diff --git a/pom.xml b/pom.xml
index 8d19201038bc65512656288d676735e60238c4f2..cf080e859ff5db6b5924b652d80466d8c5be3d86 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 a33ec51274ac4de6f9e6b7e2de419680eee6c632..1d06a8319183ac750e76965f22b986605487edb0 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 f76258d4758c514e40fb1fdbb38f82d0fbb53ea0..981e72cc4dda6aa888334b8ef9e516afe948e024 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 c5419eacbfee06f66df2d7258632f616b75f7a3a..841146ce2e48cffd78f59a3030b7c4f499048041 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 fcb68564ee1352cd0b859cbd97be7507be9fe655..f4dc7b9a63d89f1fe5c0b954ad1fcf5df69a1b53 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 2050c611b55b70197b137113d7824bac49794711..29ec03b1de89ff67d18f1479d1056435ce35fac5 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 5e1a218018ab5ba8463f64e2a67002518507e8b7..8f0c5b674401ebf02d3b7ce1cab109817bd9da67 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 b105e143465a0128e09906e56cb6608925423a0c..6f63b07cb1e21aef701e6bd5c435aef5e5aadbfc 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 ec33ae018d922ef9c4b6ba8b47fb2fa953118ca1..cd8a6591323c1cbc48beeb20d133951da753a5b7 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 87f253c754277388bec857a630f367c242223f5d..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..f3d1792b15e04e728983060817f6c81e6ded7255
--- /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 353d63c53fdf3ddcfca1250ade8fa6c1a5bcad4c..923167172521554f92c2589fabb5e0a2d6dac263 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 be411d95c81b720fbcaf63c86a7bf7957a61a563..d6e91a8542d4c650dc9a333167e150e238a20f04 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 1efaf9ce3fcc650e6cf27c51b0a904e5019b67e4..d543290e7227134a27f7125cf6c4befd357a4100 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 580d837fee76fb2414bc7d5bde0b6df9ae95c537..5278ff015efe7a8c7e87ffa36561c1efca28d3cc 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 c95348ae332d2c7952e6e702b5de3046c89aab4b..0a1566175c35afaccf54854a7a533286406097ef 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 3f4b951c97d99d8cff279dd0bafc083cd3868579..8f0f97db9a2daf4467f334ea034f7e831d061999 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 f9d6e4687939897b4fa8f447d42b0b1b6c812490..16dff25f987dde48167b2da64773e4e6686bf877 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 1a15a4a89649e800d4f4056f90bcaecd8bf83cf4..bc7ca0de283a7d2ef681b2df85da19db3ad150c9 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 c52df08e4ddf7a2fecca56a095070f56e2915fa6..43953939b71eafe00c7fdfc0ef8e9be9f9e15b47 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 f2ca86bb170d097823974f12b6500c12dbed64a2..f1133e0c420185417d755693e9168129f492a024 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 8019e90d1e8438a1a3154a37f29498834d9f22ce..87ef6fe24a545551815271e2f19aac4b7eb91200 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