diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/common-test/common-test.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/common-test/common-test.js
index b397a39b5711e2b9aa0ee6fed21675586f9fad71..46836a7d5ef554671fb175364029b6f673cc9a6c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/common-test/common-test.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/common-test/common-test.js
@@ -1,19 +1,43 @@
-var createFacade = function(){
-	return new openbis('http://127.0.0.1:8888/openbis/openbis');
-}
-
-var createFacadeAndLogin = function(action, timeoutOrNull){
+var createFacade = function(action, timeoutOrNull){
 	stop();
 	
-	var facade = createFacade();
+	var facade = new openbis('http://127.0.0.1:8888/openbis/openbis');
+	
+	facade.close = function(){
+		facade.logout(function(){
+			facade.closed = true;	
+		});
+	};
 
-	facade.login('admin','password', function(){
-		action(facade);
-	});
+	action(facade);
+
+	var timeout = timeoutOrNull ? timeoutOrNull : 10000;
+	var checkInterval = 100;
+	var intervalTotal = 0;
 	
-	setTimeout(function(){
-		start();
-	}, (timeoutOrNull ? timeoutOrNull : 1000));
+	var startWhenClosed = function(){
+		if(facade.closed){
+			start();
+		}else{
+			intervalTotal += checkInterval;
+			
+			if(intervalTotal < timeout){
+				setTimeout(startWhenClosed, checkInterval);
+			}else{
+				start();
+			}
+		}
+	};
+
+	startWhenClosed();
+}
+
+var createFacadeAndLogin = function(action, timeoutOrNull){
+	createFacade(function(facade){
+		facade.login('admin','password', function(){
+			action(facade);
+		});
+	}, timeoutOrNull);
 }
 
 var createSearchCriteriaForCodes = function(codes){
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/openbis-screening-test/openbis-screening-test.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/openbis-screening-test/openbis-screening-test.js
index 841a526d8c4764a993df919c2e8dc4e97fc5ae06..d27114e76681fb6a92e6684e2f30f01079995844 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/openbis-screening-test/openbis-screening-test.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/openbis-screening-test/openbis-screening-test.js
@@ -8,6 +8,7 @@ test("listPlates()", function(){
 		
 		facade.listPlates(function(response){
 			assertObjectsCount(response.result, 215);
+			facade.close();
 		});
 	});
 });
@@ -24,6 +25,7 @@ test("listPlatesForExperiment()", function(){
 		facade.listPlatesForExperiment(experimentIdentifier, function(response){
 			assertObjectsCount(response.result, 4);
 			assertObjectsWithValues(response.result, "plateCode", ["PLATE-1","PLATE-2", "PLATE-16-BIT", "SANOFI-EXAMPLE"]);
+			facade.close();
 		});
 	});
 });
@@ -45,6 +47,7 @@ test("getPlateMetadataList()", function(){
 		facade.getPlateMetadataList(plateIdentifiers, function(response){
 			assertObjectsCount(response.result, 2);
 			assertObjectsWithValues(response.result, "plateCode", ["PLATE-1","PLATE-2"]);
+			facade.close();
 		});
 	});
 });
@@ -54,6 +57,7 @@ test("listAllExperiments()", function(){
 		facade.listAllExperiments(function(response){
 			assertObjectsCount(response.result, 4);
 			assertObjectsWithValues(response.result, "experimentCode", ["E1","EXP-1","EXP-1","TEST"]);
+			facade.close();
 		});
 	});
 });
@@ -65,6 +69,7 @@ test("listExperimentsVisibleToUser()", function(){
 		facade.listExperimentsVisibleToUser(userId, function(response){
 			assertObjectsCount(response.result, 1);
 			assertObjectsWithValues(response.result, "experimentCode", ["E1"]);
+			facade.close();
 		});
 	});
 });
@@ -81,6 +86,7 @@ test("listFeatureVectorDatasets()", function(){
 		facade.listFeatureVectorDatasets(plateIdentifiers, function(response){
 			assertObjectsCount(response.result, 1);
 			assertObjectsWithValues(response.result, "datasetCode", ["20110913112215416-82999"]);
+			facade.close();
 		});
 	});
 });
@@ -97,6 +103,7 @@ test("listImageDatasets()", function(){
 		facade.listImageDatasets(plateIdentifiers, function(response){
 			assertObjectsCount(response.result, 3);
 			assertObjectsWithValues(response.result, "datasetCode", [ "20110913111517610-82996", "20110913112525450-83000", "20110913113026096-83001"]);
+			facade.close();
 		});
 	});
 });
