From 519743cf7533b860c430b99d83305a91a1766e3d Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 17 Oct 2014 08:43:14 +0200
Subject: [PATCH] OO-1228: reduce sleep time in unit tests, update undertow,
 remove some translator error in course wizard, make that the unit tests for
 the identity power search really test and fail if something goes wrong...

---
 pom.xml                                       |   5 +-
 .../coursecreation/steps/CcStep00.java        |   2 +-
 .../coursecreation/steps/CcStep02.java        |   7 +-
 .../steps/_content/CcStep00_form.html         |   2 +-
 .../basesecurity/BaseSecurityManager.java     |  16 +-
 .../org/olat/core/commons/persistence/DB.java |  10 -
 .../olat/core/commons/persistence/DBImpl.java |  10 +-
 .../org/olat/core/util/mail/MailModule.java   |  27 +-
 .../basesecurity/BaseSecurityManagerTest.java |  40 +-
 .../olat/basesecurity/BaseSecurityTest.java   | 810 -----------------
 .../GetIdentitiesByPowerSearchTest.java       | 821 ++++++++++++++++++
 .../commons/coordinate/CoordinatorTest.java   | 117 ++-
 .../olat/core/commons/persistence/DBTest.java |  12 +-
 .../taskexecutor/TaskExecutorManagerTest.java |   7 +-
 .../services/webdav/WebDAVCommandsTest.java   |   2 +-
 .../util/mail/manager/MailManagerTest.java    |   2 -
 .../UserCourseInformationsManagerTest.java    |   2 +-
 .../olat/group/test/BGAreaManagerTest.java    |   8 +-
 .../InstantMessagePreferencesDAOTest.java     |   2 +-
 .../resource/lock/pessimistic/PLockTest.java  | 296 ++++---
 .../java/org/olat/restapi/RestConnection.java |   6 +-
 .../java/org/olat/test/AllTestsJunit4.java    |   2 +-
 22 files changed, 1092 insertions(+), 1114 deletions(-)
 delete mode 100644 src/test/java/org/olat/basesecurity/BaseSecurityTest.java
 create mode 100644 src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java

diff --git a/pom.xml b/pom.xml
index 8d19201038b..cf080e859ff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1358,6 +1358,7 @@
 				<plugin>
 					<groupId>org.apache.maven.plugins</groupId>
 					<artifactId>maven-enforcer-plugin</artifactId>
+					<version>1.3.1</version>
 					<executions>
 						<execution>
 							<id>show-versions</id>
@@ -2198,13 +2199,13 @@
 		<dependency>
 		    <groupId>io.undertow</groupId>
 		    <artifactId>undertow-core</artifactId>
-		    <version>1.0.9.Final</version>
+		    <version>1.0.16.Final</version>
 			<scope>test</scope>
 		</dependency>
 		<dependency>
 		    <groupId>io.undertow</groupId>
 		    <artifactId>undertow-servlet</artifactId>
-		    <version>1.0.9.Final</version>
+		    <version>1.0.16.Final</version>
 			<scope>test</scope>
 		</dependency>
     
diff --git a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep00.java b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep00.java
index a33ec51274a..1d06a831918 100644
--- a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep00.java
+++ b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep00.java
@@ -187,7 +187,7 @@ public class CcStep00 extends BasicStep {
 					"o_icon o_co_icon"
 			};
 			// show checkbox
-			rightsChooser = FormUIFactory.getInstance().addCheckboxesVertical("rightsChooser", fic, keys, values, iconCSS, 1);
+			rightsChooser = FormUIFactory.getInstance().addCheckboxesVertical("cce.label", fic, keys, values, iconCSS, 1);
 			rightsChooser.addActionListener(FormEvent.ONCLICK); // Radios/Checkboxes need onclick because of IE bug OLAT-5753
 			// create edit button for enrollment and hide it
 			editButtonEnrollment = FormUIFactory.getInstance().addFormLink("cce.edit", fic);
