diff --git a/pom.xml b/pom.xml
index c2a57720f23c0c9a0062bce9a3f6419f1ba3ed3c..82cd17f25199cfbb0b549c10564c59d600ebe857 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2229,11 +2229,6 @@
 				</exclusion>
 			</exclusions>
 		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-orm</artifactId>
-			<version>${org.springframework.version}</version>
-		</dependency>
 		<!-- end Spring dependencies -->
 		<!-- Start Jersey dependency -->
 		<dependency>
diff --git a/src/main/java/de/bps/course/nodes/VCCourseNode.java b/src/main/java/de/bps/course/nodes/VCCourseNode.java
index 4c2549cfadd191f7317b33769556b4224842154b..86fa2b55b43cbc52c8b978e30a7441772e369bcf 100644
--- a/src/main/java/de/bps/course/nodes/VCCourseNode.java
+++ b/src/main/java/de/bps/course/nodes/VCCourseNode.java
@@ -143,7 +143,7 @@ public class VCCourseNode extends AbstractAccessableCourseNode {
 			if(roles.isInstitutionalResourceManager() | roles.isAuthor()) {
 				RepositoryManager rm = RepositoryManager.getInstance();
 				ICourse course = CourseFactory.loadCourse(key);
-				RepositoryEntry re = rm.lookupRepositoryEntry(course, false);
+				RepositoryEntry re = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 				if (re != null) {
 					moderator = rm.isOwnerOfRepositoryEntry(ureq.getIdentity(), re);
 					if(!moderator) {
diff --git a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java
index 1077de8f0f304552e5715ca5bffd762af5bcc862..4650ac70331b9996057f6b6f6fda2427a3acbdaf 100644
--- a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java
+++ b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java
@@ -96,7 +96,7 @@ public class QuotaManagerImpl extends QuotaManager {
 	public void init() {
 		quotaResource = resourceManager.findOrPersistResourceable(OresHelper.lookupType(Quota.class));
 		initDefaultQuotas(); // initialize default quotas
-		DBFactory.getInstance(false).intermediateCommit();
+		DBFactory.getInstance().intermediateCommit();
 		log.info("Successfully initialized Quota Manager");
 	}
 
diff --git a/src/main/java/org/olat/admin/sysinfo/HibernateStatisticsController.java b/src/main/java/org/olat/admin/sysinfo/HibernateStatisticsController.java
index 5703801fa77728cbd0030bde221f919c9dc20660..7f38b5f08fdefe9ece45f5353d77e31164b2a338 100644
--- a/src/main/java/org/olat/admin/sysinfo/HibernateStatisticsController.java
+++ b/src/main/java/org/olat/admin/sysinfo/HibernateStatisticsController.java
@@ -19,7 +19,8 @@
  */
 package org.olat.admin.sysinfo;
 
-import org.olat.core.commons.persistence.DBFactory;
+import org.hibernate.stat.Statistics;
+import org.olat.core.commons.persistence.DB;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
@@ -28,6 +29,7 @@ import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -40,6 +42,9 @@ public class HibernateStatisticsController extends BasicController {
 	private Link disableLink;
 	private Link clearLink;
 	private VelocityContainer mainVC;
+	
+	@Autowired
+	private DB dbInstance;
 
 	public HibernateStatisticsController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl);
@@ -54,8 +59,9 @@ public class HibernateStatisticsController extends BasicController {
 	}
 	
 	public void loadModel() {
-		mainVC.contextPut("isStatisticsEnabled", DBFactory.getInstance(false).getStatistics().isStatisticsEnabled());
-		mainVC.contextPut("hibernateStatistics", DBFactory.getInstance(false).getStatistics());
+		Statistics statistics = dbInstance.getStatistics();
+		mainVC.contextPut("isStatisticsEnabled", statistics.isStatisticsEnabled());
+		mainVC.contextPut("hibernateStatistics", statistics);
 	}
 	
 	@Override
@@ -65,18 +71,19 @@ public class HibernateStatisticsController extends BasicController {
 
 	@Override
 	protected void event(UserRequest ureq, Component source, Event event) {
+		Statistics statistics = dbInstance.getStatistics();
 		if (source == enableLink){
-			DBFactory.getInstance(false).getStatistics().setStatisticsEnabled(true);
-			mainVC.contextPut("isStatisticsEnabled", DBFactory.getInstance(false).getStatistics().isStatisticsEnabled());
+			statistics.setStatisticsEnabled(true);
+			mainVC.contextPut("isStatisticsEnabled",statistics.isStatisticsEnabled());
 			getWindowControl().setInfo("Hibernate statistics enabled.");
 			loadModel();
 		} else if (source == disableLink){
-			DBFactory.getInstance(false).getStatistics().setStatisticsEnabled(false);
-			mainVC.contextPut("isStatisticsEnabled", DBFactory.getInstance(false).getStatistics().isStatisticsEnabled());
+			statistics.setStatisticsEnabled(false);
+			mainVC.contextPut("isStatisticsEnabled", statistics.isStatisticsEnabled());
 			getWindowControl().setInfo("Hibernate statistics disabled.");
 			loadModel();
 		} else if (source == clearLink){
-			DBFactory.getInstance(false).getStatistics().clear();
+			statistics.clear();
 			getWindowControl().setInfo("Hibernate statistics clear done.");
 			loadModel();
 		}
diff --git a/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java b/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java
index d84e83d7bcfbdb6c9dc74e9492a906a2ad36b993..5fea001d09a0ab5cf9c8cae4a59558e39f3cc519 100644
--- a/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java
+++ b/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java
@@ -244,7 +244,7 @@ public class UserCalendarWebService {
 					AccessResult result = acManager.isAccessible(entry, retrievedUser, false);
 					if(result.isAccessible()) {
 						try {
-							final ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+							final ICourse course = CourseFactory.loadCourse(entry);
 							CourseConfig config = course.getCourseEnvironment().getCourseConfig();
 							UserCourseEnvironment userCourseEnv = new UserCourseEnvironmentImpl(ienv, course.getCourseEnvironment());
 							
diff --git a/src/main/java/org/olat/commons/coordinate/cluster/ClusterSyncer.java b/src/main/java/org/olat/commons/coordinate/cluster/ClusterSyncer.java
index e838cd21adfe65127bdb8a7d01e34ca73a5b9d14..bf42ed460ea65b40952de1b983f9a3206910f164 100644
--- a/src/main/java/org/olat/commons/coordinate/cluster/ClusterSyncer.java
+++ b/src/main/java/org/olat/commons/coordinate/cluster/ClusterSyncer.java
@@ -25,6 +25,7 @@
 package org.olat.commons.coordinate.cluster;
 
 import org.olat.core.commons.persistence.DB;
+import org.olat.core.commons.services.lock.pessimistic.PessimisticLockManager;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.AssertException;
 import org.olat.core.logging.OLog;
@@ -34,7 +35,6 @@ import org.olat.core.util.coordinate.SyncerCallback;
 import org.olat.core.util.coordinate.SyncerExecutor;
 import org.olat.core.util.coordinate.util.DerivedStringSyncer;
 import org.olat.core.util.resource.OresHelper;
-import org.olat.resource.lock.pessimistic.PessimisticLockManager;
 
 /**
  * Description:<br>
diff --git a/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml b/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml
index b88f9559b78229794b456a5cf0dca00d3226647a..96b2423896f4f66d92efd82c1bc32b9128847356 100644
--- a/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml
+++ b/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml
@@ -1,9 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:context="http://www.springframework.org/schema/context" 
 	xsi:schemaLocation="
   http://www.springframework.org/schema/beans 
-  http://www.springframework.org/schema/beans/spring-beans.xsd">
+  http://www.springframework.org/schema/beans/spring-beans.xsd
+  http://www.springframework.org/schema/context 
+  http://www.springframework.org/schema/context/spring-context.xsd">
+
+	<context:component-scan base-package="org.olat.commons.coordinate.cluster.lock" />
   
 	<bean id="persistentLockManager" class="org.olat.core.util.coordinate.DBPersistentLockManager"/>  
 
@@ -27,9 +32,10 @@
 
 	<bean id="clusterLocker" class="org.olat.commons.coordinate.cluster.lock.ClusterLocker" init-method="init">
 		<constructor-arg index="0" ref="clusterLockManager" />
+		<property name="pessimisticLockManager" ref="lockManager"/>
+		<property name="persistentLockManager" ref="persistentLockManager"/>
 		<property name="syncer" ref="org.olat.commons.coordinate.cluster.ClusterSyncer" />
 		<property name="eventBus" ref="org.olat.commons.coordinate.cluster.jms.ClusterEventBus" />
-		<property name="persistentLockManager" ref="persistentLockManager"/>
 	</bean>
 	
 	<bean id="org.olat.commons.coordinate.cluster.ClusterSyncer" class="org.olat.commons.coordinate.cluster.ClusterSyncer" >
@@ -48,8 +54,6 @@
 		<property name="jmsMsgDelayLimit"  value="5000" />
 	</bean>
 
-	<bean id="clusterLockManager" class="org.olat.commons.coordinate.cluster.lock.ClusterLockManager"/>
-
 	<import resource="classpath:/org/olat/commons/coordinate/cluster/_spring/coordinate_jms_${jms.provider}.xml"/>
 
 </beans>	
\ No newline at end of file
diff --git a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java
index b808331dc1ea06d30917b5ad64b27683f8bd1a4d..51554fafebdff65bcb9d76035754529818817407 100644
--- a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java
+++ b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java
@@ -62,6 +62,7 @@ import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerExecutor;
 import org.olat.core.util.event.MultiUserEvent;
 import org.olat.core.util.resource.OresHelper;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Description:<br>
@@ -102,6 +103,9 @@ public class ClusterAdminControllerCluster extends BasicController {
 	
 	private UserSearchController usc;
 	
+	@Autowired
+	private ClusterLockManager clusterLockManager;
+	
 	/**
 	 * @param ureq
 	 * @param wControl
@@ -333,7 +337,7 @@ public class ClusterAdminControllerCluster extends BasicController {
 				// we configured usc to either cancel or to only accept single user selection.
 				SingleIdentityChosenEvent sce = (SingleIdentityChosenEvent)event;
 				Identity ident = sce.getChosenIdentity();
-				ClusterLockManager.getInstance().releaseAllLocksFor(ident.getKey());
+				clusterLockManager.releaseAllLocksFor(ident.getKey());
 				showInfo("locks.released", ident.getName());
 			}
 		}
diff --git a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java
index 41e07d03020fafc52ca18baebeeeedfa2945e29f..c51a19b46f1ecbf93570f87dcc2c0faecffdae49 100644
--- a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java
+++ b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java
@@ -30,8 +30,8 @@ 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.core.manager.BasicManager;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
 /**
  * 
@@ -42,29 +42,14 @@ import org.springframework.beans.factory.annotation.Autowired;
  * Initial Date:  10.12.2007 <br>
  * @author Felix Jost, http://www.goodsolutions.ch
  */
-public class ClusterLockManager extends BasicManager {
-	private static ClusterLockManager INSTANCE;
-	
+@Service("clusterLockManager")
+public class ClusterLockManager {
+
 	private static final OLog log = Tracing.createLoggerFor(ClusterLockManager.class);
-	
+
 	@Autowired
 	private DB dbInstance;
 	
-	/**
-	 * [spring]
-	 */
-	private ClusterLockManager() {
-		INSTANCE = this;
-	}
-	
-	/**
-	 * to be used only by the cluster package and subpackages 
-	 * @return
-	 */
-	public static ClusterLockManager getInstance() {
-		return INSTANCE;
-	}
-	
 	LockImpl findLock(String asset) {
 		log.info("findLock: "+asset+" START");
 		StringBuilder sb = new StringBuilder();
diff --git a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java
index ef91b62ee60eca1ee89365985256e2501a2c7778..a7ef668ffdc7cb89b3db5a9294be9f3838837901 100644
--- a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java
+++ b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java
@@ -28,6 +28,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.olat.core.commons.persistence.DBFactory;
+import org.olat.core.commons.services.lock.pessimistic.PessimisticLockManager;
 import org.olat.core.gui.control.Event;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
@@ -47,7 +48,6 @@ import org.olat.core.util.coordinate.SyncerCallback;
 import org.olat.core.util.event.EventBus;
 import org.olat.core.util.event.GenericEventListener;
 import org.olat.core.util.resource.OresHelper;
-import org.olat.resource.lock.pessimistic.PessimisticLockManager;
 
 /**
  * Description:<br>
@@ -67,6 +67,7 @@ public class ClusterLocker implements Locker, GenericEventListener {
 	private EventBus eventBus;
 	private ClusterLockManager clusterLockManager;
 	private PersistentLockManager persistentLockManager;
+	private PessimisticLockManager pessimisticLockManager;
 	/**
 	 * [used by spring]
 	 *
@@ -88,7 +89,7 @@ public class ClusterLocker implements Locker, GenericEventListener {
 
 	
 	//cluster:::::: on init of olat system, clear all locks?? but only the one from node in question?
-
+	@Override
 	public PersistentLockManager getPersistentLockManager() {
 		return persistentLockManager;
 	}
@@ -96,6 +97,14 @@ public class ClusterLocker implements Locker, GenericEventListener {
 	public void setPersistentLockManager(PersistentLockManager persistentLockManager) {
 		this.persistentLockManager = persistentLockManager;
 	}
+	
+	/**
+	 * [used by Spring]
+	 * @param pessimisticLockManager
+	 */
+	public void setPessimisticLockManager(PessimisticLockManager pessimisticLockManager) {
+		this.pessimisticLockManager = pessimisticLockManager;
+	}
 
 	public LockResult acquireLock(final OLATResourceable ores, final Identity requestor, final String locksubkey) {
 		final String asset = OresHelper.createStringRepresenting(ores, locksubkey);
@@ -186,7 +195,7 @@ public class ClusterLocker implements Locker, GenericEventListener {
 		
 		
 		// cluster:: change to useage with syncer, but we don't have the olatresourceable yet
-		PessimisticLockManager.getInstance().findOrPersistPLock(asset);
+		pessimisticLockManager.findOrPersistPLock(asset);
 
 		LockImpl li = clusterLockManager.findLock(asset);
 		if (li == null) {
diff --git a/src/main/java/org/olat/commons/servlets/RSSServlet.java b/src/main/java/org/olat/commons/servlets/RSSServlet.java
index f1b0a4a6397d656da998e14a7e7aa117d58a29b1..ba93d88d7b737962def168e082c48a88c9c6e543 100644
--- a/src/main/java/org/olat/commons/servlets/RSSServlet.java
+++ b/src/main/java/org/olat/commons/servlets/RSSServlet.java
@@ -150,7 +150,7 @@ public class RSSServlet extends HttpServlet {
 			DispatcherModule.sendNotFound("none", response);
 		} finally {
 			IOUtils.closeQuietly(writer);
-			DBFactory.getInstance(false).commitAndCloseSession();
+			DBFactory.getInstance().commitAndCloseSession();
 		}
 	}
 
diff --git a/src/main/java/org/olat/core/commons/persistence/DBFactory.java b/src/main/java/org/olat/core/commons/persistence/DBFactory.java
index 98cd414b808773f5c8e557c1ec615bf06bf8f2d1..10ca638baa9ba6a6c92d5eec2f78ddb0e17187f2 100644
--- a/src/main/java/org/olat/core/commons/persistence/DBFactory.java
+++ b/src/main/java/org/olat/core/commons/persistence/DBFactory.java
@@ -39,14 +39,4 @@ public class DBFactory {
 	public static DB getInstance() {
 		return DBImpl.getInstance();
 	}
-
-    public static DB getInstance(boolean initialize) {
-        return DBImpl.getInstance();
-    }
-
-    public static DB getInstanceForClosing() {
-      return DBImpl.getInstance();
-  }
-
-
 }
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 2c2b2003a898626a21c068d342a4cf3b86986988..fc1dc5fbd627f1f86a3309ac0af158e1660df22c 100644
--- a/src/main/java/org/olat/core/commons/persistence/DBImpl.java
+++ b/src/main/java/org/olat/core/commons/persistence/DBImpl.java
@@ -31,12 +31,13 @@ import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.Enumeration;
 import java.util.List;
-import java.util.Map;
+import java.util.Properties;
 
 import javax.persistence.Cache;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
 import javax.persistence.RollbackException;
 
 import org.hibernate.HibernateException;
@@ -53,12 +54,7 @@ import org.olat.core.logging.AssertException;
 import org.olat.core.logging.DBRuntimeException;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
-import org.springframework.orm.jpa.EntityManagerFactoryUtils;
-import org.springframework.transaction.PlatformTransactionManager;
-import org.springframework.transaction.TransactionDefinition;
-import org.springframework.transaction.TransactionStatus;
-import org.springframework.transaction.support.DefaultTransactionDefinition;
-import org.springframework.transaction.support.TransactionSynchronizationManager;
+
 
 /**
  * A <b>DB </b> is a central place to get a Entity Managers. It acts as a
@@ -74,8 +70,7 @@ public class DBImpl implements DB, Destroyable {
 	private static DBImpl INSTANCE;
 	
 	private String dbVendor;
-	private EntityManagerFactory emf;
-	private PlatformTransactionManager txManager;
+	private static EntityManagerFactory emf;
 
 	private final ThreadLocal<ThreadLocalData> data = new ThreadLocal<ThreadLocalData>();
 	// Max value for commit-counter, values over this limit will be logged.
@@ -84,8 +79,16 @@ public class DBImpl implements DB, Destroyable {
 	/**
 	 * [used by spring]
 	 */
-	private DBImpl() {
-		INSTANCE = this;
+	public DBImpl(Properties databaseProperties) {
+		if(INSTANCE == null) {
+			INSTANCE = this;
+			try {
+				emf = Persistence.createEntityManagerFactory("default", databaseProperties);
+			} catch (Exception e) {
+				log.error("", e);
+				throw e;
+			}
+		}
 	}
 	
 	protected static DBImpl getInstance() {
@@ -118,14 +121,6 @@ public class DBImpl implements DB, Destroyable {
 	public void setDbVendor(String dbVendor) {
 		this.dbVendor = dbVendor;
 	}
-    
-	public void setEntityManagerFactory(EntityManagerFactory emf) {
-		this.emf = emf;
-	}
-	
-	public void setTxManager(PlatformTransactionManager txManager) {
-		this.txManager = txManager;
-	}
 
 	/**
 	 * A <b>ThreadLocalData</b> is used as a central place to store data on a per
@@ -134,7 +129,7 @@ public class DBImpl implements DB, Destroyable {
 	 * @author Andreas CH. Kapp
 	 * @author Christian Guretzki
 	 */
-	protected static class ThreadLocalData {
+	protected class ThreadLocalData {
 
 		private boolean error;
 		private Exception lastError;
@@ -145,9 +140,42 @@ public class DBImpl implements DB, Destroyable {
 		// count number of commit in db-session, used to log warn 'Call more than one commit in a db-session'
 		private int commitCounter = 0;
 		
+		private EntityManager em;
+		
 		private ThreadLocalData() {
 		// don't let any other class instantiate ThreadLocalData.
 		}
+		
+		public EntityManager getEntityManager(boolean createIfNecessary) {
+			if(em == null && createIfNecessary) {
+				em = emf.createEntityManager();
+			}
+			return em;
+		}
+		
+		public EntityManager renewEntityManager() {
+			if(em != null && !em.isOpen()) {
+				try {
+					em.close();
+				} catch (Exception e) {
+					log.error("", e);
+				}
+				em = null;
+			}
+			return getEntityManager(true);
+		}
+		
+		public void removeEntityManager() {
+			em = null;
+		}
+		
+		public boolean hasTransaction() {
+			if(em != null && em.isOpen()) {
+				EntityTransaction trx = em.getTransaction();
+				return trx != null && trx.isActive();
+			}
+			return false;
+		}
 
 		/**
 		 * @return true if initialized.
@@ -161,6 +189,12 @@ public class DBImpl implements DB, Destroyable {
 		}
 
 		public boolean isError() {
+			if(em != null && em.isOpen()) {
+				EntityTransaction trx = em.getTransaction();
+				if (trx != null && trx.isActive()) {
+					return trx.getRollbackOnly();
+				} 
+			}
 			return error;
 		}
 
@@ -218,7 +252,7 @@ public class DBImpl implements DB, Destroyable {
 	@Override
 	public EntityManager getCurrentEntityManager() {
 		//if spring has already an entity manager in this thread bounded, return it
-		EntityManager threadBoundedEm = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
+		EntityManager threadBoundedEm = getData().getEntityManager(true);
 		if(threadBoundedEm != null && threadBoundedEm.isOpen()) {
 			EntityTransaction trx = threadBoundedEm.getTransaction();
 			//if not active begin a new one (possibly manual committed)
@@ -227,10 +261,17 @@ public class DBImpl implements DB, Destroyable {
 			}
 			updateDataStatistics("entityManager");
 			return threadBoundedEm;
+		} else if(threadBoundedEm == null || !threadBoundedEm.isOpen()) {
+			threadBoundedEm = getData().renewEntityManager();
+		}
+		
+		EntityTransaction trx = threadBoundedEm.getTransaction();
+		//if not active begin a new one (possibly manual committed)
+		if(!trx.isActive()) {
+			trx.begin();
 		}
-		EntityManager em = getEntityManager();
 		updateDataStatistics("entityManager");
-		return em;
+		return threadBoundedEm;
 	}
 	
 	private Session getSession(EntityManager em) {
@@ -241,61 +282,14 @@ public class DBImpl implements DB, Destroyable {
 		return trx == null || !trx.isActive() || trx.getRollbackOnly();
 	}
 	
-	private EntityManager getEntityManager() {
-		EntityManager txEm = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
-		if(txEm == null) {
-			if(txManager != null) {
-				DefaultTransactionDefinition def = new DefaultTransactionDefinition();
-				txManager.getTransaction(def);
-				txEm = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
-			} else {
-				txEm = emf.createEntityManager();
-			}
-		} else if(!txEm.isOpen()) {
-			DefaultTransactionDefinition def = new DefaultTransactionDefinition();
-			def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
-			txManager.getTransaction(def);
-			txEm = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
+	private void updateDataStatistics(Object logObject) {
+		if (getData().getAccessCounter() > MAX_DB_ACCESS_COUNT) {
+			log.warn("beginTransaction bulk-change, too many db access for one transaction, could be a performance problem (add closeSession/createSession in loop) logObject=" + logObject, null);
+			getData().resetAccessCounter();
 		} else {
-			EntityTransaction trx = txEm.getTransaction();
-			//if not active begin a new one (possibly manual committed)
-			if(!trx.isActive()) {
-				trx.begin();
-			}
-		}
-		return txEm;
-	}
-
-  private void updateDataStatistics(Object logObject) {
-		/*
-  	//OLAT-3621: paranoia check for error state: we need to catch errors at the earliest point possible. OLAT-3621 has a suspected situation
-		//           where an earlier transaction failed and didn't clean up nicely. To check this, we introduce error checking in getInstance here
-	  
-		if (transaction != null && transaction.isActive() && transaction.getRollbackOnly()
-				&& !Thread.currentThread().getName().equals("TaskExecutorThread")) {
-			INSTANCE.logWarn("beginTransaction: Transaction (still?) in Error state: "+transaction, new Exception("DBImpl begin transaction)"));
-		}
-		*/
-	
-  	// increment only non-cachable query 
-  	if (logObject instanceof String ) {
-  		String query = (String) logObject;
-  		query = query.trim();
-  		if (   !query.startsWith("select count(poi) from org.olat.basesecurity.SecurityGroupMembershipImpl as sgmsi, org.olat.basesecurity.PolicyImpl as poi,")
-  		    && !query.startsWith("select count(grp) from org.olat.group.BusinessGroupImpl as grp")
-  		    && !query.startsWith("select count(sgmsi) from  org.olat.basesecurity.SecurityGroupMembershipImpl as sgmsi") ) {
-  			// it is no of cached queries
-  			getData().incrementAccessCounter();  			
-  		}
-  	} else {
-  		getData().incrementAccessCounter();
-  	}
-
-    if (getData().getAccessCounter() > MAX_DB_ACCESS_COUNT) {
-    	log.warn("beginTransaction bulk-change, too many db access for one transaction, could be a performance problem (add closeSession/createSession in loop) logObject=" + logObject, null);
-    	getData().resetAccessCounter();
+  			getData().incrementAccessCounter();
+    	}
     }
-  }
 
 	/**
 	 * Close the database session.
@@ -313,7 +307,7 @@ public class DBImpl implements DB, Destroyable {
 
 		//commit
 		//getCurrentEntityManager();
-		EntityManager s = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
+		EntityManager s = getData().getEntityManager(false);
 		if(s != null) {
 			EntityTransaction trx = s.getTransaction();
 			if(trx.isActive()) {
@@ -327,13 +321,7 @@ public class DBImpl implements DB, Destroyable {
 					trx.rollback();
 				}
 			}
-	
-			TransactionSynchronizationManager.clear();
-			EntityManagerFactoryUtils.closeEntityManager(s);
-			Map<Object,Object> map = TransactionSynchronizationManager.getResourceMap();
-			if(map.containsKey(emf)) {
-				TransactionSynchronizationManager.unbindResource(emf);
-			}
+			s.close();
 		}
 		data.remove();
 	}
@@ -600,24 +588,11 @@ public class DBImpl implements DB, Destroyable {
 	 */
 	@Override
 	public boolean isError() {
-		//EntityTransaction trx = getCurrentEntityManager().getTransaction();
-		EntityManager em = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
-		if(em != null && em.isOpen()) {
-			EntityTransaction trx = em.getTransaction();
-			if (trx != null && trx.isActive()) {
-				return trx.getRollbackOnly();
-			} 
-		}
-		return getData() == null ? false : getData().isError();
+		return getData().isError();
 	}
 
 	private boolean hasTransaction() {
-		EntityManager em = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
-		if(em != null && em.isOpen()) {
-			EntityTransaction trx = em.getTransaction();
-			return trx != null && trx.isActive();
-		}
-		return false;
+		return getData().hasTransaction();
 	}
 
 	/**
@@ -756,9 +731,6 @@ public class DBImpl implements DB, Destroyable {
 			// Error when trying to commit
 			try {
 				if (hasTransaction()) {
-					TransactionStatus status = txManager.getTransaction(null);
-					txManager.rollback(status);
-					
 					EntityTransaction trx = getCurrentEntityManager().getTransaction();
 					if(trx != null && trx.isActive()) {
 						if(trx.getRollbackOnly()) {
@@ -792,10 +764,6 @@ public class DBImpl implements DB, Destroyable {
 		try {
 			// see closeSession() and OLAT-4318: more robustness with commit/rollback/close, therefore
 			// we check if the connection is open at this stage at all
-
-			TransactionStatus status = txManager.getTransaction(null);
-			txManager.rollback(status);
-			
 			EntityTransaction trx = getCurrentEntityManager().getTransaction();
 			if(trx != null && trx.isActive()) {
 				if(trx.getRollbackOnly()) {
diff --git a/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml b/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml
index c37251cb4d057e5d2e28a3557e5b1c7dbbbbed36..40a3f75e3bfccd73ba687e5f0ea9979fbbcbae60 100644
--- a/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml
+++ b/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml
@@ -3,38 +3,12 @@
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="
   http://www.springframework.org/schema/beans 
-  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
+  http://www.springframework.org/schema/beans/spring-beans.xsd">
 
-	<!-- Persistence unit manager -->
-	<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager" depends-on="databaseUpgrader">
-  		<property name="persistenceXmlLocations">
-    		<list>
-     			<value>classpath:/org/olat/core/commons/persistence/_spring/core_persistence.xml</value>
-			</list>
-  		</property>
-  		<!-- 
-		<property name="defaultDataSource" ref="${db.vendor}PooledDataSource"/>
-		-->
-	</bean>
-	
-	<!-- EntityManagerFactory -->
-	<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
-		<property name="persistenceUnitManager" ref="pum"/>
-		<property name="jpaProperties" ref="${db.vendor}_${db.source}_HibernateProperties"/>
-	</bean>
-	
     <bean id="AuditInterceptor" class="org.olat.core.commons.persistence.AuditInterceptor" />
-    
-    <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
-		<property name="jpaDialect" ref="jpaDialect" />
-		<property name="entityManagerFactory" ref="emf"/>
-	</bean>
-	
-	<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
 
 	<bean id="database" class="org.olat.core.commons.persistence.DBImpl" destroy-method="destroy">
-		<property name="txManager" ref="txManager"/>
-		<property name="entityManagerFactory" ref="emf"/>
+		<constructor-arg index="0" ref="${db.vendor}_${db.source}_HibernateProperties"/>
 		<property name="dbVendor" value="${db.vendor}" />
 	</bean>
 
diff --git a/src/main/java/org/olat/resource/lock/pessimistic/PLock.java b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PLock.java
similarity index 94%
rename from src/main/java/org/olat/resource/lock/pessimistic/PLock.java
rename to src/main/java/org/olat/core/commons/services/lock/pessimistic/PLock.java
index 3231b9e134bbe1cdd2301cdaf7cb5cba361787f8..05eedb0c9b37cf2d1ea5ce1a8942347f59539cd1 100644
--- a/src/main/java/org/olat/resource/lock/pessimistic/PLock.java
+++ b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PLock.java
@@ -22,7 +22,7 @@
 * This file has been modified by the OpenOLAT community. Changes are licensed
 * under the Apache 2.0 license as the original file.
 */
-package org.olat.resource.lock.pessimistic;
+package org.olat.core.commons.services.lock.pessimistic;
 
 public interface PLock {
 
diff --git a/src/main/java/org/olat/core/commons/services/lock/pessimistic/PLockImpl.java b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PLockImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..218185930480e9cbd4eddfffaebd33770116bc11
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PLockImpl.java
@@ -0,0 +1,128 @@
+/**
+* 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.
+*/
+
+package org.olat.core.commons.services.lock.pessimistic;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Version;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.olat.core.id.CreateInfo;
+import org.olat.core.id.Persistable;
+
+/**
+ * A <b>OLATResourceImpl</b> is 
+ * 
+ * @author Andreas
+ *
+ */
+@Entity(name="plock")
+@Table(name="o_plock")
+@NamedQueries({
+	@NamedQuery(name="loadByPLockByAsset", query="select lock from plock as lock where lock.asset=:asset")
+})
+public class PLockImpl implements PLock, CreateInfo, Persistable {
+
+	private static final long serialVersionUID = 1954725655490667921L;
+	
+	@Id
+	@GeneratedValue(generator = "system-uuid")
+	@GenericGenerator(name = "system-uuid", strategy = "hilo")
+	@Column(name="plock_id", nullable=false, unique=true, insertable=true, updatable=false)
+	private Long key;
+	@Version
+	private int version = 0;
+	@Temporal(TemporalType.TIMESTAMP)
+	@Column(name="creationdate", nullable=false, insertable=true, updatable=false)
+	private Date creationDate;
+
+	@Column(name="asset", nullable=false, insertable=true, updatable=false, unique=true)
+	private String asset;
+	
+	/**
+	* Constructor needed for Hibernate.
+	*/
+	public PLockImpl() {
+		// singleton
+	}
+
+	public PLockImpl(String asset) {
+		this.asset = asset;
+	}
+	
+	@Override
+	public Long getKey() {
+		return key;
+	}
+	
+	@Override
+	public Date getCreationDate() {
+		return creationDate;
+	}
+	
+	public void setCreationDate(Date creationDate) {
+		this.creationDate = creationDate;
+	}
+
+	public String getAsset() {
+		return asset;
+	}
+
+	public void setAsset(String asset) {
+		this.asset = asset;
+	}
+
+	@Override
+	public int hashCode() {
+		return key == null ? 2396928 : key.hashCode();
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if(obj == this) {
+			return true;
+		}
+		if(obj instanceof PLockImpl) {
+			PLockImpl plock = (PLockImpl)obj;
+			return key != null && key.equals(plock.getKey());
+		}
+		return false;
+	}
+
+	@Override
+	public boolean equalsByPersistableKey(Persistable persistable) {
+		return equals(persistable);
+	}
+}
diff --git a/src/main/java/org/olat/resource/lock/pessimistic/PessimisticLockManager.java b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PessimisticLockManager.java
similarity index 80%
rename from src/main/java/org/olat/resource/lock/pessimistic/PessimisticLockManager.java
rename to src/main/java/org/olat/core/commons/services/lock/pessimistic/PessimisticLockManager.java
index f13f58eebb802ed34661d5436fe02821668e0214..24245045d1f6237946f901991655f9206763bb0d 100644
--- a/src/main/java/org/olat/resource/lock/pessimistic/PessimisticLockManager.java
+++ b/src/main/java/org/olat/core/commons/services/lock/pessimistic/PessimisticLockManager.java
@@ -22,19 +22,20 @@
 * This file has been modified by the OpenOLAT community. Changes are licensed
 * under the Apache 2.0 license as the original file.
 */
-package org.olat.resource.lock.pessimistic;
+package org.olat.core.commons.services.lock.pessimistic;
 
-import java.util.HashMap;
+import java.util.Date;
 import java.util.List;
-import java.util.Map;
 
-import org.hibernate.LockMode;
-import org.olat.core.commons.persistence.DBFactory;
-import org.olat.core.commons.persistence.DBQuery;
-import org.olat.core.configuration.Initializable;
+import javax.persistence.LockModeType;
+
+import org.olat.core.commons.persistence.DB;
 import org.olat.core.logging.AssertException;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
 
 /**
@@ -47,26 +48,24 @@ import org.olat.core.logging.Tracing;
  * Initial Date:  25.10.2007 <br>
  * @author Felix Jost, http://www.goodsolutions.ch
  */
-public class PessimisticLockManager implements Initializable {
+@Service("lockManager")
+public class PessimisticLockManager implements InitializingBean {
 	
 	private static final OLog log = Tracing.createLoggerFor(PessimisticLockManager.class);
 	
-	private static PessimisticLockManager INSTANCE;
+
 	private final String ASSET_INSERT_LOCK = "SYS_plock_global";
 	private boolean initDone = false;
 	
-	/**
-	 * [used by spring]
-	 */
-	private PessimisticLockManager() {
-		INSTANCE = this;
-	}
+	private final DB dbInstance;
 	
-	public static PessimisticLockManager getInstance() {
-		return INSTANCE;
+	@Autowired
+	private PessimisticLockManager(DB dbInstance) {
+		this.dbInstance = dbInstance;
 	}
 	
-	public void init() {
+	@Override
+	public void afterPropertiesSet() throws Exception {
 		// make sure that the resource (= row in our table) to lock the creation of new assets exists
 		PLock gLock = findPLock(ASSET_INSERT_LOCK);
 		if (gLock == null) {
@@ -74,32 +73,34 @@ public class PessimisticLockManager implements Initializable {
 			gLock = createPLock(ASSET_INSERT_LOCK);
 			savePLock(gLock);
 		}
-		DBFactory.getInstance().intermediateCommit();
+		dbInstance.intermediateCommit();
 		initDone = true;
 	}
 	
 	private PLock findPLock(String asset) {	
-		DBQuery q = DBFactory.getInstance().createQuery("select plock from org.olat.resource.lock.pessimistic.PLockImpl as plock where plock.asset = :asset");
-		q.setParameter("asset", asset);
-		q.setLockMode("plock", LockMode.PESSIMISTIC_WRITE);
-		
-		Map<String,Object> props = new HashMap<String, Object>();
-		props.put("javax.persistence.lock.timeout", new Integer(30000));
-		q.setProperties(props);
-		List res = q.list();
+		List<PLock> res = dbInstance.getCurrentEntityManager()
+				.createNamedQuery("loadByPLockByAsset", PLock.class)
+				.setParameter("asset", asset)
+				.setLockMode(LockModeType.PESSIMISTIC_WRITE)
+				.setHint("javax.persistence.lock.timeout", new Integer(30000))
+				.getResultList();
+
 		if (res.size() == 0) {
 			return null; 
 		} else {
-			return (PLock) res.get(0);
+			return res.get(0);
 		}
 	}
 	
 	private PLock createPLock(String asset) {
-		return new PLockImpl(asset);
+		PLockImpl lock = new PLockImpl();
+		lock.setAsset(asset);
+		lock.setCreationDate(new Date());
+		return lock;
 	}
 	
 	private void savePLock(PLock plock) {
-		DBFactory.getInstance().saveObject(plock);
+		dbInstance.saveObject(plock);
 	}
 	
 	/**
diff --git a/src/main/java/org/olat/core/gui/components/table/DefaultXlsTableExporter.java b/src/main/java/org/olat/core/gui/components/table/DefaultXlsTableExporter.java
index dca25e41bb303fb8e3b8a0a6e2b2f08707477ceb..39cd23d17bd475ace33ea36cfad1936c43fb3308 100644
--- a/src/main/java/org/olat/core/gui/components/table/DefaultXlsTableExporter.java
+++ b/src/main/java/org/olat/core/gui/components/table/DefaultXlsTableExporter.java
@@ -43,6 +43,7 @@ import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.CodeHelper;
+import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.WebappHelper;
 import org.olat.core.util.filter.FilterFactory;
@@ -114,6 +115,9 @@ public class DefaultXlsTableExporter implements TableExporter {
 				cellValue = FilterFactory.getHtmlTagsFilter().filter(cellValue);
 				if(StringHelper.containsNonWhitespace(cellValue)) {
 					cellValue = StringEscapeUtils.unescapeHtml(cellValue);
+					if(cellValue.length() >= 32767) {
+						cellValue = Formatter.truncate(cellValue, 32760);
+					}
 				}
 				Cell cell = dataRow.createCell(c);
 				cell.setCellValue(cellValue);
diff --git a/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java b/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java
index 1fe3a82f29e6669d7ed92f68633a59349a0de190..3b5695aedf44c629b8ad6fabc42f2b333b797928 100644
--- a/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java
+++ b/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java
@@ -833,7 +833,7 @@ public class UserActivityLoggerImpl implements IUserActivityLogger {
 		logObj.setUserProperties(tmpUserProperties);
 		
 		// and store it
-		DB db = DBFactory.getInstanceForClosing();
+		DB db = DBFactory.getInstance();
 		if (db!=null && db.isError()) {
 			// then we would run into an ERROR when we'd do more with this DB
 			// hence we just issue a log.info here with the details
diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java
index b093e15444435507648cd695e5d5d281e434bac5..f5d967e4756c53d182775e42b4f55f1654152295 100644
--- a/src/main/java/org/olat/course/CourseFactory.java
+++ b/src/main/java/org/olat/course/CourseFactory.java
@@ -442,7 +442,7 @@ public class CourseFactory extends BasicManager {
 		File fTargetCourseBasePath = targetCourse.getCourseBaseContainer().getBasefile();
 		
 		//close connection before file copy
-		DBFactory.getInstance(false).commitAndCloseSession();
+		DBFactory.getInstance().commitAndCloseSession();
 		
 		synchronized (sourceCourse) { // o_clusterNOK - cannot be solved with doInSync since could take too long (leads to error: "Lock wait timeout exceeded")
 			// copy configuration
@@ -474,7 +474,7 @@ public class CourseFactory extends BasicManager {
 			for (Reference ref: refs) {
 				referenceManager.addReference(targetCourse, ref.getTarget(), ref.getUserdata());
 				if(count % 20 == 0) {
-					DBFactory.getInstance(false).intermediateCommit();
+					DBFactory.getInstance().intermediateCommit();
 				}
 			}
 			
@@ -723,7 +723,7 @@ public class CourseFactory extends BasicManager {
 		// cause db connection timeout to be triggered
 		//@TODO transactions/backgroundjob:
 		// rework when backgroundjob infrastructure exists
-		DBFactory.getInstance(false).intermediateCommit();
+		DBFactory.getInstance().intermediateCommit();
 		AsyncExportManager.getInstance().asyncArchiveCourseLogFiles(archiveOnBehalfOf, new Runnable() {
 			public void run() {
 				// that's fine, I dont need to do anything here
diff --git a/src/main/java/org/olat/course/CourseModule.java b/src/main/java/org/olat/course/CourseModule.java
index 655082193e5a44683db7651374c1253f865a3807..1bcb4acee2c6dae66fdd41c746f4cc45cadb6625 100644
--- a/src/main/java/org/olat/course/CourseModule.java
+++ b/src/main/java/org/olat/course/CourseModule.java
@@ -109,7 +109,7 @@ public class CourseModule extends AbstractOLATModule {
 			deployCoursesFromCourseExportFiles();
 		}
 		//also in startup event processing intermediateCommit
-		DBFactory.getInstance(false).intermediateCommit();
+		DBFactory.getInstance().intermediateCommit();
 	}
 
 	
@@ -140,14 +140,7 @@ public class CourseModule extends AbstractOLATModule {
 	 */
 	@Override
 	public void init() {
-		// skip all the expensive course demo setup and deployment when we are in junit mode.
-		if (Settings.isJUnitTest()) return;
-		
-		logInfo("Initializing the OpenOLAT course system");		
-		
-		// Cleanup, otherwise this subjects will have problems in normal OLAT
-		// operation
-		DBFactory.getInstance(false).intermediateCommit();		
+		//
 	}
 
 	private void deployCoursesFromCourseExportFiles( ) {
diff --git a/src/main/java/org/olat/course/assessment/AssessmentMainController.java b/src/main/java/org/olat/course/assessment/AssessmentMainController.java
index 5a9117b593b31e5038f39245cf90ccf9bcd26e07..e7c5652f42bc64eed3da62272fa750e03c7a78f6 100644
--- a/src/main/java/org/olat/course/assessment/AssessmentMainController.java
+++ b/src/main/java/org/olat/course/assessment/AssessmentMainController.java
@@ -1414,11 +1414,11 @@ public class AssessmentMainController extends MainLayoutBasicController implemen
 							+ "ms");
 				}
 				// finished in this thread, close database session of this thread!
-				DBFactory.getInstance(false).commitAndCloseSession();
+				DBFactory.getInstance().commitAndCloseSession();
 				success = true;
 			} finally {
 				if (!success) {
-					DBFactory.getInstance(false).rollbackAndCloseSession();
+					DBFactory.getInstance().rollbackAndCloseSession();
 				}
 			}
 		}
diff --git a/src/main/java/org/olat/course/assessment/manager/UpdateEfficiencyStatementsWorker.java b/src/main/java/org/olat/course/assessment/manager/UpdateEfficiencyStatementsWorker.java
index 14587334c1fea6deda5557c4a24b823f255fb554..eb043f38c2f00d99c80ce3ec6877f4bc7c2f7342 100644
--- a/src/main/java/org/olat/course/assessment/manager/UpdateEfficiencyStatementsWorker.java
+++ b/src/main/java/org/olat/course/assessment/manager/UpdateEfficiencyStatementsWorker.java
@@ -68,7 +68,7 @@ public class UpdateEfficiencyStatementsWorker implements Runnable {
 			List<Identity> identities = esm.findIdentitiesWithEfficiencyStatements(re.getKey());
 			esm.updateEfficiencyStatements(ores, identities);
 			// close db session in this thread
-			DBFactory.getInstance(false).commitAndCloseSession();
+			DBFactory.getInstance().commitAndCloseSession();
 			success = true;
 			
 			EfficiencyStatementEvent finishedEvent = new EfficiencyStatementEvent(EfficiencyStatementEvent.CMD_FINISHED, ores.getResourceableId());
@@ -78,7 +78,7 @@ public class UpdateEfficiencyStatementsWorker implements Runnable {
 		} finally {
 			// close db session in this thread
 			if (!success) {
-				DBFactory.getInstance(false).rollbackAndCloseSession();
+				DBFactory.getInstance().rollbackAndCloseSession();
 			}
 		}
 	}
diff --git a/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java b/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java
index 35505c5ef28e8846ea6e142262b32e6674b355e9..efab2721dca25f101c6182def77aae166444dc73 100644
--- a/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java
+++ b/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java
@@ -28,8 +28,6 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 
 import org.olat.core.id.Identity;
-import org.olat.core.id.OLATResourceable;
-import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.properties.CoursePropertyManager;
@@ -53,10 +51,10 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager {
 	protected static final String LOG_PREFIX_REMOVED_OLD_LOG_ENTRIES = "Removed old log entires because of limited log size\n";
 	private static final SimpleDateFormat sdb = new SimpleDateFormat("yyyy-MM-dd HH:mm");
 	
-	private final OLATResourceable ores;
+	private final CoursePropertyManager cpm;
 
 	public UserNodeAuditManagerImpl(ICourse course) {
-		ores = course;
+		cpm = course.getCourseEnvironment().getCoursePropertyManager();
 	}
 	
 	/**
@@ -66,9 +64,6 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager {
 	 */
 	@Override
 	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, Identity assessedIdentity, String logText) {
-		ICourse course = CourseFactory.loadCourse(ores);
-		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
-
 		String text = formatMessage(identity, logText) ;
 		
 		Property logProperty = cpm.findCourseNodeProperty(courseNode, assessedIdentity, null, LOG_IDENTIFYER);
@@ -85,9 +80,6 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager {
 		
 	@Override
 	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, BusinessGroup assessedGroup, String logText) {
-		ICourse course = CourseFactory.loadCourse(ores);
-		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
-
 		String text = formatMessage(identity, logText) ;
 		
 		Property logProperty = cpm.findCourseNodeProperty(courseNode, null, assessedGroup, LOG_IDENTIFYER);
@@ -135,8 +127,6 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager {
 	 */
 	@Override
 	public boolean hasUserNodeLogs(CourseNode node) {
-		ICourse course = CourseFactory.loadCourse(ores);
-		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 		int numOfProperties = cpm.countCourseNodeProperties(node, null, null, LOG_IDENTIFYER);
 		return numOfProperties > 0;
 	}
@@ -147,16 +137,12 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager {
 	 */
 	@Override
 	public String getUserNodeLog(CourseNode courseNode, Identity identity) {
-		ICourse course = CourseFactory.loadCourse(ores);
-		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 		Property property = cpm.findCourseNodeProperty(courseNode, identity, null, LOG_IDENTIFYER);
 		return property == null ? null : property.getTextValue();
 	}
 
 	@Override
 	public String getUserNodeLog(CourseNode courseNode, BusinessGroup businessGroup) {
-		ICourse course = CourseFactory.loadCourse(ores);
-		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 		Property property = cpm.findCourseNodeProperty(courseNode, businessGroup, LOG_IDENTIFYER);
 		return property == null ? null : property.getTextValue();
 	}
diff --git a/src/main/java/org/olat/course/config/CourseConfig.java b/src/main/java/org/olat/course/config/CourseConfig.java
index 5e95df63c05f791604be4029aa2327b8e328e78f..02d9688c3978f1f02e23fb8ef7dd292bc52090d6 100644
--- a/src/main/java/org/olat/course/config/CourseConfig.java
+++ b/src/main/java/org/olat/course/config/CourseConfig.java
@@ -72,7 +72,7 @@ public class CourseConfig implements Serializable, Cloneable {
 	/**
 	 * current config file version
 	 */
-	transient private final static int CURRENTVERSION = 9;
+	transient private final static int CURRENTVERSION = 10;
 	/**
 	 * Log levels
 	 */
@@ -238,7 +238,7 @@ public class CourseConfig implements Serializable, Cloneable {
 				if (!configuration.containsKey(CERTIFICATE_MANUAL_ENABLED)) configuration.put(CERTIFICATE_MANUAL_ENABLED, Boolean.FALSE);
 				if (!configuration.containsKey(CERTIFICATE_TEMPLATE)) configuration.put(CERTIFICATE_TEMPLATE, "");
 				if (!configuration.containsKey(RECERTIFICATION_ENABLED)) configuration.put(RECERTIFICATION_ENABLED, Boolean.FALSE);
-				if (!configuration.containsKey(RECERTIFICATION_TIMELAPSE)) configuration.put(RECERTIFICATION_TIMELAPSE, "");
+				if (!configuration.containsKey(RECERTIFICATION_TIMELAPSE)) configuration.put(RECERTIFICATION_TIMELAPSE, new Integer(0));
 				this.version = 10;
 			}
 
@@ -426,30 +426,6 @@ public class CourseConfig implements Serializable, Cloneable {
 	public void setManualCertificationEnabled(boolean enabled) {
 		configuration.put(CERTIFICATE_MANUAL_ENABLED, new Boolean(enabled));
 	}
-	
-	
-	
-	/*
-	public PDFCertificatesOptions getPdfCertificateOption2() {
-		PDFCertificatesOptions option;
-		String opt = (String)configuration.get(CERTIFICATE_ENABLED);
-		if(StringHelper.containsNonWhitespace(opt)) {
-			try {
-				option = PDFCertificatesOptions.valueOf(opt);
-			} catch (Exception e) {
-				log.error("", e);
-				option = PDFCertificatesOptions.none;
-			}
-		} else {
-			option = PDFCertificatesOptions.none;
-		}
-
-		return option;
-	}
-	
-	public void setPdfCertificateOption(PDFCertificatesOptions option) {
-		configuration.put(PDF_CERTIFICATE_ENABLED, option.name());
-	}*/
 
 	/**
 	 * @return true if the efficency statement is enabled
@@ -467,8 +443,11 @@ public class CourseConfig implements Serializable, Cloneable {
 	}
 	
 	public int getRecertificationTimelapse() {
-		Integer timelapse = (Integer)configuration.get(RECERTIFICATION_TIMELAPSE);
-		return timelapse == null ? 0 : timelapse.intValue();
+		Object timelapse = configuration.get(RECERTIFICATION_TIMELAPSE);
+		if(timelapse instanceof Integer) {
+			return ((Integer)timelapse).intValue();
+		}
+		return 0;
 	}
 	
 	public void setRecertificationTimelapse(int timelapse) {
diff --git a/src/main/java/org/olat/course/member/MemberListController.java b/src/main/java/org/olat/course/member/MemberListController.java
index 7226d139f1bafec31965f802326402eff2782e1f..c8ab5bc8febad658138f0d154ad0b36d11a4740f 100644
--- a/src/main/java/org/olat/course/member/MemberListController.java
+++ b/src/main/java/org/olat/course/member/MemberListController.java
@@ -57,7 +57,7 @@ public class MemberListController extends AbstractMemberListController {
 		removeAsListenerAndDispose(identityAssessmentController);
 		
 		Identity assessedIdentity = securityManager.loadIdentityByKey(member.getIdentityKey());
-		ICourse course = CourseFactory.loadCourse(repoEntry.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(repoEntry);
 		
 		identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(),ureq, toolbarPanel,
 				assessedIdentity, course, true, false, true);
diff --git a/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java b/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java
index 092fd7925b35389eb1b06ff90700bc91e7154fb8..4a3f52ec856fcbca49b9fca2d0232ae8217736cf 100644
--- a/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java
+++ b/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java
@@ -98,7 +98,7 @@ public class MemberListWithOriginFilterController extends AbstractMemberListCont
 		removeAsListenerAndDispose(identityAssessmentController);
 		
 		Identity assessedIdentity = securityManager.loadIdentityByKey(member.getIdentityKey());
-		ICourse course = CourseFactory.loadCourse(repoEntry.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(repoEntry);
 		
 		identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(),ureq, toolbarPanel,
 				assessedIdentity, course, true, false, true);
diff --git a/src/main/java/org/olat/course/member/MemberSearchController.java b/src/main/java/org/olat/course/member/MemberSearchController.java
index 59308eb7c189363525ea459cc4b71af1c63060da..6efaf39a076d8c6e6f8165cabc7be1522c487158 100644
--- a/src/main/java/org/olat/course/member/MemberSearchController.java
+++ b/src/main/java/org/olat/course/member/MemberSearchController.java
@@ -83,7 +83,7 @@ public class MemberSearchController extends AbstractMemberListController {
 		removeAsListenerAndDispose(identityAssessmentController);
 		
 		Identity assessedIdentity = securityManager.loadIdentityByKey(member.getIdentityKey());
-		ICourse course = CourseFactory.loadCourse(repoEntry.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(repoEntry);
 		
 		identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(),ureq, toolbarPanel,
 				assessedIdentity, course, true, false, true);
diff --git a/src/main/java/org/olat/course/member/MembersManagementMainController.java b/src/main/java/org/olat/course/member/MembersManagementMainController.java
index 62022cae1b5b5d37cad4396db19e87e621c063ed..accd3453c73851780caa717f19fc7f1f0dfd6766 100644
--- a/src/main/java/org/olat/course/member/MembersManagementMainController.java
+++ b/src/main/java/org/olat/course/member/MembersManagementMainController.java
@@ -100,7 +100,7 @@ public class MembersManagementMainController extends MainLayoutBasicController
 
 		//logging
 		getUserActivityLogger().setStickyActionType(ActionType.admin);
-		ICourse course = CourseFactory.loadCourse(re.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(re);
 		addLoggingResourceable(LoggingResourceable.wrap(course));
 		
 		//ui stuff
diff --git a/src/main/java/org/olat/course/nodes/GTACourseNode.java b/src/main/java/org/olat/course/nodes/GTACourseNode.java
index 43669f423a5c1fb37d59c9adbdaf54a842bdbb52..9a3421889664b95fdf59dca975fe3378377b4d6e 100644
--- a/src/main/java/org/olat/course/nodes/GTACourseNode.java
+++ b/src/main/java/org/olat/course/nodes/GTACourseNode.java
@@ -88,7 +88,6 @@ import org.olat.group.BusinessGroup;
 import org.olat.modules.ModuleConfiguration;
 import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.repository.RepositoryEntry;
-import org.olat.resource.OLATResource;
 import org.olat.user.UserManager;
 
 /**
@@ -270,8 +269,8 @@ public class GTACourseNode extends AbstractAccessableCourseNode implements Asses
 		if(cev != null) {
 			//check assignment
 			GTAManager gtaManager = CoreSpringFactory.getImpl(GTAManager.class);
-			OLATResource courseOres = cev.getCourseGroupManager().getCourseResource();
-			ICourse course = CourseFactory.loadCourse(courseOres);
+			RepositoryEntry courseRe = cev.getCourseGroupManager().getCourseEntry();
+			ICourse course = CourseFactory.loadCourse(courseRe);
 			if(config.getBooleanSafe(GTACourseNode.GTASK_ASSIGNMENT)) {
 				File taskDirectory = gtaManager.getTasksDirectory(course.getCourseEnvironment(), this);
 				if(!TaskHelper.hasDocuments(taskDirectory)) {
diff --git a/src/main/java/org/olat/course/nodes/ViteroCourseNode.java b/src/main/java/org/olat/course/nodes/ViteroCourseNode.java
index 4ec6fab587b0224fadd4ed830e2a5b5ccf18ce05..ce6c7ef7634652a88165b60189bf78bf5b7f4648 100644
--- a/src/main/java/org/olat/course/nodes/ViteroCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ViteroCourseNode.java
@@ -110,7 +110,7 @@ public class ViteroCourseNode extends AbstractAccessableCourseNode {
 				if(roles.isInstitutionalResourceManager() | roles.isAuthor()) {
 					RepositoryManager rm = RepositoryManager.getInstance();
 					ICourse course = CourseFactory.loadCourse(key);
-					RepositoryEntry re = rm.lookupRepositoryEntry(course, false);
+					RepositoryEntry re = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 					if (re != null) {
 						moderator = rm.isOwnerOfRepositoryEntry(ureq.getIdentity(), re);
 						if(!moderator) {
diff --git a/src/main/java/org/olat/course/nodes/iq/IQRunController.java b/src/main/java/org/olat/course/nodes/iq/IQRunController.java
index da4f11928584c0bdac03abe64c3cd2ae599c3e7f..ddca53a0de8f382d9b4477642fd0cfdbadfa7855 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQRunController.java
@@ -91,7 +91,6 @@ import org.olat.modules.iq.IQManager;
 import org.olat.modules.iq.IQSecurityCallback;
 import org.olat.modules.iq.IQSubmittedEvent;
 import org.olat.repository.RepositoryEntry;
-import org.olat.repository.RepositoryManager;
 import org.olat.util.logging.activity.LoggingResourceable;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -412,11 +411,10 @@ public class IQRunController extends BasicController implements GenericEventList
 					displayContainerController = new LayoutMain3ColsController(ureq, getWindowControl(), displayController);
 					listenTo(displayContainerController); // autodispose
 
-					
 					//need to wrap a course restart controller again, because IQDisplay
 					//runs on top of GUIStack
 					ICourse course = CourseFactory.loadCourse(courseResId);
-					RepositoryEntry courseRepositoryEntry = RepositoryManager.getInstance().lookupRepositoryEntry(course, true);
+					RepositoryEntry courseRepositoryEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 					Panel empty = new Panel("empty");//empty panel set as "menu" and "tool"
 					Controller courseCloser = new DisposedCourseRestartController(ureq, getWindowControl(), courseRepositoryEntry);
 					Controller disposedRestartController = new LayoutMain3ColsController(ureq, getWindowControl(), empty, courseCloser.getInitialComponent(), "disposed course whily in iqRun" + courseResId);
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java
index dc5cc44a5dd97f8bd96c67352978a85a2eabe61a..537a69ce1ae257534c8868be20ff2e1953814bde 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java
@@ -41,6 +41,7 @@ import org.olat.core.util.coordinate.SyncerCallback;
 import org.olat.core.util.event.MultiUserEvent;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
+import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.ProjectBrokerCourseNode;
 import org.olat.course.nodes.projectbroker.datamodel.Project;
@@ -178,8 +179,9 @@ public class ProjectGroupManagerImpl extends BasicManager implements ProjectGrou
 	// PROJECT GROUP MANAGEMENT
 	////////////////////////////
 	public BusinessGroup createProjectGroupFor(Long projectBrokerId, Identity identity, String groupName, String groupDescription, Long courseId) {
-		OLATResource resource = CourseFactory.loadCourse(courseId).getCourseEnvironment().getCourseGroupManager().getCourseResource();
-		RepositoryEntry re = repositoryManager.lookupRepositoryEntry(resource, false);
+		CourseGroupManager cgm = CourseFactory.loadCourse(courseId).getCourseEnvironment().getCourseGroupManager();
+		OLATResource resource = cgm.getCourseResource();
+		RepositoryEntry re = cgm.getCourseEntry();
 
 		logDebug("createProjectGroupFor groupName=" + groupName);
 		BusinessGroup projectGroup = businessGroupService.createBusinessGroup(identity, groupName, groupDescription, -1, -1, false, false, re);
@@ -283,7 +285,7 @@ public class ProjectGroupManagerImpl extends BasicManager implements ProjectGrou
 	@Override
 	public void sendGroupChangeEvent(Project project, Long courseResourceableId, Identity identity) {
 		ICourse course = CourseFactory.loadCourse(courseResourceableId);
-		RepositoryEntry ores = repositoryManager.lookupRepositoryEntry(course, true);
+		RepositoryEntry ores = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		MultiUserEvent modifiedEvent = new BusinessGroupModifiedEvent(BusinessGroupModifiedEvent.IDENTITY_ADDED_EVENT, project.getProjectGroup(), identity);
 		CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(modifiedEvent, ores);
 	}
diff --git a/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java b/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java
index 8ff2a49428423295c807e188dfe6792152806900..08f9f11930e54f18b26b38eac23e1d766010d14d 100644
--- a/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java
+++ b/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java
@@ -35,7 +35,6 @@ import org.olat.core.CoreSpringFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.AssertException;
-import org.olat.core.manager.BasicManager;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.nodes.CourseNode;
@@ -56,7 +55,7 @@ import org.olat.resource.OLATResourceManager;
  *         manager), only view controllers use the course property manager
  *         directly.
  */
-public class PersistingCoursePropertyManager extends BasicManager implements CoursePropertyManager {
+public class PersistingCoursePropertyManager implements CoursePropertyManager {
 
 	private NarrowedPropertyManager pm;
 	private Map<String,String> anonymizerMap;
diff --git a/src/main/java/org/olat/course/reminder/rule/InitialAttemptsRuleSPI.java b/src/main/java/org/olat/course/reminder/rule/InitialAttemptsRuleSPI.java
index 2fee1ec95040a5738ac5525ec8a08989dea42dab..54dd22bf9409ca37a6e8f303c807dfdc1b74197a 100644
--- a/src/main/java/org/olat/course/reminder/rule/InitialAttemptsRuleSPI.java
+++ b/src/main/java/org/olat/course/reminder/rule/InitialAttemptsRuleSPI.java
@@ -76,8 +76,7 @@ public class InitialAttemptsRuleSPI extends AbstractLaunchDateRuleSPI {
 			ReminderRuleImpl r = (ReminderRuleImpl)rule;
 			String nodeIdent = r.getLeftOperand();
 
-			Long courseResourceId = entry.getOlatResource().getResourceableId();
-			ICourse course = CourseFactory.loadCourse(courseResourceId);
+			ICourse course = CourseFactory.loadCourse(entry);
 			CourseNode courseNode = course.getRunStructure().getNode(nodeIdent);
 
 			return helperDao.getInitialAttemptDates(entry, courseNode, identities);
diff --git a/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java b/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java
index 20363103622faf520423e21ac146cb2190b8f197..15c0a4820a7e597f0b3094c8dac9cefa6002622d 100644
--- a/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java
+++ b/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java
@@ -77,7 +77,7 @@ public class PassedRuleSPI implements FilterRuleSPI {
 			String nodeIdent = r.getLeftOperand();
 			String status = r.getRightOperand();
 			
-			ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+			ICourse course = CourseFactory.loadCourse(entry);
 			CourseNode courseNode = course.getRunStructure().getNode(nodeIdent);
 			
 			Map<Long, Boolean> passeds = helperDao.getPassed(entry, courseNode, identities);
diff --git a/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java b/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java
index 4280160e7888004193e078993d8c14b98bdf1093..215212333342b13f232b0a8c9092483df718c13f 100644
--- a/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java
+++ b/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java
@@ -80,7 +80,7 @@ public class ScoreRuleSPI implements FilterRuleSPI {
 			String operator = r.getOperator();
 			float value = Float.parseFloat(r.getRightOperand());
 			
-			ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+			ICourse course = CourseFactory.loadCourse(entry);
 			CourseNode courseNode = course.getRunStructure().getNode(nodeIdent);
 			
 			Map<Long, Float> scores = helperDao.getScores(entry, courseNode, identities);
diff --git a/src/main/java/org/olat/course/reminder/ui/InitialAttemptsRuleEditor.java b/src/main/java/org/olat/course/reminder/ui/InitialAttemptsRuleEditor.java
index 5cd929f46eb45b5cc1b2f37ea59f283600b64c08..42078729ee6b831bbb2b8558ab1030c2789c33a0 100644
--- a/src/main/java/org/olat/course/reminder/ui/InitialAttemptsRuleEditor.java
+++ b/src/main/java/org/olat/course/reminder/ui/InitialAttemptsRuleEditor.java
@@ -80,7 +80,7 @@ public class InitialAttemptsRuleEditor extends RuleEditorFragment {
 		formLayout.add(ruleCont);
 		ruleCont.getFormItemComponent().contextPut("id", id);
 		
-		ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(entry);
 		
 		
 		String currentValue = null;
diff --git a/src/main/java/org/olat/course/reminder/ui/PassedRuleEditor.java b/src/main/java/org/olat/course/reminder/ui/PassedRuleEditor.java
index 8a06ddfda35d23bbb472d7059a545fcb32bf2d53..5d2a5c35ab326fd24942ee29ffe76493e3f2c37d 100644
--- a/src/main/java/org/olat/course/reminder/ui/PassedRuleEditor.java
+++ b/src/main/java/org/olat/course/reminder/ui/PassedRuleEditor.java
@@ -74,7 +74,7 @@ public class PassedRuleEditor extends RuleEditorFragment {
 		formLayout.add(ruleCont);
 		ruleCont.getFormItemComponent().contextPut("id", id);
 		
-		ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(entry);
 
 		String currentStatus = null;
 		String currentCourseNode = null;
diff --git a/src/main/java/org/olat/course/reminder/ui/ScoreRuleEditor.java b/src/main/java/org/olat/course/reminder/ui/ScoreRuleEditor.java
index 54b1c2b1afd1a6d8c31e68b354df7a8a38aff59c..28cd57593555182816b73a7676be5bb76fbebc0c 100644
--- a/src/main/java/org/olat/course/reminder/ui/ScoreRuleEditor.java
+++ b/src/main/java/org/olat/course/reminder/ui/ScoreRuleEditor.java
@@ -74,7 +74,7 @@ public class ScoreRuleEditor extends RuleEditorFragment {
 		formLayout.add(ruleCont);
 		ruleCont.getFormItemComponent().contextPut("id", id);
 		
-		ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(entry);
 		
 		
 		String currentValue = null;
diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java
index 3e62b03235e00d6a8b60fca310b292c840f89a55..e85e146edc7dd54c9dd642fac20fc57d01875df6 100644
--- a/src/main/java/org/olat/course/run/CourseRuntimeController.java
+++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java
@@ -202,7 +202,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		super(ureq, wControl, re, reSecurity, runtimeControllerCreator, offerBookmark, showCourseConfigLink);
 		
 		if(!corrupted) {
-			ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+			ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 			addLoggingResourceable(LoggingResourceable.wrap(course));
 
 			coordinatorManager.getCoordinator().getEventBus().registerFor(this, getIdentity(), getOlatResourceable());
@@ -238,7 +238,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		super.loadRights(security);
 		if(corrupted) return;
 		
-		ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+		ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 		CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
 		// 3) all other rights are defined in the groupmanagement using the learning
 		// group rights
@@ -320,7 +320,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 	}
 	
 	private void addCustomCSS(UserRequest ureq) {
-		ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+		ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 		CustomCSS customCSS = CourseFactory.getCustomCourseCss(ureq.getUserSession(), course.getCourseEnvironment());
 		ChiefController cc = getWindowControl().getWindowBackOffice().getChiefController();
 		if (cc != null) {
@@ -1073,7 +1073,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		if(delayedClose == Delayed.options || requestForClose(ureq)) {
 			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_COURSEEDITOR)) {
 				removeCustomCSS();
-				ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+				ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 				CourseConfig courseConfig = course.getCourseEnvironment().getCourseConfig().clone();
 				CourseOptionsController ctrl = new CourseOptionsController(ureq, getWindowControl(), getRepositoryEntry(), courseConfig, true);
 				optionsToolCtr = pushController(ureq, translate("command.options"), ctrl);
@@ -1104,7 +1104,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		if(delayedClose == Delayed.certificates || requestForClose(ureq)) {
 			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_COURSEEDITOR)) {
 				removeCustomCSS();
-				ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+				ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 				CourseConfig courseConfig = course.getCourseEnvironment().getCourseConfig().clone();
 				WindowControl bwControl = getSubWindowControl("CertificationSettings");
 				CertificatesOptionsController ctrl = new CertificatesOptionsController(ureq, addToHistory(ureq, bwControl),
@@ -1137,7 +1137,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		if(delayedClose == Delayed.archive || requestForClose(ureq)) {
 			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_ARCHIVING)) {
 				removeCustomCSS();
-				ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+				ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 				ArchiverMainController ctrl = new ArchiverMainController(ureq, getWindowControl(), course, new FullAccessArchiverCallback());
 				listenTo(ctrl);
 				archiverCtrl = pushController(ureq, translate("command.openarchiver"), ctrl);
@@ -1153,7 +1153,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		if(delayedClose == Delayed.courseFolder || requestForClose(ureq)) {
 			removeCustomCSS();
 			// Folder for course with custom link model to jump to course nodes
-			ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+			ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 			VFSContainer namedCourseFolder = new NamedContainerImpl(translate("command.coursefolder"), course.getCourseFolderContainer());
 			CustomLinkTreeModel customLinkTreeModel = new CourseInternalLinkTreeModel(course.getEditorTreeModel());
 
@@ -1171,7 +1171,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 	private void doCourseAreas(UserRequest ureq) {
 		if(delayedClose == Delayed.courseAreas || requestForClose(ureq)) {
 			removeCustomCSS();
-			ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+			ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 			CourseAreasController ctrl = new CourseAreasController(ureq, getWindowControl(), getRepositoryEntry().getOlatResource());
 			ctrl.addLoggingResourceable(LoggingResourceable.wrap(course));
 			areasCtrl = pushController(ureq, translate("command.courseareas"), ctrl);
@@ -1186,7 +1186,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		if(delayedClose == Delayed.databases || requestForClose(ureq)) {
 			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_DB)) {
 				removeCustomCSS();
-				ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+				ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 				CustomDBMainController ctrl = new CustomDBMainController(ureq, getWindowControl(), course);
 				listenTo(ctrl);
 				databasesCtrl = pushController(ureq, translate("command.opendb"), ctrl);
@@ -1202,7 +1202,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		if(delayedClose == Delayed.courseStatistics || requestForClose(ureq)) {
 			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_STATISTICS)) {
 				removeCustomCSS();
-				ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+				ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 				StatisticMainController ctrl = new StatisticMainController(ureq, getWindowControl(), course);
 				listenTo(ctrl);
 				statisticsCtrl = pushController(ureq, translate("command.openstatistic"), ctrl);
@@ -1457,7 +1457,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 	
 	private void launchGlossary(UserRequest ureq) {
 		// start glossary in window
-		ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+		ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 		final CourseConfig cc = course.getCourseConfig(); // do not cache cc, not save
 		final boolean allowGlossaryEditing = reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_GLOSSARY);
 		
@@ -1500,7 +1500,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		switch(event.getType()) {
 			case calendar: {
 				if(calendarLink != null) {
-					ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+					ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 					CourseConfig cc = course.getCourseEnvironment().getCourseConfig();
 					calendarLink.setVisible(cc.isCalendarEnabled() && calendarModule.isEnabled() && calendarModule.isEnableCourseToolCalendar());
 					toolbarPanel.setDirty(true);
@@ -1509,7 +1509,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			}
 			case chat: {
 				if(chatLink != null) {
-					ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+					ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 					CourseConfig cc = course.getCourseEnvironment().getCourseConfig();
 					chatLink.setVisible(cc.isChatEnabled());
 					toolbarPanel.setDirty(true);
@@ -1518,7 +1518,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			}
 			case efficiencyStatement: {
 				if(efficiencyStatementsLink != null) {
-					ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+					ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 					CourseConfig cc = course.getCourseEnvironment().getCourseConfig();
 					efficiencyStatementsLink.setVisible(cc.isEfficencyStatementEnabled() || cc.isCertificateEnabled());
 					if(cc.isEfficencyStatementEnabled() || cc.isCertificateEnabled()) {
@@ -1532,7 +1532,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			}
 			case glossary: {
 				if(glossary != null) {
-					ICourse course = CourseFactory.loadCourse(getOlatResourceable());
+					ICourse course = CourseFactory.loadCourse(getRepositoryEntry());
 					CourseConfig cc = course.getCourseEnvironment().getCourseConfig();
 					glossary.setVisible(cc.hasGlossary());
 					toolbarPanel.setDirty(true);
diff --git a/src/main/java/org/olat/course/site/CourseSite.java b/src/main/java/org/olat/course/site/CourseSite.java
index e434476e30a5ea6a1f8bed000bb712854ba3e61f..1b6607e4f7774bd80af5b149fe66232c7c592091 100644
--- a/src/main/java/org/olat/course/site/CourseSite.java
+++ b/src/main/java/org/olat/course/site/CourseSite.java
@@ -105,7 +105,7 @@ public class CourseSite extends AbstractSiteInstance {
 		}
 
 		MainLayoutController c;
-		ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(entry);
 
 		// course-launch-state depending course-settings
 		RepositoryEntrySecurity reSecurity = rm.isAllowed(ureq, entry);
@@ -138,7 +138,7 @@ public class CourseSite extends AbstractSiteInstance {
 					public Controller create(UserRequest uureq, WindowControl wwControl,
 							TooledStackedPanel toolbarPanel, RepositoryEntry re, RepositoryEntrySecurity security, AssessmentMode assessmentMode) {
 						return new RunMainController(uureq, wwControl, toolbarPanel,
-								CourseFactory.loadCourse(re.getOlatResource()), re, security, assessmentMode);
+								CourseFactory.loadCourse(re), re, security, assessmentMode);
 					}
 				}, false, true);
 			
diff --git a/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java b/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java
index 4e65699e293c03c6c1416052f7bf4afc6afe5350..5df55094855752809baf9fc3ff590a5f37bf7469 100644
--- a/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java
+++ b/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java
@@ -94,7 +94,7 @@ public class EfficiencyStatementDetailsController extends BasicController implem
 			mainVC.put("segmentCmp", statementCtrl.getInitialComponent());
 		} else {
 			try {
-				ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+				ICourse course = CourseFactory.loadCourse(entry);
 				assessmentCtrl = new IdentityAssessmentEditController(wControl, ureq, null,
 						assessedIdentity, course, true, false, false);
 				listenTo(assessmentCtrl);
diff --git a/src/main/java/org/olat/modules/dialog/DialogElement.java b/src/main/java/org/olat/modules/dialog/DialogElement.java
index 53a053d9c83103c8b8ee3fa855c0b36e12e91098..96fe65da58913977df379fd1d72d77d60db1a114 100644
--- a/src/main/java/org/olat/modules/dialog/DialogElement.java
+++ b/src/main/java/org/olat/modules/dialog/DialogElement.java
@@ -78,10 +78,10 @@ public class DialogElement {
 		} catch (NumberFormatException nEx) {
 			return author;
 		} catch (ObjectNotFoundException oEx) {
-			DBFactory.getInstanceForClosing().rollbackAndCloseSession();
+			DBFactory.getInstance().rollbackAndCloseSession();
 			return author;
 		} catch (Throwable th) {
-			DBFactory.getInstanceForClosing().rollbackAndCloseSession();
+			DBFactory.getInstance().rollbackAndCloseSession();
 			return author;
 		}
 	}
diff --git a/src/main/java/org/olat/resource/_spring/resourceContext.xml b/src/main/java/org/olat/resource/_spring/resourceContext.xml
index 6cd7b00c74c10c9b1f53436001eb66bbeee46276..e3fbc29a4aa89a1f01ee68f99802b51f7bdc869d 100644
--- a/src/main/java/org/olat/resource/_spring/resourceContext.xml
+++ b/src/main/java/org/olat/resource/_spring/resourceContext.xml
@@ -16,6 +16,5 @@
 
 	<import resource="classpath:/org/olat/resource/accesscontrol/_spring/acContext.xml"/>
 	<import resource="classpath:/org/olat/resource/accesscontrol/provider/paypal/_spring/paypalContext.xml"/>
-	<import resource="classpath:/org/olat/resource/lock/pessimistic/_spring/lockContext.xml"/>
 
 </beans>
\ No newline at end of file
diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/paypal/PaypalIPNFilter.java b/src/main/java/org/olat/resource/accesscontrol/provider/paypal/PaypalIPNFilter.java
index 4b1b0700c5e50f1efb34dd1cb9a68072c3575700..1d2bbc241c9eec64423fe295f5afac3337f74f6c 100644
--- a/src/main/java/org/olat/resource/accesscontrol/provider/paypal/PaypalIPNFilter.java
+++ b/src/main/java/org/olat/resource/accesscontrol/provider/paypal/PaypalIPNFilter.java
@@ -75,7 +75,7 @@ public class PaypalIPNFilter implements Filter {
 			//we must log all errors, it's critical for this part of the payment
 			log.error("Paypal IPN unexpected error", t);
 		} finally {
-			DBFactory.getInstanceForClosing().closeSession();
+			DBFactory.getInstance().closeSession();
 		}
 	}
 
diff --git a/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.hbm.xml b/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.hbm.xml
deleted file mode 100644
index 4112c57cc87ccae9a78d9bbc4187011b9b705329..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.hbm.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
-	"-//Hibernate/Hibernate Mapping DTD//EN"
-	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
-<hibernate-mapping default-lazy="false">
-  <class name="org.olat.resource.lock.pessimistic.PLockImpl" table="o_plock">
-
-	<id name="key" type="long" column="plock_id" unsaved-value="null">
-		<generator class="hilo"/>
-	</id>
-
-	<version name="version" access="field" column="version" type="int"/>
-  	<property  name="creationDate" column="creationdate" type="timestamp" />   
- 	
-	<property name="asset" type="string" >
-		<column name="asset" not-null="true" length="255" unique="true" index="asset_idx"/>
-	</property>    	
-
-  </class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.java b/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.java
deleted file mode 100644
index 28c91aaad7f2e75001a90f2f7bd5c9569afae7b5..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/resource/lock/pessimistic/PLockImpl.java
+++ /dev/null
@@ -1,64 +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.
-*/
-
-package org.olat.resource.lock.pessimistic;
-
-import org.olat.core.commons.persistence.PersistentObject;
-
-/**
- * A <b>OLATResourceImpl</b> is 
- * 
- * @author Andreas
- *
- */
-public class PLockImpl extends PersistentObject implements PLock {
-
-	private String asset;
-	
-	/**
-	* Constructor needed for Hibernate.
-	*/
-	PLockImpl() {
-		// singleton
-	}
-
-	PLockImpl(String asset) {
-		this.asset = asset;
-	}
-
-
-	public String getAsset() {
-		return asset;
-	}
-
-	/**
-	 * [for hibernate]
-	 * @param asset
-	 */
-	void setAsset(String asset) {
-		this.asset = asset;
-	}
-
-}
diff --git a/src/main/java/org/olat/resource/lock/pessimistic/_spring/lockContext.xml b/src/main/java/org/olat/resource/lock/pessimistic/_spring/lockContext.xml
deleted file mode 100644
index a9cd7230571a222031db6ba6122a7a5d0f37a41b..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/resource/lock/pessimistic/_spring/lockContext.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="
-  http://www.springframework.org/schema/beans 
-  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
-
-<bean id="lockManager" class="org.olat.resource.lock.pessimistic.PessimisticLockManager" init-method="init" depends-on="database"/>
-
-</beans>
diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java
index bf636c6502bad8f008d427063fbfa444db9b49b1..63dac84fddfa2ae08871270c1e488cc0aa7d3900 100644
--- a/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java
@@ -207,7 +207,7 @@ public class CoursesInfosWebService {
 		AccessResult result = acManager.isAccessible(entry, identity, false);
 		if(result.isAccessible()) {
 			try {
-				final ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+				final ICourse course = CourseFactory.loadCourse(entry);
 				final List<FolderVO> folders = new ArrayList<FolderVO>();
 				final List<ForumVO> forums = new ArrayList<ForumVO>();
 				final IdentityEnvironment ienv = new IdentityEnvironment(identity, roles);
diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
index 6e546dd560e9df98839fd044337ec1ee839e47dd..edb1e5b4c55dfb92d65510d06df4765ac4ebc5a8 100644
--- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
@@ -376,7 +376,7 @@ public class CoursesWebService {
 		
 		//publish
 		log.info("REST Publish course " + displayName + " START");
-		ICourse course = CourseFactory.loadCourse(re.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(re);
 		CourseFactory.publishCourse(course, RepositoryEntry.ACC_USERS, false,  identity, ureq.getLocale());
 		log.info("REST Publish course " + displayName + " END");
 		return course;
diff --git a/src/main/java/org/olat/search/service/indexer/group/GroupIndexer.java b/src/main/java/org/olat/search/service/indexer/group/GroupIndexer.java
index efe7ba3203e3b1c1d8861bded9f22448793fb695..752bdedd116c4df4d5eaa77fb93dc2c28e772dce 100644
--- a/src/main/java/org/olat/search/service/indexer/group/GroupIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/group/GroupIndexer.java
@@ -89,10 +89,10 @@ public class GroupIndexer extends AbstractHierarchicalIndexer {
 			  super.doIndex(searchResourceContext, businessGroup, indexWriter);
 			} catch(Exception ex) {
 				logError("Exception indexing group=" + businessGroup, ex);
-				DBFactory.getInstance(false).rollbackAndCloseSession();
+				DBFactory.getInstance().rollbackAndCloseSession();
 			} catch (Error err) {
 				logError("Error indexing group=" + businessGroup, err);
-				DBFactory.getInstance(false).rollbackAndCloseSession();
+				DBFactory.getInstance().rollbackAndCloseSession();
 			}
 	  }
 		long indexTime = System.currentTimeMillis() - startTime;
diff --git a/src/main/java/org/olat/search/service/indexer/identity/IdentityIndexer.java b/src/main/java/org/olat/search/service/indexer/identity/IdentityIndexer.java
index 6349ddc886cf52da1bc8e61f4032e98ae49a472d..259a99e783b621a933c47c64551304b00ced0365 100644
--- a/src/main/java/org/olat/search/service/indexer/identity/IdentityIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/identity/IdentityIndexer.java
@@ -85,7 +85,7 @@ public class IdentityIndexer extends AbstractHierarchicalIndexer {
 				counter++;
 			} catch (Exception ex) {
 				logWarn("Exception while indexing identity::" + identityKey + ". Skipping this user, try next one.", ex);
-				DBFactory.getInstance(false).rollbackAndCloseSession();
+				DBFactory.getInstance().rollbackAndCloseSession();
 			}
 		}
 		if (isLogDebugEnabled()) logDebug("IdentityIndexer finished with counter::" + counter);
diff --git a/src/main/java/org/olat/search/service/indexer/repository/CourseIndexer.java b/src/main/java/org/olat/search/service/indexer/repository/CourseIndexer.java
index b6c1d1f2cc680845b13139b1b2dd4188c04a14a7..d7c0e224ed6f9b4cd83b09d8b2d3b65afc60e8c0 100644
--- a/src/main/java/org/olat/search/service/indexer/repository/CourseIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/repository/CourseIndexer.java
@@ -91,7 +91,7 @@ public class CourseIndexer extends AbstractHierarchicalIndexer {
 				return;
 			}
 
-			ICourse course = CourseFactory.loadCourse(repositoryEntry.getOlatResource());
+			ICourse course = CourseFactory.loadCourse(repositoryEntry);
 			// course.getCourseTitle(); // do not index title => index root-node
 			parentResourceContext.setParentContextType(TYPE);
 			parentResourceContext.setParentContextName(course.getCourseTitle());
diff --git a/src/main/java/org/olat/search/ui/SearchControllerFactory.java b/src/main/java/org/olat/search/ui/SearchControllerFactory.java
index c626531874435f7d0985ddc305cbd808f827f01c..3cc811143d76cfda024be4deef1458efd8331dbb 100644
--- a/src/main/java/org/olat/search/ui/SearchControllerFactory.java
+++ b/src/main/java/org/olat/search/ui/SearchControllerFactory.java
@@ -125,7 +125,7 @@ public class SearchControllerFactory implements SearchServiceUIFactory {
 					String repoKey = allTokens.get(0).split("[:]")[1];
 					RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(Long.parseLong(repoKey));
 					if(re != null) {
-						ICourse course = CourseFactory.loadCourse(re.getOlatResource());
+						ICourse course = CourseFactory.loadCourse(re);
 						CourseNode courseNode = course.getRunStructure().getNode(tokenKey);
 						return courseNode.getShortTitle();
 					}
diff --git a/src/main/java/org/olat/upgrade/UpgradeManagerImpl.java b/src/main/java/org/olat/upgrade/UpgradeManagerImpl.java
index c4641b6cbd8889cd243e178e67e6041d1e71d53d..7485c4ab0d3d53167e2891f64a8c87ec56a7c9af 100644
--- a/src/main/java/org/olat/upgrade/UpgradeManagerImpl.java
+++ b/src/main/java/org/olat/upgrade/UpgradeManagerImpl.java
@@ -78,10 +78,10 @@ public class UpgradeManagerImpl extends UpgradeManager {
 				if (upgrade.doPostSystemInitUpgrade(this))
 					logAudit("Successfully installed PostSystemInitUpgrade::" + upgrade.getVersion());
 				//just in case a doPostSystemInitUpgrade did forget it.
-				DBFactory.getInstance(false).commitAndCloseSession();
+				DBFactory.getInstance().commitAndCloseSession();
 			}
 		} catch (Throwable e) {
-			DBFactory.getInstance(false).rollbackAndCloseSession();
+			DBFactory.getInstance().rollbackAndCloseSession();
 			logWarn("Error upgrading PostSystemInitUpgrade::" + upgrade.getVersion(), e);
 			abort(e);
 		} 
diff --git a/src/main/java/org/olat/core/commons/persistence/_spring/core_persistence.xml b/src/main/resources/META-INF/persistence.xml
similarity index 99%
rename from src/main/java/org/olat/core/commons/persistence/_spring/core_persistence.xml
rename to src/main/resources/META-INF/persistence.xml
index 60dc0f8955c3c4539edcfcfba8788bf7a3fc0b1c..52fa4b88507d7cee5cfdb5991184813a5c2258ca 100644
--- a/src/main/java/org/olat/core/commons/persistence/_spring/core_persistence.xml
+++ b/src/main/resources/META-INF/persistence.xml
@@ -21,7 +21,6 @@
 		<mapping-file>org/olat/group/area/BGtoAreaRelationImpl.hbm.xml</mapping-file>
 		<mapping-file>org/olat/group/BusinessGroupImpl.hbm.xml</mapping-file>
 		<mapping-file>org/olat/group/model/BusinessGroupViewImpl.hbm.xml</mapping-file>
-		<mapping-file>org/olat/resource/lock/pessimistic/PLockImpl.hbm.xml</mapping-file>
 		<mapping-file>org/olat/resource/OLATResourceImpl.hbm.xml</mapping-file>
 		<mapping-file>org/olat/resource/accesscontrol/model/Offer.hbm.xml</mapping-file>
 		<mapping-file>org/olat/resource/accesscontrol/model/AccessMethod.hbm.xml</mapping-file>
@@ -95,6 +94,7 @@
 		<class>org.olat.commons.calendar.model.ImportedCalendar</class>
 		<class>org.olat.commons.calendar.model.ImportedToCalendar</class>
 		<class>org.olat.commons.calendar.model.CalendarUserConfiguration</class>
+		<class>org.olat.core.commons.services.lock.pessimistic.PLockImpl</class>
 		<class>org.olat.core.commons.services.notifications.model.SubscriberImpl</class>
 		<class>org.olat.core.commons.services.notifications.model.PublisherImpl</class>
 		<class>org.olat.core.commons.services.taskexecutor.model.PersistentTask</class>
diff --git a/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java b/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java
index c3b09e6c18a6d7eb34e9a5960017ed731cc75809..6b7ee934eb2c175758d678ea60bee9d5d72e1bb2 100644
--- a/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java
+++ b/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java
@@ -40,9 +40,9 @@ import java.util.UUID;
 import org.junit.Assert;
 import org.junit.Test;
 import org.olat.basesecurity.BaseSecurity;
+import org.olat.basesecurity.model.GroupImpl;
 import org.olat.commons.coordinate.cluster.ClusterCoordinator;
 import org.olat.core.commons.persistence.DB;
-import org.olat.core.commons.persistence.TestTable;
 import org.olat.core.gui.control.Event;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
@@ -172,30 +172,29 @@ public class LockTest extends OlatTestCase {
 
 	@Test
 	public void testSaveEvent() {
-		BaseSecurity baseSecurityManager = applicationContext.getBean(BaseSecurity.class);
-    Identity identity = baseSecurityManager.createAndPersistIdentity("lock-save-event-" + UUID.randomUUID().toString(), null, null, null, null);
-    dbInstance.closeSession();
-    log.info("Created identity=" + identity);
-		//
-		TestTable entry = new TestTable();
-		entry.setField1("bar");
-		entry.setField2(2221234354566776L);
+		Identity identity = securityManager.createAndPersistIdentity("lock-save-event-" + UUID.randomUUID().toString(), null, null, null, null);
+		dbInstance.closeSession();
+		log.info("Created identity=" + identity);
+		
+		//The group has no creation date -> commit will fail
+		GroupImpl entry = new GroupImpl();
+		entry.setName("bar");
 		try {
 			dbInstance.saveObject(entry);
 			dbInstance.commit();
-	    fail("Should generate an error");
+			fail("Should generate an error");
 		} catch (DBRuntimeException dre) {
 			log.info("DB connection is in error-state");
 		}
+		
 		// DB transaction must be in error state for this test
 		try {
-			
 			Locker locker = clusterCoordinator.getLocker();
 			assertTrue(locker instanceof ClusterLocker);
 			log.info("ClusterLocker created");
-	    Event event = new SignOnOffEvent(identity, false);
-	    log.info("START locker.event(event)");
-	    ((ClusterLocker)locker).event(event);
+			Event event = new SignOnOffEvent(identity, false);
+			log.info("START locker.event(event)");
+			((ClusterLocker)locker).event(event);
 			log.info("DONE locker.event(event)");
 		} catch(Exception ex) {
 			log.error("", ex);
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 435a0d0c5d2405f58a632eeece2e7380e1399063..19ab9c1649cb69fb17eb9d6b243813be02deee8a 100644
--- a/src/test/java/org/olat/core/commons/persistence/DBTest.java
+++ b/src/test/java/org/olat/core/commons/persistence/DBTest.java
@@ -32,31 +32,24 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.Date;
 import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.EntityTransaction;
 
 import org.junit.Assert;
 import org.junit.Test;
+import org.olat.basesecurity.model.GroupImpl;
 import org.olat.core.logging.DBRuntimeException;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.properties.Property;
 import org.olat.properties.PropertyManager;
 import org.olat.repository.RepositoryManager;
-import org.olat.repository.model.RepositoryEntryShortImpl;
 import org.olat.test.OlatTestCase;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.orm.jpa.EntityManagerFactoryUtils;
-import org.springframework.transaction.support.TransactionSynchronization;
-import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 
 /**
@@ -70,62 +63,21 @@ public class DBTest extends OlatTestCase {
 	private static final OLog log = Tracing.createLoggerFor(DBTest.class);
 	
 	@Autowired
- 	private RepositoryManager repositoryManager;
+	private DBImpl dbInstance;
 	@Autowired
- 	private EntityManagerFactory emf;
+ 	private RepositoryManager repositoryManager;
 		
 	/**
 	 * testCloseOfUninitializedSession
 	 */
 	@Test
 	public void testCloseOfUninitializedSession() {
-		// first get a initialized db
-		DB db = DBImpl.getInstance();
 		//close it
-		db.closeSession();
-		//then get a uninitialized db
-		db = DBImpl.getInstance();
+		dbInstance.closeSession();
 		// and close it.
-		db.closeSession();
+		dbInstance.closeSession();
 	}
 	
-	@Test
-	public void testMergeEntityManager() {	
- 		EntityManager em1 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
- 		Assert.assertNull(em1);
- 		List<RepositoryEntryShortImpl> res = repositoryManager.loadRepositoryEntryShortsByResource(Collections.singletonList(27l), "CourseModule");
- 		Assert.assertNotNull(res);
- 		EntityManager em2 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
- 		Assert.assertNotNull(em2);
- 		
- 		EntityTransaction trx = em2.getTransaction();
- 		Assert.assertTrue(trx.isActive());
- 		trx.commit();
- 		
- 		EntityManagerFactoryUtils.closeEntityManager(em2);
- 		
- 		EntityManager em3 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
- 		Assert.assertNotNull(em3);
-
- 		//search in the thread local used by Spring
- 		List<TransactionSynchronization> syncs = TransactionSynchronizationManager.getSynchronizations();
- 		Assert.assertNotNull(syncs);
- 		TransactionSynchronizationManager.clear();
- 		Map<Object,Object> map = TransactionSynchronizationManager.getResourceMap();
- 		Assert.assertNotNull(map);
- 		EntityManager em4 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
- 		Assert.assertNotNull(em4);
- 		
- 		//unbind the entity manager
- 		if(map.containsKey(emf)) {
-			TransactionSynchronizationManager.unbindResource(emf);
-		}
- 		
- 		//no entity manager anymore
- 		EntityManager em5 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
- 		Assert.assertNull(em5);
- 	}
-	
 	@Test
 	public void testMergeEntityManager_transactional() {
 		CountDownLatch latch = new CountDownLatch(1);
@@ -157,10 +109,10 @@ public class DBTest extends OlatTestCase {
 		
  		public void run() {
  			try {
-				EntityManager em1 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
+				EntityManager em1 = dbInstance.getCurrentEntityManager();
 				Assert.assertNull(em1);
 				repoManager.lookupRepositoryEntry(27l, false);
-				EntityManager em2 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
+				EntityManager em2 = dbInstance.getCurrentEntityManager();
 				//Transactional annotation must clean-up the entity manager
 				Assert.assertNull(em2);
 			} catch (Exception e) {
@@ -177,37 +129,28 @@ public class DBTest extends OlatTestCase {
 	 */
 	@Test
 	public void testErrorHandling() {
-		TestTable entry = new TestTable();
-		entry.setField1("foo");
-		entry.setField2(1234354566776L);
-		DBImpl db = DBImpl.getInstance();
+		GroupImpl entry = new GroupImpl();
+		entry.setName("foo");
 		try {		
-			db.saveObject(entry);
+			dbInstance.saveObject(entry);
 			fail("Should generate an error");
 		} catch (DBRuntimeException dre) {
-			assertTrue(db.isError());
-			assertNotNull(db.getError());
-		}
-
-		db.closeSession();
-		// in a transaction
-		db = DBImpl.getInstance();
-		TestTable entryTwo = new TestTable();
-		entryTwo.setField1("bar");
-		entryTwo.setField2(2221234354566776L);
-		try {
-			db.saveObject(entryTwo);
-			db.closeSession();
-			fail("Should generate an error");
-		} catch (DBRuntimeException dre) {
-			assertTrue(db.isError());
-			assertNotNull(db.getError());
+			assertTrue(dbInstance.isError());
+			Assert.assertNotNull(dbInstance.getError());
 		}
+		//the close must clear the transaction
+		dbInstance.closeSession();
+		
+		//a second try must work
+		GroupImpl entryTwo = new GroupImpl();
+		entryTwo.setName("bar");
+		entryTwo.setCreationDate(new Date());
+		dbInstance.saveObject(entryTwo);
+		dbInstance.commitAndCloseSession();
 	}
 	
 	@Test
 	public void testRollback() {
-		DB db = DBFactory.getInstance();
 		String propertyKey = "testRollback-1";
 		String testValue = "testRollback-1";
 		try {
@@ -218,13 +161,12 @@ public class DBTest extends OlatTestCase {
 			// name is null => generated DB error => rollback
 			Property p2 = pm.createPropertyInstance(null, null, null, null, null, null, null, testValue2, null);
 			pm.saveProperty(p2);
-			db.commit();
+			dbInstance.commit();
 			fail("Should generate error for rollback.");
 		} catch (Exception ex) {
-			db.closeSession();
+			dbInstance.closeSession();
 		}
 		// check if p1 is rollbacked
-		db = DBFactory.getInstance();
 		PropertyManager pm = PropertyManager.getInstance();
 		Property p =pm.findProperty(null, null, null, null, propertyKey);
 		assertNull("Property.save is NOT rollbacked", p);
@@ -232,7 +174,6 @@ public class DBTest extends OlatTestCase {
 	
 	@Test
 	public void testMixedNonTransactional_Transactional() {
-		DB db = DBFactory.getInstance();
 		String propertyKey1 = "testMixed-1";
 		String testValue1 = "testMixed-1";
 		String propertyKey2 = "testMixed-2";
@@ -249,11 +190,11 @@ public class DBTest extends OlatTestCase {
 			// name is null => generated DB error => rollback
 			Property p3 = pm.createPropertyInstance(null, null, null, null, null, null, null, testValue3, null);
 			pm.saveProperty(p3);
-			db.commit();
+			dbInstance.commit();
 			fail("Should generate error for rollback.");
-			db.closeSession();
+			dbInstance.closeSession();
 		} catch (Exception ex) {
-			db.closeSession();
+			dbInstance.closeSession();
 		}
 		// check if p1&p2 is rollbacked
 		PropertyManager pm = PropertyManager.getInstance();
@@ -265,7 +206,6 @@ public class DBTest extends OlatTestCase {
 	
 	@Test
 	public void testRollbackNonTransactional() {
-		DB db = DBFactory.getInstance();
 		String propertyKey1 = "testNonTransactional-1";
 		String testValue1 = "testNonTransactional-1";
 		String propertyKey2 = "testNonTransactional-2";
@@ -280,11 +220,11 @@ public class DBTest extends OlatTestCase {
 			// name is null => generated DB error => rollback ?
 			Property p3 = pm.createPropertyInstance(null, null, null, null, null, null, null, testValue3, null);
 			pm.saveProperty(p3);
-			db.commit();
+			dbInstance.commit();
 			fail("Should generate error for rollback.");
-			db.closeSession();
+			dbInstance.closeSession();
 		} catch (Exception ex) {
-			db.closeSession();
+			dbInstance.closeSession();
 		}
 		// check if p1 & p2 is NOT rollbacked
 		PropertyManager pm = PropertyManager.getInstance();
@@ -303,13 +243,12 @@ public class DBTest extends OlatTestCase {
 			long startTime = System.currentTimeMillis();
 			for (int loopCounter=0; loopCounter<loops; loopCounter++) {
 				String propertyKey = "testDbPerfKey-" + loopCounter;
-				DB db = DBFactory.getInstance();
 				PropertyManager pm = PropertyManager.getInstance();
 				String testValue = "testDbPerfValue-" + loopCounter;
 				Property p = pm.createPropertyInstance(null, null, null, null, propertyKey, null, null, testValue, null);
 				pm.saveProperty(p);
 				// forget session cache etc.
-				db.closeSession();
+				dbInstance.closeSession();
 				pm.deleteProperty(p);
 			}
 			long endTime = System.currentTimeMillis();
@@ -323,14 +262,12 @@ public class DBTest extends OlatTestCase {
 			long startTime = System.currentTimeMillis();
 			for (int loopCounter=0; loopCounter<loops; loopCounter++) {	
 				String propertyKey = "testDbPerfKey-" + loopCounter;
-				DB db = DBFactory.getInstance();
 				PropertyManager pm = PropertyManager.getInstance();
 				String testValue = "testDbPerfValue-" + loopCounter;
 				Property p = pm.createPropertyInstance(null, null, null, null, propertyKey, null, null, testValue, null);
 				pm.saveProperty(p);
 				// forget session cache etc.
-				db.closeSession();
-				db = DBFactory.getInstance();
+				dbInstance.closeSession();
 				pm.deleteProperty(p);
 			}
 			long endTime = System.currentTimeMillis();
@@ -344,16 +281,15 @@ public class DBTest extends OlatTestCase {
 	
 	@Test
 	public void testDBUTF8capable() {
-		DB db = DBFactory.getInstance();
 		PropertyManager pm = PropertyManager.getInstance();
-		String name = UUID.randomUUID().toString();
+		String uuid = UUID.randomUUID().toString();
 		String unicodetest = "a-greek a\u03E2a\u03EAa\u03E8 arab \u0630a\u0631 chinese:\u3150a\u3151a\u3152a\u3153a\u3173a\u3110-z";
-		Property p = pm.createPropertyInstance(null, null, null, null, name, null, null, unicodetest, null);
+		Property p = pm.createPropertyInstance(null, null, null, null, uuid, null, null, unicodetest, null);
 		pm.saveProperty(p);
 		// forget session cache etc.
-		db.closeSession();
+		dbInstance.closeSession();
 		
-		Property p2 = pm.findProperty(null, null, null, null, name);
+		Property p2 = pm.findProperty(null, null, null, null, uuid);
 		String lStr = p2.getStringValue();
 		assertEquals(unicodetest, lStr);
 	}
@@ -365,13 +301,13 @@ public class DBTest extends OlatTestCase {
 		PropertyManager.getInstance().saveProperty(p);
 		long propertyKey = p.getKey();
 		// forget session cache etc.
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		// 2. try to find object
-		Object testObject = DBFactory.getInstance().findObject(Property.class, propertyKey);
+		Object testObject = dbInstance.findObject(Property.class, propertyKey);
 		assertNotNull(testObject);
 		// 3. Delete object
 		PropertyManager.getInstance().deleteProperty( (Property)testObject );
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		// 4. try again to find object, now no-one should be found, must return null
 		testObject = DBFactory.getInstance().findObject(Property.class, propertyKey);
 		assertNull(testObject);
@@ -427,21 +363,19 @@ public class DBTest extends OlatTestCase {
 				
 				while (loopCounter++ < numberOfLoops ) {
 					String propertyKey = UUID.randomUUID().toString();
-					DB db = DBFactory.getInstance();
 					PropertyManager pm = PropertyManager.getInstance();
 					String testValue = "DbWorkerValue-" + workerId + "-" + loopCounter;
 					Property p = pm.createPropertyInstance(null, null, null, null, propertyKey, null, null, testValue, null);
 					pm.saveProperty(p);
 					// forget session cache etc.
-					db.closeSession();
+					dbInstance.closeSession();
 					
-					db = DBFactory.getInstance();
 					Property p2 = pm.findProperty(null, null, null, null, propertyKey);
 					String lStr = p2.getStringValue();
 					if (!testValue.equals(lStr)) {
 						errorCounter++;
 					}
-					db.closeSession();
+					dbInstance.closeSession();
 				}
 			} catch (Exception ex) {
 				log.error("", ex);
diff --git a/src/test/java/org/olat/core/commons/persistence/TestTable.hbm.xml b/src/test/java/org/olat/core/commons/persistence/TestTable.hbm.xml
deleted file mode 100644
index e4e2ab16b737b037ce656f5bc072e027bb7c0256..0000000000000000000000000000000000000000
--- a/src/test/java/org/olat/core/commons/persistence/TestTable.hbm.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC 
-        "-//Hibernate/Hibernate Mapping DTD//EN"
-        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
-
-<hibernate-mapping default-lazy="false">
- <class name="org.olat.core.commons.persistence.TestTable" table="o_tst_testtable">  
-  
-    <id name="key" column="id" type="long" unsaved-value="null">
-      <generator class="hilo"/>
-    </id>
-    
-    <version name="version" access="field" column="version" type="int"/>
-	<property  name="creationDate" column="creationdate" type="timestamp" />   
- 
-    <property name="field1" unique="false" not-null="true" length="255"/>
-    
-    <property name="field2" type="long" not-null="false"/>    	
-    
-	<!-- The following property produces a runtime error when saving the object for testing purposes. -->
-    <property name="field3" unique="false" not-null="true" length="255"/>
-        
-  </class>   
-</hibernate-mapping>
-
diff --git a/src/test/java/org/olat/core/commons/persistence/TestTable.java b/src/test/java/org/olat/core/commons/persistence/TestTable.java
deleted file mode 100644
index be99ba887417b634eaf84837f2ac6a71ebadbda7..0000000000000000000000000000000000000000
--- a/src/test/java/org/olat/core/commons/persistence/TestTable.java
+++ /dev/null
@@ -1,130 +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.core.commons.persistence;
-
-import java.util.Date;
-
-/**
- * A <b>TestTable</b> is used to test the persistence package.
- * 
- * @author Andreas Ch. Kapp
- *
- */
-public class TestTable {
-	
-	Long key;
-	int version;
-	String field1;
-	long field2;
-	String field3;
-	Date creationDate;
-
-	/**
-	 * @return field1
-	 */
-	public String getField1() {
-		return field1;
-	}
-
-	/**
-	 * @return field2
-	 */
-	public long getField2() {
-		return field2;
-	}
-
-	/**
-	 * @return field3
-	 */
-	public String getField3() {
-		return field3;
-	}
-
-	/**
-	 * @return key
-	 */
-	public Long getKey() {
-		return key;
-	}
-
-	/**
-	 * @param string
-	 */
-	public void setField1(String string) {
-		field1 = string;
-	}
-
-	/**
-	 * @param l
-	 */
-	public void setField2(long l) {
-		field2 = l;
-	}
-
-	/**
-	 * @param string
-	 */
-	public void setField3(String string) {
-		field3 = string;
-	}
-
-	/**
-	 * @param long1
-	 */
-	public void setKey(Long long1) {
-		key = long1;
-	}
-
-	/**
-	 * @return creationDate
-	 */
-	public Date getCreationDate() {
-		return creationDate;
-	}
-
-	/**
-	 * @return lastModified
-	 */
-	public Integer getVersion() {
-		return version;
-	}
-
-	/**
-	 * @param date
-	 */
-	public void setCreationDate(Date date) {
-		creationDate = date;
-	}
-
-	/**
-	 * @param date
-	 */
-	public void setVersion(int version) {
-		this.version = version;
-	}
-
-}
diff --git a/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java b/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java
index 8e7e9e5015175b518cacac9be28a4ff166f2ef3d..611583147225376da22c35ac572bc2e85e0a3374 100644
--- a/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java
+++ b/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java
@@ -1042,7 +1042,7 @@ public class ReminderRuleEngineTest extends OlatTestCase {
 	
 	private String assessmentData(Identity tutor, Identity student, ScoreEvaluation scoreEval, RepositoryEntry re) {
 		//create user course infos
-		ICourse course = CourseFactory.loadCourse(re.getOlatResource());
+		ICourse course = CourseFactory.loadCourse(re);
 		List<CourseNode> assessableNodeList = AssessmentHelper.getAssessableNodes(course.getEditorTreeModel(), null);
 		AssessableCourseNode testNode = null; 
 		for(CourseNode currentNode: assessableNodeList) {	
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 43953939b71eafe00c7fdfc0ef8e9be9f9e15b47..23a8cfc5f07d66104baa79869998e19616a36633 100644
--- a/src/test/java/org/olat/resource/lock/pessimistic/PLockTest.java
+++ b/src/test/java/org/olat/resource/lock/pessimistic/PLockTest.java
@@ -43,6 +43,8 @@ import org.junit.Test;
 import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.SecurityGroup;
 import org.olat.core.commons.persistence.DB;
+import org.olat.core.commons.services.lock.pessimistic.PLock;
+import org.olat.core.commons.services.lock.pessimistic.PessimisticLockManager;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
diff --git a/src/test/java/org/olat/restapi/UserFoldersTest.java b/src/test/java/org/olat/restapi/UserFoldersTest.java
index 8a58d925febecaae008f219791b5542259ab867b..a7ce1b69516ca0517b65b672e13c0c7058dbea59 100644
--- a/src/test/java/org/olat/restapi/UserFoldersTest.java
+++ b/src/test/java/org/olat/restapi/UserFoldersTest.java
@@ -90,7 +90,7 @@ public class UserFoldersTest extends OlatJerseyTestCase {
 		File courseWithForums = new File(courseWithForumsUrl.toURI());
 		myCourseRe = CourseFactory.deployCourseFromZIP(courseWithForums, UUID.randomUUID().toString(), 4);
 		Assert.assertNotNull(myCourseRe);
-		myCourse = CourseFactory.loadCourse(myCourseRe.getOlatResource().getResourceableId());
+		myCourse = CourseFactory.loadCourse(myCourseRe);
 
 		setup = true;
 	}
diff --git a/src/test/java/org/olat/restapi/UserMgmtTest.java b/src/test/java/org/olat/restapi/UserMgmtTest.java
index 765002eed69e131c31c2892454fe7fd340897823..367ceb0b347d073416d424f4cf3e58f81b13b093 100644
--- a/src/test/java/org/olat/restapi/UserMgmtTest.java
+++ b/src/test/java/org/olat/restapi/UserMgmtTest.java
@@ -247,7 +247,7 @@ public class UserMgmtTest extends OlatJerseyTestCase {
 			repositoryService.addRole(id1, entry, GroupRoles.participant.name());
 		}
 		
-		demoCourse = CourseFactory.loadCourse(entry.getOlatResource());
+		demoCourse = CourseFactory.loadCourse(entry);
 		TreeVisitor visitor = new TreeVisitor(new Visitor() {
 			@Override
 			public void visit(INode node) {
diff --git a/src/test/java/org/olat/test/JunitTestHelper.java b/src/test/java/org/olat/test/JunitTestHelper.java
index d28fa5f461ba799f12b4018ba8cfdc84dfc398dc..1d3d4dfc53eb47bc89de99a3ced6865ba5f3e537 100644
--- a/src/test/java/org/olat/test/JunitTestHelper.java
+++ b/src/test/java/org/olat/test/JunitTestHelper.java
@@ -212,7 +212,7 @@ public class JunitTestHelper {
 					.getRepositoryHandler(CourseModule.getCourseTypeName());
 			re = courseHandler.importResource(initialAuthor, null, displayname, description, true, Locale.ENGLISH, courseFile, null);
 			
-			ICourse course = CourseFactory.loadCourse(re.getOlatResource());
+			ICourse course = CourseFactory.loadCourse(re);
 			CourseFactory.publishCourse(course, RepositoryEntry.ACC_USERS, false,  initialAuthor, Locale.ENGLISH);
 		} catch (Exception e) {
 			log.error("", e);
@@ -238,7 +238,7 @@ public class JunitTestHelper {
 					.getRepositoryHandler(CourseModule.getCourseTypeName());
 			re = courseHandler.importResource(initialAuthor, null, displayname, description, true, Locale.ENGLISH, courseFile, null);
 			
-			ICourse course = CourseFactory.loadCourse(re.getOlatResource());
+			ICourse course = CourseFactory.loadCourse(re);
 			CourseFactory.publishCourse(course, RepositoryEntry.ACC_USERS, false,  initialAuthor, Locale.ENGLISH);
 		} catch (Exception e) {
 			log.error("", e);