@@ -113,6 +120,7 @@ test("listRawImageDatasets()", function(){
 		facade.listRawImageDatasets(plateIdentifiers, function(response){
 			assertObjectsCount(response.result, 3);
 			assertObjectsWithValues(response.result, "datasetCode", [ "20110913111517610-82996", "20110913112525450-83000", "20110913113026096-83001"]);
+			facade.close();
 		});
 	});
 });
@@ -129,6 +137,7 @@ test("listSegmentationImageDatasets()", function(){
 		facade.listSegmentationImageDatasets(plateIdentifiers, function(response){
 			assertObjectsCount(response.result, 2);
 			assertObjectsWithValues(response.result, "datasetCode", [ "20110913111925577-82997", "20110913111955463-82998" ]);
+			facade.close();
 		});
 	});
 });
@@ -140,6 +149,7 @@ test("getDatasetIdentifiers()", function(){
 		facade.getDatasetIdentifiers(datasetCodes, function(response){
 			assertObjectsCount(response.result, 2);
 			assertObjectsWithValues(response.result, "datasetCode", datasetCodes);
+			facade.close();
 		});
 	});
 });
@@ -166,7 +176,8 @@ test("listPlateWellsForExperimentAndMaterial()", function(){
 			assertObjectsCount(response.result, 3);
 			assertObjectsWithValuesFunction(response.result, "plateCode", function(result){
 				return result.experimentPlateIdentifier.plateCode;
-			}, ["PLATE-1-A", "PLATE-141-A", "PLATE-71-A"])
+			}, ["PLATE-1-A", "PLATE-141-A", "PLATE-71-A"]);
+			facade.close();
 		});
 	});
 });
@@ -187,7 +198,8 @@ test("listPlateWellsForMaterial()", function(){
 			assertObjectsCount(response.result, 3);
 			assertObjectsWithValuesFunction(response.result, "plateCode", function(result){
 				return result.experimentPlateIdentifier.plateCode;
-			}, ["PLATE-1-A", "PLATE-141-A", "PLATE-71-A"])
+			}, ["PLATE-1-A", "PLATE-141-A", "PLATE-71-A"]);
+			facade.close();
 		});
 	});
 });
@@ -202,6 +214,7 @@ test("listPlateWells()", function(){
 		
 		facade.listPlateWells(plateIdentifier, function(response){
 			assertObjectsCount(response.result, 79);
+			facade.close();
 		});
 	});
 });
@@ -215,6 +228,7 @@ test("getWellSample()", function(){
 		
 		facade.getWellSample(wellIdentifier, function(response){
 			equal(response.result.code, "PLATE-1-A:A3", "Well code is correct");
+			facade.close();
 		});
 	});
 });
@@ -229,6 +243,7 @@ test("getPlateSample()", function(){
 		
 		facade.getPlateSample(plateIdentifier, function(response){
 			equal(response.result.code, "PLATE-1", "Plate code is correct");
+			facade.close();
 		});
 	});
 });
@@ -249,7 +264,8 @@ test("listPlateMaterialMapping()", function(){
 			assertObjectsCount(response.result, 1);
 			assertObjectsWithValuesFunction(response.result, "plateCode", function(result){
 				return result.plateIdentifier.plateCode;
-			}, ["PLATE-1"])
+			}, ["PLATE-1"]);
+			facade.close();
 		});
 	});
 });
@@ -267,6 +283,7 @@ test("getExperimentImageMetadata()", function(){
 			equal(response.result.identifier.experimentCode, "E1", "Experiment code is correct");
 			equal(response.result.plateGeometry.width, 24, "Plate width is correct");
 			equal(response.result.plateGeometry.height, 16, "Plate height is correct");
+			facade.close();
 		});
 	});
 });
@@ -286,6 +303,7 @@ test("listAvailableFeatureCodes()", function(){
 			facade.listAvailableFeatureCodes(featureDatasets, function(response){
 				assertObjectsCount(response.result, 4);
 				assertArrays(response.result, ["ROW_NUMBER", "COLUMN_NUMBER", "TPU", "STATE"], "Feature codes are correct");
+				facade.close();
 			});
 		});
 	});
@@ -306,6 +324,7 @@ test("listAvailableFeatures()", function(){
 			facade.listAvailableFeatures(featureDatasets, function(response){
 				assertObjectsCount(response.result, 4);
 				assertObjectsWithValues(response.result, 'code', ["ROW_NUMBER", "COLUMN_NUMBER", "TPU", "STATE"]);
+				facade.close();
 			});
 		});
 	});
