diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/main.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/main.js
index f659e36360ed61a293319b80d2c1874be6ae24a5..edb37b4ea9ccde6baad7e72cabe9abb04bf4f30c 100644
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/main.js
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/main.js
@@ -5,20 +5,19 @@ define([
     "test-compiled/test-update",
     "test-compiled/test-search",
 
-    "test/test-freezing",
+    "test-compiled/test-freezing",
     "test-compiled/test-get",
-    "test/test-delete",
-    "test/test-execute",
-    "test/test-evaluate",
+    "test-compiled/test-delete",
+    "test-compiled/test-execute",
+    "test-compiled/test-evaluate",
     "test/test-json",
 
-    //         'test/test-dto',
+    // 'test/test-dto',
     "test/test-dto-roundtrip",
-    "test/test-custom-services",
-    "test/test-dss-services",
-    "test/test-archive-unarchive",
-
-    "test/test-import-export",
+    "test-compiled/test-custom-services",
+    "test-compiled/test-dss-services",
+    "test-compiled/test-archive-unarchive",
+    "test-compiled/test-import-export",
 ], function () {
     var testSuites = arguments
     return async function () {
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-archive-unarchive.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-archive-unarchive.js
deleted file mode 100644
index 69a2ae00ea8e5c4b46af4800b52cfff9fc154a47..0000000000000000000000000000000000000000
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-archive-unarchive.js
+++ /dev/null
@@ -1,86 +0,0 @@
-define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', 'test/common', 'test/dtos' ], function($, _, openbis, openbisExecuteOperations, common, dtos) {
-	var executeModule = function(moduleName, facade, dtos) {
-		QUnit.module(moduleName);
-
-		var testAction = function(c, fAction, actionType) {
-			c.start();
-
-			c.login(facade).then(function() {
-				c.ok("Login");
-				return fAction(facade).then(function(result) {
-					c.ok(actionType);
-					c.finish();
-				});
-			}).fail(function(error) {
-				c.fail(error.message);
-				c.finish();
-			});
-		}
-
-		QUnit.test("archiveDataSets()", function(assert) {
-			var c = new common(assert, dtos);
-
-			var fAction = function(facade) {
-				return $.when(c.createDataSet(facade), c.createDataSet(facade)).then(function(permId1, permId2) {
-					var ids = [ permId1, permId2 ];
-					return facade.archiveDataSets(ids, new dtos.DataSetArchiveOptions());
-				});
-			}
-
-			testAction(c, fAction, "Archived");
-		});
-
-		QUnit.test("unarchiveDataSets()", function(assert) {
-			var c = new common(assert, dtos);
-
-			var fAction = function(facade) {
-				return $.when(c.createDataSet(facade), c.createDataSet(facade)).then(function(permId1, permId2) {
-					var ids = [ permId1, permId2 ];
-					return facade.archiveDataSets(ids, new dtos.DataSetArchiveOptions()).then(function() {
-						return facade.unarchiveDataSets(ids, new dtos.DataSetUnarchiveOptions());
-					});
-				});
-			}
-
-			testAction(c, fAction, "Unarchived");
-		});
-
-		QUnit.test("lockDataSets()", function(assert) {
-			var c = new common(assert, dtos);
-			
-			var fAction = function(facade) {
-				return $.when(c.createDataSet(facade), c.createDataSet(facade)).then(function(permId1, permId2) {
-					var ids = [ permId1, permId2 ];
-					return facade.lockDataSets(ids, new dtos.DataSetLockOptions());
-				});
-			}
-			
-			testAction(c, fAction, "Lock");
-		});
-		
-		QUnit.test("unlockDataSets()", function(assert) {
-			var c = new common(assert, dtos);
-			
-			var fAction = function(facade) {
-				return $.when(c.createDataSet(facade), c.createDataSet(facade)).then(function(permId1, permId2) {
-					var ids = [ permId1, permId2 ];
-					return facade.lockDataSets(ids, new dtos.DataSetLockOptions()).then(function() {
-						return facade.unlockDataSets(ids, new dtos.DataSetUnlockOptions());
-					});
-				});
-			}
-			
-			testAction(c, fAction, "Unlock");
-		});
-		
-	}
-
-	return function() {
-		executeModule("Archive/Unarchive (RequireJS)", new openbis(), dtos);
-		executeModule("Archive/Unarchive (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos);
-		executeModule("Archive/Unarchive (module VAR)", new window.openbis.openbis(), window.openbis);
-		executeModule("Archive/Unarchive (module VAR - executeOperations)", new openbisExecuteOperations(new window.openbis.openbis(), window.openbis), window.openbis);
-		executeModule("Archive/Unarchive (module ESM)", new window.openbisESM.openbis(), window.openbisESM);
-		executeModule("Archive/Unarchive (module ESM - executeOperations)", new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM), window.openbisESM);
-	}
-})
\ No newline at end of file
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-archive-unarchive.ts b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-archive-unarchive.ts
new file mode 100644
index 0000000000000000000000000000000000000000..198b86e22d3c4da20b0b31751b9c798d68a0fb14
--- /dev/null
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-archive-unarchive.ts
@@ -0,0 +1,106 @@
+import openbis from "./lib/openbis/openbis.esm"
+
+exports.default = new Promise((resolve) => {
+    require(["jquery", "underscore", "openbis", "test/openbis-execute-operations", "test/common", "test/dtos"], function (
+        $,
+        _,
+        openbis,
+        openbisExecuteOperations,
+        common,
+        dtos
+    ) {
+        var executeModule = function (moduleName: string, facade: openbis.openbis, dtos: openbis.bundle) {
+            QUnit.module(moduleName)
+
+            var testAction = function (c, fAction, actionType) {
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        c.ok("Login")
+                        return fAction(facade).then(function (result) {
+                            c.ok(actionType)
+                            c.finish()
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            }
+
+            QUnit.test("archiveDataSets()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    return $.when(c.createDataSet(facade), c.createDataSet(facade)).then(function (permId1, permId2) {
+                        var ids = [permId1, permId2]
+                        return facade.archiveDataSets(ids, new dtos.DataSetArchiveOptions())
+                    })
+                }
+
+                testAction(c, fAction, "Archived")
+            })
+
+            QUnit.test("unarchiveDataSets()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    return $.when(c.createDataSet(facade), c.createDataSet(facade)).then(function (permId1, permId2) {
+                        var ids = [permId1, permId2]
+                        return facade.archiveDataSets(ids, new dtos.DataSetArchiveOptions()).then(function () {
+                            return facade.unarchiveDataSets(ids, new dtos.DataSetUnarchiveOptions())
+                        })
+                    })
+                }
+
+                testAction(c, fAction, "Unarchived")
+            })
+
+            QUnit.test("lockDataSets()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    return $.when(c.createDataSet(facade), c.createDataSet(facade)).then(function (permId1, permId2) {
+                        var ids = [permId1, permId2]
+                        return facade.lockDataSets(ids, new dtos.DataSetLockOptions())
+                    })
+                }
+
+                testAction(c, fAction, "Lock")
+            })
+
+            QUnit.test("unlockDataSets()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    return $.when(c.createDataSet(facade), c.createDataSet(facade)).then(function (permId1, permId2) {
+                        var ids = [permId1, permId2]
+                        return facade.lockDataSets(ids, new dtos.DataSetLockOptions()).then(function () {
+                            return facade.unlockDataSets(ids, new dtos.DataSetUnlockOptions())
+                        })
+                    })
+                }
+
+                testAction(c, fAction, "Unlock")
+            })
+        }
+
+        resolve(function () {
+            executeModule("Archive/Unarchive (RequireJS)", new openbis(), dtos)
+            executeModule("Archive/Unarchive (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos)
+            executeModule("Archive/Unarchive (module VAR)", new window.openbis.openbis(), window.openbis)
+            executeModule(
+                "Archive/Unarchive (module VAR - executeOperations)",
+                new openbisExecuteOperations(new window.openbis.openbis(), window.openbis),
+                window.openbis
+            )
+            executeModule("Archive/Unarchive (module ESM)", new window.openbisESM.openbis(), window.openbisESM)
+            executeModule(
+                "Archive/Unarchive (module ESM - executeOperations)",
+                new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM),
+                window.openbisESM
+            )
+        })
+    })
+})
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-custom-services.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-custom-services.js
deleted file mode 100644
index 1d28a9abddd7840de30978fe280cb950a08c6c80..0000000000000000000000000000000000000000
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-custom-services.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Test searching and executing custom AS services.
- */
-define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', 'test/common', 'test/dtos' ], function($, _, openbis, openbisExecuteOperations, common, dtos) {
-	var executeModule = function(moduleName, facade, dtos) {
-		QUnit.module(moduleName);
-
-		var testAction = function(c, fAction, fCheck) {
-			c.start();
-
-			c.login(facade).then(function() {
-				c.ok("Login");
-				return fAction(facade).then(function(result) {
-					c.ok("Got results");
-					fCheck(facade, result);
-					c.finish();
-				});
-			}).fail(function(error) {
-				c.fail(error.message);
-				c.finish();
-			});
-		}
-
-		QUnit.test("searchCustomASServices()", function(assert) {
-			var c = new common(assert, dtos);
-
-			var fAction = function(facade) {
-				var criteria = new dtos.CustomASServiceSearchCriteria();
-				criteria.withCode().thatStartsWith("simple");
-				return facade.searchCustomASServices(criteria, new dtos.CustomASServiceFetchOptions());
-			}
-
-			var fCheck = function(facade, result) {
-				var services = result.getObjects();
-				c.assertEqual(services.length, 1);
-				var service = services[0];
-				c.assertEqual(service.getCode().getPermId(), "simple-service", "Code");
-				c.assertEqual(service.getDescription(), "a simple service", "Description");
-			}
-
-			testAction(c, fAction, fCheck);
-		});
-
-		QUnit.test("executeCustomASService()", function(assert) {
-			var c = new common(assert, dtos);
-
-			var fAction = function(facade) {
-				var id = new dtos.CustomASServiceCode("simple-service");
-				var options = new dtos.CustomASServiceExecutionOptions().withParameter("a", "1").withParameter("space-code", "TEST");
-				return facade.executeCustomASService(id, options);
-			}
-
-			var fCheck = function(facade, result) {
-				c.assertEqual(1, result.getTotalCount());
-				var space = result.getObjects()[0];
-				c.assertEqual(space.getPermId(), "TEST", "PermId");
-				c.assertEqual(space.getCode(), "TEST", "Code");
-				c.assertEqual(space.getDescription(), null, "Description");
-				c.assertDate(space.getRegistrationDate(), "Registration date", 2013, 4, 12, 12, 59);
-			}
-
-			testAction(c, fAction, fCheck);
-		});
-	}
-
-	return function() {
-		executeModule("Custom AS service tests (RequireJS)", new openbis(), dtos);
-		executeModule("Custom AS service tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos);
-		executeModule("Custom AS service tests (module VAR)", new window.openbis.openbis(), window.openbis);
-		executeModule("Custom AS service tests (module VAR - executeOperations)", new openbisExecuteOperations(new window.openbis.openbis(), window.openbis), window.openbis);
-		executeModule("Custom AS service tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM);
-		executeModule("Custom AS service tests (module ESM - executeOperations)", new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM), window.openbisESM);
-	}
-})
\ No newline at end of file
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-custom-services.ts b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-custom-services.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cdf3d4bb39cde45930026b032eb6ba00187fabc3
--- /dev/null
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-custom-services.ts
@@ -0,0 +1,95 @@
+/**
+ * Test searching and executing custom AS services.
+ */
+import openbis from "./lib/openbis/openbis.esm"
+
+exports.default = new Promise((resolve) => {
+    require(["jquery", "underscore", "openbis", "test/openbis-execute-operations", "test/common", "test/dtos"], function (
+        $,
+        _,
+        openbis,
+        openbisExecuteOperations,
+        common,
+        dtos
+    ) {
+        var executeModule = function (moduleName: string, facade: openbis.openbis, dtos: openbis.bundle) {
+            QUnit.module(moduleName)
+
+            var testAction = function (c, fAction, fCheck) {
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        c.ok("Login")
+                        return fAction(facade).then(function (result) {
+                            c.ok("Got results")
+                            fCheck(facade, result)
+                            c.finish()
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            }
+
+            QUnit.test("searchCustomASServices()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var criteria = new dtos.CustomASServiceSearchCriteria()
+                    criteria.withCode().thatStartsWith("simple")
+                    return facade.searchCustomASServices(criteria, new dtos.CustomASServiceFetchOptions())
+                }
+
+                var fCheck = function (facade: openbis.openbis, result: openbis.SearchResult<openbis.CustomASService>) {
+                    var services = result.getObjects()
+                    c.assertEqual(services.length, 1)
+                    var service = services[0]
+                    c.assertEqual(service.getCode().getPermId(), "simple-service", "Code")
+                    c.assertEqual(service.getDescription(), "a simple service", "Description")
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+
+            QUnit.test("executeCustomASService()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var id = new dtos.CustomASServiceCode("simple-service")
+                    var options = new dtos.CustomASServiceExecutionOptions().withParameter("a", "1").withParameter("space-code", "TEST")
+                    return facade.executeCustomASService(id, options)
+                }
+
+                var fCheck = function (facade: openbis.openbis, result: any) {
+                    c.assertEqual(1, result.getTotalCount())
+                    var space = result.getObjects()[0]
+                    c.assertEqual(space.getPermId(), "TEST", "PermId")
+                    c.assertEqual(space.getCode(), "TEST", "Code")
+                    c.assertEqual(space.getDescription(), null, "Description")
+                    c.assertDate(space.getRegistrationDate(), "Registration date", 2013, 4, 12, 12, 59)
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+        }
+
+        resolve(function () {
+            executeModule("Custom AS service tests (RequireJS)", new openbis(), dtos)
+            executeModule("Custom AS service tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos)
+            executeModule("Custom AS service tests (module VAR)", new window.openbis.openbis(), window.openbis)
+            executeModule(
+                "Custom AS service tests (module VAR - executeOperations)",
+                new openbisExecuteOperations(new window.openbis.openbis(), window.openbis),
+                window.openbis
+            )
+            executeModule("Custom AS service tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM)
+            executeModule(
+                "Custom AS service tests (module ESM - executeOperations)",
+                new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM),
+                window.openbisESM
+            )
+        })
+    })
+})
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-delete.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-delete.js
deleted file mode 100644
index 9f85937732c27a5bc25731e599979a1f628f66a5..0000000000000000000000000000000000000000
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-delete.js
+++ /dev/null
@@ -1,398 +0,0 @@
-define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', 'test/common', 'test/dtos' ], function($, _, openbis, openbisExecuteOperations, common, dtos) {
-	var executeModule = function(moduleName, facade, dtos) {
-		QUnit.module(moduleName);
-
-		var testDeleteWithoutTrash = function(c, fCreate, fFind, fDelete) {
-			c.start();
-
-			c.login(facade).then(function() {
-				return fCreate(facade).then(function(permId) {
-					c.assertNotNull(permId, "Entity was created");
-					return fFind(facade, permId).then(function(entity) {
-						c.assertNotNull(entity, "Entity can be found");
-						return facade.searchDeletions(new dtos.DeletionSearchCriteria(), new dtos.DeletionFetchOptions()).then(function(beforeDeletions) {
-							c.ok("Got before deletions");
-							return fDelete(facade, permId).then(function() {
-								c.ok("Entity was deleted");
-								return facade.searchDeletions(new dtos.DeletionSearchCriteria(), new dtos.DeletionFetchOptions()).then(function(afterDeletions) {
-									c.ok("Got after deletions");
-									c.assertEqual(beforeDeletions.getObjects().length, afterDeletions.getObjects().length, "No new deletions found");
-									return fFind(facade, permId).then(function(entityAfterDeletion) {
-										c.assertNull(entityAfterDeletion, "Entity was deleted");
-										c.finish();
-									});
-								});
-							});
-						});
-					});
-				});
-			}).fail(function(error) {
-				c.fail(error.message);
-				c.finish();
-			});
-		}
-
-		var testDeleteWithTrashAndRevert = function(c, fCreate, fFind, fDelete) {
-			c.start();
-
-			c.login(facade).then(function() {
-				return fCreate(facade).then(function(permIdAndMore) {
-                    if (permIdAndMore.identifier) {
-                        permId = permIdAndMore.permId
-                    } else {
-                        permId = permIdAndMore;
-                    }
-					c.assertNotNull(permId, "Entity was created");
-					return fFind(facade, permId).then(function(entity) {
-						c.assertNotNull(entity, "Entity can be found");
-						return facade.searchDeletions(new dtos.DeletionSearchCriteria(), new dtos.DeletionFetchOptions()).then(function(beforeDeletions) {
-							c.ok("Got before deletions");
-							return fDelete(facade, permId).then(function(deletionId) {
-								c.ok("Entity was deleted");
-								c.assertNotEqual(deletionId.getTechId(), "", "Deletion tech id not an empty string");
-                                var fo = new dtos.DeletionFetchOptions();
-                                fo.withDeletedObjects();
-								return facade.searchDeletions(new dtos.DeletionSearchCriteria(), fo).then(function(afterDeletions) {
-                                    var objects = afterDeletions.getObjects();
-									c.ok("Got after deletions");
-									c.assertEqual(objects.length, beforeDeletions.getObjects().length + 1, "One new deletion");
-                                    var newDeletion = objects[afterDeletions.getObjects().length - 1];
-                                    if (permIdAndMore.identifier) {
-                                        var deletedObject = newDeletion.deletedObjects[0];
-                                        c.assertEqual(deletedObject.identifier, permIdAndMore.identifier, "Entity identifier match");
-                                        c.assertEqual(deletedObject.entityTypeCode, permIdAndMore.entityTypeCode, "Entity type match");
-                                        c.assertEqual(deletedObject.entityKind, permIdAndMore.entityKind, "Entity kind match");
-                                    }
-                                    c.assertEqual(newDeletion.getId().getTechId(), deletionId.getTechId(), "Deletion ids match");
-									return fFind(facade, permId).then(function(entityAfterDeletion) {
-										c.assertNull(entityAfterDeletion, "Entity was deleted");
-										return facade.revertDeletions([ deletionId ]).then(function() {
-											c.ok("Reverted deletion");
-											return fFind(facade, permId).then(function(entityAfterRevert) {
-												c.assertNotNull(entityAfterRevert, "Entity is back");
-												c.finish();
-											});
-										});
-									});
-								});
-							});
-						});
-					});
-				});
-			}).fail(function(error) {
-				c.fail(error.message);
-				c.finish();
-			});
-		}
-
-		var testDeleteWithTrashAndConfirm = function(c, fCreate, fFind, fDelete) {
-			c.start();
-
-			c.login(facade).then(
-					function() {
-						return fCreate(facade).then(
-								function(permId) {
-									c.assertNotNull(permId, "Entity was created");
-									return fFind(facade, permId).then(
-											function(entity) {
-												c.assertNotNull(entity, "Entity can be found");
-												return facade.searchDeletions(new dtos.DeletionSearchCriteria(), new dtos.DeletionFetchOptions()).then(
-														function(deletionsBeforeDeletion) {
-															c.ok("Got before deletions");
-															return fDelete(facade, permId).then(
-																	function(deletionId) {
-																		c.ok("Entity was deleted");
-																		return facade.searchDeletions(new dtos.DeletionSearchCriteria(), new dtos.DeletionFetchOptions()).then(
-																				function(deletionsAfterDeletion) {
-																					c.ok("Got after deletions");
-																					c.assertEqual(deletionsAfterDeletion.getObjects().length, deletionsBeforeDeletion.getObjects().length + 1,
-																							"One new deletion");
-																					c.assertEqual(deletionsAfterDeletion.getObjects()[deletionsAfterDeletion.getObjects().length - 1].getId()
-																							.getTechId(), deletionId.getTechId(), "Deletion ids match");
-																					return fFind(facade, permId).then(
-																							function(entityAfterDeletion) {
-																								c.assertNull(entityAfterDeletion, "Entity was deleted");
-																								return facade.confirmDeletions([ deletionId ]).then(
-																										function() {
-																											c.ok("Confirmed deletion");
-																											return fFind(facade, permId).then(
-																													function(entityAfterConfirm) {
-																														c.assertNull(entityAfterConfirm, "Entity is still gone");
-																														return facade.searchDeletions(new dtos.DeletionSearchCriteria(),
-																																new dtos.DeletionFetchOptions()).then(
-																																function(deletionsAfterConfirm) {
-																																	c.assertEqual(deletionsAfterConfirm.getObjects().length,
-																																			deletionsBeforeDeletion.getObjects().length,
-																																			"New deletion is also gone");
-																																	c.finish();
-																																});
-																													});
-																										});
-																							});
-																				});
-																	});
-														});
-											});
-								});
-					}).fail(function(error) {
-				c.fail(error.message);
-				c.finish();
-			});
-		}
-
-		QUnit.test("deleteSpaces()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createSpace, c.findSpace, c.deleteSpace);
-		});
-
-		QUnit.test("deleteProjects()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createProject, c.findProject, c.deleteProject);
-		});
-
-		QUnit.test("deleteExperiments() with revert", function(assert) {
-			var c = new common(assert, dtos);
-            testDeleteWithTrashAndRevert(c, function(facade) {
-                return c.createExperiment(facade).then(function(permId) {
-                    var fo = new dtos.ExperimentFetchOptions();
-                    fo.withType();
-                    return facade.getExperiments([permId], fo).then(function (map) {
-                        var experiment = map[permId];
-                        return {"permId" : permId,
-                                "identifier" : experiment.identifier,
-                                "entityTypeCode" : experiment.type.code,
-                                "entityKind" : dtos.EntityKind.EXPERIMENT};
-                    });
-                });
-            }, c.findExperiment, c.deleteExperiment);
-		});
-
-		QUnit.test("deleteExperiments() with confirm", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithTrashAndConfirm(c, c.createExperiment, c.findExperiment, c.deleteExperiment);
-		});
-
-		QUnit.test("deleteSamples() with revert", function(assert) {
-			var c = new common(assert, dtos);
-            testDeleteWithTrashAndRevert(c, function(facade) {
-                return c.createSample(facade).then(function(permId) {
-                    var fo = new dtos.SampleFetchOptions();
-                    fo.withType();
-                    return facade.getSamples([permId], fo).then(function (map) {
-                        var sample = map[permId];
-                        return {"permId" : permId,
-                                "identifier" : sample.identifier,
-                                "entityTypeCode" : sample.type.code,
-                                "entityKind" : dtos.EntityKind.SAMPLE};
-                    });
-                });
-            }, c.findSample, c.deleteSample);
-		});
-
-		QUnit.test("deleteSamples() with confirm", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithTrashAndConfirm(c, c.createSample, c.findSample, c.deleteSample);
-		});
-
-		QUnit.test("deleteDataSets() with revert", function(assert) {
-			var c = new common(assert, dtos);
-            testDeleteWithTrashAndRevert(c, function(facade) {
-                return c.createDataSet(facade).then(function(permId) {
-                    var fo = new dtos.DataSetFetchOptions();
-                    fo.withType();
-                    return facade.getDataSets([permId], fo).then(function (map) {
-                        var dataSet = map[permId];
-                        return {"permId" : permId,
-                                "identifier" : dataSet.code,
-                                "entityTypeCode" : dataSet.type.code,
-                                "entityKind" : dtos.EntityKind.DATA_SET};
-                    });
-                });
-            }, c.findDataSet, c.deleteDataSet);
-		});
-
-		QUnit.test("deleteDataSets() with confirm", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithTrashAndConfirm(c, c.createDataSet, c.findDataSet, c.deleteDataSet);
-		});
-
-		QUnit.test("deleteDataSets() with disallowed type without force flag", function(assert) {
-			var c = new common(assert, dtos);
-
-			c.start();
-
-			c.login(facade).then(function() {
-                return c.createDataSetType(facade, "DELETION-TEST").then(function(typeId) {
-                    c.assertNotNull(typeId, "Data set type created")
-                    return c.createDataSet(facade, typeId.getPermId()).then(function(permId) {
-                        c.assertNotNull(permId, "Entity was created");
-                        return c.deleteDataSet(facade, permId).then(function(deletionId) {
-                            c.assertNotNull(deletionId, "Entity was moved to trash");
-                            var update = new dtos.DataSetTypeUpdate();
-                            update.setTypeId(typeId);
-                            update.setDisallowDeletion(true);
-                            return facade.updateDataSetTypes([update]).then(function() {
-                                c.ok("Data set type updated")
-                                return facade.confirmDeletions([ deletionId ]).then(function() {
-                                    c.fail("Confirmation of deletion should fail without the force flag");
-                                    c.finish();
-                                });
-                            });
-                        });
-                    });
-                });
-			}).fail(function(error) {
-				c.assertContains(error.message, "Deletion failed because the following data sets have 'Disallow deletion' flag set to true in their type", "Expected error message");
-				c.finish();
-			});
-		});
-
-		QUnit.test("deleteDataSets() with disallowed type with force flag", function(assert) {
-			var c = new common(assert, dtos);
-
-			c.start();
-
-			c.login(facade).then(function() {
-                return c.createDataSetType(facade, "DELETION-TEST").then(function(typeId) {
-                    c.assertNotNull(typeId, "Data set type created")
-                    return c.createDataSet(facade, typeId.getPermId()).then(function(permId) {
-                        c.assertNotNull(permId, "Entity was created");
-                        return c.deleteDataSet(facade, permId).then(function(deletionId) {
-                            c.assertNotNull(deletionId, "Entity was moved to trash");
-                            var update = new dtos.DataSetTypeUpdate();
-                            update.setTypeId(typeId);
-                            update.setDisallowDeletion(true);
-                            return facade.updateDataSetTypes([update]).then(function() {
-                                c.ok("Data set type updated")
-                                var operation = new dtos.ConfirmDeletionsOperation([ deletionId ]);
-                                operation.setForceDeletion(true);
-                                var options = new dtos.SynchronousOperationExecutionOptions();
-                                return facade.executeOperations([ operation ], options).then(function() {
-                                    c.finish();
-                                });
-                            });
-                        });
-                    });
-                });
-			}).fail(function(error) {
-				c.fail("Confirmation of deletion should not fail with the force flag");
-				c.finish();
-			});
-		});
-
-		QUnit.test("deleteMaterials()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createMaterial, c.findMaterial, c.deleteMaterial);
-		});
-
-		QUnit.test("deletePlugins()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createPlugin, c.findPlugin, c.deletePlugin);
-		});
-
-		QUnit.test("deletePropertyTypes()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createPropertyType, c.findPropertyType, c.deletePropertyType);
-		});
-
-		QUnit.test("deleteVocabularies()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createVocabulary, c.findVocabulary, c.deleteVocabulary);
-		});
-
-		QUnit.test("deleteVocabularyTerms()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createVocabularyTerm, c.findVocabularyTerm, c.deleteVocabularyTerm);
-		});
-
-		QUnit.test("deleteExperimentTypes()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createExperimentType, c.findExperimentType, c.deleteExperimentType);
-		});
-
-		QUnit.test("deleteSampleTypes()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createSampleType, c.findSampleType, c.deleteSampleType);
-		});
-
-		QUnit.test("deleteDataSetTypes()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createDataSetType, c.findDataSetType, c.deleteDataSetType);
-		});
-
-		QUnit.test("deleteMaterialTypes()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createMaterialType, c.findMaterialType, c.deleteMaterialType);
-		});
-
-		QUnit.test("deleteExternalDms()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createExternalDms, c.findExternalDms, c.deleteExternalDms);
-		});
-
-		QUnit.test("replaceVocabularyTerms()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createVocabularyTerm, c.findVocabularyTerm, c.replaceVocabularyTerm);
-		});
-
-		QUnit.test("deleteTags()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createTag, c.findTag, c.deleteTag);
-		});
-
-		QUnit.test("deleteAuthorizationGroups()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createAuthorizationGroup, c.findAuthorizationGroup, c.deleteAuthorizationGroup);
-		});
-
-		QUnit.test("deleteRoleAssignments()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createRoleAssignment, c.findRoleAssignment, c.deleteRoleAssignment);
-		});
-
-		QUnit.test("deleteOperationExecutions()", function(assert) {
-			var c = new common(assert, dtos);
-
-			var findNotDeletedOrDeletePending = function(facade, permId) {
-				return c.findOperationExecution(facade, permId).then(function(execution) {
-					if (!execution || execution.getAvailability() == "DELETE_PENDING" || execution.getAvailability() == "DELETED") {
-						return null;
-					} else {
-						return execution;
-					}
-				});
-			}
-
-			testDeleteWithoutTrash(c, c.createOperationExecution, findNotDeletedOrDeletePending, c.deleteOperationExecution);
-		});
-
-		QUnit.test("deleteSemanticAnnotations()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createSemanticAnnotation, c.findSemanticAnnotation, c.deleteSemanticAnnotation);
-		});
-		
-		QUnit.test("deleteQueries()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createQuery, c.findQuery, c.deleteQuery);
-		});
-
-		QUnit.test("deletePersons()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createPerson, c.findPerson, c.deletePerson);
-		});
-
-		QUnit.test("deletePersonalAccessTokens()", function(assert) {
-			var c = new common(assert, dtos);
-			testDeleteWithoutTrash(c, c.createPersonalAccessToken, c.findPersonalAccessToken, c.deletePersonalAccessToken);
-		});
-	}
-
-	return function() {
-		executeModule("Deletion tests (RequireJS)", new openbis(), dtos);
-		executeModule("Deletion tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos);
-		executeModule("Deletion tests (module VAR)", new window.openbis.openbis(), window.openbis);
-		executeModule("Deletion tests (module VAR - executeOperations)", new openbisExecuteOperations(new window.openbis.openbis(), window.openbis), window.openbis);
-		executeModule("Deletion tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM);
-		executeModule("Deletion tests (module ESM - executeOperations)", new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM), window.openbisESM);
-	}
-});
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-delete.ts b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-delete.ts
new file mode 100644
index 0000000000000000000000000000000000000000..029480d418c993420b4b8e0b39ba4b8b435ea11e
--- /dev/null
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-delete.ts
@@ -0,0 +1,481 @@
+import openbis from "./lib/openbis/openbis.esm"
+
+exports.default = new Promise((resolve) => {
+    require(["jquery", "underscore", "openbis", "test/openbis-execute-operations", "test/common", "test/dtos"], function (
+        $,
+        _,
+        openbis,
+        openbisExecuteOperations,
+        common,
+        dtos
+    ) {
+        var executeModule = function (moduleName: string, facade: openbis.openbis, dtos: openbis.bundle) {
+            QUnit.module(moduleName)
+
+            var testDeleteWithoutTrash = function (c, fCreate, fFind, fDelete) {
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        return fCreate(facade).then(function (permId) {
+                            c.assertNotNull(permId, "Entity was created")
+                            return fFind(facade, permId).then(function (entity) {
+                                c.assertNotNull(entity, "Entity can be found")
+                                return facade
+                                    .searchDeletions(new dtos.DeletionSearchCriteria(), new dtos.DeletionFetchOptions())
+                                    .then(function (beforeDeletions) {
+                                        c.ok("Got before deletions")
+                                        return fDelete(facade, permId).then(function () {
+                                            c.ok("Entity was deleted")
+                                            return facade
+                                                .searchDeletions(new dtos.DeletionSearchCriteria(), new dtos.DeletionFetchOptions())
+                                                .then(function (afterDeletions) {
+                                                    c.ok("Got after deletions")
+                                                    c.assertEqual(
+                                                        beforeDeletions.getObjects().length,
+                                                        afterDeletions.getObjects().length,
+                                                        "No new deletions found"
+                                                    )
+                                                    return fFind(facade, permId).then(function (entityAfterDeletion) {
+                                                        c.assertNull(entityAfterDeletion, "Entity was deleted")
+                                                        c.finish()
+                                                    })
+                                                })
+                                        })
+                                    })
+                            })
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            }
+
+            var testDeleteWithTrashAndRevert = function (c, fCreate, fFind, fDelete) {
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        return fCreate(facade).then(function (permIdAndMore) {
+                            var permId = null
+                            if (permIdAndMore.identifier) {
+                                permId = permIdAndMore.permId
+                            } else {
+                                permId = permIdAndMore
+                            }
+                            c.assertNotNull(permId, "Entity was created")
+                            return fFind(facade, permId).then(function (entity) {
+                                c.assertNotNull(entity, "Entity can be found")
+                                return facade
+                                    .searchDeletions(new dtos.DeletionSearchCriteria(), new dtos.DeletionFetchOptions())
+                                    .then(function (beforeDeletions) {
+                                        c.ok("Got before deletions")
+                                        return fDelete(facade, permId).then(function (deletionId) {
+                                            c.ok("Entity was deleted")
+                                            c.assertNotEqual(deletionId.getTechId(), "", "Deletion tech id not an empty string")
+                                            var fo = new dtos.DeletionFetchOptions()
+                                            fo.withDeletedObjects()
+                                            return facade.searchDeletions(new dtos.DeletionSearchCriteria(), fo).then(function (afterDeletions) {
+                                                var objects = afterDeletions.getObjects()
+                                                c.ok("Got after deletions")
+                                                c.assertEqual(objects.length, beforeDeletions.getObjects().length + 1, "One new deletion")
+                                                var newDeletion = objects[afterDeletions.getObjects().length - 1]
+                                                if (permIdAndMore.identifier) {
+                                                    var deletedObject = newDeletion.getDeletedObjects()[0]
+                                                    c.assertEqual(deletedObject.getIdentifier(), permIdAndMore.identifier, "Entity identifier match")
+                                                    c.assertEqual(
+                                                        deletedObject.getEntityTypeCode(),
+                                                        permIdAndMore.entityTypeCode,
+                                                        "Entity type match"
+                                                    )
+                                                    c.assertEqual(deletedObject.getEntityKind(), permIdAndMore.entityKind, "Entity kind match")
+                                                }
+                                                c.assertEqual(
+                                                    (<openbis.DeletionTechId>newDeletion.getId()).getTechId(),
+                                                    deletionId.getTechId(),
+                                                    "Deletion ids match"
+                                                )
+                                                return fFind(facade, permId).then(function (entityAfterDeletion) {
+                                                    c.assertNull(entityAfterDeletion, "Entity was deleted")
+                                                    return facade.revertDeletions([deletionId]).then(function () {
+                                                        c.ok("Reverted deletion")
+                                                        return fFind(facade, permId).then(function (entityAfterRevert) {
+                                                            c.assertNotNull(entityAfterRevert, "Entity is back")
+                                                            c.finish()
+                                                        })
+                                                    })
+                                                })
+                                            })
+                                        })
+                                    })
+                            })
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            }
+
+            var testDeleteWithTrashAndConfirm = function (c, fCreate, fFind, fDelete) {
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        return fCreate(facade).then(function (permId) {
+                            c.assertNotNull(permId, "Entity was created")
+                            return fFind(facade, permId).then(function (entity) {
+                                c.assertNotNull(entity, "Entity can be found")
+                                return facade
+                                    .searchDeletions(new dtos.DeletionSearchCriteria(), new dtos.DeletionFetchOptions())
+                                    .then(function (deletionsBeforeDeletion) {
+                                        c.ok("Got before deletions")
+                                        return fDelete(facade, permId).then(function (deletionId) {
+                                            c.ok("Entity was deleted")
+                                            return facade
+                                                .searchDeletions(new dtos.DeletionSearchCriteria(), new dtos.DeletionFetchOptions())
+                                                .then(function (deletionsAfterDeletion) {
+                                                    c.ok("Got after deletions")
+                                                    c.assertEqual(
+                                                        deletionsAfterDeletion.getObjects().length,
+                                                        deletionsBeforeDeletion.getObjects().length + 1,
+                                                        "One new deletion"
+                                                    )
+                                                    c.assertEqual(
+                                                        (<openbis.DeletionTechId>(
+                                                            deletionsAfterDeletion
+                                                                .getObjects()
+                                                                [deletionsAfterDeletion.getObjects().length - 1].getId()
+                                                        )).getTechId(),
+                                                        deletionId.getTechId(),
+                                                        "Deletion ids match"
+                                                    )
+                                                    return fFind(facade, permId).then(function (entityAfterDeletion) {
+                                                        c.assertNull(entityAfterDeletion, "Entity was deleted")
+                                                        return facade.confirmDeletions([deletionId]).then(function () {
+                                                            c.ok("Confirmed deletion")
+                                                            return fFind(facade, permId).then(function (entityAfterConfirm) {
+                                                                c.assertNull(entityAfterConfirm, "Entity is still gone")
+                                                                return facade
+                                                                    .searchDeletions(
+                                                                        new dtos.DeletionSearchCriteria(),
+                                                                        new dtos.DeletionFetchOptions()
+                                                                    )
+                                                                    .then(function (deletionsAfterConfirm) {
+                                                                        c.assertEqual(
+                                                                            deletionsAfterConfirm.getObjects().length,
+                                                                            deletionsBeforeDeletion.getObjects().length,
+                                                                            "New deletion is also gone"
+                                                                        )
+                                                                        c.finish()
+                                                                    })
+                                                            })
+                                                        })
+                                                    })
+                                                })
+                                        })
+                                    })
+                            })
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            }
+
+            QUnit.test("deleteSpaces()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createSpace, c.findSpace, c.deleteSpace)
+            })
+
+            QUnit.test("deleteProjects()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createProject, c.findProject, c.deleteProject)
+            })
+
+            QUnit.test("deleteExperiments() with revert", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithTrashAndRevert(
+                    c,
+                    function (facade: openbis.openbis) {
+                        return c.createExperiment(facade).then(function (permId) {
+                            var fo = new dtos.ExperimentFetchOptions()
+                            fo.withType()
+                            return facade.getExperiments([permId], fo).then(function (map) {
+                                var experiment = map[permId]
+                                return {
+                                    permId: permId,
+                                    identifier: experiment.getIdentifier(),
+                                    entityTypeCode: experiment.getType().getCode(),
+                                    entityKind: dtos.EntityKind.EXPERIMENT,
+                                }
+                            })
+                        })
+                    },
+                    c.findExperiment,
+                    c.deleteExperiment
+                )
+            })
+
+            QUnit.test("deleteExperiments() with confirm", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithTrashAndConfirm(c, c.createExperiment, c.findExperiment, c.deleteExperiment)
+            })
+
+            QUnit.test("deleteSamples() with revert", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithTrashAndRevert(
+                    c,
+                    function (facade: openbis.openbis) {
+                        return c.createSample(facade).then(function (permId) {
+                            var fo = new dtos.SampleFetchOptions()
+                            fo.withType()
+                            return facade.getSamples([permId], fo).then(function (map) {
+                                var sample = map[permId]
+                                return {
+                                    permId: permId,
+                                    identifier: sample.getIdentifier(),
+                                    entityTypeCode: sample.getType().getCode(),
+                                    entityKind: dtos.EntityKind.SAMPLE,
+                                }
+                            })
+                        })
+                    },
+                    c.findSample,
+                    c.deleteSample
+                )
+            })
+
+            QUnit.test("deleteSamples() with confirm", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithTrashAndConfirm(c, c.createSample, c.findSample, c.deleteSample)
+            })
+
+            QUnit.test("deleteDataSets() with revert", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithTrashAndRevert(
+                    c,
+                    function (facade: openbis.openbis) {
+                        return c.createDataSet(facade).then(function (permId) {
+                            var fo = new dtos.DataSetFetchOptions()
+                            fo.withType()
+                            return facade.getDataSets([permId], fo).then(function (map) {
+                                var dataSet = map[permId]
+                                return {
+                                    permId: permId,
+                                    identifier: dataSet.getCode(),
+                                    entityTypeCode: dataSet.getType().getCode(),
+                                    entityKind: dtos.EntityKind.DATA_SET,
+                                }
+                            })
+                        })
+                    },
+                    c.findDataSet,
+                    c.deleteDataSet
+                )
+            })
+
+            QUnit.test("deleteDataSets() with confirm", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithTrashAndConfirm(c, c.createDataSet, c.findDataSet, c.deleteDataSet)
+            })
+
+            QUnit.test("deleteDataSets() with disallowed type without force flag", function (assert) {
+                var c = new common(assert, dtos)
+
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        return c.createDataSetType(facade, "DELETION-TEST").then(function (typeId) {
+                            c.assertNotNull(typeId, "Data set type created")
+                            return c.createDataSet(facade, typeId.getPermId()).then(function (permId) {
+                                c.assertNotNull(permId, "Entity was created")
+                                return c.deleteDataSet(facade, permId).then(function (deletionId) {
+                                    c.assertNotNull(deletionId, "Entity was moved to trash")
+                                    var update = new dtos.DataSetTypeUpdate()
+                                    update.setTypeId(typeId)
+                                    update.setDisallowDeletion(true)
+                                    return facade.updateDataSetTypes([update]).then(function () {
+                                        c.ok("Data set type updated")
+                                        return facade.confirmDeletions([deletionId]).then(function () {
+                                            c.fail("Confirmation of deletion should fail without the force flag")
+                                            c.finish()
+                                        })
+                                    })
+                                })
+                            })
+                        })
+                    })
+                    .fail(function (error) {
+                        c.assertContains(
+                            error.message,
+                            "Deletion failed because the following data sets have 'Disallow deletion' flag set to true in their type",
+                            "Expected error message"
+                        )
+                        c.finish()
+                    })
+            })
+
+            QUnit.test("deleteDataSets() with disallowed type with force flag", function (assert) {
+                var c = new common(assert, dtos)
+
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        return c.createDataSetType(facade, "DELETION-TEST").then(function (typeId) {
+                            c.assertNotNull(typeId, "Data set type created")
+                            return c.createDataSet(facade, typeId.getPermId()).then(function (permId) {
+                                c.assertNotNull(permId, "Entity was created")
+                                return c.deleteDataSet(facade, permId).then(function (deletionId) {
+                                    c.assertNotNull(deletionId, "Entity was moved to trash")
+                                    var update = new dtos.DataSetTypeUpdate()
+                                    update.setTypeId(typeId)
+                                    update.setDisallowDeletion(true)
+                                    return facade.updateDataSetTypes([update]).then(function () {
+                                        c.ok("Data set type updated")
+                                        var operation = new dtos.ConfirmDeletionsOperation([deletionId])
+                                        operation.setForceDeletion(true)
+                                        var options = new dtos.SynchronousOperationExecutionOptions()
+                                        return facade.executeOperations([operation], options).then(function () {
+                                            c.finish()
+                                        })
+                                    })
+                                })
+                            })
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail("Confirmation of deletion should not fail with the force flag")
+                        c.finish()
+                    })
+            })
+
+            QUnit.test("deleteMaterials()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createMaterial, c.findMaterial, c.deleteMaterial)
+            })
+
+            QUnit.test("deletePlugins()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createPlugin, c.findPlugin, c.deletePlugin)
+            })
+
+            QUnit.test("deletePropertyTypes()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createPropertyType, c.findPropertyType, c.deletePropertyType)
+            })
+
+            QUnit.test("deleteVocabularies()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createVocabulary, c.findVocabulary, c.deleteVocabulary)
+            })
+
+            QUnit.test("deleteVocabularyTerms()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createVocabularyTerm, c.findVocabularyTerm, c.deleteVocabularyTerm)
+            })
+
+            QUnit.test("deleteExperimentTypes()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createExperimentType, c.findExperimentType, c.deleteExperimentType)
+            })
+
+            QUnit.test("deleteSampleTypes()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createSampleType, c.findSampleType, c.deleteSampleType)
+            })
+
+            QUnit.test("deleteDataSetTypes()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createDataSetType, c.findDataSetType, c.deleteDataSetType)
+            })
+
+            QUnit.test("deleteMaterialTypes()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createMaterialType, c.findMaterialType, c.deleteMaterialType)
+            })
+
+            QUnit.test("deleteExternalDms()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createExternalDms, c.findExternalDms, c.deleteExternalDms)
+            })
+
+            QUnit.test("replaceVocabularyTerms()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createVocabularyTerm, c.findVocabularyTerm, c.replaceVocabularyTerm)
+            })
+
+            QUnit.test("deleteTags()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createTag, c.findTag, c.deleteTag)
+            })
+
+            QUnit.test("deleteAuthorizationGroups()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createAuthorizationGroup, c.findAuthorizationGroup, c.deleteAuthorizationGroup)
+            })
+
+            QUnit.test("deleteRoleAssignments()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createRoleAssignment, c.findRoleAssignment, c.deleteRoleAssignment)
+            })
+
+            QUnit.test("deleteOperationExecutions()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var findNotDeletedOrDeletePending = function (facade: openbis.openbis, permId) {
+                    return c.findOperationExecution(facade, permId).then(function (execution) {
+                        if (!execution || execution.getAvailability() == "DELETE_PENDING" || execution.getAvailability() == "DELETED") {
+                            return null
+                        } else {
+                            return execution
+                        }
+                    })
+                }
+
+                testDeleteWithoutTrash(c, c.createOperationExecution, findNotDeletedOrDeletePending, c.deleteOperationExecution)
+            })
+
+            QUnit.test("deleteSemanticAnnotations()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createSemanticAnnotation, c.findSemanticAnnotation, c.deleteSemanticAnnotation)
+            })
+
+            QUnit.test("deleteQueries()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createQuery, c.findQuery, c.deleteQuery)
+            })
+
+            QUnit.test("deletePersons()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createPerson, c.findPerson, c.deletePerson)
+            })
+
+            QUnit.test("deletePersonalAccessTokens()", function (assert) {
+                var c = new common(assert, dtos)
+                testDeleteWithoutTrash(c, c.createPersonalAccessToken, c.findPersonalAccessToken, c.deletePersonalAccessToken)
+            })
+        }
+
+        resolve(function () {
+            executeModule("Deletion tests (RequireJS)", new openbis(), dtos)
+            executeModule("Deletion tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos)
+            executeModule("Deletion tests (module VAR)", new window.openbis.openbis(), window.openbis)
+            executeModule(
+                "Deletion tests (module VAR - executeOperations)",
+                new openbisExecuteOperations(new window.openbis.openbis(), window.openbis),
+                window.openbis
+            )
+            executeModule("Deletion tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM)
+            executeModule(
+                "Deletion tests (module ESM - executeOperations)",
+                new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM),
+                window.openbisESM
+            )
+        })
+    })
+})
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-dss-services.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-dss-services.js
deleted file mode 100644
index 8fe9957a3c2eeea9c69abcb4637e241f629539d8..0000000000000000000000000000000000000000
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-dss-services.js
+++ /dev/null
@@ -1,287 +0,0 @@
-/**
- * Test searching and executing DSS services.
- */
-define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', 'test/common', 'test/dtos' ], function($, _, openbis, openbisExecuteOperations, common, dtos) {
-	var executeModule = function(moduleName, facade, dtos) {
-		QUnit.module(moduleName);
-
-		var testAction = function(c, fAction, fCheck) {
-			c.start();
-
-			c.login(facade).then(function() {
-				c.ok("Login");
-				return fAction(facade).then(function(result) {
-					c.ok("Got results");
-					var token = fCheck(facade, result);
-					if (token) {
-						token.then(function() {
-							c.finish()
-						});
-					} else {
-						c.finish();
-					}
-				});
-			}).fail(function(error) {
-				c.fail(error.message);
-				c.finish();
-			});
-		}
-
-		var testActionWhichShouldFail = function(c, fAction, errorMessage) {
-			c.start();
-			
-			c.login(facade).then(function() {
-				c.ok("Login");
-				return fAction(facade).then(function(result) {
-					c.fail("Action supposed to fail");
-					c.finish();
-				});
-			}).fail(function(error) {
-				c.ok("Action failed as expected");
-				c.assertEqual(error.message, errorMessage, "Error message");
-				c.finish();
-			});
-		}
-		
-		QUnit.test("searchSearchDomainService()", function(assert) {
-			var c = new common(assert, dtos);
-
-			var fAction = function(facade) {
-				var criteria = new dtos.SearchDomainServiceSearchCriteria();
-				var fetchOptions = new dtos.SearchDomainServiceFetchOptions();
-				return facade.searchSearchDomainServices(criteria, fetchOptions);
-			}
-
-			var fCheck = function(facade, result) {
-				c.assertEqual(result.getTotalCount(), 4, "Number of results");
-				c.assertEqual(result.getObjects().length, 4, "Number of results");
-				var objects = result.getObjects();
-				objects.sort(function(o1, o2) { return o1.getPermId().toString().localeCompare(o2.getPermId().toString())});
-				c.assertEqual(objects[1].getPermId().toString(), "DSS1:echo-database", "Perm id");
-				c.assertEqual(objects[1].getName(), "echo-database", "Name");
-				c.assertEqual(objects[1].getLabel(), "Echo database", "Label");
-				c.assertEqual(objects[1].getPossibleSearchOptionsKey(), "optionsKey", "Possible searcg option keys");
-				c.assertEqual(objects[1].getPossibleSearchOptions().toString(), "Alpha [alpha],beta [beta]", "Possible search options");
-			}
-
-			testAction(c, fAction, fCheck);
-		});
-		
-		QUnit.test("executeSearchDomainService()", function(assert) {
-			var c = new common(assert, dtos);
-			
-			var fAction = function(facade) {
-				var options = new dtos.SearchDomainServiceExecutionOptions();
-				options.withPreferredSearchDomain("echo-database");
-				options.withSearchString("key").withParameter("key", 
-						JSON.stringify({
-							"searchDomain" : "Echo database",
-							"dataSetCode" : "20130415093804724-403",
-							"pathInDataSet" : "PATH-2",
-							"sequenceIdentifier" : "ID-2",
-							"positionInSequence" : "2"
-						}));
-				return facade.executeSearchDomainService(options);
-			}
-			
-			var fCheck = function(facade, result) {
-				c.assertEqual(result.getTotalCount(), 2, "Number of results");
-				c.assertEqual(result.getObjects().length, 2, "Number of results");
-				var objects = result.getObjects();
-				objects.sort(function(o1, o2) { return o1.getServicePermId().toString().localeCompare(o2.getServicePermId().toString())});
-				c.assertEqual(objects[0].getServicePermId().toString(), "DSS1:echo-database", "Service perm id");
-				c.assertEqual(objects[0].getSearchDomainName(), "echo-database", "Search domain name");
-				c.assertEqual(objects[0].getSearchDomainLabel(), "Echo database", "Search domain label");
-				c.assertEqual(objects[0].getEntityIdentifier(), "20130415093804724-403", "Entity identifier");
-				c.assertEqual(objects[0].getEntityKind(), "DATA_SET", "Entity kind");
-				c.assertEqual(objects[0].getEntityType(), "UNKNOWN", "Entity type");
-				c.assertEqual(objects[0].getEntityPermId(), "20130415093804724-403", "Entity perm id");
-				c.assertEqual(JSON.stringify(objects[0].getResultDetails()), JSON.stringify({"identifier": "ID-2",
-					"path_in_data_set": "PATH-2", "position": "2"}), "Result details");
-			}
-			
-			testAction(c, fAction, fCheck);
-		});
-		
-		QUnit.test("searchAggregationService()", function(assert) {
-			var c = new common(assert, dtos);
-
-			var fAction = function(facade) {
-				var criteria = new dtos.AggregationServiceSearchCriteria();
-				var id = new dtos.DssServicePermId("js-test", new dtos.DataStorePermId("DSS1"));
-				criteria.withId().thatEquals(id);
-				var fetchOptions = new dtos.AggregationServiceFetchOptions();
-				return facade.searchAggregationServices(criteria, fetchOptions);
-			}
-
-			var fCheck = function(facade, result) {
-				c.assertEqual(result.getTotalCount(), 1, "Number of results");
-				c.assertEqual(result.getObjects().length, 1, "Number of results");
-				var objects = result.getObjects();
-				c.assertEqual(objects[0].getPermId().toString(), "DSS1:js-test", "Perm id");
-				c.assertEqual(objects[0].getName(), "js-test", "Name");
-				c.assertEqual(objects[0].getLabel(), "js-test", "Label");
-			}
-
-			testAction(c, fAction, fCheck);
-		});
-		
-		QUnit.test("executeAggregationService()", function(assert) {
-			var c = new common(assert, dtos);
-			
-			var fAction = function(facade) {
-				var id = new dtos.DssServicePermId("js-test", new dtos.DataStorePermId("DSS1"));
-				var options = new dtos.AggregationServiceExecutionOptions();
-				options.withParameter("method", "test");
-				options.withParameter("answer", 42).withParameter("pi", 3.1415926);
-				return facade.executeAggregationService(id, options);
-			}
-			
-			var fCheck = function(facade, tableModel) {
-				c.assertEqual(tableModel.getColumns().toString(), "key,value", "Table columns");
-				c.assertEqual(tableModel.getRows().toString(), "method,test,answer,42,pi,3.1415926", "Table rows");
-			}
-			
-			testAction(c, fAction, fCheck);
-		});
-		
-		QUnit.test("executeAggregationService() with data store code is null", function(assert) {
-			var c = new common(assert, dtos);
-			
-			var fAction = function(facade) {
-				var id = new dtos.DssServicePermId("js-test", new dtos.DataStorePermId(null));
-				var options = new dtos.AggregationServiceExecutionOptions();
-				return facade.executeAggregationService(id, options);
-			}
-			
-			testActionWhichShouldFail(c, fAction, "Data store code cannot be empty. (Context: [])");
-		});
-		
-		QUnit.test("executeAggregationService() with data store id is null", function(assert) {
-			var c = new common(assert, dtos);
-			
-			var fAction = function(facade) {
-				var id = new dtos.DssServicePermId("js-test", null);
-				var options = new dtos.AggregationServiceExecutionOptions();
-				return facade.executeAggregationService(id, options);
-			}
-			
-			testActionWhichShouldFail(c, fAction, "Data store id cannot be null. (Context: [])");
-		});
-		
-		QUnit.test("executeAggregationService() with key is null", function(assert) {
-			var c = new common(assert, dtos);
-			
-			var fAction = function(facade) {
-				var id = new dtos.DssServicePermId(null, new dtos.DataStorePermId("DSS1"));
-				var options = new dtos.AggregationServiceExecutionOptions();
-				return facade.executeAggregationService(id, options);
-			}
-			
-			testActionWhichShouldFail(c, fAction, "Service key cannot be empty. (Context: [])");
-		});
-		
-		QUnit.test("searchReportingService()", function(assert) {
-			var c = new common(assert, dtos);
-
-			var fAction = function(facade) {
-				var criteria = new dtos.ReportingServiceSearchCriteria();
-				var id = new dtos.DssServicePermId("test-reporting-service", new dtos.DataStorePermId("DSS1"));
-				criteria.withId().thatEquals(id);
-				var fetchOptions = new dtos.ReportingServiceFetchOptions();
-				return facade.searchReportingServices(criteria, fetchOptions);
-			}
-
-			var fCheck = function(facade, result) {
-				c.assertEqual(result.getTotalCount(), 1, "Number of results");
-				c.assertEqual(result.getObjects().length, 1, "Number of results");
-				var objects = result.getObjects();
-				c.assertEqual(objects[0].getPermId().toString(), "DSS1:test-reporting-service", "Perm id");
-				c.assertEqual(objects[0].getName(), "test-reporting-service", "Name");
-				c.assertEqual(objects[0].getLabel(), "Test Jython Reporting", "Label");
-			}
-
-			testAction(c, fAction, fCheck);
-		});
-		
-		QUnit.test("executeReportingService()", function(assert) {
-			var c = new common(assert, dtos);
-			var dataSetCode;
-			
-			var fAction = function(facade) {
-				return $.when(c.createDataSet(facade)).then(function(permId) {
-					dataSetCode = permId.getPermId();
-					var serviceId = new dtos.DssServicePermId("test-reporting-service", new dtos.DataStorePermId("DSS1"));
-					var options = new dtos.ReportingServiceExecutionOptions();
-					options.withDataSets(dataSetCode);
-					return facade.executeReportingService(serviceId, options);
-				});
-			}
-			
-			var fCheck = function(facade, tableModel) {
-				c.assertEqual(tableModel.getColumns().toString(), "Data Set,Data Set Type", "Table columns");
-				c.assertEqual(tableModel.getRows().toString(), dataSetCode + ",ALIGNMENT", "Table rows");
-			}
-			
-			testAction(c, fAction, fCheck);
-		});
-		
-		QUnit.test("searchProcessingService()", function(assert) {
-			var c = new common(assert, dtos);
-
-			var fAction = function(facade) {
-				var criteria = new dtos.ProcessingServiceSearchCriteria();
-				var id = new dtos.DssServicePermId("test-processing-service", new dtos.DataStorePermId("DSS1"));
-				criteria.withId().thatEquals(id);
-				var fetchOptions = new dtos.ProcessingServiceFetchOptions();
-				return facade.searchProcessingServices(criteria, fetchOptions);
-			}
-
-			var fCheck = function(facade, result) {
-				c.assertEqual(result.getTotalCount(), 1, "Number of results");
-				c.assertEqual(result.getObjects().length, 1, "Number of results");
-				var objects = result.getObjects();
-				c.assertEqual(objects[0].getPermId().toString(), "DSS1:test-processing-service", "Perm id");
-				c.assertEqual(objects[0].getName(), "test-processing-service", "Name");
-				c.assertEqual(objects[0].getLabel(), "Test Jython Processing", "Label");
-			}
-
-			testAction(c, fAction, fCheck);
-		});
-		
-		QUnit.test("executeProcessingService()", function(assert) {
-			var c = new common(assert, dtos);
-			var dataSetCode;
-			
-			var fAction = function(facade) {
-				return $.when(c.createDataSet(facade)).then(function(permId) {
-					dataSetCode = permId.getPermId();
-					var serviceId = new dtos.DssServicePermId("test-processing-service", new dtos.DataStorePermId("DSS1"));
-					var options = new dtos.ProcessingServiceExecutionOptions();
-					options.withDataSets([dataSetCode]);
-					return facade.executeProcessingService(serviceId, options);
-				});
-			}
-			
-			var fCheck = function(facade) {
-				return $.when(c.waitUntilEmailWith(facade, dataSetCode, 10000).then(function(emails) {
-					c.assertEqual(emails[0][0].value, "franz-josef.elmer@systemsx.ch", "Email To");
-					c.assertEqual(emails[0][1].value, "'Test Jython Processing' [test-processing-service] processing\n finished", "Email Subject");
-					c.assertContains(emails[0][2].value, dataSetCode, "Email Content with data set " + dataSetCode);
-				}));
-			}
-			
-			testAction(c, fAction, fCheck);
-		});
-		
-	}
-
-	return function() {
-		executeModule("DSS service tests (RequireJS)", new openbis(), dtos);
-		executeModule("DSS service tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos);
-		executeModule("DSS service tests (module VAR)", new window.openbis.openbis(), window.openbis);
-		executeModule("DSS service tests (module VAR - executeOperations)", new openbisExecuteOperations(new window.openbis.openbis(), window.openbis), window.openbis);
-		executeModule("DSS service tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM);
-		executeModule("DSS service tests (module ESM - executeOperations)", new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM), window.openbisESM);
-	}
-})
\ No newline at end of file
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-dss-services.ts b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-dss-services.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8f33dec837a5ffe82802eef5135bffed86e191f7
--- /dev/null
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-dss-services.ts
@@ -0,0 +1,324 @@
+/**
+ * Test searching and executing DSS services.
+ */
+import openbis from "./lib/openbis/openbis.esm"
+
+exports.default = new Promise((resolve) => {
+    require(["jquery", "underscore", "openbis", "test/openbis-execute-operations", "test/common", "test/dtos"], function (
+        $,
+        _,
+        openbis,
+        openbisExecuteOperations,
+        common,
+        dtos
+    ) {
+        var executeModule = function (moduleName: string, facade: openbis.openbis, dtos: openbis.bundle) {
+            QUnit.module(moduleName)
+
+            var testAction = function (c, fAction, fCheck) {
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        c.ok("Login")
+                        return fAction(facade).then(function (result) {
+                            c.ok("Got results")
+                            var token = fCheck(facade, result)
+                            if (token) {
+                                token.then(function () {
+                                    c.finish()
+                                })
+                            } else {
+                                c.finish()
+                            }
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            }
+
+            var testActionWhichShouldFail = function (c, fAction, errorMessage) {
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        c.ok("Login")
+                        return fAction(facade).then(function (result) {
+                            c.fail("Action supposed to fail")
+                            c.finish()
+                        })
+                    })
+                    .fail(function (error) {
+                        c.ok("Action failed as expected")
+                        c.assertEqual(error.message, errorMessage, "Error message")
+                        c.finish()
+                    })
+            }
+
+            QUnit.test("searchSearchDomainService()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var criteria = new dtos.SearchDomainServiceSearchCriteria()
+                    var fetchOptions = new dtos.SearchDomainServiceFetchOptions()
+                    return facade.searchSearchDomainServices(criteria, fetchOptions)
+                }
+
+                var fCheck = function (facade: openbis.openbis, result: openbis.SearchResult<openbis.SearchDomainService>) {
+                    c.assertEqual(result.getTotalCount(), 4, "Number of results")
+                    c.assertEqual(result.getObjects().length, 4, "Number of results")
+                    var objects = result.getObjects()
+                    objects.sort(function (o1, o2) {
+                        return o1.getPermId().toString().localeCompare(o2.getPermId().toString())
+                    })
+                    c.assertEqual(objects[1].getPermId().toString(), "DSS1:echo-database", "Perm id")
+                    c.assertEqual(objects[1].getName(), "echo-database", "Name")
+                    c.assertEqual(objects[1].getLabel(), "Echo database", "Label")
+                    c.assertEqual(objects[1].getPossibleSearchOptionsKey(), "optionsKey", "Possible searcg option keys")
+                    c.assertEqual(objects[1].getPossibleSearchOptions().toString(), "Alpha [alpha],beta [beta]", "Possible search options")
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+
+            QUnit.test("executeSearchDomainService()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var options = new dtos.SearchDomainServiceExecutionOptions()
+                    options.withPreferredSearchDomain("echo-database")
+                    options.withSearchString("key").withParameter(
+                        "key",
+                        JSON.stringify({
+                            searchDomain: "Echo database",
+                            dataSetCode: "20130415093804724-403",
+                            pathInDataSet: "PATH-2",
+                            sequenceIdentifier: "ID-2",
+                            positionInSequence: "2",
+                        })
+                    )
+                    return facade.executeSearchDomainService(options)
+                }
+
+                var fCheck = function (facade: openbis.openbis, result: openbis.SearchResult<openbis.SearchDomainServiceExecutionResult>) {
+                    c.assertEqual(result.getTotalCount(), 2, "Number of results")
+                    c.assertEqual(result.getObjects().length, 2, "Number of results")
+                    var objects = result.getObjects()
+                    objects.sort(function (o1, o2) {
+                        return o1.getServicePermId().toString().localeCompare(o2.getServicePermId().toString())
+                    })
+                    c.assertEqual(objects[0].getServicePermId().toString(), "DSS1:echo-database", "Service perm id")
+                    c.assertEqual(objects[0].getSearchDomainName(), "echo-database", "Search domain name")
+                    c.assertEqual(objects[0].getSearchDomainLabel(), "Echo database", "Search domain label")
+                    c.assertEqual(objects[0].getEntityIdentifier(), "20130415093804724-403", "Entity identifier")
+                    c.assertEqual(objects[0].getEntityKind(), "DATA_SET", "Entity kind")
+                    c.assertEqual(objects[0].getEntityType(), "UNKNOWN", "Entity type")
+                    c.assertEqual(objects[0].getEntityPermId(), "20130415093804724-403", "Entity perm id")
+                    c.assertEqual(
+                        JSON.stringify(objects[0].getResultDetails()),
+                        JSON.stringify({ identifier: "ID-2", path_in_data_set: "PATH-2", position: "2" }),
+                        "Result details"
+                    )
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+
+            QUnit.test("searchAggregationService()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var criteria = new dtos.AggregationServiceSearchCriteria()
+                    var id = new dtos.DssServicePermId("js-test", new dtos.DataStorePermId("DSS1"))
+                    criteria.withId().thatEquals(id)
+                    var fetchOptions = new dtos.AggregationServiceFetchOptions()
+                    return facade.searchAggregationServices(criteria, fetchOptions)
+                }
+
+                var fCheck = function (facade: openbis.openbis, result: openbis.SearchResult<openbis.AggregationService>) {
+                    c.assertEqual(result.getTotalCount(), 1, "Number of results")
+                    c.assertEqual(result.getObjects().length, 1, "Number of results")
+                    var objects = result.getObjects()
+                    c.assertEqual(objects[0].getPermId().toString(), "DSS1:js-test", "Perm id")
+                    c.assertEqual(objects[0].getName(), "js-test", "Name")
+                    c.assertEqual(objects[0].getLabel(), "js-test", "Label")
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+
+            QUnit.test("executeAggregationService()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var id = new dtos.DssServicePermId("js-test", new dtos.DataStorePermId("DSS1"))
+                    var options = new dtos.AggregationServiceExecutionOptions()
+                    options.withParameter("method", "test")
+                    options.withParameter("answer", 42).withParameter("pi", 3.1415926)
+                    return facade.executeAggregationService(id, options)
+                }
+
+                var fCheck = function (facade: openbis.openbis, tableModel: openbis.TableModel) {
+                    c.assertEqual(tableModel.getColumns().toString(), "key,value", "Table columns")
+                    c.assertEqual(tableModel.getRows().toString(), "method,test,answer,42,pi,3.1415926", "Table rows")
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+
+            QUnit.test("executeAggregationService() with data store code is null", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var id = new dtos.DssServicePermId("js-test", new dtos.DataStorePermId(null))
+                    var options = new dtos.AggregationServiceExecutionOptions()
+                    return facade.executeAggregationService(id, options)
+                }
+
+                testActionWhichShouldFail(c, fAction, "Data store code cannot be empty. (Context: [])")
+            })
+
+            QUnit.test("executeAggregationService() with data store id is null", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var id = new dtos.DssServicePermId("js-test", null)
+                    var options = new dtos.AggregationServiceExecutionOptions()
+                    return facade.executeAggregationService(id, options)
+                }
+
+                testActionWhichShouldFail(c, fAction, "Data store id cannot be null. (Context: [])")
+            })
+
+            QUnit.test("executeAggregationService() with key is null", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var id = new dtos.DssServicePermId(null, new dtos.DataStorePermId("DSS1"))
+                    var options = new dtos.AggregationServiceExecutionOptions()
+                    return facade.executeAggregationService(id, options)
+                }
+
+                testActionWhichShouldFail(c, fAction, "Service key cannot be empty. (Context: [])")
+            })
+
+            QUnit.test("searchReportingService()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var criteria = new dtos.ReportingServiceSearchCriteria()
+                    var id = new dtos.DssServicePermId("test-reporting-service", new dtos.DataStorePermId("DSS1"))
+                    criteria.withId().thatEquals(id)
+                    var fetchOptions = new dtos.ReportingServiceFetchOptions()
+                    return facade.searchReportingServices(criteria, fetchOptions)
+                }
+
+                var fCheck = function (facade: openbis.openbis, result: openbis.SearchResult<openbis.ReportingService>) {
+                    c.assertEqual(result.getTotalCount(), 1, "Number of results")
+                    c.assertEqual(result.getObjects().length, 1, "Number of results")
+                    var objects = result.getObjects()
+                    c.assertEqual(objects[0].getPermId().toString(), "DSS1:test-reporting-service", "Perm id")
+                    c.assertEqual(objects[0].getName(), "test-reporting-service", "Name")
+                    c.assertEqual(objects[0].getLabel(), "Test Jython Reporting", "Label")
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+
+            QUnit.test("executeReportingService()", function (assert) {
+                var c = new common(assert, dtos)
+                var dataSetCode
+
+                var fAction = function (facade: openbis.openbis) {
+                    return $.when(c.createDataSet(facade)).then(function (permId) {
+                        dataSetCode = permId.getPermId()
+                        var serviceId = new dtos.DssServicePermId("test-reporting-service", new dtos.DataStorePermId("DSS1"))
+                        var options = new dtos.ReportingServiceExecutionOptions()
+                        options.withDataSets(dataSetCode)
+                        return facade.executeReportingService(serviceId, options)
+                    })
+                }
+
+                var fCheck = function (facade: openbis.openbis, tableModel: openbis.TableModel) {
+                    c.assertEqual(tableModel.getColumns().toString(), "Data Set,Data Set Type", "Table columns")
+                    c.assertEqual(tableModel.getRows().toString(), dataSetCode + ",ALIGNMENT", "Table rows")
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+
+            QUnit.test("searchProcessingService()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var criteria = new dtos.ProcessingServiceSearchCriteria()
+                    var id = new dtos.DssServicePermId("test-processing-service", new dtos.DataStorePermId("DSS1"))
+                    criteria.withId().thatEquals(id)
+                    var fetchOptions = new dtos.ProcessingServiceFetchOptions()
+                    return facade.searchProcessingServices(criteria, fetchOptions)
+                }
+
+                var fCheck = function (facade: openbis.openbis, result: openbis.SearchResult<openbis.ProcessingService>) {
+                    c.assertEqual(result.getTotalCount(), 1, "Number of results")
+                    c.assertEqual(result.getObjects().length, 1, "Number of results")
+                    var objects = result.getObjects()
+                    c.assertEqual(objects[0].getPermId().toString(), "DSS1:test-processing-service", "Perm id")
+                    c.assertEqual(objects[0].getName(), "test-processing-service", "Name")
+                    c.assertEqual(objects[0].getLabel(), "Test Jython Processing", "Label")
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+
+            QUnit.test("executeProcessingService()", function (assert) {
+                var c = new common(assert, dtos)
+                var dataSetCode
+
+                var fAction = function (facade: openbis.openbis) {
+                    return $.when(c.createDataSet(facade)).then(function (permId) {
+                        dataSetCode = permId.getPermId()
+                        var serviceId = new dtos.DssServicePermId("test-processing-service", new dtos.DataStorePermId("DSS1"))
+                        var options = new dtos.ProcessingServiceExecutionOptions()
+                        options.withDataSets([dataSetCode])
+                        return facade.executeProcessingService(serviceId, options)
+                    })
+                }
+
+                var fCheck = function (facade: openbis.openbis) {
+                    return $.when(
+                        c.waitUntilEmailWith(facade, dataSetCode, 10000).then(function (emails) {
+                            c.assertEqual(emails[0][0].value, "franz-josef.elmer@systemsx.ch", "Email To")
+                            c.assertEqual(
+                                emails[0][1].value,
+                                "'Test Jython Processing' [test-processing-service] processing\n finished",
+                                "Email Subject"
+                            )
+                            c.assertContains(emails[0][2].value, dataSetCode, "Email Content with data set " + dataSetCode)
+                        })
+                    )
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+        }
+
+        resolve(function () {
+            executeModule("DSS service tests (RequireJS)", new openbis(), dtos)
+            executeModule("DSS service tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos)
+            executeModule("DSS service tests (module VAR)", new window.openbis.openbis(), window.openbis)
+            executeModule(
+                "DSS service tests (module VAR - executeOperations)",
+                new openbisExecuteOperations(new window.openbis.openbis(), window.openbis),
+                window.openbis
+            )
+            executeModule("DSS service tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM)
+            executeModule(
+                "DSS service tests (module ESM - executeOperations)",
+                new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM),
+                window.openbisESM
+            )
+        })
+    })
+})
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-evaluate.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-evaluate.js
deleted file mode 100644
index b84e07c3c16110740975b7b9256f6964b46ae034..0000000000000000000000000000000000000000
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-evaluate.js
+++ /dev/null
@@ -1,139 +0,0 @@
-define([
-  "jquery",
-  "underscore",
-  "openbis",
-  "test/openbis-execute-operations",
-  "test/common",
-  "test/dtos"
-], function ($, _, openbis, openbisExecuteOperations, common, dtos) {
-  var executeModule = function (moduleName, facade, dtos) {
-    QUnit.module(moduleName);
-
-    var testDynamicPropertyPlugin = function (assert, databasePlugin) {
-      var c = new common(assert, dtos);
-      c.start();
-
-      c.login(facade)
-        .then(function () {
-          var creation = new dtos.PluginCreation();
-          creation.setName(c.generateId("plugin"));
-          creation.setPluginType(dtos.PluginType.DYNAMIC_PROPERTY);
-          creation.setScript("def calculate():\n  return 'testValue'");
-
-          return $.when(
-            facade.createPlugins([creation]),
-            c.createSample(facade)
-          ).then(function (pluginIds, sampleId) {
-            var options = new dtos.DynamicPropertyPluginEvaluationOptions();
-            if (databasePlugin) {
-              options.setPluginId(pluginIds[0]);
-            } else {
-              options.setPluginScript(creation.getScript());
-            }
-            options.setObjectId(sampleId);
-
-            return facade.evaluatePlugin(options).then(function (result) {
-              c.assertEqual(
-                result.getValue(),
-                "testValue",
-                "Evaluation result value"
-              );
-              c.finish();
-            });
-          });
-        })
-        .fail(function (error) {
-          c.fail(error.message);
-          c.finish();
-        });
-    };
-
-    var testEntityValidationPlugin = function (assert, databasePlugin) {
-      var c = new common(assert, dtos);
-      c.start();
-
-      c.login(facade)
-        .then(function () {
-          var creation = new dtos.PluginCreation();
-          creation.setName(c.generateId("plugin"));
-          creation.setPluginType(dtos.PluginType.ENTITY_VALIDATION);
-          creation.setScript(
-            "def validate(entity, isNew):\n  requestValidation(entity)\n  if isNew:\n    return 'testError'\n  else:\n    return None"
-          );
-
-          return $.when(
-            facade.createPlugins([creation]),
-            c.createSample(facade)
-          ).then(function (pluginIds, sampleId) {
-            var options = new dtos.EntityValidationPluginEvaluationOptions();
-            if (databasePlugin) {
-              options.setPluginId(pluginIds[0]);
-            } else {
-              options.setPluginScript(creation.getScript());
-            }
-            options.setNew(true);
-            options.setObjectId(sampleId);
-
-            return $.when(
-              facade.evaluatePlugin(options),
-              c.findSample(facade, sampleId)
-            ).then(function (result, sample) {
-              c.assertEqual(
-                result.getError(),
-                "testError",
-                "Evaluation result error"
-              );
-              c.assertObjectsWithValues(
-                result.getRequestedValidations(),
-                "identifier",
-                [sample.getIdentifier().getIdentifier()]
-              );
-
-              c.finish();
-            });
-          });
-        })
-        .fail(function (error) {
-          c.fail(error.message);
-          c.finish();
-        });
-    };
-
-    QUnit.test(
-      "evaluatePlugin() dynamic property plugin from database",
-      function (assert) {
-        return testDynamicPropertyPlugin(assert, true);
-      }
-    );
-
-    QUnit.test(
-      "evaluatePlugin() dynamic property plugin from script",
-      function (assert) {
-        return testDynamicPropertyPlugin(assert, false);
-      }
-    );
-
-    QUnit.test(
-      "evaluatePlugin() entity validation plugin from database",
-      function (assert) {
-        return testEntityValidationPlugin(assert, true);
-      }
-    );
-
-    QUnit.test(
-      "evaluatePlugin() entity validation plugin from script",
-      function (assert) {
-        return testEntityValidationPlugin(assert, false);
-      }
-    );
-  };
-
-  return function () {
-    executeModule("Evaluate tests (RequireJS)", new openbis(), dtos);
-    executeModule("Evaluate tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos);
-    executeModule("Evaluate tests (module VAR)", new window.openbis.openbis(), window.openbis);
-    executeModule("Evaluate tests (module VAR - executeOperations)", new openbisExecuteOperations(new window.openbis.openbis(), window.openbis), window.openbis);
-    executeModule("Evaluate tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM);
-    executeModule("Evaluate tests (module ESM - executeOperations)", new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM), window.openbisESM);
-  };
-});
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-evaluate.ts b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-evaluate.ts
new file mode 100644
index 0000000000000000000000000000000000000000..17366ad4d957272b0fed83aaa6575f926361e0c5
--- /dev/null
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-evaluate.ts
@@ -0,0 +1,122 @@
+import openbis from "./lib/openbis/openbis.esm"
+
+exports.default = new Promise((resolve) => {
+    require(["jquery", "underscore", "openbis", "test/openbis-execute-operations", "test/common", "test/dtos"], function (
+        $,
+        _,
+        openbis,
+        openbisExecuteOperations,
+        common,
+        dtos
+    ) {
+        var executeModule = function (moduleName: string, facade: openbis.openbis, dtos: openbis.bundle) {
+            QUnit.module(moduleName)
+
+            var testDynamicPropertyPlugin = function (assert, databasePlugin) {
+                var c = new common(assert, dtos)
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        var creation = new dtos.PluginCreation()
+                        creation.setName(c.generateId("plugin"))
+                        creation.setPluginType(dtos.PluginType.DYNAMIC_PROPERTY)
+                        creation.setScript("def calculate():\n  return 'testValue'")
+
+                        return $.when(facade.createPlugins([creation]), c.createSample(facade)).then(function (pluginIds, sampleId) {
+                            var options = new dtos.DynamicPropertyPluginEvaluationOptions()
+                            if (databasePlugin) {
+                                options.setPluginId(pluginIds[0])
+                            } else {
+                                options.setPluginScript(creation.getScript())
+                            }
+                            options.setObjectId(sampleId)
+
+                            return facade.evaluatePlugin(options).then(function (result) {
+                                c.assertEqual(
+                                    (<openbis.DynamicPropertyPluginEvaluationResult>result).getValue(),
+                                    "testValue",
+                                    "Evaluation result value"
+                                )
+                                c.finish()
+                            })
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            }
+
+            var testEntityValidationPlugin = function (assert, databasePlugin) {
+                var c = new common(assert, dtos)
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        var creation = new dtos.PluginCreation()
+                        creation.setName(c.generateId("plugin"))
+                        creation.setPluginType(dtos.PluginType.ENTITY_VALIDATION)
+                        creation.setScript(
+                            "def validate(entity, isNew):\n  requestValidation(entity)\n  if isNew:\n    return 'testError'\n  else:\n    return None"
+                        )
+
+                        return $.when(facade.createPlugins([creation]), c.createSample(facade)).then(function (pluginIds, sampleId) {
+                            var options = new dtos.EntityValidationPluginEvaluationOptions()
+                            if (databasePlugin) {
+                                options.setPluginId(pluginIds[0])
+                            } else {
+                                options.setPluginScript(creation.getScript())
+                            }
+                            options.setNew(true)
+                            options.setObjectId(sampleId)
+
+                            return $.when(facade.evaluatePlugin(options), c.findSample(facade, sampleId)).then(function (result, sample) {
+                                c.assertEqual(result.getError(), "testError", "Evaluation result error")
+                                c.assertObjectsWithValues(result.getRequestedValidations(), "identifier", [sample.getIdentifier().getIdentifier()])
+
+                                c.finish()
+                            })
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            }
+
+            QUnit.test("evaluatePlugin() dynamic property plugin from database", function (assert) {
+                return testDynamicPropertyPlugin(assert, true)
+            })
+
+            QUnit.test("evaluatePlugin() dynamic property plugin from script", function (assert) {
+                return testDynamicPropertyPlugin(assert, false)
+            })
+
+            QUnit.test("evaluatePlugin() entity validation plugin from database", function (assert) {
+                return testEntityValidationPlugin(assert, true)
+            })
+
+            QUnit.test("evaluatePlugin() entity validation plugin from script", function (assert) {
+                return testEntityValidationPlugin(assert, false)
+            })
+        }
+
+        resolve(function () {
+            executeModule("Evaluate tests (RequireJS)", new openbis(), dtos)
+            executeModule("Evaluate tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos)
+            executeModule("Evaluate tests (module VAR)", new window.openbis.openbis(), window.openbis)
+            executeModule(
+                "Evaluate tests (module VAR - executeOperations)",
+                new openbisExecuteOperations(new window.openbis.openbis(), window.openbis),
+                window.openbis
+            )
+            executeModule("Evaluate tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM)
+            executeModule(
+                "Evaluate tests (module ESM - executeOperations)",
+                new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM),
+                window.openbisESM
+            )
+        })
+    })
+})
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-execute.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-execute.js
deleted file mode 100644
index 75964c52734cf750f450e951d3dbef5c4a6ae23c..0000000000000000000000000000000000000000
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-execute.js
+++ /dev/null
@@ -1,72 +0,0 @@
-define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', 'test/common', 'test/dtos' ], function($, _, openbis, openbisExecuteOperations, common, dtos) {
-	var executeModule = function(moduleName, facade, dtos) {
-		QUnit.module(moduleName);
-
-		QUnit.test("executeQuery()", function(assert) {
-			var c = new common(assert, dtos);
-			c.start();
-
-			c.login(facade).then(function() {
-				var creation = new dtos.QueryCreation();
-				creation.setName(c.generateId("query"));
-				creation.setDatabaseId(new dtos.QueryDatabaseName("openbisDB"));
-				creation.setQueryType(dtos.QueryType.GENERIC);
-				creation.setSql("select perm_id, code from projects where perm_id = ${perm_id}");
-
-				return facade.createQueries([ creation ]).then(function(techIds) {
-					var options = new dtos.QueryExecutionOptions();
-					options.withParameter("perm_id", "20130412150031345-203");
-
-					return facade.executeQuery(techIds[0], options).then(function(table) {
-						c.assertEqual(table.getColumns().length, 2, "Columns count");
-						c.assertEqual(table.getColumns()[0].title, "perm_id", "Column[0] title");
-						c.assertEqual(table.getColumns()[1].title, "code", "Column[1] title");
-						c.assertEqual(table.getRows().length, 1, "Rows count");
-						c.assertEqual(table.getRows()[0][0].value, "20130412150031345-203", "Value[0][0]");
-						c.assertEqual(table.getRows()[0][1].value, "TEST-PROJECT", "Value[0][1]");
-
-						c.finish();
-					});
-				});
-			}).fail(function(error) {
-				c.fail(error.message);
-				c.finish();
-			});
-		});
-
-		QUnit.test("executeSql()", function(assert) {
-			var c = new common(assert, dtos);
-			c.start();
-
-			c.login(facade).then(function() {
-				var options = new dtos.SqlExecutionOptions();
-				options.withDatabaseId(new dtos.QueryDatabaseName("openbisDB"));
-				options.withParameter("perm_id", "20130412150031345-203");
-
-				return facade.executeSql("select perm_id, code from projects where perm_id = ${perm_id}", options).then(function(table) {
-					c.assertEqual(table.getColumns().length, 2, "Columns count");
-					c.assertEqual(table.getColumns()[0].title, "perm_id", "Column[0] title");
-					c.assertEqual(table.getColumns()[1].title, "code", "Column[1] title");
-					c.assertEqual(table.getRows().length, 1, "Rows count");
-					c.assertEqual(table.getRows()[0][0].value, "20130412150031345-203", "Value[0][0]");
-					c.assertEqual(table.getRows()[0][1].value, "TEST-PROJECT", "Value[0][1]");
-
-					c.finish();
-				});
-			}).fail(function(error) {
-				c.fail(error.message);
-				c.finish();
-			});
-		});
-
-	}
-
-	return function() {
-		executeModule("Execute tests (RequireJS)", new openbis(), dtos);
-		executeModule("Execute tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos);
-		executeModule("Execute tests (module VAR)", new window.openbis.openbis(), window.openbis);
-		executeModule("Execute tests (module VAR - executeOperations)", new openbisExecuteOperations(new window.openbis.openbis(), window.openbis), window.openbis);
-		executeModule("Execute tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM);
-		executeModule("Execute tests (module ESM - executeOperations)", new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM), window.openbisESM);
-	}
-});
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-execute.ts b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-execute.ts
new file mode 100644
index 0000000000000000000000000000000000000000..582d518f9b1eb6533f2f187f48d6e36f84622c1b
--- /dev/null
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-execute.ts
@@ -0,0 +1,94 @@
+import openbis from "./lib/openbis/openbis.esm"
+
+exports.default = new Promise((resolve) => {
+    require(["jquery", "underscore", "openbis", "test/openbis-execute-operations", "test/common", "test/dtos"], function (
+        $,
+        _,
+        openbis,
+        openbisExecuteOperations,
+        common,
+        dtos
+    ) {
+        var executeModule = function (moduleName: string, facade: openbis.openbis, dtos: openbis.bundle) {
+            QUnit.module(moduleName)
+
+            QUnit.test("executeQuery()", function (assert) {
+                var c = new common(assert, dtos)
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        var creation = new dtos.QueryCreation()
+                        creation.setName(c.generateId("query"))
+                        creation.setDatabaseId(new dtos.QueryDatabaseName("openbisDB"))
+                        creation.setQueryType(dtos.QueryType.GENERIC)
+                        creation.setSql("select perm_id, code from projects where perm_id = ${perm_id}")
+
+                        return facade.createQueries([creation]).then(function (techIds) {
+                            var options = new dtos.QueryExecutionOptions()
+                            options.withParameter("perm_id", "20130412150031345-203")
+
+                            return facade.executeQuery(techIds[0], options).then(function (table) {
+                                c.assertEqual(table.getColumns().length, 2, "Columns count")
+                                c.assertEqual(table.getColumns()[0].getTitle(), "perm_id", "Column[0] title")
+                                c.assertEqual(table.getColumns()[1].getTitle(), "code", "Column[1] title")
+                                c.assertEqual(table.getRows().length, 1, "Rows count")
+                                c.assertEqual((<openbis.TableStringCell>table.getRows()[0][0]).getValue(), "20130412150031345-203", "Value[0][0]")
+                                c.assertEqual((<openbis.TableStringCell>table.getRows()[0][1]).getValue(), "TEST-PROJECT", "Value[0][1]")
+
+                                c.finish()
+                            })
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            })
+
+            QUnit.test("executeSql()", function (assert) {
+                var c = new common(assert, dtos)
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        var options = new dtos.SqlExecutionOptions()
+                        options.withDatabaseId(new dtos.QueryDatabaseName("openbisDB"))
+                        options.withParameter("perm_id", "20130412150031345-203")
+
+                        return facade.executeSql("select perm_id, code from projects where perm_id = ${perm_id}", options).then(function (table) {
+                            c.assertEqual(table.getColumns().length, 2, "Columns count")
+                            c.assertEqual(table.getColumns()[0].getTitle(), "perm_id", "Column[0] title")
+                            c.assertEqual(table.getColumns()[1].getTitle(), "code", "Column[1] title")
+                            c.assertEqual(table.getRows().length, 1, "Rows count")
+                            c.assertEqual((<openbis.TableStringCell>table.getRows()[0][0]).getValue(), "20130412150031345-203", "Value[0][0]")
+                            c.assertEqual((<openbis.TableStringCell>table.getRows()[0][1]).getValue(), "TEST-PROJECT", "Value[0][1]")
+
+                            c.finish()
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            })
+        }
+
+        resolve(function () {
+            executeModule("Execute tests (RequireJS)", new openbis(), dtos)
+            executeModule("Execute tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos)
+            executeModule("Execute tests (module VAR)", new window.openbis.openbis(), window.openbis)
+            executeModule(
+                "Execute tests (module VAR - executeOperations)",
+                new openbisExecuteOperations(new window.openbis.openbis(), window.openbis),
+                window.openbis
+            )
+            executeModule("Execute tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM)
+            executeModule(
+                "Execute tests (module ESM - executeOperations)",
+                new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM),
+                window.openbisESM
+            )
+        })
+    })
+})
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-freezing.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-freezing.js
deleted file mode 100644
index 09cacd4a70cd996f1f4096207f6ceaa5c3a63314..0000000000000000000000000000000000000000
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-freezing.js
+++ /dev/null
@@ -1,251 +0,0 @@
-define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', 'test/common', 'test/dtos' ], function($, _, openbis, openbisExecuteOperations, common, dtos) {
-	var executeModule = function(moduleName, facade, dtos) {
-		QUnit.module(moduleName);
-
-		var testUpdate = function(c, entityKind, fCreate, fUpdate, fFind, freezings) {
-			c.start();
-
-			var ctx = {
-				facade : null,
-				permIds : null,
-				freezingMethodsByPermIds : {}
-			};
-			
-			c.login(facade).then(function() {
-				ctx.facade = facade;
-				var codePrefix = c.generateId(entityKind);
-				var codes = [];
-				$.each(Object.keys(freezings), function(index, method) {
-					codes.push(codePrefix + "-" + method);
-				});
-				return fCreate(facade, codes);
-			}).then(function(permIds) {
-				c.ok("Entities created: " + permIds);
-				ctx.permIds = permIds;
-				$.each(Object.keys(freezings), function(index, method) {
-					ctx.freezingMethodsByPermIds[permIds[index].getPermId()] = method;
-				});
-				return fUpdate(ctx.facade, ctx.freezingMethodsByPermIds);
-			}).then(function() {
-				c.ok("Entities frozen: " + ctx.permIds);
-				return fFind(ctx.facade, ctx.permIds);
-			}).then(function(entities) {
-				$.each(ctx.freezingMethodsByPermIds, function(permId, method) {
-					var entity = entities[permId];
-					$.each(freezings[method], function(flagName, expectedValue) {
-						var m = "is" + flagName.charAt(0).toUpperCase() + flagName.slice(1);
-						c.assertEqual(entity[m](), expectedValue, entity.getCode() + ": " + flagName);
-					});
-				});
-				c.finish();
-			}).fail(function(error) {
-				c.fail(error.message);
-				c.finish();
-			});
-		}
-
-		QUnit.test("freeze spaces()", function(assert) {
-			var c = new common(assert, dtos);
-
-			var fCreate = function(facade, codes) {
-				var creations = [];
-				$.each(codes, function(index, code) {
-					var creation = new dtos.SpaceCreation();
-					creation.setCode(code);
-					creations.push(creation);
-				});
-				return facade.createSpaces(creations);
-			}
-			
-			var fUpdate = function(facade, freezingMethodsByPermIds) {
-				var updates = [];
-				$.each(freezingMethodsByPermIds, function(permId, method) {
-					var update = new dtos.SpaceUpdate();
-					update.setSpaceId(new dtos.SpacePermId(permId));
-					update[method]();
-					updates.push(update);
-				});
-				return facade.updateSpaces(updates);
-			}
-			
-			var fFind = function(facade, permIds) {
-				return facade.getSpaces(permIds, c.createSpaceFetchOptions());
-			}
-			
-
-			testUpdate(c, "SPACE", fCreate, fUpdate, fFind, 
-					{"freeze" : {"frozen" : true, "frozenForProjects" : false, "frozenForSamples" : false},
-					 "freezeForProjects" : {"frozen" : true, "frozenForProjects" : true, "frozenForSamples" : false},
-					 "freezeForSamples" : {"frozen" : true, "frozenForProjects" : false, "frozenForSamples" : true}
-					});
-	});
-	
-	QUnit.test("freeze projects()", function(assert) {
-		var c = new common(assert, dtos);
-		
-		var fCreate = function(facade, codes) {
-			var creations = [];
-			$.each(codes, function(index, code) {
-				var creation = new dtos.ProjectCreation();
-				creation.setSpaceId(new dtos.SpacePermId("TEST"));
-				creation.setCode(code);
-				creations.push(creation);
-			});
-			return facade.createProjects(creations);
-		}
-		
-		var fUpdate = function(facade, freezingMethodsByPermIds) {
-			var updates = [];
-			$.each(freezingMethodsByPermIds, function(permId, method) {
-				var update = new dtos.ProjectUpdate();
-				update.setProjectId(new dtos.ProjectPermId(permId));
-				update[method]();
-				updates.push(update);
-			});
-			return facade.updateProjects(updates);
-		}
-		
-		var fFind = function(facade, permIds) {
-			return facade.getProjects(permIds, c.createProjectFetchOptions());
-		}
-		
-		testUpdate(c, "PROJECT", fCreate, fUpdate, fFind, 
-				{"freeze" : {"frozen" : true, "frozenForExperiments" : false, "frozenForSamples" : false},
-				 "freezeForExperiments" : {"frozen" : true, "frozenForExperiments" : true, "frozenForSamples" : false},
-				 "freezeForSamples" : {"frozen" : true, "frozenForExperiments" : false, "frozenForSamples" : true}
-				});
-	});
-	
-	QUnit.test("freeze experiments()", function(assert) {
-		var c = new common(assert, dtos);
-		
-		var fCreate = function(facade, codes) {
-			var creations = [];
-			$.each(codes, function(index, code) {
-				var creation = new dtos.ExperimentCreation();
-				creation.setCode(code);
-				creation.setTypeId(new dtos.EntityTypePermId("HT_SEQUENCING"));
-				creation.setProjectId(new dtos.ProjectIdentifier("/TEST/TEST-PROJECT"));
-				creations.push(creation);
-			});
-			return facade.createExperiments(creations);
-		}
-		
-		var fUpdate = function(facade, freezingMethodsByPermIds) {
-			var updates = [];
-			$.each(freezingMethodsByPermIds, function(permId, method) {
-				var update = new dtos.ExperimentUpdate();
-				update.setExperimentId(new dtos.ExperimentPermId(permId));
-				update[method]();
-				updates.push(update);
-			});
-			return facade.updateExperiments(updates);
-		}
-		
-		var fFind = function(facade, permIds) {
-			return facade.getExperiments(permIds, c.createExperimentFetchOptions());
-		}
-		
-		testUpdate(c, "EXPERIMENT", fCreate, fUpdate, fFind, 
-				{"freeze" : {"frozen" : true, "frozenForDataSets" : false, "frozenForSamples" : false},
-				 "freezeForDataSets" : {"frozen" : true, "frozenForDataSets" : true, "frozenForSamples" : false},
-				 "freezeForSamples" : {"frozen" : true, "frozenForDataSets" : false, "frozenForSamples" : true}
-				});
-	});
-	
-	QUnit.test("freeze samples()", function(assert) {
-		var c = new common(assert, dtos);
-		
-		var fCreate = function(facade, codes) {
-			var creations = [];
-			$.each(codes, function(index, code) {
-				var creation = new dtos.SampleCreation();
-				creation.setSpaceId(new dtos.SpacePermId("TEST"));
-				creation.setCode(code);
-				creation.setTypeId(new dtos.EntityTypePermId("UNKNOWN"));
-				creations.push(creation);
-			});
-			return facade.createSamples(creations);
-		}
-		
-		var fUpdate = function(facade, freezingMethodsByPermIds) {
-			var updates = [];
-			$.each(freezingMethodsByPermIds, function(permId, method) {
-				var update = new dtos.SampleUpdate();
-				update.setSampleId(new dtos.SamplePermId(permId));
-				update[method]();
-				updates.push(update);
-			});
-			return facade.updateSamples(updates);
-		}
-		
-		var fFind = function(facade, permIds) {
-			return facade.getSamples(permIds, c.createSampleFetchOptions());
-		}
-		
-		testUpdate(c, "SAMPLE", fCreate, fUpdate, fFind, 
-				{"freeze" : {"frozen" : true, "frozenForDataSets" : false, "frozenForComponents" : false, 
-							 "frozenForChildren" : false, "frozenForParents" : false},
-				 "freezeForDataSets" : {"frozen" : true, "frozenForDataSets" : true, "frozenForComponents" : false, 
-					 					"frozenForChildren" : false, "frozenForParents" : false},
-				 "freezeForComponents" : {"frozen" : true, "frozenForDataSets" : false, "frozenForComponents" : true, 
-					 					  "frozenForChildren" : false, "frozenForParents" : false},
-				 "freezeForChildren" : {"frozen" : true, "frozenForDataSets" : false, "frozenForComponents" : false, 
-					 					"frozenForChildren" : true, "frozenForParents" : false},
-				 "freezeForParents" : {"frozen" : true, "frozenForDataSets" : false, "frozenForComponents" : false, 
-					 				   "frozenForChildren" : false, "frozenForParents" : true}
-				});
-	});
-	
-	QUnit.test("freeze data sets()", function(assert) {
-		var c = new common(assert, dtos);
-		
-		var fCreate = function(facade, codes) {
-			var creations = [];
-			$.each(codes, function(index, code) {
-				creations.push(c.createDataSet(facade, "UNKNOWN"));
-			});
-			return $.when.apply($, creations).then(function(){
-				return Array.prototype.slice.call(arguments);
-			});
-		}
-		
-		var fUpdate = function(facade, freezingMethodsByPermIds) {
-			var updates = [];
-			$.each(freezingMethodsByPermIds, function(permId, method) {
-				var update = new dtos.DataSetUpdate();
-				update.setDataSetId(new dtos.DataSetPermId(permId));
-				update[method]();
-				updates.push(update);
-			});
-			return facade.updateDataSets(updates);
-		}
-		
-		var fFind = function(facade, permIds) {
-			return facade.getDataSets(permIds, c.createDataSetFetchOptions());
-		}
-		
-		testUpdate(c, "DATA_SET", fCreate, fUpdate, fFind, 
-				{"freeze" : {"frozen" : true, "frozenForContainers" : false, "frozenForComponents" : false, 
-							 "frozenForChildren" : false, "frozenForParents" : false},
-				 "freezeForContainers" : {"frozen" : true, "frozenForContainers" : true, "frozenForComponents" : false, 
-										  "frozenForChildren" : false, "frozenForParents" : false},
-				 "freezeForComponents" : {"frozen" : true, "frozenForContainers" : false, "frozenForComponents" : true, 
-										  "frozenForChildren" : false, "frozenForParents" : false},
-				 "freezeForChildren" : {"frozen" : true, "frozenForContainers" : false, "frozenForComponents" : false, 
-										"frozenForChildren" : true, "frozenForParents" : false},
-				 "freezeForParents" : {"frozen" : true, "frozenForContainers" : false, "frozenForComponents" : false, 
-									   "frozenForChildren" : false, "frozenForParents" : true}
-				});
-	});
-}
-
-	return function() {
-		executeModule("Freezing tests (RequireJS)", new openbis(), dtos);
-		executeModule("Freezing tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos);
-		executeModule("Freezing tests (module VAR)", new window.openbis.openbis(), window.openbis);
-		executeModule("Freezing tests (module VAR - executeOperations)", new openbisExecuteOperations(new window.openbis.openbis(), window.openbis), window.openbis);
-		executeModule("Freezing tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM);
-		executeModule("Freezing tests (module ESM - executeOperations)", new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM), window.openbisESM);
-	}
-});
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-freezing.ts b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-freezing.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1fb67c443ecb76283b5fe18c7738d97d710f7d07
--- /dev/null
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-freezing.ts
@@ -0,0 +1,318 @@
+import openbis from "./lib/openbis/openbis.esm"
+
+exports.default = new Promise((resolve) => {
+    require(["jquery", "underscore", "openbis", "test/openbis-execute-operations", "test/common", "test/dtos"], function (
+        $,
+        _,
+        openbis,
+        openbisExecuteOperations,
+        common,
+        dtos
+    ) {
+        var executeModule = function (moduleName: string, facade: openbis.openbis, dtos: openbis.bundle) {
+            QUnit.module(moduleName)
+
+            var testUpdate = function (c, entityKind, fCreate, fUpdate, fFind, freezings) {
+                c.start()
+
+                var ctx = {
+                    facade: null,
+                    permIds: null,
+                    freezingMethodsByPermIds: {},
+                }
+
+                c.login(facade)
+                    .then(function () {
+                        ctx.facade = facade
+                        var codePrefix = c.generateId(entityKind)
+                        var codes = []
+                        $.each(Object.keys(freezings), function (index, method) {
+                            codes.push(codePrefix + "-" + method)
+                        })
+                        return fCreate(facade, codes)
+                    })
+                    .then(function (permIds) {
+                        c.ok("Entities created: " + permIds)
+                        ctx.permIds = permIds
+                        $.each(Object.keys(freezings), function (index, method) {
+                            ctx.freezingMethodsByPermIds[permIds[index].getPermId()] = method
+                        })
+                        return fUpdate(ctx.facade, ctx.freezingMethodsByPermIds)
+                    })
+                    .then(function () {
+                        c.ok("Entities frozen: " + ctx.permIds)
+                        return fFind(ctx.facade, ctx.permIds)
+                    })
+                    .then(function (entities) {
+                        $.each(ctx.freezingMethodsByPermIds, function (permId, method) {
+                            var entity = entities[permId]
+                            $.each(freezings[method], function (flagName, expectedValue) {
+                                var m = "is" + flagName.charAt(0).toUpperCase() + flagName.slice(1)
+                                c.assertEqual(entity[m](), expectedValue, entity.getCode() + ": " + flagName)
+                            })
+                        })
+                        c.finish()
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            }
+
+            QUnit.test("freeze spaces()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fCreate = function (facade: openbis.openbis, codes: string[]) {
+                    var creations: openbis.SpaceCreation[] = []
+                    $.each(codes, function (index: number, code: string) {
+                        var creation = new dtos.SpaceCreation()
+                        creation.setCode(code)
+                        creations.push(creation)
+                    })
+                    return facade.createSpaces(creations)
+                }
+
+                var fUpdate = function (facade: openbis.openbis, freezingMethodsByPermIds: { [index: string]: string }) {
+                    var updates: openbis.SpaceUpdate[] = []
+                    $.each(freezingMethodsByPermIds, function (permId: string, method: string) {
+                        var update = new dtos.SpaceUpdate()
+                        update.setSpaceId(new dtos.SpacePermId(permId))
+                        update[method]()
+                        updates.push(update)
+                    })
+                    return facade.updateSpaces(updates)
+                }
+
+                var fFind = function (facade: openbis.openbis, permIds: openbis.SpacePermId[]) {
+                    return facade.getSpaces(permIds, c.createSpaceFetchOptions())
+                }
+
+                testUpdate(c, "SPACE", fCreate, fUpdate, fFind, {
+                    freeze: { frozen: true, frozenForProjects: false, frozenForSamples: false },
+                    freezeForProjects: { frozen: true, frozenForProjects: true, frozenForSamples: false },
+                    freezeForSamples: { frozen: true, frozenForProjects: false, frozenForSamples: true },
+                })
+            })
+
+            QUnit.test("freeze projects()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fCreate = function (facade: openbis.openbis, codes: string[]) {
+                    var creations = []
+                    $.each(codes, function (index: number, code: string) {
+                        var creation = new dtos.ProjectCreation()
+                        creation.setSpaceId(new dtos.SpacePermId("TEST"))
+                        creation.setCode(code)
+                        creations.push(creation)
+                    })
+                    return facade.createProjects(creations)
+                }
+
+                var fUpdate = function (facade: openbis.openbis, freezingMethodsByPermIds: { [index: string]: string }) {
+                    var updates: openbis.ProjectUpdate[] = []
+                    $.each(freezingMethodsByPermIds, function (permId: string, method: string) {
+                        var update = new dtos.ProjectUpdate()
+                        update.setProjectId(new dtos.ProjectPermId(permId))
+                        update[method]()
+                        updates.push(update)
+                    })
+                    return facade.updateProjects(updates)
+                }
+
+                var fFind = function (facade: openbis.openbis, permIds: openbis.ProjectPermId[]) {
+                    return facade.getProjects(permIds, c.createProjectFetchOptions())
+                }
+
+                testUpdate(c, "PROJECT", fCreate, fUpdate, fFind, {
+                    freeze: { frozen: true, frozenForExperiments: false, frozenForSamples: false },
+                    freezeForExperiments: { frozen: true, frozenForExperiments: true, frozenForSamples: false },
+                    freezeForSamples: { frozen: true, frozenForExperiments: false, frozenForSamples: true },
+                })
+            })
+
+            QUnit.test("freeze experiments()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fCreate = function (facade: openbis.openbis, codes: string[]) {
+                    var creations: openbis.ExperimentCreation[] = []
+                    $.each(codes, function (index: number, code: string) {
+                        var creation = new dtos.ExperimentCreation()
+                        creation.setCode(code)
+                        creation.setTypeId(new dtos.EntityTypePermId("HT_SEQUENCING"))
+                        creation.setProjectId(new dtos.ProjectIdentifier("/TEST/TEST-PROJECT"))
+                        creations.push(creation)
+                    })
+                    return facade.createExperiments(creations)
+                }
+
+                var fUpdate = function (facade: openbis.openbis, freezingMethodsByPermIds: { [index: string]: string }) {
+                    var updates: openbis.ExperimentUpdate[] = []
+                    $.each(freezingMethodsByPermIds, function (permId: string, method: string) {
+                        var update = new dtos.ExperimentUpdate()
+                        update.setExperimentId(new dtos.ExperimentPermId(permId))
+                        update[method]()
+                        updates.push(update)
+                    })
+                    return facade.updateExperiments(updates)
+                }
+
+                var fFind = function (facade: openbis.openbis, permIds: openbis.ExperimentPermId[]) {
+                    return facade.getExperiments(permIds, c.createExperimentFetchOptions())
+                }
+
+                testUpdate(c, "EXPERIMENT", fCreate, fUpdate, fFind, {
+                    freeze: { frozen: true, frozenForDataSets: false, frozenForSamples: false },
+                    freezeForDataSets: { frozen: true, frozenForDataSets: true, frozenForSamples: false },
+                    freezeForSamples: { frozen: true, frozenForDataSets: false, frozenForSamples: true },
+                })
+            })
+
+            QUnit.test("freeze samples()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fCreate = function (facade: openbis.openbis, codes: string[]) {
+                    var creations: openbis.SampleCreation[] = []
+                    $.each(codes, function (index: number, code: string) {
+                        var creation = new dtos.SampleCreation()
+                        creation.setSpaceId(new dtos.SpacePermId("TEST"))
+                        creation.setCode(code)
+                        creation.setTypeId(new dtos.EntityTypePermId("UNKNOWN"))
+                        creations.push(creation)
+                    })
+                    return facade.createSamples(creations)
+                }
+
+                var fUpdate = function (facade: openbis.openbis, freezingMethodsByPermIds: { [index: string]: string }) {
+                    var updates: openbis.SampleUpdate[] = []
+                    $.each(freezingMethodsByPermIds, function (permId: string, method: string) {
+                        var update = new dtos.SampleUpdate()
+                        update.setSampleId(new dtos.SamplePermId(permId))
+                        update[method]()
+                        updates.push(update)
+                    })
+                    return facade.updateSamples(updates)
+                }
+
+                var fFind = function (facade: openbis.openbis, permIds: openbis.SamplePermId[]) {
+                    return facade.getSamples(permIds, c.createSampleFetchOptions())
+                }
+
+                testUpdate(c, "SAMPLE", fCreate, fUpdate, fFind, {
+                    freeze: { frozen: true, frozenForDataSets: false, frozenForComponents: false, frozenForChildren: false, frozenForParents: false },
+                    freezeForDataSets: {
+                        frozen: true,
+                        frozenForDataSets: true,
+                        frozenForComponents: false,
+                        frozenForChildren: false,
+                        frozenForParents: false,
+                    },
+                    freezeForComponents: {
+                        frozen: true,
+                        frozenForDataSets: false,
+                        frozenForComponents: true,
+                        frozenForChildren: false,
+                        frozenForParents: false,
+                    },
+                    freezeForChildren: {
+                        frozen: true,
+                        frozenForDataSets: false,
+                        frozenForComponents: false,
+                        frozenForChildren: true,
+                        frozenForParents: false,
+                    },
+                    freezeForParents: {
+                        frozen: true,
+                        frozenForDataSets: false,
+                        frozenForComponents: false,
+                        frozenForChildren: false,
+                        frozenForParents: true,
+                    },
+                })
+            })
+
+            QUnit.test("freeze data sets()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fCreate = function (facade: openbis.openbis, codes: string[]) {
+                    var creations = []
+                    $.each(codes, function (index: number, code: string) {
+                        creations.push(c.createDataSet(facade, "UNKNOWN"))
+                    })
+                    return $.when.apply($, creations).then(function () {
+                        return Array.prototype.slice.call(arguments)
+                    })
+                }
+
+                var fUpdate = function (facade: openbis.openbis, freezingMethodsByPermIds: { [index: string]: string }) {
+                    var updates: openbis.DataSetUpdate[] = []
+                    $.each(freezingMethodsByPermIds, function (permId: string, method: string) {
+                        var update = new dtos.DataSetUpdate()
+                        update.setDataSetId(new dtos.DataSetPermId(permId))
+                        update[method]()
+                        updates.push(update)
+                    })
+                    return facade.updateDataSets(updates)
+                }
+
+                var fFind = function (facade: openbis.openbis, permIds: openbis.DataSetPermId[]) {
+                    return facade.getDataSets(permIds, c.createDataSetFetchOptions())
+                }
+
+                testUpdate(c, "DATA_SET", fCreate, fUpdate, fFind, {
+                    freeze: {
+                        frozen: true,
+                        frozenForContainers: false,
+                        frozenForComponents: false,
+                        frozenForChildren: false,
+                        frozenForParents: false,
+                    },
+                    freezeForContainers: {
+                        frozen: true,
+                        frozenForContainers: true,
+                        frozenForComponents: false,
+                        frozenForChildren: false,
+                        frozenForParents: false,
+                    },
+                    freezeForComponents: {
+                        frozen: true,
+                        frozenForContainers: false,
+                        frozenForComponents: true,
+                        frozenForChildren: false,
+                        frozenForParents: false,
+                    },
+                    freezeForChildren: {
+                        frozen: true,
+                        frozenForContainers: false,
+                        frozenForComponents: false,
+                        frozenForChildren: true,
+                        frozenForParents: false,
+                    },
+                    freezeForParents: {
+                        frozen: true,
+                        frozenForContainers: false,
+                        frozenForComponents: false,
+                        frozenForChildren: false,
+                        frozenForParents: true,
+                    },
+                })
+            })
+        }
+
+        resolve(function () {
+            executeModule("Freezing tests (RequireJS)", new openbis(), dtos)
+            executeModule("Freezing tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos)
+            executeModule("Freezing tests (module VAR)", new window.openbis.openbis(), window.openbis)
+            executeModule(
+                "Freezing tests (module VAR - executeOperations)",
+                new openbisExecuteOperations(new window.openbis.openbis(), window.openbis),
+                window.openbis
+            )
+            executeModule("Freezing tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM)
+            executeModule(
+                "Freezing tests (module ESM - executeOperations)",
+                new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM),
+                window.openbisESM
+            )
+        })
+    })
+})
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-import-export.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-import-export.js
deleted file mode 100644
index fb867289638cee94265d7772a08eb181d8b02fb5..0000000000000000000000000000000000000000
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-import-export.js
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- *  Copyright ETH 2023 Zürich, Scientific IT Services
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', 'test/common', 'test/dtos' ],
-  function($, _, openbis, openbisExecuteOperations, common, dtos) {
-    var fileContent = "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";
-
-    var executeModule = function(moduleName, facade, dtos) {
-      QUnit.module(moduleName);
-
-      var testAction = function(c, fAction, fCheck) {
-        c.start();
-
-        c.login(facade).then(function() {
-          c.ok("Login");
-          return fAction(facade).then(function(result) {
-            c.ok("Got results");
-            var checkPromise = fCheck(facade, result);
-            if (checkPromise) {
-              checkPromise.then(function() {
-                c.finish()
-              });
-            } else {
-              c.finish();
-            }
-          });
-        }).fail(function(error) {
-          c.fail(error.message);
-          c.finish();
-        });
-      }
-
-      QUnit.test("executeImport()", function(assert) {
-        var c = new common(assert, dtos);
-
-        var fAction = function(facade) {
-          var importData = new dtos.UncompressedImportData();
-          importData.setFormat("XLS");
-          importData.setFile(fileContent);
-
-          var importOptions = new dtos.ImportOptions();
-          importOptions.setMode("UPDATE_IF_EXISTS");
-
-          return facade.executeImport(importData, importOptions);
-        }
-
-        var fCheck = function(facade) {
-          var criteria = new dtos.VocabularySearchCriteria();
-          criteria.withCode().thatEquals("VOCAB");
-
-          var vocabularyFetchOptions = c.createVocabularyFetchOptions()
-          vocabularyFetchOptions.withTerms();
-
-          return facade.searchVocabularies(criteria, vocabularyFetchOptions).then(function(results) {
-            c.assertEqual(results.getTotalCount(), 1)
-            var vocabulary = (results.getObjects())[0];
-
-            c.assertEqual(vocabulary.code, "VOCAB");
-
-            var terms = vocabulary.getTerms();
-
-            c.assertEqual(terms.length, 3)
-
-            var codes = terms.map(function(object) {
-              return object.code;
-            }).sort();
-
-            var labels = terms.map(function(object) {
-              return object.label;
-            }).sort();
-
-            c.assertEqual(codes[0], "TERM_A");
-            c.assertEqual(codes[1], "TERM_B");
-            c.assertEqual(codes[2], "TERM_C");
-
-            c.assertEqual(labels[0], "A");
-            c.assertEqual(labels[1], "B");
-            c.assertEqual(labels[2], "C");
-          }).fail(function(error) {
-            c.fail("Error searching vocabularies. error=" + error.message);
-          });
-        }
-
-        testAction(c, fAction, fCheck);
-      });
-
-      QUnit.test("executeExport()", function(assert) {
-        var c = new common(assert, dtos);
-
-        var fAction = function(facade) {
-          var exportablePermId = new dtos.ExportablePermId(
-            dtos.ExportableKind.SAMPLE, new dtos.SamplePermId("200902091225616-1027"));
-          var exportData = new dtos.ExportData(exportablePermId,
-            new dtos.AllFields());
-
-          var exportOptions = new dtos.ExportOptions(
-            [dtos.ExportFormat.XLSX, dtos.ExportFormat.HTML, dtos.ExportFormat.PDF,
-              dtos.ExportFormat.DATA], dtos.XlsTextFormat.RICH, true, false, true);
-
-          return facade.executeExport(exportData, exportOptions);
-        }
-
-        var fCheck = function(facade, result) {
-          c.assertNotNull(result);
-          if (!result.downloadURL) {
-            c.assertNotNull(result.results);
-            c.assertEqual(result.results.length, 1);
-            c.assertNotNull(result.results[0].exportResult);
-            c.assertNotNull(result.results[0].exportResult.downloadURL);
-          }
-
-          return null;
-        }
-
-        testAction(c, fAction, fCheck);
-      });
-    }
-
-    return function() {
-        executeModule("Export/import tests (RequireJS)", new openbis(), dtos);
-        executeModule("Export/import tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos);
-        executeModule("Export/import tests (module VAR)", new window.openbis.openbis(), window.openbis);
-        executeModule("Export/import tests (module VAR - executeOperations)", new openbisExecuteOperations(new window.openbis.openbis(), window.openbis), window.openbis);
-        executeModule("Export/import tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM);
-        executeModule("Export/import tests (module ESM - executeOperations)", new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM), window.openbisESM);
-    }
-  });
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-import-export.ts b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-import-export.ts
new file mode 100644
index 0000000000000000000000000000000000000000..527fe1992abe58abcc4129e3ed37c89676622faa
--- /dev/null
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-import-export.ts
@@ -0,0 +1,219 @@
+/*
+ *  Copyright ETH 2023 Zürich, Scientific IT Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+import openbis from "./lib/openbis/openbis.esm"
+
+exports.default = new Promise((resolve) => {
+    require(["jquery", "underscore", "openbis", "test/openbis-execute-operations", "test/common", "test/dtos"], function (
+        $,
+        _,
+        openbis,
+        openbisExecuteOperations,
+        common,
+        dtos
+    ) {
+        var fileContent =
+            "UEsDBBQACAgIAEh8FVcAAAAAAAAAAAAAAAALAAAAX3JlbHMvLnJlbHOtksFOwzAMhu97iir3Nd1ACKGmu0xIuyE0HsAkbhu1iaPEg/L2RBMSDI2" +
+            "yw45xfn/+YqXeTG4s3jAmS16JVVmJAr0mY32nxMv+cXkvNs2ifsYROEdSb0Mqco9PSvTM4UHKpHt0kEoK6PNNS9EB52PsZAA9QIdyXVV3Mv5kiOaEWeyMEnFnVqLYfwS8hE1ta" +
+            "zVuSR8cej4z4lcikyF2yEpMo3ynOLwSDWWGCnneZX25y9/vlA4ZDDBITRGXIebuyBbTt44h/ZTL6ZiYE7q55nJwYvQGzbwShDBndHtNI31ITO6fFR0zX0qLWp78y+YTUEsHCIW" +
+            "aNJruAAAAzgIAAFBLAwQUAAgICABIfBVXAAAAAAAAAAAAAAAAGgAAAHhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzrZFNa8MwDIbv/RVG98VJB2OMOL2MQa/9+AHGUeLQxDaS1" +
+            "rX/fi4bWwpl7NCT0Nfzvkj16jSN6ojEQwwGqqIEhcHFdgi9gf3u7eEZVs2i3uBoJY+wHxKrvBPYgBdJL1qz8zhZLmLCkDtdpMlKTqnXybqD7VEvy/JJ05wBzRVTrVsDtG4rULt" +
+            "zwv+wY9cNDl+je58wyA0JzXIekTPRUo9i4CsvMgf0bfnlPeU/Ih3YI8qvg59SNncJ1V9mHu96C28J261Qfuz8JPPyt5lFra/e3XwCUEsHCE/w+XrSAAAAJQIAAFBLAwQUAAgIC" +
+            "ABIfBVXAAAAAAAAAAAAAAAADwAAAHhsL3dvcmtib29rLnhtbI1T23LaMBB971d49A6+cCkwmAw1eJKZ3iakybNsr7GKLHmkJUA6/feuZZym0z70AaS96OzZ3ePlzbmW3jMYK7S" +
+            "KWTgMmAcq14VQ+5h9e0gHM+ZZ5KrgUiuI2QUsu1m9W560OWRaHzx6r2zMKsRm4fs2r6DmdqgbUBQptak5kmn2vm0M8MJWAFhLPwqCqV9zoViHsDD/g6HLUuSw0fmxBoUdiAHJk" +
+            "djbSjSWrZalkPDYNeTxpvnMa6KdcJkzf/VK+6vxMp4fjk1K2TErubRAjVb69CX7DjlSR1xK5hUcIZwH4z7lDwiNlEllyNk6HgWc7O94azrEW23Ei1bI5S43WsqYoTleqxFRFPm" +
+            "/Irt2UA88s73z/CRUoU8xoxVd3txP7vokCqxogdPRbNz7bkHsK4zZLJxHzEOe3beDitkkoGelMBZdEYfCqZNnoHqtRQ35bzpyO+tPT7mBupdhS5XOu4IqO50ghZ6FFZkkxmYhK" +
+            "GDuisgh9jDUbk7zFwiG8hN9VEQhbDkZKD/pgiDWhHaNvy7nam9AIieSwyAIwhYXzvjRojuvUpKa7n/JSYrMQCcgpyXmHY2I2Y/302iazKbRIFqHo0EYbieDD6PxZJBu05Qml2y" +
+            "SefqTdOVQF/RLOv4WDX0k91DuLrTbc8y25xzk2nHyKa37d9T8XhOrX1BLBwg0mo9c+wEAAHADAABQSwMEFAAICAgASHwVVwAAAAAAAAAAAAAAAA0AAAB4bC9zdHlsZXMueG1s7" +
+            "Vldb5swFH3fr7D8vkISmrYTUHWdmPYyVWsqTZr24IABq8ZGttOG/vrZmBBI231k6kYq+mJ8fM+5h4sNjuufrwsK7rCQhLMATo5cCDCLeUJYFsCbRfT2FAKpEEsQ5QwHsMISnod" +
+            "vfKkqiq9zjBXQCkwGMFeqfOc4Ms5xgeQRLzHTIykXBVK6KzJHlgKjRBpSQZ2p686dAhEGQ5+tiqhQEsR8xZS20ULANp8SDc49CKzcJU+0lY+YYYEodELfaQRCP+VsqzOHFgh9+" +
+            "QDuENUiUxMec8oFENkygFHk1n8GZqjANuwSUbIUxIApKgitLGzJORJS37bVq7PbHDuZdiQvBLFeu4LuwOhLO6DECpuxVm320lV7LrH3conrxswYQmk7Y6bQAqFfIqWwYJHugOZ" +
+            "6UZV62jG9DqxMHfeL6EygajI97hDqRuddcpHodded8xYCCUEZZ4jelAFMEZUYttAHfs82YOhTnCotLEiWm1bx0jEiSvFCX2w4JrVVbi90+hhTem0W8dd0e/euFl2njxcdqzv63" +
+            "WC8N5dWqemgsqRVxI1I/Qwt8L4O6UEXlGSswDuBV4IrHKv6HVTDoY82gSDngjxoafMAs2bNm1eWIrGB7P1CoPBafeEKWRXt6V6gcqHBtoiEJXViPSZzQdjtgkekHdZlKlsbgPL" +
+            "4FicbkzlJNLUT6azTnUq52zpN9q1T43O3UF24W6nNNDgcM9PRzDNm9l5bo5nRzGhmNDOa2ceMNxvSl9KbDMqNNyg30yG5OfvPZpzu9t1u5jv7+Pm+2/h1+th5189fWj+0Pf0/K" +
+            "tvr+iHUK5r3Z0X7/VXyims2rIlmzhiGXrHjIc2ysWCHvCyd5lPaOSDrfVZbFJjjxwB+NgfStFO25YpQRZjtOY8Jl7wo0CZ+ctwjzJ4lgG/u95Y075HmT5JWQmAWVy3npMfxfsb" +
+            "p5Trt8U6e4l1hEetn0FLOehR79Lktpu5s/3cQ/gBQSwcIAAc48d4CAACAGAAAUEsDBBQACAgIAEh8FVcAAAAAAAAAAAAAAAAYAAAAeGwvd29ya3NoZWV0cy9zaGVldDEueG1sv" +
+            "Vffc9o4EH6/v8Lj9+JfGIcM0GnD5Xozaelc0nbm3oQtY01kyScJCPnrbyXZxsEuydxwfUiQdle737crw+fZ+6eSOjssJOFs7gYj33UwS3lG2Gbufnu4fXflOlIhliHKGZ67Byz" +
+            "d94vfZnsuHmWBsXIgAZNzt1CquvY8mRa4RHLEK8zAk3NRIgVbsfFkJTDKzKGSeqHvT7wSEebaDNfiLTl4npMUL3m6LTFTNonAFCmALwtSySbbU/amfJlAe6Da4OlAXFpPmy8Y9" +
+            "/KVJBVc8lyNUl7W0Posp970Bc8nEf63TEEMVHdETypskpXpW1iWSDxuq3eQu4JOrQkl6mAIu4uZyf9VODmhCovPPIMh54hKDL4KbfA9Vt8q41cP/CsYGre3mHn14cUsIzAPjcw" +
+            "ROJ+7H4LrZaIjTMB3gveys3Zkwfe3gG9LkWzSGeMfgmR3hGGwKrGtjX/x/Q2nn6AXcE27jr8xNK0xCLIpAOEdzlWbUqH1PaY4VTjrnlttFYUi94dyzWmbIMM52lKlIUA5Lhr7D" +
+            "hDPXabbSSElr3SJG0yppuk6qY79E/JPxq7zzHl5nyIKTQp8v7P/Yo6fWnU779CBb01baq9+stacP2qTzuvrIRkWur0V0k9hjcJ1EFh32KL5eNXd26OO/McMBHztvHTi7roZza2" +
+            "5MTDquhPQhR8kU4XGNYqm4zgKwrjtE0zlE9Y9B3c8SsDxDONoTPUAuO30Hd5hCgcMoq4NSliC3gsEixl0VZr/ur8UVVJPsE6abqXiZQ3NzqggWYbZYFlTs0RPABM+CTOfUh3Mj" +
+            "KDbNk0Y6P5ctl5Y1wsH6kXJ5etFdb1oqJ5/+Xrjut54oF5g75sdo/0+RQotZoLvHWECbVU78baQuU2TUdxDYKPP3C4Dq8cNKOty+jmVZhBwWIJ1t/Bn3k4DhD/A1AILfzGwsAc" +
+            "saIGZiI/9iPBlxE0/IhomF50jZ5/hy7KLDLLIIGOD7GxE0ME+HsY+Pof96n/APjbIxmcmYyPiM5PpR8QvI5b9iJ/MLv7Vs4tfnV3cm93khH8/IhlmNznL7tLUJq9Sm/SAX51Q6" +
+            "0dMh6kl56glo+ji7JJX2SU97IF/Qm8g5CTLMqmvrtcQ9jrf85UgTK0qI8udAqQbSOmj1NscZd6pBeRm+yPEBXnmTCF6A1ofi85PFrywKJL2HZ7VrJ+R2BAoTI0Y9EdJLQ/rNag" +
+            "ns4LWr7mCXje7wmhMvYuD4CoI/DCahKE/hjM552rY5bU6eVuBPKuwuCfP8GM4hf50pKDRz42eqretgHIdnWIlTPWM79lDgdkKWMLgBQGS5gVn7lZcKIEICL81RenjB5b9KIhqJ" +
+            "bkDrzMd+ZuCDLzhpX5TklrBshdNXVZE6wL/2M2jJeUVweYCADvblVvTACcjeQ4dZ+qWCHks1ZpXWfb77niZFzOeZVa6wwXprGFpM1pzu+4Wg237mrn4F1BLBwh76zOXRQQAAKo" +
+            "OAABQSwMEFAAICAgASHwVVwAAAAAAAAAAAAAAABQAAAB4bC9zaGFyZWRTdHJpbmdzLnhtbI2STU/DMAyG7/yKyHeWMgmEpjRTKeM0BJo6pJ2mkJo1UvNBnE7w7wkFiRvK0fbj9" +
+            "7Uti/WHHdkZIxnvarhaVMDQad8bd6ph3z1c3gKjpFyvRu+whk8kWMsLQZRYbnVUw5BSWHFOekCraOEDulx589GqlMN44hQiqp4GxGRHvqyqG26VccC0n1zKttfAJmfeJ2x/E0u" +
+            "QgowUs8mKgtLZO6sQxjOCfHlqm7v9ttkdjt3heSN4koJ/8//1/CxZxLa+xyLwHklHE1Kp8Dx4EblVrzgWkd1m93hsitAyahYsm7KMmgXbssv/UTz/mPwCUEsHCEgvXEPsAAAAo" +
+            "QIAAFBLAwQUAAgICABIfBVXAAAAAAAAAAAAAAAAEQAAAGRvY1Byb3BzL2NvcmUueG1sfVJNT8MwDL3zK6rcu6QtGlO0dhIguDCBxCYQt5C6I9AmUeJ9/XvSbi1fEzf7vZdnO/Z" +
+            "0tmvqaAPOK6NzkowYiUBLUyq9yslycRNPSORR6FLURkNO9uDJrDibSsulcfDgjAWHCnwUjLTn0ubkDdFySr18g0b4UVDoQFbGNQJD6lbUCvkhVkBTxsa0ARSlQEFbw9gOjuRoW" +
+            "crB0q5d3RmUkkINDWj0NBkl9EuL4Bp/8kHHfFM2CvcWTkp7clDvvBqE2+12tM06aeg/oc/zu8du1Fjp9qskkGJ6bIRLBwKhjIIBP5Trmafs6npxQ4qUpSxm45iliyTjGeNp9jK" +
+            "lv963hofYuGKupDPeVBjdV5WSEC09uPbJoGjVJXjplMWw2KIjfwAhr4VercMWCtDx7WUnGaB2v7XwOA+XUCkoL/fB4wTWt9kcsf/nzGI2idNkkVzw7Jwn429z9gZdZQcb1R5kk" +
+            "XVFh7Tt2q9f30HiYaQhCTEqrOEA9+GfIy0+AVBLBwgoNK7AewEAAPACAABQSwMEFAAICAgASHwVVwAAAAAAAAAAAAAAABMAAABkb2NQcm9wcy9jdXN0b20ueG1snc6xCsIwFIX" +
+            "h3acI2dtUB5HStIs4O1T3kN62AXNvyE2LfXsjgu6Ohx8+TtM9/UOsENkRarkvKykALQ0OJy1v/aU4ScHJ4GAehKDlBiy7dtdcIwWIyQGLLCBrOacUaqXYzuANlzljLiNFb1Kec" +
+            "VI0js7CmeziAZM6VNVR2YUT+SJ8Ofnx6jX9Sw5k3+/43m8he22jfmfbF1BLBwjh1gCAlwAAAPEAAABQSwMEFAAICAgASHwVVwAAAAAAAAAAAAAAABAAAABkb2NQcm9wcy9hcHA" +
+            "ueG1snZBNa8MwDIbv+xXB9Jo4CUtWiuOyMXYqbIes7BY8W2k9/IXtlPTfz21Z2/Oki754JL1kPWuVHcAHaU2HqqJEGRhuhTS7Dn32b/kSZSEyI5iyBjp0hIDW9IF8eOvARwkhS" +
+            "wQTOrSP0a0wDnwPmoUitU3qjNZrFlPqd9iOo+TwavmkwURcl2WLYY5gBIjcXYHoQlwd4n+hwvLTfWHbH13iUdKDdopFoATfwt5GpnqpgVapfE3Is3NKchaTInQjvz28n1fgp6J" +
+            "JXi820kzz8LVsh/YxuxsY0gs/wCNuysXLJJXIa4LvYSfy9iI1rZqiTHYe+KsRfFOV/gJQSwcIRY4uEvgAAACaAQAAUEsDBBQACAgIAEh8FVcAAAAAAAAAAAAAAAATAAAAW0Nvb" +
+            "nRlbnRfVHlwZXNdLnhtbL2UTU/DMAyG7/yKKlfUZuOAEGq3Ax9HmMQ4o5C4bVjzoSQb27/H6QZMo2xMqzhFjf2+j+22zsdL1SQLcF4aXZBhNiAJaG6E1FVBnqf36RUZj87y6cq" +
+            "CTzBX+4LUIdhrSj2vQTGfGQsaI6VxigV8dBW1jM9YBfRiMLik3OgAOqQhepBRfgslmzchuVvi9ZqLcpLcrPMiqiDM2kZyFjBMY5R26hw0fo9wocVOdemmsgyVbY6vpfXnvxOsr" +
+            "nYAUsXO4n234s1Ct6QNoOYRx+2kgGTCXHhgChPoS+yEZj3300VaNhvYu3GzV2NmGSb/E3gbeRzNlKXkIAyfK5Rk3jpgwtcAAYtvz0wxqQ/wfVg14Pumt6Z/6LwVeNoew56L+PI" +
+            "/NIGaORBPweH/3fsgtr331YH6iTPW42ZwcHwRn19eVKcWjcAFuf8NfBPnPhh1cuNrm2PhyDiZDHHRCBA/2Wc5bbf06ANQSwcItuOWgmMBAADUBQAAUEsBAhQAFAAICAgASHwVV" +
+            "4WaNJruAAAAzgIAAAsAAAAAAAAAAAAAAAAAAAAAAF9yZWxzLy5yZWxzUEsBAhQAFAAICAgASHwVV0/w+XrSAAAAJQIAABoAAAAAAAAAAAAAAAAAJwEAAHhsL19yZWxzL3dvcmt" +
+            "ib29rLnhtbC5yZWxzUEsBAhQAFAAICAgASHwVVzSaj1z7AQAAcAMAAA8AAAAAAAAAAAAAAAAAQQIAAHhsL3dvcmtib29rLnhtbFBLAQIUABQACAgIAEh8FVcABzjx3gIAAIAYA" +
+            "AANAAAAAAAAAAAAAAAAAHkEAAB4bC9zdHlsZXMueG1sUEsBAhQAFAAICAgASHwVV3vrM5dFBAAAqg4AABgAAAAAAAAAAAAAAAAAkgcAAHhsL3dvcmtzaGVldHMvc2hlZXQxLnh" +
+            "tbFBLAQIUABQACAgIAEh8FVdIL1xD7AAAAKECAAAUAAAAAAAAAAAAAAAAAB0MAAB4bC9zaGFyZWRTdHJpbmdzLnhtbFBLAQIUABQACAgIAEh8FVcoNK7AewEAAPACAAARAAAAA" +
+            "AAAAAAAAAAAAEsNAABkb2NQcm9wcy9jb3JlLnhtbFBLAQIUABQACAgIAEh8FVfh1gCAlwAAAPEAAAATAAAAAAAAAAAAAAAAAAUPAABkb2NQcm9wcy9jdXN0b20ueG1sUEsBAhQ" +
+            "AFAAICAgASHwVV0WOLhL4AAAAmgEAABAAAAAAAAAAAAAAAAAA3Q8AAGRvY1Byb3BzL2FwcC54bWxQSwECFAAUAAgICABIfBVXtuOWgmMBAADUBQAAEwAAAAAAAAAAAAAAAAATE" +
+            "QAAW0NvbnRlbnRfVHlwZXNdLnhtbFBLBQYAAAAACgAKAIACAAC3EgAAAAA="
+
+        var executeModule = function (moduleName: string, facade: openbis.openbis, dtos: openbis.bundle) {
+            QUnit.module(moduleName)
+
+            var testAction = function (c, fAction, fCheck) {
+                c.start()
+
+                c.login(facade)
+                    .then(function () {
+                        c.ok("Login")
+                        return fAction(facade).then(function (result) {
+                            c.ok("Got results")
+                            var checkPromise = fCheck(facade, result)
+                            if (checkPromise) {
+                                checkPromise.then(function () {
+                                    c.finish()
+                                })
+                            } else {
+                                c.finish()
+                            }
+                        })
+                    })
+                    .fail(function (error) {
+                        c.fail(error.message)
+                        c.finish()
+                    })
+            }
+
+            QUnit.test("executeImport()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var importData = new dtos.UncompressedImportData()
+                    importData.setFormat("XLS")
+                    importData.setFile(fileContent)
+
+                    var importOptions = new dtos.ImportOptions()
+                    importOptions.setMode("UPDATE_IF_EXISTS")
+
+                    return facade.executeImport(importData, importOptions)
+                }
+
+                var fCheck = function (facade: openbis.openbis) {
+                    var criteria = new dtos.VocabularySearchCriteria()
+                    criteria.withCode().thatEquals("VOCAB")
+
+                    var vocabularyFetchOptions = c.createVocabularyFetchOptions()
+                    vocabularyFetchOptions.withTerms()
+
+                    return facade.searchVocabularies(criteria, vocabularyFetchOptions).then(
+                        function (results) {
+                            c.assertEqual(results.getTotalCount(), 1)
+                            var vocabulary = results.getObjects()[0]
+
+                            c.assertEqual(vocabulary.getCode(), "VOCAB")
+
+                            var terms = vocabulary.getTerms()
+
+                            c.assertEqual(terms.length, 3)
+
+                            var codes = terms
+                                .map(function (object) {
+                                    return object.getCode()
+                                })
+                                .sort()
+
+                            var labels = terms
+                                .map(function (object) {
+                                    return object.getLabel()
+                                })
+                                .sort()
+
+                            c.assertEqual(codes[0], "TERM_A")
+                            c.assertEqual(codes[1], "TERM_B")
+                            c.assertEqual(codes[2], "TERM_C")
+
+                            c.assertEqual(labels[0], "A")
+                            c.assertEqual(labels[1], "B")
+                            c.assertEqual(labels[2], "C")
+                        },
+                        function (error) {
+                            c.fail("Error searching vocabularies. error=" + error.message)
+                        }
+                    )
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+
+            QUnit.test("executeExport()", function (assert) {
+                var c = new common(assert, dtos)
+
+                var fAction = function (facade: openbis.openbis) {
+                    var exportablePermId = new dtos.ExportablePermId(dtos.ExportableKind.SAMPLE, new dtos.SamplePermId("200902091225616-1027"))
+                    var exportData = new dtos.ExportData([exportablePermId], new dtos.AllFields())
+
+                    var exportOptions = new dtos.ExportOptions(
+                        [dtos.ExportFormat.XLSX, dtos.ExportFormat.HTML, dtos.ExportFormat.PDF, dtos.ExportFormat.DATA],
+                        dtos.XlsTextFormat.RICH,
+                        true,
+                        false,
+                        true
+                    )
+
+                    return facade.executeExport(exportData, exportOptions)
+                }
+
+                var fCheck = function (facade: openbis.openbis, result: openbis.ExportResult) {
+                    c.assertNotNull(result)
+                    c.assertNotNull(result.getDownloadURL())
+                    return null
+                }
+
+                testAction(c, fAction, fCheck)
+            })
+        }
+
+        resolve(function () {
+            executeModule("Export/import tests (RequireJS)", new openbis(), dtos)
+            executeModule("Export/import tests (RequireJS - executeOperations)", new openbisExecuteOperations(new openbis(), dtos), dtos)
+            executeModule("Export/import tests (module VAR)", new window.openbis.openbis(), window.openbis)
+            executeModule(
+                "Export/import tests (module VAR - executeOperations)",
+                new openbisExecuteOperations(new window.openbis.openbis(), window.openbis),
+                window.openbis
+            )
+            executeModule("Export/import tests (module ESM)", new window.openbisESM.openbis(), window.openbisESM)
+            executeModule(
+                "Export/import tests (module ESM - executeOperations)",
+                new openbisExecuteOperations(new window.openbisESM.openbis(), window.openbisESM),
+                window.openbisESM
+            )
+        })
+    })
+})