diff --git a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep02.java b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep02.java
index f76258d4758..981e72cc4dd 100644
--- a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep02.java
+++ b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/CcStep02.java
@@ -155,8 +155,7 @@ public class CcStep02 extends BasicStep {
 			formLayout.add(formItems);
 
 			// create access limit checkbox
-			publishCheckbox = FormUIFactory.getInstance().addCheckboxesVertical("publishCheckbox", formItems, new String[] {"ison"}, new String[] {""}, 1);
-			publishCheckbox.setLabel("car.makepublic", null);
+			publishCheckbox = FormUIFactory.getInstance().addCheckboxesHorizontal("car.makepublic", formItems, new String[] {"ison"}, new String[] {""});
 			publishCheckbox.select("ison", true);
 
 			publishCheckbox.addActionListener(FormEvent.ONCHANGE);
@@ -180,9 +179,7 @@ public class CcStep02 extends BasicStep {
 				values[2] = translator.translate("car.university", new String[] { institution });
 			}
 			
-			accessChooser = FormUIFactory.getInstance().addDropdownSingleselect("accessChooser", formItems, keys, values, null);
-			accessChooser.setLabel("car.label", null);
-
+			accessChooser = FormUIFactory.getInstance().addDropdownSingleselect("car.label", formItems, keys, values, null);
 			accessChooser.select(CourseCreationConfiguration.ACL_OLAT, true);
 			accessChooser.addActionListener(FormEvent.ONCHANGE);
 
diff --git a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/_content/CcStep00_form.html b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/_content/CcStep00_form.html
index c5419eacbfe..841146ce2e4 100644
--- a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/_content/CcStep00_form.html
+++ b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/steps/_content/CcStep00_form.html
@@ -4,7 +4,7 @@
         <table>
         	<tr valign="top">
         		<td >$r.translate("cce.label"):&nbsp;&nbsp;</td>         
-				<td align="left" >$r.render("rightsChooser")</td>
+				<td align="left" >$r.render("cce.label")</td>
 				<td align="right" style="padding-top:17px;">$r.render("cce.edit")</td>		
 			</tr>	
 			<tr>
diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
index fcb68564ee1..f4dc7b9a63d 100644
--- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
+++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
@@ -136,21 +136,21 @@ public class BaseSecurityManager extends BasicManager implements BaseSecurity {
 	public void init() { // called only once at startup and only from one thread
 		// init the system level groups and its policies
 		initSysGroupAdmin();
-		DBFactory.getInstance(false).intermediateCommit();
+		dbInstance.commit();
 		initSysGroupAuthors();
-		DBFactory.getInstance(false).intermediateCommit();
+		dbInstance.commit();
 		initSysGroupGroupmanagers();
-		DBFactory.getInstance(false).intermediateCommit();
+		dbInstance.commit();
 		initSysGroupPoolsmanagers();
-		DBFactory.getInstance(false).intermediateCommit();
+		dbInstance.commit();
 		initSysGroupUsermanagers();
-		DBFactory.getInstance(false).intermediateCommit();
+		dbInstance.commit();
 		initSysGroupUsers();
-		DBFactory.getInstance(false).intermediateCommit();
+		dbInstance.commit();
 		initSysGroupAnonymous();
-		DBFactory.getInstance(false).intermediateCommit();
+		dbInstance.commit();
 		initSysGroupInstitutionalResourceManager();
-		DBFactory.getInstance(false).intermediateCommit();
+		dbInstance.commitAndCloseSession();
 	}
 
 	/**
diff --git a/src/main/java/org/olat/core/commons/persistence/DB.java b/src/main/java/org/olat/core/commons/persistence/DB.java
index 2050c611b55..29ec03b1de8 100644
--- a/src/main/java/org/olat/core/commons/persistence/DB.java
+++ b/src/main/java/org/olat/core/commons/persistence/DB.java
@@ -40,11 +40,6 @@ public interface DB {
 	 * Close the database session.
 	 */
 	public void closeSession();
-	
-	/**
-	 * Close the database session, clean threadlocal but only if necessary
-	 */
-	//public void cleanUpSession();
 
 	/**
 	 * Create a DBQuery
@@ -162,11 +157,6 @@ public interface DB {
 	 */
 	public Persistable loadObject(Persistable persistable, boolean forceReloadFromDB);
 
-
-	/**
-	 * Begin a new transaction (don't forget to commit the last one)
-	 */
-	public void begin();
 	
 	/**
 	 * Call this to commit current changes.
diff --git a/src/main/java/org/olat/core/commons/persistence/DBImpl.java b/src/main/java/org/olat/core/commons/persistence/DBImpl.java
index 5e1a218018a..8f0c5b67440 100644
--- a/src/main/java/org/olat/core/commons/persistence/DBImpl.java
+++ b/src/main/java/org/olat/core/commons/persistence/DBImpl.java
@@ -660,11 +660,11 @@ public class DBImpl extends LogDelegator implements DB, Destroyable {
 		}
 	}
 	
-	private void evict(EntityManager em, Object object, ThreadLocalData data) {
+	private void evict(EntityManager em, Object object, ThreadLocalData localData) {
 		try {
 			getSession(em).evict(object);			
 		} catch (Exception e) {
-			data.setError(e);
+			localData.setError(e);
 			throw new DBRuntimeException("Error in evict() Object from Database. ", e);
 		}
 	}
@@ -695,12 +695,6 @@ public class DBImpl extends LogDelegator implements DB, Destroyable {
 		}
 	}
 
-	@Override
-	public void begin() {
-		//this will begin a new transaction
-		getCurrentEntityManager();
-	}
-
 	/**
 	 * Call this to commit a transaction opened by beginTransaction().
 	 */
diff --git a/src/main/java/org/olat/core/util/mail/MailModule.java b/src/main/java/org/olat/core/util/mail/MailModule.java
index b105e143465..6f63b07cb1e 100644
--- a/src/main/java/org/olat/core/util/mail/MailModule.java
+++ b/src/main/java/org/olat/core/util/mail/MailModule.java
@@ -21,16 +21,11 @@ package org.olat.core.util.mail;
 
 import java.io.File;
 
-import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.modules.bc.FolderConfig;
 import org.olat.core.configuration.AbstractOLATModule;
 import org.olat.core.configuration.PersistedProperties;
-import org.olat.core.extensions.action.GenericActionExtension;
-import org.olat.core.gui.control.Event;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.WebappHelper;
-import org.olat.core.util.event.FrameworkStartedEvent;
-import org.olat.core.util.event.FrameworkStartupEventChannel;
 import org.olat.core.util.vfs.LocalFolderImpl;
 import org.olat.core.util.vfs.VFSContainer;
 
@@ -59,7 +54,6 @@ public class MailModule extends AbstractOLATModule {
 	
 	public MailModule() {
 		//make Spring happy
-		FrameworkStartupEventChannel.registerForStartupEvent(this);
 	}
 	
 	/**
@@ -115,30 +109,11 @@ public class MailModule extends AbstractOLATModule {
 	 * @param internSystem
 	 */
 	public void setInterSystem(boolean internSystem) {
+		this.internSystem = internSystem;
 		String internSystemStr = internSystem ? "true" : "false";
-		enableExtensions(internSystem);
 		setStringProperty(INTERN_MAIL_SYSTEM, internSystemStr, true);
 	}
 	
-	private void enableExtensions(boolean enabled){
-		try {
-			((GenericActionExtension)CoreSpringFactory.getBean("mailAEparent")).setEnabled(enabled);
-			((GenericActionExtension)CoreSpringFactory.getBean("mailAEinbox")).setEnabled(enabled);
-			((GenericActionExtension)CoreSpringFactory.getBean("mailAEoutbox")).setEnabled(enabled);			
-		} catch (Exception e) {
-			// do nothing when extension don't exist.
-		}
-	}
-	
-	@Override
-	public void event(Event event) {
-		if(event instanceof FrameworkStartedEvent) {
-			enableExtensions(isInternSystem());
-		} else {
-			super.event(event);
-		}
-	}
-	
 	/**
 	 * Users can receive real e-mail too. This setting is the default for
 	 * users. They can change it in Preferences Panel.
diff --git a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
index ec33ae018d9..cd8a6591323 100644
--- a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
+++ b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
@@ -65,19 +65,19 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 	
 	@Test
 	public void testCreateIdentity() {
-		String name = "createid-" + UUID.randomUUID().toString();
-		User user = userManager.createUser("first" + name, "last" + name, name + "@frentix.com");
-		Identity identity = securityManager.createAndPersistIdentityAndUser(name, user, BaseSecurityModule.getDefaultAuthProviderIdentifier(), name, "secret");
+		String username = "createid-" + UUID.randomUUID().toString();
+		User user = userManager.createUser("first" + username, "last" + username, username + "@frentix.com");
+		Identity identity = securityManager.createAndPersistIdentityAndUser(username, user, BaseSecurityModule.getDefaultAuthProviderIdentifier(), username, "secret");
 		dbInstance.commitAndCloseSession();
 		
 		Assert.assertNotNull(identity);
 		Assert.assertNotNull(identity.getKey());
-		Assert.assertEquals(name, identity.getName());
+		Assert.assertEquals(username, identity.getName());
 		Assert.assertNotNull(identity.getUser());
 		Assert.assertEquals(user, identity.getUser());
-		Assert.assertEquals("first" + name, identity.getUser().getProperty(UserConstants.FIRSTNAME, null));
-		Assert.assertEquals("last" + name, identity.getUser().getProperty(UserConstants.LASTNAME, null));
-		Assert.assertEquals(name + "@frentix.com", identity.getUser().getProperty(UserConstants.EMAIL, null));
+		Assert.assertEquals("first" + username, identity.getUser().getProperty(UserConstants.FIRSTNAME, null));
+		Assert.assertEquals("last" + username, identity.getUser().getProperty(UserConstants.LASTNAME, null));
+		Assert.assertEquals(username + "@frentix.com", identity.getUser().getProperty(UserConstants.EMAIL, null));
 	}
 	
 	/**
@@ -85,11 +85,11 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 	 */
 	@Test
 	public void testCreateUpdateIdentity() {
-		String name = "update-id-" + UUID.randomUUID().toString();
-		User user = userManager.createUser("first" + name, "last" + name, name + "@frentix.com");
+		String username = "update-id-" + UUID.randomUUID().toString();
+		User user = userManager.createUser("first" + username, "last" + username, username + "@frentix.com");
 		user.setProperty(UserConstants.COUNTRY, "");
 		user.setProperty(UserConstants.CITY, "Basel");
-		Identity identity = securityManager.createAndPersistIdentityAndUser(name, user, BaseSecurityModule.getDefaultAuthProviderIdentifier(), name, "secret");
+		Identity identity = securityManager.createAndPersistIdentityAndUser(username, user, BaseSecurityModule.getDefaultAuthProviderIdentifier(), username, "secret");
 		dbInstance.commitAndCloseSession();
 		
 		//reload and update
@@ -103,8 +103,8 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 		//reload and check
 		Identity identitySecond = securityManager.loadIdentityByKey(identity.getKey());
 		Assert.assertEquals("firstname", identitySecond.getUser().getProperty(UserConstants.FIRSTNAME, null));
-		Assert.assertEquals("last" + name, identitySecond.getUser().getProperty(UserConstants.LASTNAME, null));
-		Assert.assertEquals(name + "@frentix.com", identitySecond.getUser().getProperty(UserConstants.EMAIL, null));
+		Assert.assertEquals("last" + username, identitySecond.getUser().getProperty(UserConstants.LASTNAME, null));
+		Assert.assertEquals(username + "@frentix.com", identitySecond.getUser().getProperty(UserConstants.EMAIL, null));
 		Assert.assertEquals("CH", identitySecond.getUser().getProperty(UserConstants.COUNTRY, null));
 		Assert.assertEquals("Lausanne", identitySecond.getUser().getProperty(UserConstants.CITY, null));
 	}
@@ -156,16 +156,16 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 	@Test
 	public void testFindIdentityByName() {
 		//create a user it
-		String name = "find-me-" + UUID.randomUUID().toString();
-		Identity id = JunitTestHelper.createAndPersistIdentityAsUser(name);
+		String username = "find-me-" + UUID.randomUUID().toString();
+		Identity id = JunitTestHelper.createAndPersistIdentityAsUser(username);
 		Assert.assertNotNull(id);
-		Assert.assertEquals(name, id.getName());
+		Assert.assertEquals(username, id.getName());
 		dbInstance.commitAndCloseSession();
 		
 		//find it
-		Identity foundId = securityManager.findIdentityByName(name);
+		Identity foundId = securityManager.findIdentityByName(username);
 		Assert.assertNotNull(foundId);
-		Assert.assertEquals(name, foundId.getName());
+		Assert.assertEquals(username, foundId.getName());
 		Assert.assertEquals(id, foundId);
 	}
 	
@@ -210,11 +210,11 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 	
 	@Test
 	public void testCreateNamedGroup() {
-		String name = UUID.randomUUID().toString().replace("-", "").substring(0, 16);
-		SecurityGroup ng = securityManager.createAndPersistNamedSecurityGroup(name);
+		String username = UUID.randomUUID().toString().replace("-", "").substring(0, 16);
+		SecurityGroup ng = securityManager.createAndPersistNamedSecurityGroup(username);
 		dbInstance.commitAndCloseSession();
 		
-		SecurityGroup sgFound = securityManager.findSecurityGroupByName(name);
+		SecurityGroup sgFound = securityManager.findSecurityGroupByName(username);
 		Assert.assertNotNull(sgFound);
 		Assert.assertEquals(sgFound.getKey(), ng.getKey());
 	}
diff --git a/src/test/java/org/olat/basesecurity/BaseSecurityTest.java b/src/test/java/org/olat/basesecurity/BaseSecurityTest.java
deleted file mode 100644
index 87f253c7542..00000000000
--- a/src/test/java/org/olat/basesecurity/BaseSecurityTest.java
+++ /dev/null
@@ -1,810 +0,0 @@
-/**
-* OLAT - Online Learning and Training<br>
-* http://www.olat.org
-* <p>
-* Licensed under the Apache License, Version 2.0 (the "License"); <br>
-* you may not use this file except in compliance with the License.<br>
-* You may obtain a copy of the License at
-* <p>
-* http://www.apache.org/licenses/LICENSE-2.0
-* <p>
-* Unless required by applicable law or agreed to in writing,<br>
-* software distributed under the License is distributed on an "AS IS" BASIS, <br>
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
-* See the License for the specific language governing permissions and <br>
-* limitations under the License.
-* <p>
-* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
-* University of Zurich, Switzerland.
-* <hr>
-* <a href="http://www.openolat.org">
-* OpenOLAT - Online Learning and Training</a><br>
-* This file has been modified by the OpenOLAT community. Changes are licensed
-* under the Apache 2.0 license as the original file.  
-* <p>
-*/ 
-
-package org.olat.basesecurity;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import junit.framework.Assert;
-
-import org.junit.Test;
-import org.olat.core.commons.persistence.DBFactory;
-import org.olat.core.id.Identity;
-import org.olat.core.id.Roles;
-import org.olat.core.id.User;
-import org.olat.core.id.UserConstants;
-import org.olat.core.logging.OLog;
-import org.olat.core.logging.Tracing;
-import org.olat.test.JunitTestHelper;
-import org.olat.test.OlatTestCase;
-import org.olat.user.UserManager;
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * Description: <br>
- * 
- * @author Felix Jost
- */
-public class BaseSecurityTest extends OlatTestCase {
-	
-	private static final OLog log = Tracing.createLoggerFor(BaseSecurityTest.class);
-	
-	@Autowired
-	private BaseSecurity baseSecurityManager;
-	
-
-	
-	@Test
-	public void testGetIdentitiesByPowerSearch() {
-		System.out.println("start testGetIdentitiesByPowerSearch");
-		try {
-			Identity ident = getOrCreateIdentity("anIdentity");
-			Identity ident2 = getOrCreateTestIdentity("extremegroovy");
-			Assert.assertNotNull(ident2);
-			Identity deletedIdent = getOrCreateTestIdentity("delete");
-			deletedIdent = baseSecurityManager.saveIdentityStatus(deletedIdent, Identity.STATUS_DELETED);
-
-			SecurityGroup admins = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_ADMIN);
-			baseSecurityManager.addIdentityToSecurityGroup(deletedIdent, admins);
-
-			
-			// basic query to find all system users without restrictions
-			List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size()>0); 
-			int numberOfAllUsers = results.size();
-			
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null,Identity.STATUS_ACTIV);
-			assertTrue(results.size()>0);
-			int numberOfActiveUsers = results.size();
-			
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, Identity.STATUS_DELETED);
-			assertTrue(results.size() >0);
-			int numberOfDeletedUsers = results.size();
-			assertEquals("Number of all users != activeUsers + deletedUsers" , numberOfAllUsers, numberOfActiveUsers + numberOfDeletedUsers);
-			
-			// user attributes search test
-			DBFactory.getInstance().closeSession();
-			results = baseSecurityManager.getIdentitiesByPowerSearch(ident.getName(), null, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-			assertEquals("Wrong search result (search with username)" + ident.getName() + "' ",ident.getName() , results.get(0).getName());
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(ident.getName(), null, true, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-			assertEquals("Wrong search result (search with username)" + ident.getName() + "' ",ident.getName() , results.get(0).getName());
-			
-			results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity", null, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity", null, true, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch("lalal", null, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("lalal", null, true, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-			
-			Map<String, String> userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.INSTITUTIONALNAME, "*zh2");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			sysoutResults(results);
-			assertEquals("Wrong search result 'UserConstants.INSTITUTIONALNAME='*zh2'", 2, results.size());
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-			assertEquals("Wrong search result for visible 'UserConstants.INSTITUTIONALNAME='*zh2'", 1, results.size());
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.INSTITUTIONALNAME, "un");
-			userProperties.put(UserConstants.INSTITUTIONALUSERIDENTIFIER, "678"); // per default the % is only attached at the end of the query. 
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.INSTITUTIONALNAME, "un");
-			userProperties.put(UserConstants.INSTITUTIONALUSERIDENTIFIER, "%678");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 2);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.INSTITUTIONALNAME, "un");
-			userProperties.put(UserConstants.INSTITUTIONALUSERIDENTIFIER, "12-345-678");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 2);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.INSTITUTIONALNAME, "un");
-			userProperties.put(UserConstants.INSTITUTIONALUSERIDENTIFIER, "888");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.INSTITUTIONALNAME, "un");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 2);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, Identity.STATUS_ACTIV);
-			assertTrue(results.size() == 1);
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, Identity.STATUS_ACTIV);
-			assertTrue(results.size() == 1);
-		} catch (Exception e) {
-			e.printStackTrace();
-		} catch (Error err) {
-			err.printStackTrace();
-		}
-		System.out.println("stop testGetIdentitiesByPowerSearch");
-		
-	}
-	
-	@Test public void testGetIdentitiesByPowerSearchWithGroups() {
-		System.out.println("start testGetIdentitiesByPowerSearchWithGroups");
-		try {
-			Identity ident = getOrCreateIdentity("anIdentity");
-			Identity ident2 = getOrCreateTestIdentity("extremegroovy");
-
-			// add some stats
-			ident = baseSecurityManager.saveIdentityStatus(ident, Identity.STATUS_ACTIV);
-			ident2 = baseSecurityManager.saveIdentityStatus(ident2, Identity.STATUS_ACTIV);
-			
-			// check on those four default groups
-			SecurityGroup admins, authors, anonymous;
-			admins = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_ADMIN);
-			anonymous = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_ANONYMOUS);
-			authors = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_AUTHORS);
-			// test setup: identity is admin and author
-			baseSecurityManager.addIdentityToSecurityGroup(ident, admins);
-			baseSecurityManager.addIdentityToSecurityGroup(ident2, admins);
-			baseSecurityManager.addIdentityToSecurityGroup(ident, authors);
-
-			// security group search test
-			DBFactory.getInstance().closeSession();
-			SecurityGroup[] groups1 = {admins};
-			SecurityGroup[] groups2 = {admins, authors};
-			SecurityGroup[] groups3 = {authors};
-			SecurityGroup[] groupsInvalid = {anonymous};
-
-			// basic query to find all system users without restrictions
-			List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size()>0); 
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, Identity.STATUS_DELETED);
-			assertTrue(results.size() >0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups1, null, null, null, null, null, null, null);
-			assertTrue(results.size() >0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups1, null, null, null, null);
-			assertTrue(results.size() >0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups2, null, null, null, null, null, null, null);
-			assertTrue(results.size() >0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups2, null, null, null, null);
-			assertTrue(results.size() >0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups3, null, null, null, null, null, null, null);
-			assertTrue(results.size() >0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups3, null, null, null, null);
-			assertTrue(results.size() >0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groupsInvalid, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groupsInvalid, null, null, null, null);
-			assertTrue(results.size() == 0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity", null, true, groups2, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity", null, true, groups2, null, null, null, null);
-			assertTrue(results.size() == 1);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity", null, true, groups1, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity", null, true, groups1, null, null, null, null);
-			assertTrue(results.size() == 1);
-
-			// policy search test
-			DBFactory.getInstance().closeSession();
-			List<Policy> policies = baseSecurityManager.getPoliciesOfSecurityGroup(admins);
-			PermissionOnResourceable[] adminPermissions = convertPoliciesListToPermissionOnResourceArray(policies);
-			policies = baseSecurityManager.getPoliciesOfSecurityGroup(anonymous);
-			PermissionOnResourceable[] anonymousPermissions = convertPoliciesListToPermissionOnResourceArray(policies);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, adminPermissions, null, null, null, null, null, null);
-			assertTrue(results.size() >0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, adminPermissions, null, null, null);
-			assertTrue(results.size() >0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, anonymousPermissions, null, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, anonymousPermissions, null, null, null);
-			assertTrue(results.size() == 0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups2, anonymousPermissions, null, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups2, anonymousPermissions, null, null, null);
-			assertTrue(results.size() == 0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups2, adminPermissions, null, null, null, null, null, null);
-			assertTrue(results.size() >0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups2, adminPermissions, null, null, null);
-			assertTrue(results.size() >0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups3, adminPermissions, null, null, null, null, null, null);
-			assertTrue("Found no identities for group 'authors'",results.size() >0);
-			boolean isAuthor = true;
-			checkIdentitiesHasRoles(results, isAuthor);
-
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups3, adminPermissions, null, null, null);
-			assertTrue("Found no identities for group 'authors'",results.size() >0);
-			checkIdentitiesHasRoles(results, isAuthor);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity", null, true, groups2, adminPermissions, null, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity", null, true, groups2, adminPermissions, null, null, null);
-			assertTrue(results.size() == 1);
-			
-			results = baseSecurityManager.getIdentitiesByPowerSearch("dontexist", null, true, groups2, adminPermissions, null, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("dontexist", null, true, groups2, adminPermissions, null, null, null);
-			assertTrue(results.size() == 0);
-
-			// authentication provider search
-			String[] authProviders = {BaseSecurityModule.getDefaultAuthProviderIdentifier(), "Shib"};
-			String[] authProvidersInvalid = {"nonexist"};// max length 8 !		
-			String[] authProviderNone = { null };
-			String[] authProvidersAll = {BaseSecurityModule.getDefaultAuthProviderIdentifier(), "Shib", null };
-			
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviders, null, null, null, null, null);
-			assertTrue(results.size() >0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviders, null, null);
-			assertTrue(results.size() >0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProvidersInvalid, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProvidersInvalid, null, null);
-			assertTrue(results.size() == 0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity", null, true, groups2, adminPermissions, authProviders, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity", null, true, groups2, adminPermissions, authProviders, null, null);
-			assertTrue(results.size() == 1);
-			
-			results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity", null, true, groups2, adminPermissions, authProvidersInvalid, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity", null, true, groups2, adminPermissions, authProvidersInvalid, null, null);
-			assertTrue(results.size() == 0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch("dontexist", null, true, groups2, adminPermissions, authProviders, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("dontexist", null, true, groups2, adminPermissions, authProviders, null, null);
-			assertTrue(results.size() == 0);
-
-			Authentication auth = baseSecurityManager.findAuthentication(ident, BaseSecurityModule.getDefaultAuthProviderIdentifier());
-			baseSecurityManager.deleteAuthentication(auth);
-			DBFactory.getInstance().closeSession();
-
-			// ultimate tests
-			//Identity ident = getOrCreateIdentity("anIdentity");
-			Date created = ident.getCreationDate();
-			Calendar cal = Calendar.getInstance();
-			cal.setTime(created);
-			cal.add(Calendar.DAY_OF_MONTH, -5);
-			Date before = cal.getTime();
-
-			DBFactory.getInstance().closeSession();
-			results = baseSecurityManager.getIdentitiesByPowerSearch("groovy", null, true, groups1, adminPermissions, null, before, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("groovy", null, true, groups1, adminPermissions, null, before, null);
-			assertTrue(results.size() == 0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch("extremegroovy", null, true, groups1, adminPermissions, null, before, null, null, null, null);
-			assertTrue(results.size() == 1);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("extremegroovy", null, true, groups1, adminPermissions, null, before, null);
-			assertTrue(results.size() == 1);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, authProviders, before, null, null, null, null);
-			assertTrue("Found no results", results.size() > 0);
-			checkIdentitiesAreInGroups(results, groups1);
-			checkIdentitiesHasAuthProvider(results,authProviders );
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, authProviders, before, null);
-			assertTrue("Found no results", results.size() > 0);
-			checkIdentitiesAreInGroups(results, groups1);
-			checkIdentitiesHasAuthProvider(results,authProviders );
-			
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, authProviderNone, before, null, null, null, null);
-			assertTrue("Found no results", results.size() > 0);
-			checkIdentitiesAreInGroups(results, groups1);
-			checkIdentitiesHasPermissions(results, adminPermissions);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, authProviderNone, before, null);
-			assertTrue("Found no results", results.size() > 0);
-			checkIdentitiesAreInGroups(results, groups1);
-			checkIdentitiesHasPermissions(results, adminPermissions);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch("%y", null, true, groups1, adminPermissions, authProvidersAll, before, null, null, null, null);
-			assertTrue(results.size() == 2);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("%y", null, true, groups1, adminPermissions, authProvidersAll, before, null);
-			assertTrue(results.size() == 2);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch("%y", null, true, groups1, adminPermissions, authProvidersAll, null, before, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("%y", null, true, groups1, adminPermissions, authProvidersAll, null, before);
-			assertTrue(results.size() == 0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, null, before, null, null, null, null);
-			sysoutResults(results);
-			assertTrue("Found no results", results.size() > 0);
-			checkIdentitiesAreInGroups(results, groups1);
-			checkIdentitiesHasPermissions(results, adminPermissions);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, null, before, null);
-			assertTrue("Found no results", results.size() > 0);
-			checkIdentitiesAreInGroups(results, groups1);
-			checkIdentitiesHasPermissions(results, adminPermissions);
-			
-			System.out.println("Tschagaaa, good job!");
-			DBFactory.getInstance().closeSession();
-		} catch (Exception e) {
-			e.printStackTrace();
-		} catch (Error err) {
-			err.printStackTrace();
-		}
-		System.out.println("stop testGetIdentitiesByPowerSearchWithGroups");
-	}
-	
-	
-	@Test public void testGetIdentitiesByPowerSearchAuthProvider(){
-	
-
-		System.out.println("start testGetIdentitiesByPowerSearchAuthProvider");
-		try {
-			//authentication provider search		
-			String[] authProviderNone = { null };
-			String[] authProvidersAll = {BaseSecurityModule.getDefaultAuthProviderIdentifier(), "Shib", null };
-			
-			//check count before adding
-			List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null, null, null, null);
-			int prevProviderNoneCount = results.size();
-			//add two new users with authProviderNone
-			getOrCreateTestIdentityWithAuth("authNoneOne", null);
-			getOrCreateTestIdentityWithAuth("authNoneTwo", null);
-			DBFactory.getInstance().closeSession();
-			// special case: no auth provider
-			// test if 2 new users are found.
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null, null, null, null);
-			assertEquals("Wrong number of identities, search with (authProviderNone)", prevProviderNoneCount, results.size() - 2);
-			
-			
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null);
-			prevProviderNoneCount = results.size();
-			getOrCreateTestIdentityWithAuth("authNoneThree", null);
-			getOrCreateTestIdentityWithAuth("authNoneFour", null);
-			DBFactory.getInstance().closeSession();
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null);
-			assertEquals("Wrong number of visible identities, search with (authProviderNone)", prevProviderNoneCount, results.size() - 2  );
-			
-			
-			
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null, null, null, null);
-			prevProviderNoneCount = results.size();
-			getOrCreateTestIdentityWithAuth("authNoneFive", null);
-			getOrCreateTestIdentityWithAuth("authNoneSix", null);
-			DBFactory.getInstance().closeSession();
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null, null, null, null);
-			assertEquals("Wrong number of identities, search with (authProviderNone)", prevProviderNoneCount, results.size() - 2  );
-			
-
-			
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null);
-			prevProviderNoneCount = results.size();
-			getOrCreateTestIdentityWithAuth("authNoneSeven", null);
-			getOrCreateTestIdentityWithAuth("authNoneEight", null);
-			DBFactory.getInstance().closeSession();
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null);
-			assertEquals("Wrong number of visible identities, search with (authProviderNone)", prevProviderNoneCount, results.size() - 2);
-			
-			
-			
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProvidersAll, null, null, null, null, null);
-			prevProviderNoneCount = results.size();
-			//add a new identity per entry of AuthProvidersAll
-			getOrCreateTestIdentityWithAuth("authTwelve", "Shib");
-			getOrCreateTestIdentityWithAuth("authThirteen", BaseSecurityModule.getDefaultAuthProviderIdentifier());
-			getOrCreateTestIdentityWithAuth("authForteen", null);
-			DBFactory.getInstance().closeSession();
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProvidersAll, null, null, null, null, null);
-			assertTrue(results.size() - prevProviderNoneCount == 3);
-			
-			
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProvidersAll, null, null);
-			prevProviderNoneCount = results.size();
-//add a new identity per entry of AuthProvidersAll
-			getOrCreateTestIdentityWithAuth("authSixteen", "Shib");
-			getOrCreateTestIdentityWithAuth("authSeventeen", BaseSecurityModule.getDefaultAuthProviderIdentifier());
-			getOrCreateTestIdentityWithAuth("authEighteen", null);
-			DBFactory.getInstance().closeSession();
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProvidersAll, null, null);
-			assertTrue(results.size() - prevProviderNoneCount == 3);
-		} catch (Exception e) {
-			e.printStackTrace();
-		} catch (Error err) {
-			err.printStackTrace();
-		}
-		System.out.println("stop testGetIdentitiesByPowerSearchAuthProvider");
-
-		
-		
-	}
-	
-	
-	
-	// Hint : Properties for testing with HSQL must be lowercaseHSQL DB does not 
-	//        mysql 'like' found results with upper and lowercase
-	//        HSQL  'like' found only results with lowercase
-	//        Our implementation of powersearch convert search-properties to lowercase ! 
-	@Test public void testGetIdentitiesByPowerSearchWithUserPropertiesAndIntersectionOption() {
-		// create two test users
-
-		System.out.println("start testGetIdentitiesByPowerSearchWithUserPropertiesAndIntersectionOption");
-		try {
-			User onePropUser = UserManager.getInstance().createUser("onepropuser", "onepropuser", "onepropuser@lustig.com");
-			onePropUser.setProperty(UserConstants.FIRSTNAME, "one");		
-			Identity onePropeIdentity = baseSecurityManager.createAndPersistIdentityAndUser("onePropUser", onePropUser, BaseSecurityModule.getDefaultAuthProviderIdentifier(), "onepropuser", "ppp");
-			Assert.assertNotNull(onePropeIdentity);
-			
-			User twoPropUser = UserManager.getInstance().createUser("twopropuser", "twopropuser", "twopropuser@lustig.com");
-			twoPropUser.setProperty(UserConstants.FIRSTNAME, "two");
-			twoPropUser.setProperty(UserConstants.LASTNAME, "prop");
-			Identity twoPropeIdentity = baseSecurityManager.createAndPersistIdentityAndUser("twopropuser", twoPropUser, BaseSecurityModule.getDefaultAuthProviderIdentifier(), "twopropuser", "ppp");
-			Assert.assertNotNull(twoPropeIdentity);
-			// commit
-			DBFactory.getInstance().closeSession();
-
-			HashMap<String, String> userProperties;
-			
-			// find first
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "one");
-			List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-
-			// no intersection - all properties optional
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "one");
-			userProperties.put(UserConstants.LASTNAME, "somewrongvalue");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-
-			// no intersection - all properties optional
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "one");
-			userProperties.put(UserConstants.LASTNAME, "somewrongvalue");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, false, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-
-			// find second
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "two");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-			
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "two");
-			userProperties.put(UserConstants.LASTNAME, "somewrongvalue");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 0);
-
-			// no intersection - all properties optional
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "two");
-			userProperties.put(UserConstants.LASTNAME, "somewrongvalue");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, false, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "two");
-			userProperties.put(UserConstants.LASTNAME, "prop");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-			
-			// find all
-			// 1. basic query to find all system users without restrictions
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size()>0); 
-			int numberOfAllUsers = results.size();
-			
-			userProperties = new HashMap<String, String>();
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertEquals("Wrong search result 'empty userProperties'", numberOfAllUsers, results.size());
-			
-			userProperties = new HashMap<String, String>();
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, false, null, null, null, null, null, null, null, null);
-			assertEquals("Wrong search result 'empty userProperties and intersection=false'", numberOfAllUsers, results.size());
-
-			DBFactory.getInstance().closeSession();
-		} catch (Exception e) {
-			e.printStackTrace();
-		} catch (Error err) {
-			err.printStackTrace();
-		}
-		System.out.println("stop testGetIdentitiesByPowerSearchWithUserPropertiesAndIntersectionOption");
-
-	}
-
-	@Test public void testMultipleUserPropertiesSearches() {
-		System.out.println("start testMultipleUserPropertiesSearches");
-		// create two test users
-		try {
-			User multiPropUser = UserManager.getInstance().createUser("multipropuser", "multipropuser", "multipropuser@lustig.com");
-			multiPropUser.setProperty(UserConstants.FIRSTNAME, "multi");		
-			multiPropUser.setProperty(UserConstants.LASTNAME, "prop");		
-			multiPropUser.setProperty(UserConstants.INSTITUTIONALNAME, "multiinst");		
-			multiPropUser.setProperty(UserConstants.INSTITUTIONALEMAIL, "multiinst@lustig.com");		
-			multiPropUser.setProperty(UserConstants.INSTITUTIONALUSERIDENTIFIER, "multiinst");		
-			multiPropUser.setProperty(UserConstants.CITY, "züri");		
-			Identity onePropeIdentity = baseSecurityManager.createAndPersistIdentityAndUser("multiPropUser", multiPropUser, BaseSecurityModule.getDefaultAuthProviderIdentifier(), "multipropuser", "ppp");
-			Assert.assertNotNull(onePropeIdentity);
-			
-			// commit
-			DBFactory.getInstance().closeSession();
-
-			HashMap<String, String> userProperties;
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "multi");
-			List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			sysoutResults(results);
-			assertTrue(results.size() == 1);
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "multi");
-			userProperties.put(UserConstants.LASTNAME, "prop");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1);
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "multi");
-			userProperties.put(UserConstants.LASTNAME, "prop");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, false, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 2); // multipropuser and twopropuser
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "multi");
-			userProperties.put(UserConstants.LASTNAME, "prop");
-			userProperties.put(UserConstants.INSTITUTIONALNAME, "multiinst");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1); 
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "multi");
-			userProperties.put(UserConstants.LASTNAME, "prop");
-			userProperties.put(UserConstants.INSTITUTIONALNAME, "multiinst");
-			userProperties.put(UserConstants.INSTITUTIONALEMAIL, "multiinst@lustig.com");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1); 
-
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "multi");
-			userProperties.put(UserConstants.LASTNAME, "prop");
-			userProperties.put(UserConstants.INSTITUTIONALNAME, "multiinst");
-			userProperties.put(UserConstants.INSTITUTIONALEMAIL, "multiinst@lustig.com");
-			userProperties.put(UserConstants.INSTITUTIONALUSERIDENTIFIER, "multiinst");
-			userProperties.put(UserConstants.CITY, "züri");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 1); 
-
-			// Test to reproduce for OLAT-2820:
-			// multipropuser matches firstname, lastname and city
-			// twopropuser matches lastname and has a firstname but not city
-			// Since it intersection flag is set to false it must find both users!
-			userProperties = new HashMap<String, String>();
-			userProperties.put(UserConstants.FIRSTNAME, "multi"); 
-			userProperties.put(UserConstants.LASTNAME, "prop");
-// TODO: fg,cg: Did not found results with empty user-properties	
-//		 twopro has same lastname but different firstname => will be found with userPropertiesInterseactionSearch = true
-//		 twopro has no other user-properties, with current solution no OR-search runs correct with empty user-properties like twopro user has.
-
-//		userProperties.put(UserConstants.INSTITUTIONALNAME, "MultiInst");
-//		userProperties.put(UserConstants.INSTITUTIONALEMAIL, "MultiInst@lustig.com");
-//		userProperties.put(UserConstants.INSTITUTIONALUSERIDENTIFIER, "MultiInst");
-//		userProperties.put(UserConstants.CITY, "Züri");
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, false, null, null, null, null, null, null, null, null);
-			assertTrue(results.size() == 2); // multipropuser and twopropuser
-			DBFactory.getInstance().closeSession();
-		} catch (Exception e) {
-			e.printStackTrace();
-		} catch (Error err) {
-			err.printStackTrace();
-		}
-
-		System.out.println("stop testMultipleUserPropertiesSearches");
-	}
-	
-	@Test public void testGetIdentitiesByPowerSearchWithDate() {
-		System.out.println("start testGetIdentitiesByPowerSearchWithDate");
-		try {
-			Identity ident = getOrCreateIdentity("anIdentity");
-			Date created = ident.getCreationDate();
-			Calendar cal = Calendar.getInstance();
-			cal.setTime(created);
-			cal.add(Calendar.DAY_OF_MONTH, -5);
-			Date before = cal.getTime();
-			cal.add(Calendar.DAY_OF_MONTH, 10);
-			Date after = cal.getTime();
-
-			// basic query to find all system users without restrictions
-			List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, null);
-			assertTrue(results.size()>0); 
-			int numberOfAllUsers = results.size();
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, Identity.STATUS_DELETED);
-			assertTrue(results.size() >0);
-			int numberOfDeletedUsers = results.size();
-
-			Date createdAfter = before;
-			Date createdBefore = after;
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, createdAfter, createdBefore, null, null, null);
-			assertEquals("Search with date (createdAfter,createdBefore) delivers not the same number of users", numberOfAllUsers, results.size());
-
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, before, after);
-			assertEquals("Search (visible identities) with date (createdAfter,createdBefore) delivers not the same number of users", (numberOfAllUsers - numberOfDeletedUsers) , results.size()); // One identity is deleted
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, after, null, null, null);
-			assertEquals("Search with date (only after) delivers not the same number of users", numberOfAllUsers, results.size());
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, null, after);
-			assertEquals("Search (visible identities) with date (createdAfter,createdBefore) delivers not the same number of users", (numberOfAllUsers - numberOfDeletedUsers) , results.size()); // One identity is deleted
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, before, null, null, null, null);
-			assertEquals("Search with date (only before) delivers not the same number of users", numberOfAllUsers, results.size());
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, before, null);
-			assertEquals("Search (visible identities) with date (createdAfter,createdBefore) delivers not the same number of users", (numberOfAllUsers - numberOfDeletedUsers) , results.size()); // One identity is deleted
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, after, before, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, after, before);
-			assertTrue(results.size() == 0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, after, null, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, after, null);
-			assertTrue(results.size() == 0);
-
-			results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, before, null, null, null);
-			assertTrue(results.size() == 0);
-			results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, null, before);
-			assertTrue(results.size() == 0);
-		} catch (Exception e) {
-			e.printStackTrace();
-		} catch (Error err) {
-			err.printStackTrace();
-		}
-		
-
-		System.out.println("end testGetIdentitiesByPowerSearchWithDate");
-	}
-
-	////////////////////
-	// Helper
-	///////////////////
-	private Identity getOrCreateIdentity(String name) {
-		Identity ident = baseSecurityManager.findIdentityByName(name);
-		if (ident != null) {
-			return ident;
-		} else {
-			return JunitTestHelper.createAndPersistIdentityAsUser(name);
-		}
-	}
-	
-	private Identity getOrCreateTestIdentity(String name) {
-		return getOrCreateTestIdentityWithAuth(name,BaseSecurityModule.getDefaultAuthProviderIdentifier());
-	}
-	
-	private Identity getOrCreateTestIdentityWithAuth(String name, String authProvider){
-		Identity ident = baseSecurityManager.findIdentityByName(name);
-		if (ident != null) {
-			return ident;
-		} else {
-			User user = UserManager.getInstance().createUser(name+"_Firstname", name + "_Lastname", name + "@lustig.com");
-			user.setProperty(UserConstants.INSTITUTIONALNAME, "unizh2");
-			user.setProperty(UserConstants.INSTITUTIONALUSERIDENTIFIER, "12-345-678-908");
-			ident = baseSecurityManager.createAndPersistIdentityAndUser(name, user, authProvider, name, "ppp");
-			return ident;
-		}
-	}
-
-	private PermissionOnResourceable[] convertPoliciesListToPermissionOnResourceArray(List<Policy> policies) {
-		PermissionOnResourceable[] array = new PermissionOnResourceable[policies.size()];
-		for (int i = 0; i < policies.size()	; i++) {
-			Policy policy = policies.get(i);
-			PermissionOnResourceable por = new PermissionOnResourceable(policy.getPermission(), policy.getOlatResource());
-			array[i] = por;			
-		}
-		
-		return array;
-	}
-
-	/*
-	 * Only for debugging to see identities result list.
-	 */
-	private void sysoutResults(List<Identity> results) {
-		log.info("TEST results.size()=" + results.size());
-		for (Identity identity:results) {
-			log.debug("TEST ident=" + identity);
-		}		
-	}
-
-	// check Helper Methoden
-	////////////////////////
-	private void checkIdentitiesHasPermissions(List<Identity> results, PermissionOnResourceable[] adminPermissions) {
-		for (Identity resultIdentity: results) {
-			for (int i = 0; i < adminPermissions.length; i++) {
-				assertTrue( baseSecurityManager.isIdentityPermittedOnResourceable(resultIdentity, adminPermissions[i].getPermission(), adminPermissions[i].getOlatResourceable() ) );
-			}
-		}
-	}
-	
-	private void checkIdentitiesHasAuthProvider(List<Identity> results, String[] authProviders) {
-		for (Identity resultIdentity : results) {
-			boolean foundIdentityWithAuth = false;
-			for (int i = 0; i < authProviders.length; i++) {
-				Authentication authentication = baseSecurityManager.findAuthentication(resultIdentity, authProviders[i]);
-				if (authentication != null) {
-					foundIdentityWithAuth = true;
-				}
- 			}
-			assertTrue("Coud not found any authentication for identity=" + resultIdentity, foundIdentityWithAuth);
-		}
-	}
-
-	private void checkIdentitiesAreInGroups(List<Identity> results, SecurityGroup[] groups1) {
-		for (Identity resultIdentity:results) {
-			boolean foundIdentityInSecGroup = false;
-			for (int i = 0; i < groups1.length; i++) {
-				if (baseSecurityManager.isIdentityInSecurityGroup(resultIdentity, groups1[i]) ) {
-					foundIdentityInSecGroup = true;
-				}
-			}
-			assertTrue("Coud not found identity=" + resultIdentity, foundIdentityInSecGroup);
-		}
-	}
-	
-	private void checkIdentitiesHasRoles(List<Identity> results, boolean checkIsAuthor) {
-		for (Identity resultIdentity: results) {
-			Roles roles = baseSecurityManager.getRoles(resultIdentity);
-			if (checkIsAuthor) {
-				assertTrue("Identity has not roles author, identity=" + resultIdentity, roles.isAuthor());
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java b/src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java
new file mode 100644
index 00000000000..f3d1792b15e
--- /dev/null
+++ b/src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java
@@ -0,0 +1,821 @@
+/**
+* OLAT - Online Learning and Training<br>
+* http://www.olat.org
+* <p>
+* Licensed under the Apache License, Version 2.0 (the "License"); <br>
+* you may not use this file except in compliance with the License.<br>
+* You may obtain a copy of the License at
+* <p>
+* http://www.apache.org/licenses/LICENSE-2.0
+* <p>
+* Unless required by applicable law or agreed to in writing,<br>
+* software distributed under the License is distributed on an "AS IS" BASIS, <br>
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+* See the License for the specific language governing permissions and <br>
+* limitations under the License.
+* <p>
+* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
+* University of Zurich, Switzerland.
+* <hr>
+* <a href="http://www.openolat.org">
+* OpenOLAT - Online Learning and Training</a><br>
+* This file has been modified by the OpenOLAT community. Changes are licensed
+* under the Apache 2.0 license as the original file.  
+* <p>
+*/ 
+
+package org.olat.basesecurity;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.olat.core.commons.persistence.DBFactory;
+import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
+import org.olat.core.id.User;
+import org.olat.core.id.UserConstants;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.test.JunitTestHelper;
+import org.olat.test.OlatTestCase;
+import org.olat.user.UserManager;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * Description: <br>
+ * 
+ * @author Felix Jost
+ */
+public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
+	
+	private static final OLog log = Tracing.createLoggerFor(GetIdentitiesByPowerSearchTest.class);
+	
+	@Autowired
+	private BaseSecurity baseSecurityManager;
+	
+	@Test
+	public void testGetIdentitiesByPowerSearch() {
+		String suffix = UUID.randomUUID().toString();
+		Identity ident = JunitTestHelper.createAndPersistIdentityAsUser("anIdentity-" + suffix);
+		Identity uniIdent = getOrCreateTestIdentity("extremegroovy-" + suffix);
+		Assert.assertNotNull(uniIdent);
+		Identity deletedIdent = getOrCreateTestIdentity("delete");
+		deletedIdent = baseSecurityManager.saveIdentityStatus(deletedIdent, Identity.STATUS_DELETED);
+
+		SecurityGroup admins = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_ADMIN);
+		baseSecurityManager.addIdentityToSecurityGroup(deletedIdent, admins);
+
+		
+		// basic query to find all system users without restrictions
+		List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, null);
+		assertTrue(results.size()>0); 
+		int numberOfAllUsers = results.size();
+		
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null,Identity.STATUS_ACTIV);
+		assertTrue(results.size()>0);
+		int numberOfActiveUsers = results.size();
+		
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, Identity.STATUS_DELETED);
+		assertTrue(results.size() >0);
+		int numberOfDeletedUsers = results.size();
+		assertEquals("Number of all users != activeUsers + deletedUsers" , numberOfAllUsers, numberOfActiveUsers + numberOfDeletedUsers);
+		
+		// user attributes search test
+		DBFactory.getInstance().closeSession();
+		results = baseSecurityManager.getIdentitiesByPowerSearch(ident.getName(), null, true, null, null, null, null, null, null, null, null);
+		assertTrue(results.size() == 1);
+		assertEquals("Wrong search result (search with username)" + ident.getName() + "' ",ident.getName() , results.get(0).getName());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(ident.getName(), null, true, null, null, null, null, null);
+		assertTrue(results.size() == 1);
+		assertEquals("Wrong search result (search with username)" + ident.getName() + "' ",ident.getName() , results.get(0).getName());
+		
+		results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity-" + suffix, null, true, null, null, null, null, null, null, null, null);
+		assertTrue(results.size() == 1);
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity-" + suffix, null, true, null, null, null, null, null);
+		assertTrue(results.size() == 1);
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch("lalal", null, true, null, null, null, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("lalal", null, true, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+	}
+	
+	@Test
+	public void testGetIdentitiesByPowerSearch_institution() {
+		String suffix = UUID.randomUUID().toString();
+		Identity ident = JunitTestHelper.createAndPersistIdentityAsUser("anIdentity-" + suffix);
+		Identity uniIdent = getOrCreateTestIdentity("extremegroovy-" + suffix);
+		Assert.assertNotNull(uniIdent);
+		Identity deletedIdent = getOrCreateTestIdentity("delete");
+		deletedIdent = baseSecurityManager.saveIdentityStatus(deletedIdent, Identity.STATUS_DELETED);
+
+		SecurityGroup admins = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_ADMIN);
+		baseSecurityManager.addIdentityToSecurityGroup(deletedIdent, admins);
+
+		
+		//search institutional name with *zh2
+		Map<String, String> userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.INSTITUTIONALNAME, "*zh2");
+		List<Identity> zh2Results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertFalse("Wrong search result 'UserConstants.INSTITUTIONALNAME='*zh2'", zh2Results.contains(ident));
+		Assert.assertTrue("Wrong search result 'UserConstants.INSTITUTIONALNAME='*zh2'", zh2Results.contains(uniIdent));
+		Assert.assertTrue("Wrong search result 'UserConstants.INSTITUTIONALNAME='*zh2'", zh2Results.contains(deletedIdent));
+		List<Identity> zh2VisibleResults = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
+		Assert.assertFalse("Wrong search result for visible 'UserConstants.INSTITUTIONALNAME='*zh2'", zh2VisibleResults.contains(ident));
+		Assert.assertTrue("Wrong search result for visible 'UserConstants.INSTITUTIONALNAME='*zh2'", zh2VisibleResults.contains(uniIdent));
+		Assert.assertFalse("Wrong search result for visible 'UserConstants.INSTITUTIONALNAME='*zh2'", zh2VisibleResults.contains(deletedIdent));
+		
+		//search institutional not found (identifier)
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.INSTITUTIONALNAME, "un");
+		userProperties.put(UserConstants.INSTITUTIONALUSERIDENTIFIER, "678"); // per default the % is only attached at the end of the query. 
+		List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+
+		//search institutional name and user identifier
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.INSTITUTIONALNAME, "un");
+		userProperties.put(UserConstants.INSTITUTIONALUSERIDENTIFIER, "%678");
+		List<Identity> results_678 = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertFalse(results_678.contains(ident));
+		Assert.assertTrue(results_678.contains(uniIdent));
+		Assert.assertTrue(results_678.contains(deletedIdent));
+		
+		//search visible institutional name and user identifier
+		List<Identity> visible_678_results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
+		Assert.assertFalse(visible_678_results.contains(ident));
+		Assert.assertTrue(visible_678_results.contains(uniIdent));
+		Assert.assertFalse(visible_678_results.contains(deletedIdent));
+
+		//search institutional name and user identifier 12-345-678*
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.INSTITUTIONALNAME, "un");
+		userProperties.put(UserConstants.INSTITUTIONALUSERIDENTIFIER, "12-345-678");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertFalse(results.contains(ident));
+		Assert.assertTrue(results.contains(uniIdent));
+		Assert.assertTrue(results.contains(deletedIdent));
+		
+		//search visible institutional name and user identifier 12-345-678*
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
+		Assert.assertFalse(results.contains(ident));
+		Assert.assertTrue(results.contains(uniIdent));
+		Assert.assertFalse(results.contains(deletedIdent));
+
+		//search institutional name and user identifier 888 (nothing to find)
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.INSTITUTIONALNAME, "un");
+		userProperties.put(UserConstants.INSTITUTIONALUSERIDENTIFIER, "888");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+
+		//search institutional name
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.INSTITUTIONALNAME, "un");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertFalse(results.contains(ident));
+		Assert.assertTrue(results.contains(uniIdent));
+		Assert.assertTrue(results.contains(deletedIdent));
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null);
+		Assert.assertFalse(results.contains(ident));
+		Assert.assertTrue(results.contains(uniIdent));
+		Assert.assertFalse(results.contains(deletedIdent));
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, Identity.STATUS_ACTIV);
+		Assert.assertFalse(results.contains(ident));
+		Assert.assertTrue(results.contains(uniIdent));
+		Assert.assertFalse(results.contains(deletedIdent));
+	}
+	
+	@Test
+	public void testGetIdentitiesByPowerSearch_groups() {
+		String suffix = UUID.randomUUID().toString();
+		Identity ident = JunitTestHelper.createAndPersistIdentityAsUser("anIdentity-" + suffix);
+		Identity ident2 = getOrCreateTestIdentity("extremegroovy-" + suffix);
+
+		// add some stats
+		ident = baseSecurityManager.saveIdentityStatus(ident, Identity.STATUS_ACTIV);
+		ident2 = baseSecurityManager.saveIdentityStatus(ident2, Identity.STATUS_ACTIV);
+		
+		// check on those four default groups
+		SecurityGroup admins = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_ADMIN);
+		SecurityGroup anonymous = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_ANONYMOUS);
+		SecurityGroup authors = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_AUTHORS);
+		// test setup: identity is admin and author
+		baseSecurityManager.addIdentityToSecurityGroup(ident, admins);
+		baseSecurityManager.addIdentityToSecurityGroup(ident2, admins);
+		baseSecurityManager.addIdentityToSecurityGroup(ident, authors);
+
+		// security group search test
+		DBFactory.getInstance().closeSession();
+		SecurityGroup[] groups1 = {admins};
+		SecurityGroup[] groups2 = {admins, authors};
+		SecurityGroup[] groups3 = {authors};
+		SecurityGroup[] groupsInvalid = {anonymous};
+
+		// basic query to find all system users without restrictions
+		List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, null);
+		Assert.assertFalse(results.isEmpty()); 
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, Identity.STATUS_DELETED);
+		Assert.assertFalse(results.isEmpty());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups1, null, null, null, null, null, null, null);
+		Assert.assertFalse(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups1, null, null, null, null);
+		Assert.assertFalse(results.isEmpty());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups2, null, null, null, null, null, null, null);
+		Assert.assertFalse(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups2, null, null, null, null);
+		Assert.assertFalse(results.isEmpty());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups3, null, null, null, null, null, null, null);
+		Assert.assertFalse(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups3, null, null, null, null);
+		Assert.assertFalse(results.isEmpty());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groupsInvalid, null, null, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groupsInvalid, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity-" + suffix, null, true, groups2, null, null, null, null, null, null, null);
+		Assert.assertEquals(1, results.size());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity-" + suffix, null, true, groups2, null, null, null, null);
+		Assert.assertEquals(1, results.size());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity-" + suffix, null, true, groups1, null, null, null, null, null, null, null);
+		Assert.assertEquals(1, results.size());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity-" + suffix, null, true, groups1, null, null, null, null);
+		Assert.assertEquals(1, results.size());	
+	}
+
+	
+	@Test
+	public void testGetIdentitiesByPowerSearch_policies() {
+		String suffix = UUID.randomUUID().toString();
+		Identity ident = JunitTestHelper.createAndPersistIdentityAsUser("anIdentity-" + suffix);
+		Identity ident2 = getOrCreateTestIdentity("extremegroovy-" + suffix);
+
+		// add some stats
+		ident = baseSecurityManager.saveIdentityStatus(ident, Identity.STATUS_ACTIV);
+		ident2 = baseSecurityManager.saveIdentityStatus(ident2, Identity.STATUS_ACTIV);
+		
+		// check on those four default groups
+		SecurityGroup admins = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_ADMIN);
+		SecurityGroup anonymous = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_ANONYMOUS);
+		SecurityGroup authors = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_AUTHORS);
+		// test setup: identity is admin and author
+		baseSecurityManager.addIdentityToSecurityGroup(ident, admins);
+		baseSecurityManager.addIdentityToSecurityGroup(ident2, admins);
+		baseSecurityManager.addIdentityToSecurityGroup(ident, authors);
+		
+		// policy search test
+		DBFactory.getInstance().closeSession();
+		List<Policy> policies = baseSecurityManager.getPoliciesOfSecurityGroup(admins);
+		PermissionOnResourceable[] adminPermissions = convertPoliciesListToPermissionOnResourceArray(policies);
+		policies = baseSecurityManager.getPoliciesOfSecurityGroup(anonymous);
+		PermissionOnResourceable[] anonymousPermissions = convertPoliciesListToPermissionOnResourceArray(policies);
+
+		// security group search test
+		DBFactory.getInstance().closeSession();
+		SecurityGroup[] groups2 = {admins, authors};
+		SecurityGroup[] groups3 = {authors};
+
+		List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, adminPermissions, null, null, null, null, null, null);
+		Assert.assertFalse(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, adminPermissions, null, null, null);
+		Assert.assertFalse(results.isEmpty());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, anonymousPermissions, null, null, null, null, null, null);
+		assertTrue(results.size() == 0);
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, anonymousPermissions, null, null, null);
+		assertTrue(results.size() == 0);
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups2, anonymousPermissions, null, null, null, null, null, null);
+		assertTrue(results.size() == 0);
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups2, anonymousPermissions, null, null, null);
+		assertTrue(results.size() == 0);
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups2, adminPermissions, null, null, null, null, null, null);
+		assertTrue(results.size() >0);
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups2, adminPermissions, null, null, null);
+		assertTrue(results.size() >0);
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups3, adminPermissions, null, null, null, null, null, null);
+		assertTrue("Found no identities for group 'authors'",results.size() > 0);
+		boolean isAuthor = true;
+		checkIdentitiesHasRoles(results, isAuthor);
+
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups3, adminPermissions, null, null, null);
+		assertTrue("Found no identities for group 'authors'",results.size() > 0);
+		checkIdentitiesHasRoles(results, isAuthor);
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity-" + suffix, null, true, groups2, adminPermissions, null, null, null, null, null, null);
+		assertTrue(results.size() == 1);
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity-" + suffix, null, true, groups2, adminPermissions, null, null, null);
+		assertTrue(results.size() == 1);
+		
+		results = baseSecurityManager.getIdentitiesByPowerSearch("dontexist", null, true, groups2, adminPermissions, null, null, null, null, null, null);
+		assertTrue(results.size() == 0);
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("dontexist", null, true, groups2, adminPermissions, null, null, null);
+		assertTrue(results.size() == 0);
+	}
+	
+	@Test
+	public void testGetIdentitiesByPowerSearch_authProvider() {
+		String suffix = UUID.randomUUID().toString();
+		Identity ident = JunitTestHelper.createAndPersistIdentityAsUser("anIdentity-" + suffix);
+		Identity ident2 = getOrCreateTestIdentity("extremegroovy-" + suffix);
+
+		// add some stats
+		ident = baseSecurityManager.saveIdentityStatus(ident, Identity.STATUS_ACTIV);
+		ident2 = baseSecurityManager.saveIdentityStatus(ident2, Identity.STATUS_ACTIV);
+		
+		// check on those four default groups
+		SecurityGroup admins = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_ADMIN);
+		SecurityGroup authors = baseSecurityManager.findSecurityGroupByName(Constants.GROUP_AUTHORS);
+		// test setup: identity is admin and author
+		baseSecurityManager.addIdentityToSecurityGroup(ident, admins);
+		baseSecurityManager.addIdentityToSecurityGroup(ident2, admins);
+		baseSecurityManager.addIdentityToSecurityGroup(ident, authors);
+
+		SecurityGroup[] groups1 = { admins };
+		SecurityGroup[] groups2 = { admins, authors };
+		
+		// policy search test
+		DBFactory.getInstance().closeSession();
+		List<Policy> policies = baseSecurityManager.getPoliciesOfSecurityGroup(admins);
+		PermissionOnResourceable[] adminPermissions = convertPoliciesListToPermissionOnResourceArray(policies);
+				
+		// authentication provider search
+		String[] authProviders = {BaseSecurityModule.getDefaultAuthProviderIdentifier(), "Shib"};
+		String[] authProvidersInvalid = {"nonexist"};// max length 8 !		
+		String[] authProviderNone = { null };
+		String[] authProvidersAll = {BaseSecurityModule.getDefaultAuthProviderIdentifier(), "Shib", null };
+		
+		List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviders, null, null, null, null, null);
+		Assert.assertFalse(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviders, null, null);
+		Assert.assertFalse(results.isEmpty());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProvidersInvalid, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProvidersInvalid, null, null);
+		Assert.assertTrue(results.isEmpty());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity-" + suffix, null, true, groups2, adminPermissions, authProviders, null, null, null, null, null);
+		Assert.assertEquals(1, results.size());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity-" + suffix, null, true, groups2, adminPermissions, authProviders, null, null);
+		Assert.assertEquals(1, results.size());
+		
+		results = baseSecurityManager.getIdentitiesByPowerSearch("an*tity", null, true, groups2, adminPermissions, authProvidersInvalid, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("an*tity", null, true, groups2, adminPermissions, authProvidersInvalid, null, null);
+		Assert.assertTrue(results.isEmpty());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch("dontexist", null, true, groups2, adminPermissions, authProviders, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("dontexist", null, true, groups2, adminPermissions, authProviders, null, null);
+		Assert.assertTrue(results.isEmpty());
+
+		Authentication auth = baseSecurityManager.findAuthentication(ident, BaseSecurityModule.getDefaultAuthProviderIdentifier());
+		baseSecurityManager.deleteAuthentication(auth);
+		DBFactory.getInstance().closeSession();
+
+		// ultimate tests
+		//Identity ident = getOrCreateIdentity("anIdentity");
+		Date created = ident.getCreationDate();
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(created);
+		cal.add(Calendar.DAY_OF_MONTH, -5);
+		Date before = cal.getTime();
+
+		DBFactory.getInstance().closeSession();
+		results = baseSecurityManager.getIdentitiesByPowerSearch("groovy", null, true, groups1, adminPermissions, null, before, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("groovy", null, true, groups1, adminPermissions, null, before, null);
+		Assert.assertTrue(results.isEmpty());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch("extremegroovy-" + suffix, null, true, groups1, adminPermissions, null, before, null, null, null, null);
+		Assert.assertEquals(1, results.size());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("extremegroovy-" + suffix, null, true, groups1, adminPermissions, null, before, null);
+		Assert.assertEquals(1, results.size());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, authProviders, before, null, null, null, null);
+		Assert.assertFalse("Found no results", results.isEmpty());
+		checkIdentitiesAreInGroups(results, groups1);
+		checkIdentitiesHasAuthProvider(results,authProviders );
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, authProviders, before, null);
+		Assert.assertFalse("Found no results", results.isEmpty());
+		checkIdentitiesAreInGroups(results, groups1);
+		checkIdentitiesHasAuthProvider(results,authProviders );
+		
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, authProviderNone, before, null, null, null, null);
+		Assert.assertFalse("Found no results", results.isEmpty());
+		checkIdentitiesAreInGroups(results, groups1);
+		checkIdentitiesHasPermissions(results, adminPermissions);
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, authProviderNone, before, null);
+		Assert.assertFalse("Found no results", results.isEmpty());
+		checkIdentitiesAreInGroups(results, groups1);
+		checkIdentitiesHasPermissions(results, adminPermissions);
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch("%y", null, true, groups1, adminPermissions, authProvidersAll, before, null, null, null, null);
+		Assert.assertTrue(results.contains(ident));
+		Assert.assertTrue(results.contains(ident2));
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("%y", null, true, groups1, adminPermissions, authProvidersAll, before, null);
+		Assert.assertTrue(results.contains(ident));
+		Assert.assertTrue(results.contains(ident2));
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch("%y", null, true, groups1, adminPermissions, authProvidersAll, null, before, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("%y", null, true, groups1, adminPermissions, authProvidersAll, null, before);
+		Assert.assertTrue(results.isEmpty());
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, null, before, null, null, null, null);
+		sysoutResults(results);
+		Assert.assertFalse("Found no results", results.isEmpty());
+		checkIdentitiesAreInGroups(results, groups1);
+		checkIdentitiesHasPermissions(results, adminPermissions);
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, groups1, adminPermissions, null, before, null);
+		Assert.assertFalse("Found no results", results.isEmpty());
+		checkIdentitiesAreInGroups(results, groups1);
+		checkIdentitiesHasPermissions(results, adminPermissions);
+	}
+	
+	@Test
+	public void testGetIdentitiesByPowerSearch_authProviders() {
+		//authentication provider search		
+		String[] authProviderNone = { null };
+		String[] authProvidersAll = { BaseSecurityModule.getDefaultAuthProviderIdentifier(), "Shib", null };
+		
+		//check count before adding
+		List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null, null, null, null);
+		int prevProviderNoneCount = results.size();
+		//add two new users with authProviderNone
+		String rnd = UUID.randomUUID().toString();
+		Identity authNoneOne = getOrCreateTestIdentityWithAuth("authNoneOne-" + rnd, null);
+		Identity authNoneTwo = getOrCreateTestIdentityWithAuth("authNoneTwo-" + rnd, null);
+		DBFactory.getInstance().closeSession();
+		
+		// special case: no auth provider
+		// test if 2 new users are found.
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null, null, null, null);
+		Assert.assertTrue(results.contains(authNoneOne));
+		Assert.assertTrue(results.contains(authNoneTwo));
+		Assert.assertEquals(prevProviderNoneCount + 2, results.size());
+		
+		//same but check visible
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null);
+		prevProviderNoneCount = results.size();
+		
+		Identity authNoneThree = getOrCreateTestIdentityWithAuth("authNoneThree-" + rnd, null);
+		Identity authNoneFour = getOrCreateTestIdentityWithAuth("authNoneFour-" + rnd, null);
+		DBFactory.getInstance().closeSession();
+		
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null);
+		Assert.assertTrue(results.contains(authNoneThree));
+		Assert.assertTrue(results.contains(authNoneFour));
+		Assert.assertEquals("Wrong number of visible identities, search with (authProviderNone)", prevProviderNoneCount + 2, results.size());
+
+		//
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null, null, null, null);
+		prevProviderNoneCount = results.size();
+		
+		getOrCreateTestIdentityWithAuth("authNoneFive-" + rnd, null);
+		getOrCreateTestIdentityWithAuth("authNoneSix-" + rnd, null);
+		DBFactory.getInstance().closeSession();
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null, null, null, null);
+		Assert.assertEquals("Wrong number of identities, search with (authProviderNone)", prevProviderNoneCount + 2, results.size());
+		
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null);
+		prevProviderNoneCount = results.size();
+		getOrCreateTestIdentityWithAuth("authNoneSeven-" + rnd, null);
+		getOrCreateTestIdentityWithAuth("authNoneEight-" + rnd, null);
+		DBFactory.getInstance().closeSession();
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null);
+		Assert.assertEquals("Wrong number of visible identities, search with (authProviderNone)", prevProviderNoneCount + 2, results.size());
+		
+		
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProvidersAll, null, null, null, null, null);
+		prevProviderNoneCount = results.size();
+		//add a new identity per entry of AuthProvidersAll
+		getOrCreateTestIdentityWithAuth("authTwelve-" + rnd, "Shib");
+		getOrCreateTestIdentityWithAuth("authThirteen-" + rnd, BaseSecurityModule.getDefaultAuthProviderIdentifier());
+		getOrCreateTestIdentityWithAuth("authForteen-" + rnd, null);
+		DBFactory.getInstance().closeSession();
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProvidersAll, null, null, null, null, null);
+		Assert.assertTrue(results.size() - prevProviderNoneCount == 3);
+		
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProvidersAll, null, null);
+		prevProviderNoneCount = results.size();
+		//add a new identity per entry of AuthProvidersAll
+		getOrCreateTestIdentityWithAuth("authSixteen-" + rnd, "Shib");
+		getOrCreateTestIdentityWithAuth("authSeventeen-" + rnd, BaseSecurityModule.getDefaultAuthProviderIdentifier());
+		getOrCreateTestIdentityWithAuth("authEighteen-" + rnd, null);
+		DBFactory.getInstance().closeSession();
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProvidersAll, null, null);
+		Assert.assertTrue(results.size() - prevProviderNoneCount == 3);
+	}
+	
+	// Hint : Properties for testing with HSQL must be lowercaseHSQL DB does not 
+	//     mysql 'like' found results with upper and lowercase
+	//     HSQL  'like' found only results with lowercase
+	//     Our implementation of powersearch convert search-properties to lowercase ! 
+	@Test
+	public void testGetIdentitiesByPowerSearch_userPropertiesAndIntersectionOption() {
+		// create two test users
+		String one = "one" + UUID.randomUUID().toString().replace("-", "");
+		String oneUsername = "onePropUser-" + UUID.randomUUID();
+
+		User onePropUser = UserManager.getInstance().createUser("onepropuser", "onepropuser", one + "@lustig.com");
+		onePropUser.setProperty(UserConstants.FIRSTNAME, "one");		
+		Identity onePropIdentity = baseSecurityManager.createAndPersistIdentityAndUser(oneUsername, onePropUser, BaseSecurityModule.getDefaultAuthProviderIdentifier(), oneUsername, "ppp");
+		Assert.assertNotNull(onePropIdentity);
+		
+		String two = "two" + UUID.randomUUID().toString().replace("-", "");
+		String twoUsername = "twoPropUser-" + UUID.randomUUID();
+
+		User twoPropUser = UserManager.getInstance().createUser("twopropuser", "twopropuser", two + "@lustig.com");
+		twoPropUser.setProperty(UserConstants.FIRSTNAME, "two");
+		twoPropUser.setProperty(UserConstants.LASTNAME, "prop");
+		Identity twoPropIdentity = baseSecurityManager.createAndPersistIdentityAndUser(twoUsername, twoPropUser, BaseSecurityModule.getDefaultAuthProviderIdentifier(), twoUsername, "ppp");
+		Assert.assertNotNull(twoPropIdentity);
+		DBFactory.getInstance().closeSession();
+
+		HashMap<String, String> userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "one");
+		List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertTrue(results.contains(onePropIdentity));
+
+		// no intersection - all properties optional
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "one");
+		userProperties.put(UserConstants.LASTNAME, "somewrongvalue");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+
+		// no intersection - all properties optional
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "one");
+		userProperties.put(UserConstants.LASTNAME, "somewrongvalue");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, false, null, null, null, null, null, null, null, null);
+		Assert.assertTrue(results.contains(onePropIdentity));
+		Assert.assertFalse(results.contains(twoPropIdentity));
+
+		// find second
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "two");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertFalse(results.contains(onePropIdentity));
+		Assert.assertTrue(results.contains(twoPropIdentity));
+		
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "two");
+		userProperties.put(UserConstants.LASTNAME, "somewrongvalue");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertTrue(results.isEmpty());
+
+		// no intersection - all properties optional
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "two");
+		userProperties.put(UserConstants.LASTNAME, "somewrongvalue");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, false, null, null, null, null, null, null, null, null);
+		Assert.assertFalse(results.contains(onePropIdentity));
+		Assert.assertTrue(results.contains(twoPropIdentity));
+
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "two");
+		userProperties.put(UserConstants.LASTNAME, "prop");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertFalse(results.contains(onePropIdentity));
+		Assert.assertTrue(results.contains(twoPropIdentity));
+		
+		// find all
+		// 1. basic query to find all system users without restrictions
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, null);
+		Assert.assertFalse(results.isEmpty()); 
+		int numberOfAllUsers = results.size();
+		
+		userProperties = new HashMap<String, String>();
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertEquals("Wrong search result 'empty userProperties'", numberOfAllUsers, results.size());
+		
+		userProperties = new HashMap<String, String>();
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, false, null, null, null, null, null, null, null, null);
+		Assert.assertEquals("Wrong search result 'empty userProperties and intersection=false'", numberOfAllUsers, results.size());
+	}
+
+	@Test
+	public void testGetIdentitiesByPowerSearch_multipleUserProperties() {
+		String multi = "multi" + UUID.randomUUID().toString().replace("-", "");
+		String multiInst = "multiinst" + UUID.randomUUID().toString().replace("-", "");
+		String multiUsername = "multiPropUser-" + UUID.randomUUID();
+
+		User user = UserManager.getInstance().createUser("multipropuser", "multipropuser", multi + "@lustig.com");
+		user.setProperty(UserConstants.FIRSTNAME, "multi");		
+		user.setProperty(UserConstants.LASTNAME, "prop");		
+		user.setProperty(UserConstants.INSTITUTIONALNAME, "multiinst");		
+		user.setProperty(UserConstants.INSTITUTIONALEMAIL, multiInst + "@lustig.com");		
+		user.setProperty(UserConstants.INSTITUTIONALUSERIDENTIFIER, multiInst);		
+		user.setProperty(UserConstants.CITY, "züri");		
+		Identity identity = baseSecurityManager.createAndPersistIdentityAndUser(multiUsername, user, BaseSecurityModule.getDefaultAuthProviderIdentifier(), multiUsername, "ppp");
+		Assert.assertNotNull(identity);
+		
+		// commit
+		DBFactory.getInstance().closeSession();
+
+		HashMap<String, String> userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "multi");
+		List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		sysoutResults(results);
+		Assert.assertTrue(results.contains(identity));
+
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "multi");
+		userProperties.put(UserConstants.LASTNAME, "prop");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertTrue(results.contains(identity));
+
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "multi");
+		userProperties.put(UserConstants.LASTNAME, "prop");
+		userProperties.put(UserConstants.INSTITUTIONALNAME, "multiinst");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertTrue(results.contains(identity));  
+
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "multi");
+		userProperties.put(UserConstants.LASTNAME, "prop");
+		userProperties.put(UserConstants.INSTITUTIONALNAME, "multiinst");
+		userProperties.put(UserConstants.INSTITUTIONALEMAIL, multiInst + "@lustig.com");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertEquals(1, results.size());
+		Assert.assertTrue(results.contains(identity));
+
+		userProperties = new HashMap<String, String>();
+		userProperties.put(UserConstants.FIRSTNAME, "multi");
+		userProperties.put(UserConstants.LASTNAME, "prop");
+		userProperties.put(UserConstants.INSTITUTIONALNAME, "multiinst");
+		userProperties.put(UserConstants.INSTITUTIONALEMAIL, multiInst + "@lustig.com");
+		userProperties.put(UserConstants.INSTITUTIONALUSERIDENTIFIER, multiInst);
+		userProperties.put(UserConstants.CITY, "züri");
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertEquals(1, results.size());
+		Assert.assertTrue(results.contains(identity));
+	}
+	
+	@Test
+	public void testGetIdentitiesByPowerSearch_withDate() {
+		Identity ident = JunitTestHelper.createAndPersistIdentityAsUser("anIdentity-" + UUID.randomUUID());
+		Date created = ident.getCreationDate();
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(created);
+		cal.add(Calendar.DAY_OF_MONTH, -5);
+		Date before = cal.getTime();
+		cal.add(Calendar.DAY_OF_MONTH, 10);
+		Date after = cal.getTime();
+
+		// basic query to find all system users without restrictions
+		List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, null);
+		assertTrue(results.size()>0); 
+		int numberOfAllUsers = results.size();
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, Identity.STATUS_DELETED);
+		assertTrue(results.size() >0);
+		int numberOfDeletedUsers = results.size();
+
+		Date createdAfter = before;
+		Date createdBefore = after;
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, createdAfter, createdBefore, null, null, null);
+		assertEquals("Search with date (createdAfter,createdBefore) delivers not the same number of users", numberOfAllUsers, results.size());
+
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, before, after);
+		assertEquals("Search (visible identities) with date (createdAfter,createdBefore) delivers not the same number of users", (numberOfAllUsers - numberOfDeletedUsers) , results.size()); // One identity is deleted
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, after, null, null, null);
+		assertEquals("Search with date (only after) delivers not the same number of users", numberOfAllUsers, results.size());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, null, after);
+		assertEquals("Search (visible identities) with date (createdAfter,createdBefore) delivers not the same number of users", (numberOfAllUsers - numberOfDeletedUsers) , results.size()); // One identity is deleted
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, before, null, null, null, null);
+		assertEquals("Search with date (only before) delivers not the same number of users", numberOfAllUsers, results.size());
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, before, null);
+		assertEquals("Search (visible identities) with date (createdAfter,createdBefore) delivers not the same number of users", (numberOfAllUsers - numberOfDeletedUsers) , results.size()); // One identity is deleted
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, after, before, null, null, null);
+		assertTrue(results.size() == 0);
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, after, before);
+		assertTrue(results.size() == 0);
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, after, null, null, null, null);
+		assertTrue(results.size() == 0);
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, after, null);
+		assertTrue(results.size() == 0);
+
+		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, null, null, before, null, null, null);
+		assertTrue(results.size() == 0);
+		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, null, null, before);
+		assertTrue(results.size() == 0);
+	}
+
+	////////////////////
+	// Helper
+	///////////////////
+	
+	private Identity getOrCreateTestIdentity(String loginName) {
+		return getOrCreateTestIdentityWithAuth(loginName, BaseSecurityModule.getDefaultAuthProviderIdentifier());
+	}
+	
+	private Identity getOrCreateTestIdentityWithAuth(String loginName, String authProvider){
+		Identity ident = baseSecurityManager.findIdentityByName(loginName);
+		if (ident != null) {
+			return ident;
+		} else {
+			User user = UserManager.getInstance().createUser(loginName+"_Firstname", loginName + "_Lastname", loginName + "@lustig.com");
+			user.setProperty(UserConstants.INSTITUTIONALNAME, "unizh2");
+			user.setProperty(UserConstants.INSTITUTIONALUSERIDENTIFIER, "12-345-678-908");
+			ident = baseSecurityManager.createAndPersistIdentityAndUser(loginName, user, authProvider, loginName, "ppp");
+			return ident;
+		}
+	}
+
+	private PermissionOnResourceable[] convertPoliciesListToPermissionOnResourceArray(List<Policy> policies) {
+		PermissionOnResourceable[] array = new PermissionOnResourceable[policies.size()];
+		for (int i = 0; i < policies.size()	; i++) {
+			Policy policy = policies.get(i);
+			PermissionOnResourceable por = new PermissionOnResourceable(policy.getPermission(), policy.getOlatResource());
+			array[i] = por;			
+		}
+		
+		return array;
+	}
+
+	/*
+	 * Only for debugging to see identities result list.
+	 */
+	private void sysoutResults(List<Identity> results) {
+		log.info("TEST results.size()=" + results.size());
+		for (Identity identity:results) {
+			log.debug("TEST ident=" + identity);
+		}		
+	}
+
+	// check Helper Methoden
+	////////////////////////
+	private void checkIdentitiesHasPermissions(List<Identity> results, PermissionOnResourceable[] adminPermissions) {
+		for (Identity resultIdentity: results) {
+			for (int i = 0; i < adminPermissions.length; i++) {
+				assertTrue( baseSecurityManager.isIdentityPermittedOnResourceable(resultIdentity, adminPermissions[i].getPermission(), adminPermissions[i].getOlatResourceable() ) );
+			}
+		}
+	}
+	
+	private void checkIdentitiesHasAuthProvider(List<Identity> results, String[] authProviders) {
+		for (Identity resultIdentity : results) {
+			boolean foundIdentityWithAuth = false;
+			for (int i = 0; i < authProviders.length; i++) {
+				Authentication authentication = baseSecurityManager.findAuthentication(resultIdentity, authProviders[i]);
+				if (authentication != null) {
+					foundIdentityWithAuth = true;
+				}
+ 			}
+			assertTrue("Coud not found any authentication for identity=" + resultIdentity, foundIdentityWithAuth);
+		}
+	}
+
+	private void checkIdentitiesAreInGroups(List<Identity> results, SecurityGroup[] groups1) {
+		for (Identity resultIdentity:results) {
+			boolean foundIdentityInSecGroup = false;
+			for (int i = 0; i < groups1.length; i++) {
+				if (baseSecurityManager.isIdentityInSecurityGroup(resultIdentity, groups1[i]) ) {
+					foundIdentityInSecGroup = true;
+				}
+			}
+			assertTrue("Coud not found identity=" + resultIdentity, foundIdentityInSecGroup);
+		}
+	}
+	
+	private void checkIdentitiesHasRoles(List<Identity> results, boolean checkIsAuthor) {
+		for (Identity resultIdentity: results) {
+			Roles roles = baseSecurityManager.getRoles(resultIdentity);
+			if (checkIsAuthor) {
+				assertTrue("Identity has not roles author, identity=" + resultIdentity, roles.isAuthor());
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/test/java/org/olat/commons/coordinate/CoordinatorTest.java b/src/test/java/org/olat/commons/coordinate/CoordinatorTest.java
index 353d63c53fd..92316717252 100644
--- a/src/test/java/org/olat/commons/coordinate/CoordinatorTest.java
+++ b/src/test/java/org/olat/commons/coordinate/CoordinatorTest.java
@@ -26,14 +26,16 @@
 
 package org.olat.commons.coordinate;
 
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
-import org.junit.Before;
+import org.jgroups.util.UUID;
+import org.junit.Assert;
 import org.junit.Test;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DBFactory;
@@ -63,11 +65,6 @@ public class CoordinatorTest extends OlatTestCase {
 	@Autowired
 	private RepositoryService repositoryService;
 	
-	@Before
-	public void setUp() throws Exception {
-		DBFactory.getInstance().closeSession();
-	}
-	
 
 	/**
 	 * Test with 2 threads T1 & T2.
@@ -89,7 +86,9 @@ public class CoordinatorTest extends OlatTestCase {
 		final List<Exception> exceptionHolder = Collections.synchronizedList(new ArrayList<Exception>(1));
 		final List<Boolean> statusList = Collections.synchronizedList(new ArrayList<Boolean>(1));
 	
+		final CountDownLatch finishCount = new CountDownLatch(2);
 		final OLATResourceable ores = OresHelper.createOLATResourceableInstance("testDoInSync", new Long("123"));
+		
 		// thread 1
 		new Thread(new Runnable() {
 			public void run() {
@@ -102,7 +101,7 @@ public class CoordinatorTest extends OlatTestCase {
 					});//end syncerCallback
 					
 					// sleep
-					sleep(10000);
+					sleep(1000);
 					
 					// do again do something in sync
 					CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerExecutor(){
@@ -119,7 +118,8 @@ public class CoordinatorTest extends OlatTestCase {
 						DBFactory.getInstance().closeSession();
 					} catch (Exception e) {
 						// ignore
-					};
+					}
+					finishCount.countDown();
 				}	
 			}}).start();
 		
@@ -128,7 +128,7 @@ public class CoordinatorTest extends OlatTestCase {
 			public void run() {
 				try {
 					// sleep
-					sleep(5000);
+					sleep(500);
 
 					// do something in sync
 					CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerExecutor(){
@@ -138,7 +138,7 @@ public class CoordinatorTest extends OlatTestCase {
 					});//end syncerCallback
 					
 					// sleep
-					sleep(10000);
+					sleep(1000);
 					
 					// do again do something in sync
 					CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerExecutor(){
@@ -155,25 +155,23 @@ public class CoordinatorTest extends OlatTestCase {
 						DBFactory.getInstance().closeSession();
 					} catch (Exception e) {
 						// ignore
-					};
+					}
+					finishCount.countDown();
 				}	
 			}}).start();
 		
 		// sleep until t1 and t2 should have terminated/excepted
-		int loopCount = 0;
-		while ( (statusList.size()<2) && (exceptionHolder.size()<1) && (loopCount<90)) {
-			sleep(1000);
-			loopCount++;
+		try {
+			finishCount.await(10, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			Assert.fail("Threads did not finish in 10sec");
 		}
-		assertTrue("Threads did not finish in 90sec", loopCount<90);
+
 		// if not -> they are in deadlock and the db did not detect it
 		for (Exception exception : exceptionHolder) {
-			log.info("exception: "+exception.getMessage());
-			exception.printStackTrace();
-		}
-		if (exceptionHolder.size() > 0) {
-			assertTrue("It throws an exception in test => see sysout exception[0]=" + exceptionHolder.get(0).getMessage(), exceptionHolder.size() == 0);	
+			log.error("exception: ", exception);
 		}
+		Assert.assertEquals("It throws an exception in test", 0, exceptionHolder.size());	
 	}
 
 	/**
@@ -197,6 +195,8 @@ public class CoordinatorTest extends OlatTestCase {
 		final List<Boolean> statusList = Collections.synchronizedList(new ArrayList<Boolean>(1));
 	
 		final OLATResourceable ores = OresHelper.createOLATResourceableInstance("testDoInSync", new Long("123"));
+		final CountDownLatch finishCount = new CountDownLatch(2);
+		
 		// thread 1
 		new Thread(new Runnable() {
 			public void run() {
@@ -210,7 +210,7 @@ public class CoordinatorTest extends OlatTestCase {
 					});//end syncerCallback
 					
 					// sleep
-					sleep(10000);
+					sleep(1000);
 					
 					// do again do something in sync
 					CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerCallback<Boolean>(){
@@ -228,7 +228,8 @@ public class CoordinatorTest extends OlatTestCase {
 						DBFactory.getInstance().closeSession();
 					} catch (Exception e) {
 						// ignore
-					};
+					}
+					finishCount.countDown();
 				}	
 			}}).start();
 		
@@ -237,7 +238,7 @@ public class CoordinatorTest extends OlatTestCase {
 			public void run() {
 				try {
 					// sleep
-					sleep(5000);
+					sleep(500);
 
 					// do something in sync
 					CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerCallback<Boolean>(){
@@ -248,7 +249,7 @@ public class CoordinatorTest extends OlatTestCase {
 					});//end syncerCallback
 					
 					// sleep
-					sleep(10000);
+					sleep(1000);
 					
 					// do again do something in sync
 					CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerCallback<Boolean>(){
@@ -266,52 +267,46 @@ public class CoordinatorTest extends OlatTestCase {
 						DBFactory.getInstance().closeSession();
 					} catch (Exception e) {
 						// ignore
-					};
+					}
+					finishCount.countDown();
 				}	
 			}}).start();
 		
 		// sleep until t1 and t2 should have terminated/excepted
-		int loopCount = 0;
-		while ( (statusList.size()<2) && (exceptionHolder.size()<1) && (loopCount<90)) {
-			sleep(1000);
-			loopCount++;
+		try {
+			finishCount.await(10, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			Assert.fail("Test takes too long (more than 10s)");
 		}
-		assertTrue("Threads did not finish in 90sec", loopCount<90);
+
 		// if not -> they are in deadlock and the db did not detect it
 		for (Exception exception : exceptionHolder) {
-			log.info("exception: "+exception.getMessage());
-			exception.printStackTrace();
-		}
-		if (exceptionHolder.size() > 0) {
-			assertTrue("It throws an exception in test => see sysout exception[0]=" + exceptionHolder.get(0).getMessage(), exceptionHolder.size() == 0);	
+			log.error("exception: ", exception);
 		}
+
+		Assert.assertEquals("It throws an exception in test", 0, exceptionHolder.size());	
 	}
-	
 
-	@Test
+	@Test(expected = AssertException.class) 
 	public void testNestedAssertExceptionInDoInSync() {
 		final OLATResourceable ores = OresHelper.createOLATResourceableInstance("testNestedAssertExceptionInDoInSync", new Long("123"));
 		
-		try {
-			CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerCallback<Boolean>(){
-				public Boolean execute() {
-					log.info("testNestedAssertExceptionInDoInSync: execute doInSync 1");
-					
-					// Do agin in sync => nested => no allowed!
-					CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerCallback<Boolean>(){
-						public Boolean execute() {
-							log.info("testNestedAssertExceptionInDoInSync: execute doInSync 2");
-							fail("No NestedAssertException thrown");
-							return Boolean.TRUE;
-						}
-					});//end syncerCallback
-	
-					return Boolean.TRUE;
-				}
-			});//end syncerCallback
-		}catch(AssertException aex) {
-			log.info("testNestedAssertExceptionInDoInSync: Ok, got a AssertException=" + aex);
-		}
+		CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerCallback<Boolean>(){
+			public Boolean execute() {
+				log.info("testNestedAssertExceptionInDoInSync: execute doInSync 1");
+				
+				// Do agin in sync => nested => no allowed!
+				CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(ores, new SyncerCallback<Boolean>(){
+					public Boolean execute() {
+						log.info("testNestedAssertExceptionInDoInSync: execute doInSync 2");
+						fail("No NestedAssertException thrown");
+						return Boolean.TRUE;
+					}
+				});//end syncerCallback
+
+				return Boolean.TRUE;
+			}
+		});//end syncerCallback
 	}
 	
 	@Test
@@ -345,9 +340,9 @@ public class CoordinatorTest extends OlatTestCase {
 
 	@Test
 	public void testDoInSyncPerformance() {
-		final OLATResourceable ores = OresHelper.createOLATResourceableInstance("testDoInSyncPerformance", new Long("123989456"));
+		final OLATResourceable ores = OresHelper.createOLATResourceableInstance(UUID.randomUUID().toString(), new Long("123989456"));
 		OLATResource r =  CoreSpringFactory.getImpl(OLATResourceManager.class).findOrPersistResourceable(ores);
-		int maxLoop = 1000;
+		int maxLoop = 500;
 
 		final RepositoryEntry re = repositoryService.create("test", "perfTest", "testPerf", "perfTest description", r);
 		// create security group
diff --git a/src/test/java/org/olat/core/commons/persistence/DBTest.java b/src/test/java/org/olat/core/commons/persistence/DBTest.java
index be411d95c81..d6e91a8542d 100644
--- a/src/test/java/org/olat/core/commons/persistence/DBTest.java
+++ b/src/test/java/org/olat/core/commons/persistence/DBTest.java
@@ -136,8 +136,7 @@ public class DBTest extends OlatTestCase {
 		try {
 			latch.await(20, TimeUnit.SECONDS);
 		} catch (InterruptedException e) {
-			log.error("", e);
-			fail("Takes too long");
+			fail("Takes too long (more than 20sec)");
 		}
 		
 		Assert.assertFalse(test.hasError());
@@ -146,11 +145,11 @@ public class DBTest extends OlatTestCase {
  	private class TestThread extends Thread {
  		private boolean error;
  		private final CountDownLatch latch;
- 		private final RepositoryManager repositoryManager;
+ 		private final RepositoryManager repoManager;
  		
  		public TestThread(RepositoryManager repositoryManager, CountDownLatch latch) {
  			this.latch = latch;
- 			this.repositoryManager = repositoryManager;
+ 			this.repoManager = repositoryManager;
  		}
  		
  		public boolean hasError() {
@@ -161,7 +160,7 @@ public class DBTest extends OlatTestCase {
  			try {
 				EntityManager em1 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
 				Assert.assertNull(em1);
-				repositoryManager.lookupRepositoryEntry(27l, false);
+				repoManager.lookupRepositoryEntry(27l, false);
 				EntityManager em2 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
 				//Transactional annotation must clean-up the entity manager
 				Assert.assertNull(em2);
@@ -401,8 +400,7 @@ public class DBTest extends OlatTestCase {
 		try {
 			latch.await(20, TimeUnit.SECONDS);
 		} catch (InterruptedException e) {
-			log.error("", e);
-			fail("Takes too long");
+			fail("Takes too long (more than 20sec)");
 		}
 
 		for (int i=0; i<maxWorkers; i++) {
diff --git a/src/test/java/org/olat/core/commons/services/taskexecutor/TaskExecutorManagerTest.java b/src/test/java/org/olat/core/commons/services/taskexecutor/TaskExecutorManagerTest.java
index 1efaf9ce3fc..d543290e722 100644
--- a/src/test/java/org/olat/core/commons/services/taskexecutor/TaskExecutorManagerTest.java
+++ b/src/test/java/org/olat/core/commons/services/taskexecutor/TaskExecutorManagerTest.java
@@ -25,8 +25,6 @@ import java.util.concurrent.TimeUnit;
 import junit.framework.Assert;
 
 import org.junit.Test;
-import org.olat.core.logging.OLog;
-import org.olat.core.logging.Tracing;
 import org.olat.test.OlatTestCase;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -38,8 +36,6 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class TaskExecutorManagerTest extends OlatTestCase {
 	
-	private static final OLog log = Tracing.createLoggerFor(TaskExecutorManagerTest.class);
-	
 	@Autowired
 	private TaskExecutorManager taskExecutorManager;
 	
@@ -52,8 +48,7 @@ public class TaskExecutorManagerTest extends OlatTestCase {
 			boolean zero = finishCount.await(10, TimeUnit.SECONDS);
 			Assert.assertTrue(zero);
 		} catch (InterruptedException e) {
-			log.error("", e);
-			Assert.fail();
+			Assert.fail("Takes too long (more than 10sec)");
 		}
 	}
 	
diff --git a/src/test/java/org/olat/core/commons/services/webdav/WebDAVCommandsTest.java b/src/test/java/org/olat/core/commons/services/webdav/WebDAVCommandsTest.java
index 580d837fee7..5278ff015ef 100644
--- a/src/test/java/org/olat/core/commons/services/webdav/WebDAVCommandsTest.java
+++ b/src/test/java/org/olat/core/commons/services/webdav/WebDAVCommandsTest.java
@@ -143,7 +143,7 @@ public class WebDAVCommandsTest extends WebDAVTestCase {
 		HttpResponse response = conn.head(publicUri);
 		Header lengthHeader = response.getFirstHeader("Content-Length");
 		Assert.assertNotNull(lengthHeader);
-		Assert.assertEquals("0", lengthHeader.getValue());
+		Assert.assertEquals("10", lengthHeader.getValue());
 		Header typeHeader = response.getFirstHeader("Content-Type");
 		Assert.assertNotNull(typeHeader);
 		Assert.assertEquals("text/plain", typeHeader.getValue());
diff --git a/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java b/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java
index c95348ae332..0a1566175c3 100644
--- a/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java
+++ b/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java
@@ -64,7 +64,6 @@ public class MailManagerTest extends OlatTestCase {
 		inbox = mailModule.isInternSystem();
 		if(!inbox) {
 			mailModule.setInterSystem(true);
-			sleep(500);//set of properties on module are async
 		}
 	}
 	
@@ -72,7 +71,6 @@ public class MailManagerTest extends OlatTestCase {
 	public void resetInternalInbox() {
 		if(!inbox) {
 			mailModule.setInterSystem(inbox);
-			sleep(500);//set of properties on module are async
 		}
 	}
 	
diff --git a/src/test/java/org/olat/course/assessment/manager/UserCourseInformationsManagerTest.java b/src/test/java/org/olat/course/assessment/manager/UserCourseInformationsManagerTest.java
index 3f4b951c97d..8f0f97db9a2 100644
--- a/src/test/java/org/olat/course/assessment/manager/UserCourseInformationsManagerTest.java
+++ b/src/test/java/org/olat/course/assessment/manager/UserCourseInformationsManagerTest.java
@@ -192,7 +192,7 @@ public class UserCourseInformationsManagerTest extends OlatTestCase {
 		try {
 			latch.await(120, TimeUnit.SECONDS);
 		} catch (InterruptedException e) {
-			log.error("", e);
+			Assert.fail("Takes too long (more than 120sec)");
 		}
 		
 		int countErrors = 0;
diff --git a/src/test/java/org/olat/group/test/BGAreaManagerTest.java b/src/test/java/org/olat/group/test/BGAreaManagerTest.java
index f9d6e468793..16dff25f987 100644
--- a/src/test/java/org/olat/group/test/BGAreaManagerTest.java
+++ b/src/test/java/org/olat/group/test/BGAreaManagerTest.java
@@ -645,13 +645,12 @@ public class BGAreaManagerTest extends OlatTestCase {
 		try {
 			finfishCount.await(120, TimeUnit.SECONDS);
 		} catch (InterruptedException e) {
-			e.printStackTrace();
+			log.error("", e);
 		}
 
 		// if not -> they are in deadlock and the db did not detect it
 		for (Exception exception : exceptionHolder) {
-			System.err.println("exception: "+exception.getMessage());
-			exception.printStackTrace();
+			log.error("exception: ", exception);
 		}
 		assertTrue("Exceptions #" + exceptionHolder.size(), exceptionHolder.size() == 0);				
 		assertEquals("Not all threads has finished", 0, finfishCount.getCount());
@@ -735,8 +734,7 @@ public class BGAreaManagerTest extends OlatTestCase {
 
 		// if not -> they are in deadlock and the db did not detect it
 		for (Exception exception : exceptionHolder) {
-			System.err.println("exception: "+exception.getMessage());
-			exception.printStackTrace();
+			log.error("exception: ", exception);
 		}
 		assertTrue("Exceptions #" + exceptionHolder.size(), exceptionHolder.size() == 0);				
 		assertEquals("Not all threads has finished", 0, finfishCount.getCount());
diff --git a/src/test/java/org/olat/instantMessaging/InstantMessagePreferencesDAOTest.java b/src/test/java/org/olat/instantMessaging/InstantMessagePreferencesDAOTest.java
index 1a15a4a8964..bc7ca0de283 100644
--- a/src/test/java/org/olat/instantMessaging/InstantMessagePreferencesDAOTest.java
+++ b/src/test/java/org/olat/instantMessaging/InstantMessagePreferencesDAOTest.java
@@ -146,7 +146,7 @@ public class InstantMessagePreferencesDAOTest extends OlatTestCase {
 		try {
 			finishCount.await(20, TimeUnit.SECONDS);
 		} catch (InterruptedException e) {
-			log.error("", e);
+			Assert.fail("Takes too long (mote than 20sec)");
 		}
 		
 		boolean allOk = true;
diff --git a/src/test/java/org/olat/resource/lock/pessimistic/PLockTest.java b/src/test/java/org/olat/resource/lock/pessimistic/PLockTest.java
index c52df08e4dd..43953939b71 100644
--- a/src/test/java/org/olat/resource/lock/pessimistic/PLockTest.java
+++ b/src/test/java/org/olat/resource/lock/pessimistic/PLockTest.java
@@ -38,43 +38,54 @@ import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
+import org.junit.Assert;
 import org.junit.Test;
 import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.SecurityGroup;
-import org.olat.core.commons.persistence.DBFactory;
+import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
+import org.springframework.beans.factory.annotation.Autowired;
 
 
 /**
  * 
  */
 public class PLockTest extends OlatTestCase {
+	
+	private static final OLog log = Tracing.createLoggerFor(PLockTest.class);
 
 	private static final int MAX_COUNT = 5; //5; //30;
 	private static final int MAX_USERS_MORE = 20; //20; //100;
+	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private PessimisticLockManager pessimisticLockManager;
 
 	
 	@Test public void testReentrantLock() {
 		long start = System.currentTimeMillis();
 		String asset = "p1";
 		// make sure the lock is created first
-		PLock pc = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+		PLock pc = pessimisticLockManager.findOrPersistPLock(asset);
 		assertNotNull(pc);
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		
 		// test double acquisition within same transaction
-		PLock pc1 = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+		PLock pc1 = pessimisticLockManager.findOrPersistPLock(asset);
 		assertNotNull(pc1);
-		PLock pc2 = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+		PLock pc2 = pessimisticLockManager.findOrPersistPLock(asset);
 		assertNotNull(pc2);
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		
 		// and without explicit transaction boundary.
-		PLock p1 = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+		PLock p1 = pessimisticLockManager.findOrPersistPLock(asset);
 		assertNotNull(p1);
-		PLock p2 = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+		PLock p2 = pessimisticLockManager.findOrPersistPLock(asset);
 		assertNotNull(p2);
 		long stop = System.currentTimeMillis();
 		long diff = stop - start;
@@ -85,39 +96,40 @@ public class PLockTest extends OlatTestCase {
 	 * T1		T2
 	 *
 	 */
-	@Test public void testReentrantLock2Threads() {
+	@Test
+	public void testReentrantLock2Threads() {
 		final String asset = "p1-2";
 		
 		// make sure the lock is created first
-		PLock pc = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+		PLock pc = pessimisticLockManager.findOrPersistPLock(asset);
 		assertNotNull(pc);
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 
 		final List<Exception> exceptionHolder = Collections.synchronizedList(new ArrayList<Exception>(1));
-		final List<Boolean> statusList = Collections.synchronizedList(new ArrayList<Boolean>(1));
+		final CountDownLatch finishCount = new CountDownLatch(2);
 
 		// thread 1
 		new Thread(new Runnable() {
 			public void run() {
 				try {
-					PLock pc1 = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+					PLock pc1 = pessimisticLockManager.findOrPersistPLock(asset);
 					assertNotNull(pc1);
-					System.out.println("Thread-1: got PLock pc1=" + pc1);
-					System.out.println("Thread-1: sleep 10sec");
-					sleep(10000);
-					PLock pc2 = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+					log.info("Thread-1: got PLock pc1=" + pc1);
+					log.info("Thread-1: sleep 1sec");
+					sleep(1000);
+					PLock pc2 = pessimisticLockManager.findOrPersistPLock(asset);
 					assertNotNull(pc2);
-					System.out.println("Thread-1: got PLock pc2=" + pc2);
-					System.out.println("Thread-1: finished");
-					statusList.add(Boolean.TRUE);
+					log.info("Thread-1: got PLock pc2=" + pc2);
+					log.info("Thread-1: finished");
 				} catch (Exception e) {
 					exceptionHolder.add(e);
 				} finally {
+					finishCount.countDown();
 					try {
-						DBFactory.getInstance().closeSession();
+						dbInstance.commitAndCloseSession();
 					} catch (Exception e) {
 						// ignore
-					};
+					}
 				}	
 			}}).start();
 		
@@ -125,40 +137,40 @@ public class PLockTest extends OlatTestCase {
 		new Thread(new Runnable() {
 			public void run() {
 				try {
-					System.out.println("Thread-2: sleep 5sec");
-					sleep(5000);
-					System.out.println("Thread-2: try to get PLock...");
-					PLock p1 = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+					log.info("Thread-2: sleep 0.5sec");
+					sleep(500);
+					log.info("Thread-2: try to get PLock...");
+					PLock p1 = pessimisticLockManager.findOrPersistPLock(asset);
 					assertNotNull(p1);
-					System.out.println("Thread-2: got PLock p1=" + p1);
-					System.out.println("Thread-2: sleep 10sec");
-					sleep(10000);
-					PLock p2 = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+					log.info("Thread-2: got PLock p1=" + p1);
+					log.info("Thread-2: sleep 1sec");
+					sleep(1000);
+					PLock p2 = pessimisticLockManager.findOrPersistPLock(asset);
 					assertNotNull(p2);
-					System.out.println("Thread-1: got PLock p2=" + p2);
-					System.out.println("Thread-1: finished");
-					statusList.add(Boolean.TRUE);
+					log.info("Thread-1: got PLock p2=" + p2);
+					log.info("Thread-1: finished");
 				} catch (Exception e) {
 					exceptionHolder.add(e);
 				} finally {
+					finishCount.countDown();
 					try {
-						DBFactory.getInstance().closeSession();
+						dbInstance.commitAndCloseSession();
 					} catch (Exception e) {
 						// ignore
-					};
+					}
 				}	
 			}}).start();
 		
 		// sleep until t1 and t2 should have terminated/excepted
-		int loopCount = 0;
-		while ( (statusList.size()<2) && (exceptionHolder.size()<1) && (loopCount<60)) {
-			sleep(1000);
-			loopCount++;
+		try {
+			finishCount.await(60, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			Assert.fail("Test takes too long (more than 60s)");
 		}
-		assertTrue("Threads did not finish in 60sec", loopCount<60);
+		
 		// if not -> they are in deadlock and the db did not detect it
 		for (Exception exception : exceptionHolder) {
-			System.out.println("exception: "+exception.getMessage());
+			log.info("exception: "+exception.getMessage());
 			exception.printStackTrace();
 		}
 		assertTrue("exception in test => see sysout", exceptionHolder.size() == 0);				
@@ -170,13 +182,13 @@ public class PLockTest extends OlatTestCase {
 		
 		final String asset = "testLockWaitTimout";
 		
-		System.out.println("testing if holding a lock timeouts");
+		log.info("testing if holding a lock timeouts");
 		// make sure all three row entries for the locks are created, otherwise the system-wide locking 
 		// applied on lock-row-creation cannot support row-level-locking by definition. 
 
-		PLock pc3 = PessimisticLockManager.getInstance().findOrPersistPLock("blibli");
+		PLock pc3 = pessimisticLockManager.findOrPersistPLock("blibli");
 		assertNotNull(pc3);
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		
 		/**
 		 *    t1   t2
@@ -193,22 +205,24 @@ public class PLockTest extends OlatTestCase {
 		
 	
 		final List<Exception> exceptionHolder = Collections.synchronizedList(new ArrayList<Exception>(1));
+		final CountDownLatch finishCount = new CountDownLatch(2);
 		
 		// t1
 		new Thread(new Runnable() {
 			public void run() {
 				try {
-					sleep(2500);
-					PLock p3 = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+					sleep(500);
+					PLock p3 = pessimisticLockManager.findOrPersistPLock(asset);
 					assertNotNull(p3);					
 				} catch (Exception e) {
 					exceptionHolder.add(e);
 				} finally {
+					finishCount.countDown();
 					try {
-						DBFactory.getInstance().closeSession();
+						dbInstance.closeSession();
 					} catch (Exception e) {
 						// ignore
-					};
+					}
 				}	
 			}}).start();
 		
@@ -216,101 +230,105 @@ public class PLockTest extends OlatTestCase {
 		new Thread(new Runnable() {
 			public void run() {
 				try {
-					PLock p2 = PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+					PLock p2 = pessimisticLockManager.findOrPersistPLock(asset);
 					assertNotNull(p2);
-					sleep(60000);
-					// holding the lock for more than the transaction timeout (normally 30secs, configured where? hib) should cause a lock timeout
-					// if the db is configured so.
+					sleep(55000);
+					// holding the lock for more than the transaction timeout
+					// (normally 30secs, configured where? hib) should cause a lock timeout
+					// if the db is configured so (innodb_lock_wait_timeout).
 				} catch (Exception e) {
 					exceptionHolder.add(e);
 				} finally {
+					finishCount.countDown();
 					try {
-						DBFactory.getInstance().closeSession();
+						dbInstance.closeSession();
 					} catch (Exception e) {
 						// ignore
-					};
+					}
 				}					
 			}}).start();
 		
 		// sleep until t1 and t2 should have terminated/excepted
-		System.out.println("Sleep 55s");
-		sleep(55000);
-		
-		// if not -> they are in deadlock and the db did not detect it
-		for (Exception exception : exceptionHolder) {
-			System.out.println("exception: "+exception.getMessage());
-			exception.printStackTrace();
+		try {
+			log.info("Sleep 55s");
+			finishCount.await(60, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			Assert.fail("");
 		}
-		assertTrue("expected a lock wait timeout exceeded exception", exceptionHolder.size() > 0);				
+		
+		Assert.assertEquals("expected a lock wait timeout exceeded exception", 1, exceptionHolder.size());				
 	}
 	
-	@Test public void testSingleRowLockingSupported() {
-		System.out.println("testing if one lock only locks the given row and not the complete table (test whether the database supports rowlocking)");
+	@Test
+	public void testSingleRowLockingSupported() {
+		log.info("testing if one lock only locks the given row and not the complete table (test whether the database supports rowlocking)");
 		// make sure both row entries for the locks are created, otherwise the system-wide locking 
 		// applied on lock-row-creation cannot support row-level-locking by definition. 
-		PLock pc1 = PessimisticLockManager.getInstance().findOrPersistPLock("blabla");
-		assertNotNull(pc1);
-		PLock pc2 = PessimisticLockManager.getInstance().findOrPersistPLock("blublu");
-		assertNotNull(pc2);
-		DBFactory.getInstance().closeSession();
+		PLock pc1 = pessimisticLockManager.findOrPersistPLock("blabla");
+		Assert.assertNotNull(pc1);
+		PLock pc2 = pessimisticLockManager.findOrPersistPLock("blublu");
+		Assert.assertNotNull(pc2);
+		dbInstance.closeSession();
 		
 		final List<Long> holder = new ArrayList<Long>(1);
 		// first thread acquires the lock and waits and continues holding the lock for some time.
-		PLock p1 = PessimisticLockManager.getInstance().findOrPersistPLock("blabla");
-		assertNotNull(p1);
+		PLock p1 = pessimisticLockManager.findOrPersistPLock("blabla");
+		Assert.assertNotNull(p1);
 		
 		new Thread(new Runnable() {
 			public void run() {
-				PLock p2 = PessimisticLockManager.getInstance().findOrPersistPLock("blublu");
+				PLock p2 = pessimisticLockManager.findOrPersistPLock("blublu");
 				assertNotNull(p2);
-				long p2Acquired = System.currentTimeMillis();
+				long p2Acquired = System.nanoTime();
 				holder.add(new Long(p2Acquired));
-				DBFactory.getInstance().closeSession();
+				dbInstance.closeSession();
 				
 			}}).start();
 		
-		sleep(5000);
-		long p1AboutToRelease= System.currentTimeMillis();
-		DBFactory.getInstance().closeSession();
+		sleep(500);
+		long p1AboutToRelease = System.nanoTime();
+		dbInstance.closeSession();
 		
 		// if row locking is not supported, then the timestamp when p2 has been acquired will be shortly -after- p1 has been released
-		boolean singleRowLockingOk = holder.size() >0 &&  holder.get(0).longValue() < p1AboutToRelease;
+		boolean singleRowLockingOk = holder.size() > 0 &&  holder.get(0).longValue() < p1AboutToRelease;
 		assertTrue("the database does not seem to support row locking when executing 'select for update', critical for performance!, ", singleRowLockingOk);
 	}
 	
-	@Test public void testNestedLockingSupported() {
-		System.out.println("testing if nested locking is supported");
+	@Test
+	public void testNestedLockingSupported() {
+		log.info("testing if nested locking is supported");
 		// make sure all three row entries for the locks are created, otherwise the system-wide locking 
 		// applied on lock-row-creation cannot support row-level-locking by definition. 
 
-		PLock pc1 = PessimisticLockManager.getInstance().findOrPersistPLock("blabla");
+		PLock pc1 = pessimisticLockManager.findOrPersistPLock("blabla");
 		assertNotNull(pc1);
-		PLock pc2 = PessimisticLockManager.getInstance().findOrPersistPLock("blublu");
+		PLock pc2 = pessimisticLockManager.findOrPersistPLock("blublu");
 		assertNotNull(pc2);
-		PLock pc3 = PessimisticLockManager.getInstance().findOrPersistPLock("blibli");
+		PLock pc3 = pessimisticLockManager.findOrPersistPLock("blibli");
 		assertNotNull(pc3);
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		
 		final List<Long> holder = new ArrayList<Long>(1);
 		// first thread acquires the two locks and waits and continues holding the lock for some time.
-		PLock p1 = PessimisticLockManager.getInstance().findOrPersistPLock("blabla");
+		PLock p1 = pessimisticLockManager.findOrPersistPLock("blabla");
 		assertNotNull(p1);
-		PLock p3 = PessimisticLockManager.getInstance().findOrPersistPLock("blibli");
+		PLock p3 = pessimisticLockManager.findOrPersistPLock("blibli");
 		assertNotNull(p3);
 		
 		new Thread(new Runnable() {
 			public void run() {
-				PLock p2 = PessimisticLockManager.getInstance().findOrPersistPLock("blibli");
+				PLock p2 = pessimisticLockManager.findOrPersistPLock("blibli");
 				assertNotNull(p2);
-				long p2Acquired = System.currentTimeMillis();
+				long p2Acquired = System.nanoTime();
 				holder.add(new Long(p2Acquired));
-				DBFactory.getInstance().closeSession();
+				dbInstance.closeSession();
 				
 			}}).start();
-		sleep(5000);
+		sleep(500);
 		boolean acOk = holder.size() == 0;
-		DBFactory.getInstance().closeSession();
-		sleep(5000);
+		//the commit will drop the lock on blibli d
+		dbInstance.closeSession();
+		sleep(500);
 		boolean acNowOk = holder.size() == 1;
 		
 		// if row locking is not supported, then the timestamp when p2 has been acquired will be shortly -after- p1 has been released
@@ -318,18 +336,19 @@ public class PLockTest extends OlatTestCase {
 		assertTrue("after having released the blabla lock, a next waiting thread must have acquired it after some time", acNowOk);
 	}
 	
-	@Test public void testDeadLockTimeout() {
-		System.out.println("testing if deadlock detection and handling is supported");
+	@Test
+	public void testDeadLockTimeout() {
+		log.info("testing if deadlock detection and handling is supported");
 		// make sure all three row entries for the locks are created, otherwise the system-wide locking 
 		// applied on lock-row-creation cannot support row-level-locking by definition. 
 
-		PLock pc1 = PessimisticLockManager.getInstance().findOrPersistPLock("blabla");
+		PLock pc1 = pessimisticLockManager.findOrPersistPLock("blabla");
 		assertNotNull(pc1);
-		PLock pc2 = PessimisticLockManager.getInstance().findOrPersistPLock("blublu");
+		PLock pc2 = pessimisticLockManager.findOrPersistPLock("blublu");
 		assertNotNull(pc2);
-		PLock pc3 = PessimisticLockManager.getInstance().findOrPersistPLock("blibli");
+		PLock pc3 = pessimisticLockManager.findOrPersistPLock("blibli");
 		assertNotNull(pc3);
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		
 		/**
 		 *    t1   t2
@@ -347,27 +366,28 @@ public class PLockTest extends OlatTestCase {
 		
 	
 		final List<Exception> exceptionHolder = Collections.synchronizedList(new ArrayList<Exception>(1));
-		
+		final CountDownLatch finishCount = new CountDownLatch(2);
 		// t1
 		new Thread(new Runnable() {
 			public void run() {
 				try {
-					PLock p1 = PessimisticLockManager.getInstance().findOrPersistPLock("blabla");
+					PLock p1 = pessimisticLockManager.findOrPersistPLock("blabla");
 					assertNotNull(p1);
-					sleep(2500);
+					sleep(250);
 					// now try to acquire blibli but that fails, since blibli is already locked by thread 2.
 					// but thread 2 cannot continue either, since it is waiting for lock blabla, which is already hold by thread 1
 					// -> deadlock
-					PLock p3 = PessimisticLockManager.getInstance().findOrPersistPLock("blibli");
+					PLock p3 = pessimisticLockManager.findOrPersistPLock("blibli");
 					assertNotNull(p3);					
 				} catch (Exception e) {
 					exceptionHolder.add(e);
 				} finally {
 					try {
-						DBFactory.getInstance().closeSession();
+						dbInstance.closeSession();
 					} catch (Exception e) {
 						// ignore
-					};
+					}
+					finishCount.countDown();
 				}	
 			}}).start();
 		
@@ -375,35 +395,40 @@ public class PLockTest extends OlatTestCase {
 		new Thread(new Runnable() {
 			public void run() {
 				try {
-					PLock p2 = PessimisticLockManager.getInstance().findOrPersistPLock("blibli");
+					PLock p2 = pessimisticLockManager.findOrPersistPLock("blibli");
 					assertNotNull(p2);
-					sleep(5000);
-					PLock p3 = PessimisticLockManager.getInstance().findOrPersistPLock("blabla");
+					sleep(500);
+					PLock p3 = pessimisticLockManager.findOrPersistPLock("blabla");
 					assertNotNull(p3);
 				} catch (Exception e) {
 					exceptionHolder.add(e);
 				} finally {
 					try {
-						DBFactory.getInstance().closeSession();
+						dbInstance.closeSession();
 					} catch (Exception e) {
 						// ignore
-					};
+					}
+					finishCount.countDown();
 				}					
 			}}).start();
 		
 		// sleep until t1 and t2 should have terminated/excepted
-		sleep(8000);
+		try {
+			finishCount.await(8, TimeUnit.SECONDS);
+		} catch (InterruptedException e) {
+			Assert.fail("Takes too long (more than 8sec)");
+		}
+		
 		// if not -> they are in deadlock and the db did not detect it
 		for (Exception exception : exceptionHolder) {
-			System.out.println("exception: "+exception.getMessage());
-			exception.printStackTrace();
+			log.error("exception: ", exception);
 		}
 		assertTrue("expected a deadlock exception, but got none", exceptionHolder.size() > 0);				
 	}
 	
 	
 	@Test public void testPerf() {
-		System.out.println("testing what the throughput is for the pessimistic locking");
+		log.info("testing what the throughput is for the pessimistic locking");
 		// test what the throughput is for the pessimistic locking.
 		// take 500 threads (created and started with no delay (as fast as the vm can) trying to acquire a plock on 20 different olatresourceables.
 		// measure how long that takes. and warn if it exceeds an upper boundary.
@@ -425,12 +450,12 @@ public class PLockTest extends OlatTestCase {
 			Runnable r = new Runnable() {
 				public void run() {
 					try {
-						PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+						pessimisticLockManager.findOrPersistPLock(asset);
 						doneSignal.countDown();
 					} catch (Exception e) {
 						e.printStackTrace();
 					} finally {
-						DBFactory.getInstance().closeSession();
+						dbInstance.closeSession();
 					}
 				}
 			};
@@ -439,11 +464,10 @@ public class PLockTest extends OlatTestCase {
 
 		// 4. wait till all are finished or it takes too long
 		try {
-			boolean interrupt = doneSignal.await(20, TimeUnit.SECONDS);
-			System.out.println("perf for Plocktest:testPerf(): "+(System.currentTimeMillis()-start));
-			assertTrue("Test takes too long (more than 20s)", interrupt);
+			doneSignal.await(20, TimeUnit.SECONDS);
+			log.info("perf for Plocktest:testPerf(): "+(System.currentTimeMillis()-start));
 		} catch (InterruptedException e) {
-			fail("" + e.getMessage());
+			fail("Test takes too long (more than 20s)");
 		}
 		
 		// repeat the same again - this time it should/could be faster
@@ -455,12 +479,12 @@ public class PLockTest extends OlatTestCase {
 			Runnable r = new Runnable() {
 				public void run() {
 					try {
-						PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+						pessimisticLockManager.findOrPersistPLock(asset);
 						doneSignal2.countDown();
 					} catch (Exception e) {
 						e.printStackTrace();
 					} finally {
-						DBFactory.getInstance().commitAndCloseSession();
+						dbInstance.commitAndCloseSession();
 					}
 				}
 			};
@@ -471,7 +495,7 @@ public class PLockTest extends OlatTestCase {
 		
 		try {
 			boolean interrupt = doneSignal.await(20, TimeUnit.SECONDS);
-			System.out.println("perf (again) for Plocktest:testPerf(): "+(System.currentTimeMillis()-start2));
+			log.info("perf (again) for Plocktest:testPerf(): "+(System.currentTimeMillis()-start2));
 			assertTrue("Test takes too long (more than 20s)", interrupt);
 		} catch (InterruptedException e) {
 			fail("" + e.getMessage());
@@ -479,7 +503,7 @@ public class PLockTest extends OlatTestCase {
 	}
 	
 	@Test public void testSync() {
-		System.out.println("testing enrollment");
+		log.info("testing enrollment");
     //	 ------------------ now check with lock -------------------
 		// create a group
 		//	 create users
@@ -487,13 +511,13 @@ public class PLockTest extends OlatTestCase {
 		for (int i = 0; i < MAX_COUNT + MAX_USERS_MORE; i++) {
 			Identity id = JunitTestHelper.createAndPersistIdentityAsUser("u-" + i + "-" + UUID.randomUUID().toString());
 			identities.add(id);
-			System.out.println("testSync: Identity=" + id.getName() + " created");
+			log.info("testSync: Identity=" + id.getName() + " created");
 		}
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 
 		final SecurityGroup group2 = BaseSecurityManager.getInstance().createAndPersistSecurityGroup();
 		// make sure the lock has been written to the disk (tests for createOrFind see other methods)
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		
 		//prepare threads
 		int numOfThreads = MAX_COUNT + MAX_USERS_MORE;
@@ -505,14 +529,14 @@ public class PLockTest extends OlatTestCase {
 			new Thread(new Runnable(){
 				public void run() {
 					try {
-						System.out.println("testSync: thread started j=" + j);
+						log.info("testSync: thread started j=" + j);
 						Identity id = identities.get(j);
 						//
-						PLock p2 = PessimisticLockManager.getInstance().findOrPersistPLock("befinsert");
+						PLock p2 = pessimisticLockManager.findOrPersistPLock("befinsert");
 						assertNotNull(p2);
 						doNoLockingEnrol(id, group2);
-						DBFactory.getInstance().commit();
-						DBFactory.getInstance().closeSession();
+						dbInstance.commit();
+						dbInstance.closeSession();
 					} catch (Exception e) {
 						e.printStackTrace();
 					} finally {
@@ -524,19 +548,19 @@ public class PLockTest extends OlatTestCase {
 		try {
 			finishCount.await(120, TimeUnit.SECONDS);
 		} catch (InterruptedException e) {
-			e.printStackTrace();
+			log.error("", e);
 		}
 
 		// now count 
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		int cnt2 = BaseSecurityManager.getInstance().countIdentitiesOfSecurityGroup(group2);
 		assertTrue("cnt should be smaller or eq than allowed since synced with select for update. cnt:"+cnt2+", max "+MAX_COUNT, cnt2 <= MAX_COUNT);
 		assertTrue("cnt should be eq to allowed since synced with select for update. cnt:"+cnt2+", max "+MAX_COUNT, cnt2 == MAX_COUNT);
-		System.out.println("cnt lock "+cnt2);
+		log.info("cnt lock "+cnt2);
 	}
 	
 	
-	void doNoLockingEnrol(Identity i, SecurityGroup group) {
+	private void doNoLockingEnrol(Identity i, SecurityGroup group) {
 		// check that below max
 		try {
 			StringBuilder sb = new StringBuilder();
@@ -549,9 +573,9 @@ public class PLockTest extends OlatTestCase {
 				sb.append(" adding "+i.getName()+": current.. "+cnt+", max = "+MAX_COUNT);
 				BaseSecurityManager.getInstance().addIdentityToSecurityGroup(i, group);
 			}
-			System.out.println(sb.toString());
+			log.info(sb.toString());
 		} catch (Exception e) {
-			e.printStackTrace();
+			log.error("", e);
 		}
 	}
 }
\ No newline at end of file
diff --git a/src/test/java/org/olat/restapi/RestConnection.java b/src/test/java/org/olat/restapi/RestConnection.java
index f2ca86bb170..f1133e0c420 100644
--- a/src/test/java/org/olat/restapi/RestConnection.java
+++ b/src/test/java/org/olat/restapi/RestConnection.java
@@ -180,9 +180,11 @@ public class RestConnection {
 		if(200 == response.getStatusLine().getStatusCode()) {
 			HttpEntity entity = response.getEntity();
 			return parse(entity.getContent(), cl);
+		} else {
+			EntityUtils.consume(response.getEntity());
+			log.error("get return: " + response.getStatusLine().getStatusCode());
+			return null;
 		}
-		log.error("get return: " + response.getStatusLine().getStatusCode());
-		return null;
 	}
 	
 	public void addEntity(HttpEntityEnclosingRequestBase put, NameValuePair... pairs)
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index 8019e90d1e8..87ef6fe24a5 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -100,7 +100,7 @@ import org.junit.runners.Suite;
 	org.olat.resource.OLATResourceManagerTest.class,//ok
 	org.olat.basesecurity.manager.GroupDAOTest.class,//ok
 	org.olat.basesecurity.SecurityManagerTest.class,//ok
-	org.olat.basesecurity.BaseSecurityTest.class,//ok
+	org.olat.basesecurity.GetIdentitiesByPowerSearchTest.class,//ok
 	org.olat.basesecurity.BaseSecurityManagerTest.class,//ok
 	org.olat.user.UserManagerTest.class,//ok
 	org.olat.user.UserNameAndPasswordSyntaxCheckerWithRegexpTest.class,//ok
-- 
GitLab