@@ -327,7 +346,8 @@ test("loadFeatures()", function(){
 			facade.loadFeatures(featureDatasets, featureCodes, function(response){
 				assertObjectsCount(response.result, 1);
 				assertArrays(response.result[0].featureCodes, featureCodes, 'Feature codes are correct');
-				equal(response.result[0].featureVectors.length, 96, 'Feature vectors count is correct')
+				equal(response.result[0].featureVectors.length, 96, 'Feature vectors count is correct');
+				facade.close();
 			});
 		});
 	});
@@ -360,8 +380,9 @@ test("loadFeaturesForDatasetWellReferences()", function(){
 			facade.loadFeaturesForDatasetWellReferences(datasetWellReferences, featureCodes, function(response){
 				assertObjectsCount(response.result, 1);
 				assertArrays(response.result[0].featureCodes, featureCodes, 'Feature codes are correct');
-				equal(response.result[0].wellPosition.wellRow, 1, 'Well row is correct')
-				equal(response.result[0].wellPosition.wellColumn, 2, 'Well column is correct')
+				equal(response.result[0].wellPosition.wellRow, 1, 'Well row is correct');
+				equal(response.result[0].wellPosition.wellColumn, 2, 'Well column is correct');
+				facade.close();
 			});
 		});
 	});
@@ -391,7 +412,8 @@ test("loadImagesBase64ForImageReferencesAndImageConversion()", function(){
 				var convertToPng = false;
 				
 				facade.loadImagesBase64ForImageReferencesAndImageConversion(imageReferences, convertToPng, function(response){
-					alert(response.result.length);
+					assertObjectsCount(response.result, 9);
+					facade.close();
 				});
 			});
 		});
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/openbis-test/openbis-test.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/openbis-test/openbis-test.js
index e462f8c21c9dc2ee945c03eac1a5842ff1ccbf56..fdea0064f6ffffe703ad82a8598bb303c56e95ef 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/openbis-test/openbis-test.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/applications/openbis-test/openbis-test.js
@@ -4,68 +4,55 @@
  */
 
 test("logout", function(){
-
-	stop();
-
-	var facade = createFacade();
-	
-	facade.logout(function(){
-		equal(facade.getSession(), null, 'Session is empty after logout');
-		
-		facade.restoreSession();
-		equal(facade.getSession(), null, 'Restored session is empty after logout');
-		
-		facade.isSessionActive(function(response){
-			equal(response.result, false, 'Session is inactive after logout');
+	createFacade(function(facade){
+		facade.logout(function(){
+			equal(facade.getSession(), null, 'Session is empty after logout');
+			
+			facade.restoreSession();
+			equal(facade.getSession(), null, 'Restored session is empty after logout');
+			
+			facade.isSessionActive(function(response){
+				equal(response.result, false, 'Session is inactive after logout');
+				facade.close();
+			});
 		});
 	});
-	
-	setTimeout(function(){
-		start();
-	}, 1000);
-
 });
 
 test("login", function() {
-	
-	stop();
-
-	var facade = createFacade();
-	
-	facade.login('admin','password', function(response){
-		ok(response.result,'Session from server is not empty after login');
-		ok(facade.getSession(), 'Session from facade is not empty after login');
-
-		facade.isSessionActive(function(response){
-			equal(response.result, true,'Session is active after login');
+	createFacade(function(facade){
+		facade.login('admin','password', function(response){
+			ok(response.result,'Session from server is not empty after login');
+			ok(facade.getSession(), 'Session from facade is not empty after login');
+
+			facade.isSessionActive(function(response){
+				equal(response.result, true,'Session is active after login');
+				facade.close();
+			});
 		});
 	});
-	
-	setTimeout(function(){
-		start();
-	}, 1000);
 });
 
 test("cookies", function() {
-	
-	var facade = createFacade();
-
-	facade.useSession('session-1');
-	facade.rememberSession();
-	equal(facade.getSession(), 'session-1', 'Session 1 used')
-	
-	facade.useSession('session-2');
-	equal(facade.getSession(), 'session-2', 'Session 2 used')
-	
-	facade.restoreSession();
-	equal(facade.getSession(), 'session-1', 'Session 1 restored')
-	
+	createFacade(function(facade){
+		facade.useSession('session-1');
+		facade.rememberSession();
+		equal(facade.getSession(), 'session-1', 'Session 1 used')
+		
+		facade.useSession('session-2');
+		equal(facade.getSession(), 'session-2', 'Session 2 used')
+		
+		facade.restoreSession();
+		equal(facade.getSession(), 'session-1', 'Session 1 restored')
+		facade.close();
+	});
 });
 
 test("listNamedRoleSets()", function(){
 	createFacadeAndLogin(function(facade){
 		facade.listNamedRoleSets(function(response){
 			ok(response.result, 'Got results');
+			facade.close();
 		});
 	});
 });
@@ -74,6 +61,7 @@ test("listSpacesWithProjectsAndRoleAssignments()", function(){
 	createFacadeAndLogin(function(facade){
 		facade.listSpacesWithProjectsAndRoleAssignments(null, function(response){
 			assertObjectsCount(response.result, 4);
+			facade.close();
 		});
 	});
 });
@@ -88,6 +76,7 @@ test("searchForSamples()", function(){
 			assertObjectsCount(response.result, 2);
 			assertObjectsWithCodes(response.result, sampleCodes);
 			assertObjectsWithProperties(response.result);
+			facade.close();
 		});
 	});
 });
@@ -103,6 +92,7 @@ test("searchForSamplesWithFetchOptions()", function(){
 			assertObjectsCount(response.result, 2);
 			assertObjectsWithCodes(response.result, sampleCodes);
 			assertObjectsWithoutProperties(response.result);
+			facade.close();
 		});
 	});
 });
@@ -119,6 +109,7 @@ test("searchForSamplesOnBehalfOfUser()", function(){
 			assertObjectsCount(response.result, 1);
 			assertObjectsWithCodes(response.result, [ 'PLATE-1-A' ]);
 			assertObjectsWithoutProperties(response.result);
+			facade.close();
 		});
 	});
 });
@@ -137,6 +128,7 @@ test("filterSamplesVisibleToUser()", function(){
 				assertObjectsCount(response.result, 1);
 				assertObjectsWithCodes(response.result, [ 'PLATE-1-A' ]);
 				assertObjectsWithProperties(response.result);
+				facade.close();
 			});
 		});
 	});
@@ -149,6 +141,7 @@ test("listSamplesForExperiment()", function(){
 		facade.listSamplesForExperiment(experimentIdentifier, function(response){
 			assertObjectsCount(response.result, 1);
 			assertObjectsWithCodes(response.result, [ 'TEST-SAMPLE' ]);
+			facade.close();
 		});
 	});
 });
@@ -162,6 +155,7 @@ test("listDataSetsForSamples()", function(){
 			
 			facade.listDataSetsForSamples(samples, function(response){
 				assertObjectsCount(response.result, 19);
+				facade.close();
 			});
 		});
 	});
@@ -178,6 +172,7 @@ test("listExperiments()", function(){
 			facade.listExperiments(projects, experimentType, function(response){
 				assertObjectsCount(response.result, 1);
 				assertObjectsWithCodes(response.result, [ 'TEST' ]);
+				facade.close();
 			});
 		});
 	});
@@ -194,6 +189,7 @@ test("listExperimentsHavingSamples()", function(){
 			facade.listExperimentsHavingSamples(projects, experimentType, function(response){
 				assertObjectsCount(response.result, 1);
 				assertObjectsWithCodes(response.result, [ 'TEST' ]);
+				facade.close();
 			});
 		});
 	});
@@ -210,6 +206,7 @@ test("listExperimentsHavingDataSets()", function(){
 			facade.listExperimentsHavingDataSets(projects, experimentType, function(response){
 				assertObjectsCount(response.result, 1);
 				assertObjectsWithCodes(response.result, [ 'TEST' ]);
+				facade.close();
 			});
 		});
 	});
@@ -226,6 +223,7 @@ test("filterExperimentsVisibleToUser()", function(){
 			facade.filterExperimentsVisibleToUser(experiments, userId, function(response){
 				assertObjectsCount(response.result, 1);
 				assertObjectsWithCodes(response.result, [ 'E1' ]);
+				facade.close();
 			});
 		});
 	});
@@ -241,6 +239,7 @@ test("listDataSetsForSample()", function(){
 			
 			facade.listDataSetsForSample(sample, restrictToDirectlyConnected, function(response){
 				assertObjectsCount(response.result, 6);
+				facade.close();
 			});
 		});
 	});
@@ -251,6 +250,7 @@ test("listDataStores()", function(){
 		facade.listDataStores(function(response){
 			assertObjectsCount(response.result, 1);
 			assertObjectsWithCodes(response.result, [ 'DSS-SCREENING' ]);
+			facade.close();
 		});
 	});
 });
@@ -259,6 +259,7 @@ test("getDefaultPutDataStoreBaseURL()", function(){
 	createFacadeAndLogin(function(facade){
 		facade.getDefaultPutDataStoreBaseURL(function(response){
 			equal(response.result, 'https://sprint-openbis.ethz.ch:8444', 'URL is correct')
+			facade.close();
 		});
 	});
 });
@@ -269,6 +270,7 @@ test("tryGetDataStoreBaseURL()", function(){
 		
 		facade.tryGetDataStoreBaseURL(dataSetCode, function(response){
 			equal(response.result, 'https://sprint-openbis.ethz.ch:8444', 'URL is correct')
+			facade.close();
 		});
 	});
 });
@@ -283,6 +285,7 @@ test("getDataStoreBaseURLs()", function(){
 			var urlForDataSets = response.result[0];
 			equal(urlForDataSets.dataStoreURL, 'https://sprint-openbis.ethz.ch:8444', 'URL is correct');
 			deepEqual(urlForDataSets.dataSetCodes.sort(), dataSetCodes.sort());
+			facade.close();
 		});
 	});
 });
@@ -291,6 +294,7 @@ test("listDataSetTypes()", function(){
 	createFacadeAndLogin(function(facade){
 		facade.listDataSetTypes(function(response){
 			assertObjectsCount(response.result, 25);
+			facade.close();
 		});
 	});
 });
@@ -299,6 +303,7 @@ test("listVocabularies()", function(){
 	createFacadeAndLogin(function(facade){
 		facade.listVocabularies(function(response){
 			assertObjectsCount(response.result, 4);
+			facade.close();
 		});
 	});
 });
@@ -314,6 +319,7 @@ test("listDataSetsForSamplesWithConnections()", function(){
 			facade.listDataSetsForSamplesWithConnections(samples, connectionsToGet, function(response){
 				assertObjectsCount(response.result, 6);
 				assertObjectsWithParentCodes(response.result);
+				facade.close();
 			});
 		});
 	});
@@ -331,6 +337,7 @@ test("listDataSetsForSamplesOnBehalfOfUser()", function(){
 			facade.listDataSetsForSamplesOnBehalfOfUser(samples, connectionsToGet, userId, function(response){
 				assertObjectsCount(response.result, 5);
 				assertObjectsWithParentCodes(response.result);
+				facade.close();
 			});
 		});
 	});
@@ -347,6 +354,7 @@ test("listDataSetsForExperiments()", function(){
 			facade.listDataSetsForExperiments(experiments, connectionsToGet, function(response){
 				assertObjectsCount(response.result, 19);
 				assertObjectsWithParentCodes(response.result);
+				facade.close();
 			});
 		});
 	});
@@ -364,6 +372,7 @@ test("listDataSetsForExperimentsOnBehalfOfUser()", function(){
 			facade.listDataSetsForExperimentsOnBehalfOfUser(experiments, connectionsToGet, userId, function(response){
 				assertObjectsCount(response.result, 428);
 				assertObjectsWithParentCodes(response.result);
+				facade.close();
 			});
 		});
 	});
@@ -377,6 +386,7 @@ test("getDataSetMetaData()", function(){
 			assertObjectsCount(response.result, 2);
 			assertObjectsWithCodes(response.result, dataSetCodes);
 			assertObjectsWithProperties(response.result);
+			facade.close();
 		});
 	});
 });
@@ -390,6 +400,7 @@ test("getDataSetMetaDataWithFetchOptions()", function(){
 			assertObjectsCount(response.result, 2);
 			assertObjectsWithCodes(response.result, dataSetCodes);
 			assertObjectsWithoutProperties(response.result);
+			facade.close();
 		});
 	});
 });
@@ -404,6 +415,7 @@ test("searchForDataSets()", function(){
 			assertObjectsCount(response.result, 2);
 			assertObjectsWithCodes(response.result, dataSetCodes);
 			assertObjectsWithProperties(response.result);
+			facade.close();
 		});
 	});
 });
@@ -419,6 +431,7 @@ test("searchForDataSetsOnBehalfOfUser()", function(){
 			assertObjectsCount(response.result, 2);
 			assertObjectsWithCodes(response.result, [ '20110817134524954-81697', '20110817134715385-81703' ]);
 			assertObjectsWithProperties(response.result);
+			facade.close();
 		});
 	});
 });