diff --git a/src/main/java/org/olat/admin/securitygroup/gui/multi/UsersToGroupWizardController.java b/src/main/java/org/olat/admin/securitygroup/gui/multi/UsersToGroupWizardController.java
index 5583237750696ec8bc23c7d242b2464420dd7892..90e7c3c50021baa935220005da6efa7084c764a8 100644
--- a/src/main/java/org/olat/admin/securitygroup/gui/multi/UsersToGroupWizardController.java
+++ b/src/main/java/org/olat/admin/securitygroup/gui/multi/UsersToGroupWizardController.java
@@ -34,7 +34,7 @@ import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.Constants;
 import org.olat.basesecurity.SecurityGroup;
 import org.olat.basesecurity.events.MultiIdentityChosenEvent;
-import org.olat.core.commons.persistence.SyncHelper;
+import org.olat.core.commons.persistence.PersistenceHelper;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -173,13 +173,13 @@ public class UsersToGroupWizardController extends WizardController {
 							isanonymous.add(username);
 						} else {
 							// check if already in group
-							boolean inGroup = SyncHelper.containsPersistable(existIdents, ident);
+							boolean inGroup = PersistenceHelper.containsPersistable(existIdents, ident);
 							if (inGroup) {
 								// added to warning: already in group
 								alreadyin.add(ident.getName());
 							} else {
 								// ok to add -> preview (but filter duplicate entries)
-								if (!SyncHelper.containsPersistable(oks, ident)) {
+								if (!PersistenceHelper.containsPersistable(oks, ident)) {
 									oks.add(ident);
 								}
 							}
diff --git a/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java b/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java
index aa359141134f74269b1febd777a13fd329c52537..8b50c8af3ff09806a20d1e6c773885e178975ade 100644
--- a/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java
+++ b/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java
@@ -29,7 +29,7 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.AssertException;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerCallback;
 import org.olat.group.BusinessGroup;
diff --git a/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java b/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java
index 3a2a47ee3154a70f3842b4aab85bd9a54160ad69..d745d776bc6280aafc4312614779069112492216 100644
--- a/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java
+++ b/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java
@@ -94,7 +94,7 @@ import org.olat.core.manager.BasicManager;
 import org.olat.core.util.CodeHelper;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerCallback;
 import org.olat.core.util.prefs.Preferences;
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 64f724845acf3ffcf4e2db42922ab0a5cf16ce61..218124df62e38f5b98d92bb2aa9a7c296a94a815 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
@@ -57,7 +57,7 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.WebappHelper;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerExecutor;
 import org.olat.core.util.event.MultiUserEvent;
diff --git a/src/main/java/org/olat/commons/servlets/WebDAVManagerImpl.java b/src/main/java/org/olat/commons/servlets/WebDAVManagerImpl.java
index ec62b54bd4a0c421fe9dfbb2068cebbc97ab0d63..ff12210aa463bf33dfede4509cf023792874bf97 100644
--- a/src/main/java/org/olat/commons/servlets/WebDAVManagerImpl.java
+++ b/src/main/java/org/olat/commons/servlets/WebDAVManagerImpl.java
@@ -43,7 +43,7 @@ import org.olat.core.servlets.SecureWebdavServlet;
 import org.olat.core.servlets.WebDAVManager;
 import org.olat.core.util.SessionInfo;
 import org.olat.core.util.UserSession;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.session.UserSessionManager;
 import org.olat.login.auth.WebDAVAuthManager;
diff --git a/src/main/java/org/olat/core/commons/modules/glossary/GlossaryItemManager.java b/src/main/java/org/olat/core/commons/modules/glossary/GlossaryItemManager.java
index 1e33c6fa540771978d9f2ea1785ca089193e5abb..07810f8949ae3a884ce5ddf9a9e001c8b631f59a 100644
--- a/src/main/java/org/olat/core/commons/modules/glossary/GlossaryItemManager.java
+++ b/src/main/java/org/olat/core/commons/modules/glossary/GlossaryItemManager.java
@@ -37,7 +37,7 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.manager.BasicManager;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerExecutor;
 import org.olat.core.util.resource.OresHelper;
diff --git a/src/main/java/org/olat/core/commons/persistence/PersistenceHelper.java b/src/main/java/org/olat/core/commons/persistence/PersistenceHelper.java
index db5a30fc3564bdf7600fdb7c69c53dfb43ecd892..5b069725bbd0b5c32fd2a5a0cc9c386ce79ea816 100644
--- a/src/main/java/org/olat/core/commons/persistence/PersistenceHelper.java
+++ b/src/main/java/org/olat/core/commons/persistence/PersistenceHelper.java
@@ -109,7 +109,6 @@ public class PersistenceHelper {
 
 	/**
 	 * 
-	 * FIXME:fj:c cleanup up these methods here and class SyncHelper
 	 * Checks if the given persistable is in the given iterator (database identity). 
 	 * If so, the persistable from the iterator is returned. If not, null is returned. 
 	 * @param iter Iterator of persistable objects
@@ -117,10 +116,9 @@ public class PersistenceHelper {
 	 * @return null if not found or the persistable object that has the same key as the given 
 	 * persistable object. The object might also have object identity, but this is not guaranteed. 
 	 */
-	// TODO:cg: not used => Remove it, ask fj
-	public static Persistable getPersistableByPersistableKey(Iterator iter, Persistable persistable) {
+	public static Persistable getPersistableByPersistableKey(Iterator<? extends Persistable> iter, Persistable persistable) {
 		while (iter.hasNext()) {
-			Persistable persistableFromIterator = (Persistable) iter.next();
+			Persistable persistableFromIterator = iter.next();
 			if (persistable.equalsByPersistableKey(persistableFromIterator)) 
 				return persistableFromIterator;
 		}
@@ -136,7 +134,7 @@ public class PersistenceHelper {
 	 * @param persistable Persistable object
 	 * @return boolean
 	 */
-	public static boolean listContainsObjectByKey(List objects, Persistable persistable) {
+	public static boolean listContainsObjectByKey(List<? extends Persistable> objects, Persistable persistable) {
 		return listContainsObjectByKey(objects, persistable.getKey());
 	}
 
@@ -147,10 +145,10 @@ public class PersistenceHelper {
 	 * @param persistable Persistable object
 	 * @return boolean
 	 */
-	public static boolean listContainsObjectByKey(List objects, Long key) {
-		for (Iterator iter = objects.iterator(); iter.hasNext();) {
+	public static boolean listContainsObjectByKey(List<? extends Persistable> objects, Long key) {
+		for (Iterator<? extends Persistable> iter = objects.iterator(); iter.hasNext();) {
 			try {
-				Persistable listObject = (Persistable) iter.next();
+				Persistable listObject = iter.next();
 				if (listObject.getKey().equals(key))  {
 					return true;
 				}
@@ -168,7 +166,7 @@ public class PersistenceHelper {
 	 * @param persistable
 	 * @return int position of object in list
 	 */
-	public static int indexOf(List objects, Persistable persistable){
+	public static int indexOf(List<? extends Persistable> objects, Persistable persistable){
 		return indexOf(objects, persistable.getKey());
 	}
 	
@@ -179,10 +177,10 @@ public class PersistenceHelper {
 	 * @param key
 	 * @return int position of object in list
 	 */
-	public static int indexOf(List objects, Long key) {
-		for (Iterator iter = objects.iterator(); iter.hasNext();) {
+	public static int indexOf(List<? extends Persistable> objects, Long key) {
+		for (Iterator<? extends Persistable> iter = objects.iterator(); iter.hasNext();) {
 			try {
-				Persistable listObject = (Persistable) iter.next();
+				Persistable listObject = iter.next();
 				if (listObject.getKey().equals(key))  {
 					return objects.indexOf(listObject);
 				}
@@ -200,7 +198,7 @@ public class PersistenceHelper {
 	 * replace value
 	 * @return boolean true: object replaced; false: object was not found in list
 	 */
-	public static boolean replaceObjectInListByKey(List objects, Persistable toBeReplacedObject) {
+	public static boolean replaceObjectInListByKey(List<Persistable> objects, Persistable toBeReplacedObject) {
 		int i = indexOf(objects, toBeReplacedObject);
 		// return false when object was not found in list
 		if (i < 0) return false;
@@ -220,14 +218,14 @@ public class PersistenceHelper {
 	 * After calling this operation the originalList will contain less or the same amount of
 	 * objects
 	 */
-	public static int removeObjectsFromList(List originalList, List toBeRemovedObjects) {	
+	public static int removeObjectsFromList(List<? extends Persistable> originalList, List<? extends Persistable> toBeRemovedObjects) {	
 		int counter = 0;
-		Iterator removeIter = toBeRemovedObjects.iterator();
+		Iterator<? extends Persistable> removeIter = toBeRemovedObjects.iterator();
 		while (removeIter.hasNext()) {
-			Persistable toBeRemoved = (Persistable) removeIter.next();
-			Iterator originalIter = originalList.iterator();
+			Persistable toBeRemoved = removeIter.next();
+			Iterator<? extends Persistable> originalIter = originalList.iterator();
 			while (originalIter.hasNext()) {
-				Persistable fromOriginal = (Persistable) originalIter.next();
+				Persistable fromOriginal = originalIter.next();
 				if (fromOriginal.getKey().equals(toBeRemoved.getKey())) {
 					originalList.remove(fromOriginal);
 					counter++;
@@ -238,6 +236,33 @@ public class PersistenceHelper {
 		return counter;
 	}
 	
+	public static Persistable findInListByKey(List<? extends Persistable> persistables, Persistable persistable) {
+		Long key = persistable.getKey();
+		for (Iterator<? extends Persistable> iter = persistables.iterator(); iter.hasNext();) {
+			Persistable ppit  = iter.next();
+			if (ppit.getKey().equals(key)) {
+				return ppit;
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * @param listOfPersistables
+	 * @param persistable
+	 * @return True if listOfPersistable contains persistable
+	 */
+	public static boolean containsPersistable(List<? extends Persistable> listOfPersistables, Persistable persistable) {
+		Long key = persistable.getKey();
+		for (Iterator<? extends Persistable> iter = listOfPersistables.iterator(); iter.hasNext();) {
+			Persistable entry = iter.next();
+			if (entry.getKey().equals(key)) {
+				return true;
+			} 
+		}
+		return false;
+	}
+	
 	/**
 	 * 
 	 * @param list
diff --git a/src/main/java/org/olat/core/commons/persistence/SyncHelper.java b/src/main/java/org/olat/core/commons/persistence/SyncHelper.java
deleted file mode 100644
index 81cf90ae9b4bae16572625ef8b2a83e4a707c902..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/core/commons/persistence/SyncHelper.java
+++ /dev/null
@@ -1,84 +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.Iterator;
-import java.util.List;
-
-import org.olat.core.id.Persistable;
-
-/**
-*  Description:<br>
-*
-* @author Felix Jost
-*/
-public class SyncHelper {
-
-	/**
-	 * @param persistables
-	 * @param persistable
-	 * @return Persistable
-	 */
-	public static Persistable findInListByKey(List persistables, Persistable persistable) {
-		Long key = persistable.getKey();
-		for (Iterator iter = persistables.iterator(); iter.hasNext();) {
-			Persistable ppit  = (Persistable) iter.next();
-			if (ppit.getKey().equals(key)) {
-				return ppit;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * @param listOfPersistables
-	 * @param persistable
-	 * @return True if listOfPersistable contains persistable
-	 */
-	public static boolean containsPersistable(List listOfPersistables, Persistable persistable) {
-		Long key = persistable.getKey();
-		for (Iterator iter = listOfPersistables.iterator(); iter.hasNext();) {
-			Persistable entry = (Persistable) iter.next();
-			if (entry.getKey().equals(key)) {
-				return true;
-			} 
-		}
-		return false;
-	}
-	
-	/*public static List replacePersistable(List listOfPersitables, Persistable newPersistable) {
-		for (Iterator iter = listOfPersitables.iterator(); iter.hasNext();) {
-			Persistable entry = (Persistable) iter.next();
-			if (entry.getKey().equals(newPersistable.getKey())) {
-				int index = listOfPersitables.indexOf(entry);
-				listOfPersitables.add(index, newPersistable);
-			}
-		}		
-		return listOfPersitables;
-		
-	}*/
-}
diff --git a/src/main/java/org/olat/core/commons/persistence/_spring/core_persistence.xml b/src/main/java/org/olat/core/commons/persistence/_spring/core_persistence.xml
index 9240a0e6f4250d51f88269c20f0c34a29259008c..6158140ec42abcad725796e4aa515fbab353d0d5 100644
--- a/src/main/java/org/olat/core/commons/persistence/_spring/core_persistence.xml
+++ b/src/main/java/org/olat/core/commons/persistence/_spring/core_persistence.xml
@@ -77,6 +77,7 @@
 		
 		<class>org.olat.instantMessaging.model.InstantMessageImpl</class>
 		<class>org.olat.instantMessaging.model.ImPreferencesImpl</class>
+		<class>org.olat.instantMessaging.model.RosterEntryImpl</class>
 		<class>org.olat.instantMessaging.model.InstantMessageNotificationImpl</class>
 		<properties>
 			<property name="hibernate.generate_statistics" value="true"/>
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 d6e9394add45c3577db141b98cdb910b4cd096af..2e6445d72b0670cef5ec28b39aa9b97964d7c6a1 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
@@ -159,7 +159,7 @@
 				<prop key="hibernate.cache.use_query_cache">true</prop>
 				<prop key="hibernate.cache.use_second_level_cache">true</prop>
 				<prop key="hibernate.cache.region.factory_class">org.olat.core.commons.persistence.JpaInfinispanRegionFactory</prop>
-				<prop key="hibernate.cache.infinispan.cfg">infinispan-SingleVM.xml</prop>
+				<prop key="hibernate.cache.infinispan.cfg">infinispan-config.xml</prop>
 				<prop key="hibernate.cache.region.jbc2.query.localonly">true</prop>
 				<prop key="hibernate.cache.region_prefix">openolat</prop>
 			</props>
diff --git a/src/main/java/org/olat/core/dispatcher/mapper/manager/MapperServiceImpl.java b/src/main/java/org/olat/core/dispatcher/mapper/manager/MapperServiceImpl.java
index 4d745dab909d4b5ed965a4ced46d0798b45389b3..e20f94c10c11661bb8661a7815ad43164d06f08c 100644
--- a/src/main/java/org/olat/core/dispatcher/mapper/manager/MapperServiceImpl.java
+++ b/src/main/java/org/olat/core/dispatcher/mapper/manager/MapperServiceImpl.java
@@ -35,7 +35,7 @@ import org.olat.core.util.Encoder;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.UserSession;
 import org.olat.core.util.WebappHelper;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.Coordinator;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerExecutor;
diff --git a/src/main/java/org/olat/core/id/context/HistoryManager.java b/src/main/java/org/olat/core/id/context/HistoryManager.java
index e970672acf6e0ae02a4b3cebab6b7bc7729827b3..e9d932564a7b3f041382f85b66443d28b9a88847 100644
--- a/src/main/java/org/olat/core/id/context/HistoryManager.java
+++ b/src/main/java/org/olat/core/id/context/HistoryManager.java
@@ -22,6 +22,7 @@ package org.olat.core.id.context;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.IOException;
 
 import org.olat.core.commons.modules.bc.FolderConfig;
 import org.olat.core.id.Identity;
@@ -74,13 +75,7 @@ public class HistoryManager extends BasicManager {
 		try {
 			String pathHomePage = FolderConfig.getCanonicalRoot() + FolderConfig.getUserHomePage(identity.getName());
 			File resumeXml = new File(pathHomePage, "resume.xml");
-			if(resumeXml.exists()) {
-				FileInputStream in = new FileInputStream(resumeXml);
-				HistoryPoint point = (HistoryPoint)historyStream.fromXML(in);
-				FileUtils.closeSafely(in);
-				return point;
-			}
-			return null;
+			return readHistory(resumeXml);
 		} catch (Exception e) {
 			logError("Cannot read resume file: ", e);
 			return null;
@@ -98,8 +93,14 @@ public class HistoryManager extends BasicManager {
 			logError("Can not delete history file", e);
 		}
 	}
-
 	
-	
-
+	protected HistoryPoint readHistory(File resumeXml) throws IOException {
+		if(resumeXml.exists()) {
+			FileInputStream in = new FileInputStream(resumeXml);
+			HistoryPoint point = (HistoryPoint)historyStream.fromXML(in);
+			FileUtils.closeSafely(in);
+			return point;
+		}
+		return null;
+	}
 }
diff --git a/src/main/java/org/olat/core/id/context/HistoryPointImpl.java b/src/main/java/org/olat/core/id/context/HistoryPointImpl.java
index 02c39f9459d6251e72f2c47ec3f21c69bb562a8d..6ac4e1c78ffed495d4753a2e7226c1220360abf0 100644
--- a/src/main/java/org/olat/core/id/context/HistoryPointImpl.java
+++ b/src/main/java/org/olat/core/id/context/HistoryPointImpl.java
@@ -20,6 +20,7 @@
 
 package org.olat.core.id.context;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -32,8 +33,9 @@ import java.util.List;
  * Initial Date:  18 jan. 2011 <br>
  * @author srosse, stephane.rosse@frentix.com, www.frentix.com
  */
-public class HistoryPointImpl implements HistoryPoint {
+public class HistoryPointImpl implements HistoryPoint, Serializable {
 
+	private static final long serialVersionUID = -7002881531372365733L;
 	private final String uuid;
 	private final String businessPath;
 	private final List<ContextEntry> entries;
diff --git a/src/main/java/org/olat/core/util/cache/n/CacheConfig.java b/src/main/java/org/olat/core/util/cache/CacheConfig.java
similarity index 99%
rename from src/main/java/org/olat/core/util/cache/n/CacheConfig.java
rename to src/main/java/org/olat/core/util/cache/CacheConfig.java
index 28f265bc5aa9c87ca960e0c6a73c804346088809..6f3ce43df0dd72c2e28106eea8215bc82bdb7774 100644
--- a/src/main/java/org/olat/core/util/cache/n/CacheConfig.java
+++ b/src/main/java/org/olat/core/util/cache/CacheConfig.java
@@ -23,7 +23,7 @@
 * under the Apache 2.0 license as the original file.  
 * <p>
 */ 
-package org.olat.core.util.cache.n;
+package org.olat.core.util.cache;
 
 import java.util.Map;
 
diff --git a/src/main/java/org/olat/core/util/cache/n/CacheWrapper.java b/src/main/java/org/olat/core/util/cache/CacheWrapper.java
similarity index 93%
rename from src/main/java/org/olat/core/util/cache/n/CacheWrapper.java
rename to src/main/java/org/olat/core/util/cache/CacheWrapper.java
index 30769b12863b6aa60c0cb64e00e442b898599ff4..490af22ebe8073938734c000898738f653bc06b7 100644
--- a/src/main/java/org/olat/core/util/cache/n/CacheWrapper.java
+++ b/src/main/java/org/olat/core/util/cache/CacheWrapper.java
@@ -23,9 +23,10 @@
 * under the Apache 2.0 license as the original file.  
 * <p>
 */ 
-package org.olat.core.util.cache.n;
+package org.olat.core.util.cache;
 
 import java.io.Serializable;
+import java.util.List;
 
 import org.olat.core.id.OLATResourceable;
 
@@ -40,7 +41,7 @@ import org.olat.core.id.OLATResourceable;
  * Initial Date:  03.10.2007 <br>
  * @author Felix Jost, http://www.goodsolutions.ch
  */
-public interface CacheWrapper<U> {
+public interface CacheWrapper<U, V extends Serializable> {
 	
 	
 	public boolean containsKey(U key);
@@ -51,7 +52,7 @@ public interface CacheWrapper<U> {
 	 * @return the cache entry or null when the element has expired, never been put into yet, or removed due to max-size, 
 	 * 	or a put in a different cluster node which led to an invalidate message
 	 */
-	public Serializable get(U key);
+	public V get(U key);
 	
 	/**
 	 * o_clusterREVIEW :pb  review references
@@ -64,7 +65,7 @@ public interface CacheWrapper<U> {
 	 * @param key
 	 * @param value
 	 */
-	public void update(U key, Serializable value);	
+	public V update(U key, V value);	
 	
 	/**
 	 * use this put whenever you just fill up a cache from data which is already on the db or the filesystem. e.g. use it when you simply load some properties again into cache.
@@ -88,7 +89,7 @@ public interface CacheWrapper<U> {
 	 * @param value
 	 *
 	 */
-	public void put(U key, Serializable value);
+	public V put(U key, V value);
 	
 	/**
 	 * removes a value from the cache. this method is thread-safe
diff --git a/src/main/java/org/olat/core/util/cache/n/InfinispanCacheManager.java b/src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacheManager.java
similarity index 98%
rename from src/main/java/org/olat/core/util/cache/n/InfinispanCacheManager.java
rename to src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacheManager.java
index acd16a2a6045a700f09dd0b41c46cc330b75231a..9bb7dc08e7e64db075d1f3faeaea53a7bfe18e75 100644
--- a/src/main/java/org/olat/core/util/cache/n/InfinispanCacheManager.java
+++ b/src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacheManager.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.util.cache.n;
+package org.olat.core.util.cache.infinispan;
 
 import javax.naming.InitialContext;
 
diff --git a/src/main/java/org/olat/core/util/cache/n/InfinispanCacheWrapper.java b/src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacheWrapper.java
similarity index 85%
rename from src/main/java/org/olat/core/util/cache/n/InfinispanCacheWrapper.java
rename to src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacheWrapper.java
index 9560e1f177146cc316a3ba3a35cf9ad607374401..a66895d9d84c02256940fe8224b2fa4c5cbac0f7 100644
--- a/src/main/java/org/olat/core/util/cache/n/InfinispanCacheWrapper.java
+++ b/src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacheWrapper.java
@@ -23,10 +23,11 @@
 * under the Apache 2.0 license as the original file.  
 * <p>
 */ 
-package org.olat.core.util.cache.n;
+package org.olat.core.util.cache.infinispan;
 
 import java.io.Serializable;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.infinispan.Cache;
@@ -40,6 +41,8 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.OLATRuntimeException;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.cache.CacheConfig;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.resource.OresHelper;
 
 /**
@@ -50,7 +53,7 @@ import org.olat.core.util.resource.OresHelper;
  * Initial Date:  03.10.2007 <br>
  * @author Felix Jost, http://www.goodsolutions.ch
  */
-public class InfinispanCacheWrapper implements CacheWrapper<Object> {
+public class InfinispanCacheWrapper implements CacheWrapper<Object,Serializable> {
 	private static final OLog log = Tracing.createLoggerFor(InfinispanCacheWrapper.class);
 	
 	private final String cacheName;	// the fully qualified name of the cache
@@ -58,7 +61,7 @@ public class InfinispanCacheWrapper implements CacheWrapper<Object> {
 	private final EmbeddedCacheManager cachemanager;
 	
 	private Cache<Object,Serializable> cache;
-	private Map<String, CacheWrapper<Object>> children = null;
+	private Map<String, CacheWrapper<Object, Serializable>> children = null;
 	
 	
 	/**
@@ -96,7 +99,7 @@ public class InfinispanCacheWrapper implements CacheWrapper<Object> {
 	 * @param config
 	 * @return
 	 */
-	protected CacheWrapper<Object> createChildCacheWrapper(String childName, CacheConfig aconfig) {
+	protected CacheWrapper<Object,Serializable> createChildCacheWrapper(String childName, CacheConfig aconfig) {
 		return new InfinispanCacheWrapper(childName, aconfig, cachemanager);
 	}
 
@@ -104,7 +107,7 @@ public class InfinispanCacheWrapper implements CacheWrapper<Object> {
 	 * 
 	 * @return the map with the children or null
 	 */
-	protected Map<String, CacheWrapper<Object>> getChildren() {
+	protected Map<String, CacheWrapper<Object,Serializable>> getChildren() {
 		return children;
 	}
 	
@@ -114,7 +117,7 @@ public class InfinispanCacheWrapper implements CacheWrapper<Object> {
 		synchronized(this) {//cluster_ok by definition of this class as used in single vm
 			CacheWrapper cwChild = null;
 			if (children == null) {
-				children = new HashMap<String, CacheWrapper<Object>>();
+				children = new HashMap<String, CacheWrapper<Object,Serializable>>();
 			} else {
 				cwChild = children.get(childName);
 			}
@@ -152,31 +155,35 @@ public class InfinispanCacheWrapper implements CacheWrapper<Object> {
 		return (Serializable)elem;
 	}
 
+	@Override
 	public void remove(Object key) {
 		synchronized (cache) {//cluster_ok by definition of this class as used in single vm
 			cache.remove(key);
 		}
 	}
 	
-	public void update(Object key, Serializable value) {
-		// update is the same as put for the singlevm mode
-		synchronized (cache) {//cluster_ok by definition of this class as used in single vm
+	@Override
+	public Serializable update(Object key, Serializable value) {
+		Serializable reloaded;
+		synchronized (cache) {
 			if(cache.containsKey(key)) {
-				cache.replace(key, value);
+				reloaded = cache.replace(key, value);
 			} else {
-				cache.put(key, value);
+				reloaded = cache.put(key, value);
 			}
 		}	
+		return reloaded;
 	}
 
-	public void put(Object key, Serializable value) {
-		// put is the same as update for the singlevm mode
-		synchronized (cache) {//cluster_ok by definition of this class as used in single vm
-			cache.put(key, value);
+	@Override
+	public Serializable put(Object key, Serializable value) {
+		Serializable reloaded;
+		synchronized (cache) {
+			reloaded = cache.put(key, value);
 		}
+		return reloaded;
 	}
 
-	
 	protected String getCacheName() {
 		return cacheName;
 	}
diff --git a/src/main/java/org/olat/core/util/cache/n/InfinispanCacher.java b/src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacher.java
similarity index 94%
rename from src/main/java/org/olat/core/util/cache/n/InfinispanCacher.java
rename to src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacher.java
index e797ad57a5f8c13f4fe7329e0f12e91a5fe9a5c1..9389b8bcbb45277387ea09950f26dfb975ccb901 100644
--- a/src/main/java/org/olat/core/util/cache/n/InfinispanCacher.java
+++ b/src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacher.java
@@ -23,11 +23,13 @@
 * under the Apache 2.0 license as the original file.  
 * <p>
 */ 
-package org.olat.core.util.cache.n;
+package org.olat.core.util.cache.infinispan;
 
 import org.infinispan.manager.EmbeddedCacheManager;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.AssertException;
+import org.olat.core.util.cache.CacheConfig;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.Cacher;
 import org.olat.core.util.resource.OresHelper;
 
diff --git a/src/main/java/org/olat/core/util/coordinate/Cacher.java b/src/main/java/org/olat/core/util/coordinate/Cacher.java
index b5d2ba96ab4181a320bfe970e9166379f04d7b62..176ab325706b1fdbe096531890e909689d1222b3 100644
--- a/src/main/java/org/olat/core/util/coordinate/Cacher.java
+++ b/src/main/java/org/olat/core/util/coordinate/Cacher.java
@@ -26,7 +26,7 @@
 package org.olat.core.util.coordinate;
 
 import org.infinispan.manager.EmbeddedCacheManager;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 
 /**
  * Description:<br>
diff --git a/src/main/java/org/olat/core/util/resource/OresHelper.java b/src/main/java/org/olat/core/util/resource/OresHelper.java
index 5eac00e86cdf024f44403b39d97c639a72aacb8e..fd45b9cb75286aedea70faf563cab2585277b888 100644
--- a/src/main/java/org/olat/core/util/resource/OresHelper.java
+++ b/src/main/java/org/olat/core/util/resource/OresHelper.java
@@ -52,26 +52,20 @@ public class OresHelper {
 	public static OLATResourceable createOLATResourceableInstance(final String type, final Long key) {
 		if (key == null) throw new AssertException("key may not be null; type = "+type);
 		if (type.length() > ORES_TYPE_LENGTH) throw new AssertException("Olatresource type may not exceed 50 chars: type="+type);
-		return new OLATResourceable() {
-			public String getResourceableTypeName() {
-				return type;
-			}
-			public Long getResourceableId() {
-				return key;
-			}
-		};
+		return new Resourceable(type, key);
 	}
 
 	public static OLATResourceable createOLATResourceableType(final String type) {
 		return createOLATResourceableInstance(type, new Long(0));
 	}
 	
-	public static OLATResourceable createOLATResourceableType(Class clazz) {
+	public static OLATResourceable createOLATResourceableType(Class<?> clazz) {
 		return createOLATResourceableType(clazz.getName());
 	}
 	
-
-	
+	public static OLATResourceable clone(OLATResourceable original) {
+		return new Resourceable(original.getResourceableTypeName(), original.getResourceableId());
+	}
 
 	/**
 	 * Use only when you need to create a new olatresourceable instance.
@@ -81,7 +75,7 @@ public class OresHelper {
 	 * @param key the key; may not be null!
 	 * @return OLATResourceable instance
 	 */
-	public static OLATResourceable createOLATResourceableInstance(Class aClass, final Long key) {
+	public static OLATResourceable createOLATResourceableInstance(Class<?> aClass, final Long key) {
 		String type = calculateTypeName(aClass);
 		return createOLATResourceableInstance(type, key);
 	}
@@ -163,7 +157,7 @@ public class OresHelper {
 	 * @param aClass the class representing the type: NOTE: aClass.getName() may not exceed 50 chars
 	 * @return OLATResourceable
 	 */
-	public static OLATResourceable lookupType(Class aClass) {
+	public static OLATResourceable lookupType(Class<?> aClass) {
 		return lookupType(aClass, null);
 	}
 	
@@ -172,7 +166,7 @@ public class OresHelper {
 	 * @param aClass
 	 * @return Calculated type name
 	 */
-	public static String calculateTypeName(Class aClass) {
+	public static String calculateTypeName(Class<?> aClass) {
 		return calculateTypeName(aClass, null);
 	}
 	
@@ -182,7 +176,7 @@ public class OresHelper {
 	 * @param subType May not exceed 15 characters
 	 * @return Calculated type name
 	 */
-	public static String calculateTypeName(Class aClass, String subType) {
+	public static String calculateTypeName(Class<?> aClass, String subType) {
 		String comp = aClass.getName();
 		int pos = comp.lastIndexOf(".");
 		if (pos == -1) throw new AssertException("class name without package!! (contains no dot):"+comp);
@@ -201,7 +195,7 @@ public class OresHelper {
 	 * @param aClass
 	 * @return True if ores is of type aClass
 	 */
-	public static boolean isOfType(OLATResourceable ores, Class aClass) {
+	public static boolean isOfType(OLATResourceable ores, Class<?> aClass) {
 		String type = ores.getResourceableTypeName();
 		String calcName = calculateTypeName(aClass, null);
 		boolean ok = (type.equals(calcName));
@@ -226,12 +220,9 @@ public class OresHelper {
 	 * @param subType may only contain a..z and 0..9; and may only be 15 chars long
 	 * @return OLATResourceable
 	 */
-	public static OLATResourceable lookupType(Class aClass, String subType) {
+	public static OLATResourceable lookupType(Class<?> aClass, String subType) {
 		final String type = calculateTypeName(aClass, subType); 
-		OLATResourceable ores = new OLATResourceable() {
-			public String getResourceableTypeName() { return type;	}
-			public Long getResourceableId() { return null;	}};
-		return ores;
+		return new Resourceable(type, null);
 	}
 	
 	/**
@@ -265,14 +256,6 @@ public class OresHelper {
 
 	public static OLATResourceable createOLATResourceableInstanceWithoutCheck(final String type,final Long key) {
 		if (key == null) throw new AssertException("key may not be null; type = "+type);
-		return new OLATResourceable() {
-			public String getResourceableTypeName() {
-				return type;
-			}
-			public Long getResourceableId() {
-				return key;
-			}
-		};
+		return new Resourceable(type,key);
 	}
-	
 }
diff --git a/src/main/java/org/olat/core/util/resource/Resourceable.java b/src/main/java/org/olat/core/util/resource/Resourceable.java
new file mode 100644
index 0000000000000000000000000000000000000000..a63944a7427ed903113dfd94b0243871ca43e129
--- /dev/null
+++ b/src/main/java/org/olat/core/util/resource/Resourceable.java
@@ -0,0 +1,86 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <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 the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <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>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.core.util.resource;
+
+import java.io.Serializable;
+
+import org.olat.core.id.OLATResourceable;
+
+/**
+ * An implementation of the OLATresourceable which is serializable
+ * 
+ * 
+ * Initial date: 19.12.2012<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class Resourceable implements OLATResourceable, Serializable, Cloneable {
+
+	private static final long serialVersionUID = 4493480617698403988L;
+	private String type;
+	private Long key;
+	
+	public Resourceable() {
+		//
+	}
+	
+	public Resourceable(String type, Long key) {
+		this.type = type;
+		this.key = key;
+	}
+	
+	@Override
+	public String getResourceableTypeName() {
+		return type;
+	}
+
+	@Override
+	public Long getResourceableId() {
+		return key;
+	}
+
+	@Override
+	public int hashCode() {
+		return (key == null ? 2938 : key.hashCode()) + (type == null ? 76678 : type.hashCode());
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if(this == obj) {
+			return true;
+		}
+		if(obj instanceof OLATResourceable) {
+			OLATResourceable ores = (OLATResourceable)obj;
+			return type != null && type.equals(ores.getResourceableTypeName())
+					&& key != null && key.equals(ores.getResourceableId());
+		}
+		return false;
+	}
+
+	@Override
+	public String toString() {
+		return "resourceable[type=" + type + ":id=" + key + "]" + super.toString();
+	}
+
+	@Override
+	protected Resourceable clone() {
+		return new Resourceable(type, key);
+	}
+}
diff --git a/src/main/java/org/olat/core/util/session/UserSessionManager.java b/src/main/java/org/olat/core/util/session/UserSessionManager.java
index 03fc0d122b6077dcc89161b7545e4014227695fe..b9d203b2220be2278f7d6b97bee7c7f03975adf3 100644
--- a/src/main/java/org/olat/core/util/session/UserSessionManager.java
+++ b/src/main/java/org/olat/core/util/session/UserSessionManager.java
@@ -52,7 +52,7 @@ import org.olat.core.logging.activity.UserActivityLoggerImpl;
 import org.olat.core.util.SessionInfo;
 import org.olat.core.util.SignOnOffEvent;
 import org.olat.core.util.UserSession;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.event.GenericEventListener;
 import org.olat.core.util.prefs.Preferences;
@@ -91,7 +91,7 @@ public class UserSessionManager implements GenericEventListener {
 	@Autowired
 	private HistoryManager historyManager;
 	
-	private CacheWrapper<Long> userSessionCache;
+	private CacheWrapper<Long,Integer> userSessionCache;
 	
 	@PostConstruct
 	public void initBean() {
diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java
index f980de6e1ad13e244676b257be85fdcc1dc05ccd..d7cdbe39f2af6ff75a80040af70ea427f9404b9d 100644
--- a/src/main/java/org/olat/course/CourseFactory.java
+++ b/src/main/java/org/olat/course/CourseFactory.java
@@ -76,7 +76,7 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.UserSession;
 import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerCallback;
 import org.olat.core.util.coordinate.SyncerExecutor;
diff --git a/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java b/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java
index e9cf3d01a3574449886638d1625e2d7a32fd82e9..9f7883bc9847466adfa23ae6185e0352b0f7f10e 100644
--- a/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java
+++ b/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java
@@ -48,7 +48,7 @@ import org.olat.core.logging.activity.StringResourceableType;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.manager.BasicManager;
 import org.olat.core.util.StringHelper;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerCallback;
 import org.olat.core.util.coordinate.SyncerExecutor;
diff --git a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
index 245b813c367f22623829862f3d994b221de26f79..a5d95c759dff89d360f5523fcdab2d6e40c7fd20 100644
--- a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
+++ b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
@@ -28,7 +28,7 @@ import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.Constants;
 import org.olat.basesecurity.SecurityGroup;
 import org.olat.core.CoreSpringFactory;
-import org.olat.core.commons.persistence.SyncHelper;
+import org.olat.core.commons.persistence.PersistenceHelper;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.impl.Form;
@@ -88,13 +88,13 @@ public class ImportMemberOverviewIdentitiesController extends StepFormBasicContr
 				isanonymous.add(identityKey);
 			} else {
 				// check if already in group
-				boolean inGroup = SyncHelper.containsPersistable(existIdents, ident);
+				boolean inGroup = PersistenceHelper.containsPersistable(existIdents, ident);
 				if (inGroup) {
 					// added to warning: already in group
 					alreadyin.add(ident.getName());
 				} else {
 					// ok to add -> preview (but filter duplicate entries)
-					if (!SyncHelper.containsPersistable(oks, ident)) {
+					if (!PersistenceHelper.containsPersistable(oks, ident)) {
 						oks.add(ident);
 					}
 				}
@@ -125,13 +125,13 @@ public class ImportMemberOverviewIdentitiesController extends StepFormBasicContr
 					isanonymous.add(username);
 				} else {
 					// check if already in group
-					boolean inGroup = SyncHelper.containsPersistable(existIdents, ident);
+					boolean inGroup = PersistenceHelper.containsPersistable(existIdents, ident);
 					if (inGroup) {
 						// added to warning: already in group
 						alreadyin.add(ident.getName());
 					} else {
 						// ok to add -> preview (but filter duplicate entries)
-						if (!SyncHelper.containsPersistable(oks, ident)) {
+						if (!PersistenceHelper.containsPersistable(oks, ident)) {
 							oks.add(ident);
 						}
 					}
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java
index 2874b16e9239989116e8f3f7be680587a4989454..2dafda73bfa2e09e853e784bd2a1dafd77c625a9 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java
@@ -46,7 +46,7 @@ import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.manager.BasicManager;
 import org.olat.core.util.FileUtils;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerCallback;
 import org.olat.core.util.coordinate.SyncerExecutor;
diff --git a/src/main/java/org/olat/ims/qti/process/QTIHelper.java b/src/main/java/org/olat/ims/qti/process/QTIHelper.java
index 043ea41ffd522c1468e2fb05cfcf31d046afc41a..ad3f5de01ded99c5efb741bf0532759410e46c73 100644
--- a/src/main/java/org/olat/ims/qti/process/QTIHelper.java
+++ b/src/main/java/org/olat/ims/qti/process/QTIHelper.java
@@ -38,7 +38,7 @@ import org.dom4j.Document;
 import org.dom4j.Element;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.ObjectCloner;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.vfs.LocalFileImpl;
 import org.olat.core.util.vfs.LocalFolderImpl;
diff --git a/src/main/java/org/olat/instantMessaging/InstantMessagingService.java b/src/main/java/org/olat/instantMessaging/InstantMessagingService.java
index d8291d1273fa28a7c2984455abe1ccd996abf6e4..40fcc48db9cab91c789ad20082a7a8b43219ef10 100644
--- a/src/main/java/org/olat/instantMessaging/InstantMessagingService.java
+++ b/src/main/java/org/olat/instantMessaging/InstantMessagingService.java
@@ -77,7 +77,7 @@ public interface InstantMessagingService {
 	 * @param chatResource
 	 * @param listener
 	 */
-	public void unlistenChat(OLATResourceable chatResource, GenericEventListener listener);
+	public void unlistenChat(Identity identity, OLATResourceable chatResource, GenericEventListener listener);
 	
 	/**
 	 * Factory method to build the OLATResourceable for privat chat
diff --git a/src/main/java/org/olat/instantMessaging/OpenInstantMessageEvent.java b/src/main/java/org/olat/instantMessaging/OpenInstantMessageEvent.java
index 2c7cb165ddec4d82002bc927fc6f4dbe7b4ae773..7345ed538ee0f3c79d96241504c4b407cd1787fe 100644
--- a/src/main/java/org/olat/instantMessaging/OpenInstantMessageEvent.java
+++ b/src/main/java/org/olat/instantMessaging/OpenInstantMessageEvent.java
@@ -55,7 +55,7 @@ public class OpenInstantMessageEvent extends MultiUserEvent {
 	}
 	
 	public OpenInstantMessageEvent(UserRequest ureq, RosterEntry entry) {
-		this(ureq, new Buddy(entry.getIdentityKey(), entry.getName()));
+		this(ureq, new Buddy(entry.getIdentityKey(), entry.getFullName(), entry.getNickName()));
 	}
 	
 	public OpenInstantMessageEvent(UserRequest ureq, OLATResourceable ores, String roomName) {
diff --git a/src/main/java/org/olat/instantMessaging/manager/InstantMessagingServiceImpl.java b/src/main/java/org/olat/instantMessaging/manager/InstantMessagingServiceImpl.java
index 2ebdeafacdeeb9c2c8ea82c7cfa8908d02ecf79f..0ff8bed0428b703088e083d78716854a823863dc 100644
--- a/src/main/java/org/olat/instantMessaging/manager/InstantMessagingServiceImpl.java
+++ b/src/main/java/org/olat/instantMessaging/manager/InstantMessagingServiceImpl.java
@@ -22,7 +22,6 @@ package org.olat.instantMessaging.manager;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.List;
-import java.util.Set;
 
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.IdentityShort;
@@ -43,6 +42,7 @@ import org.olat.instantMessaging.InstantMessagingService;
 import org.olat.instantMessaging.model.Buddy;
 import org.olat.instantMessaging.model.BuddyStats;
 import org.olat.instantMessaging.model.InstantMessageImpl;
+import org.olat.instantMessaging.model.RosterEntryImpl;
 import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -56,6 +56,8 @@ import org.springframework.stereotype.Service;
 @Service
 public class InstantMessagingServiceImpl extends BasicManager implements InstantMessagingService {
 	
+	@Autowired
+	private RosterDAO rosterDao;
 	@Autowired
 	private InstantMessageDAO imDao;
 	@Autowired
@@ -73,7 +75,6 @@ public class InstantMessagingServiceImpl extends BasicManager implements Instant
 	@Autowired
 	private BaseSecurity securityManager;
 
-	
 	@Override
 	public String getStatus(Long identityKey) {
 		return "available";
@@ -182,7 +183,7 @@ public class InstantMessagingServiceImpl extends BasicManager implements Instant
 	public Buddy getBuddyById(Long identityKey) {
 		IdentityShort identity = securityManager.loadIdentityShortByKey(identityKey);
 		String fullname = userManager.getUserDisplayName(identity);
-		return new Buddy(identity.getKey(), fullname);
+		return new Buddy(identity.getKey(), fullname, null);
 	}
 
 	@Override
@@ -191,7 +192,7 @@ public class InstantMessagingServiceImpl extends BasicManager implements Instant
 		List<Buddy> buddies = new ArrayList<Buddy>(contacts.size());
 		for(Identity contact:contacts) {
 			String fullname = userManager.getUserDisplayName(contact.getUser());
-			buddies.add(new Buddy(contact.getKey(), fullname));
+			buddies.add(new Buddy(contact.getKey(), fullname, null));
 		}
 		return buddies;
 	}
@@ -203,12 +204,10 @@ public class InstantMessagingServiceImpl extends BasicManager implements Instant
 		List<Buddy> buddies = new ArrayList<Buddy>(contacts.size());
 		for(Identity contact:contacts) {
 			String fullname = userManager.getUserDisplayName(contact.getUser());
-			buddies.add(new Buddy(contact.getKey(), fullname));
+			buddies.add(new Buddy(contact.getKey(), fullname, null));
 		}
 		return buddies;
 	}
-	
-	
 
 	@Override
 	public BuddyStats getBuddyStats(Identity me) {
@@ -223,24 +222,26 @@ public class InstantMessagingServiceImpl extends BasicManager implements Instant
 
 	@Override
 	public List<Buddy> getBuddiesListenTo(OLATResourceable chatResource) {
-		Set<String> names = coordinator.getCoordinator().getEventBus().getListeningIdentityNamesFor(chatResource);
-		List<Identity> identities = securityManager.findIdentitiesByName(names);
+		List<RosterEntryImpl> roster = rosterDao.getRoster(chatResource, 0, -1);
 		List<Buddy> buddies = new ArrayList<Buddy>();
-		for(Identity identity:identities) {
-			String fullname = userManager.getUserDisplayName(identity.getUser());
-			buddies.add(new Buddy(identity.getKey(), fullname));
+		if(roster != null) {
+			for(RosterEntryImpl entry:roster) {
+				buddies.add(new Buddy(entry.getIdentityKey(), entry.getFullName(), entry.getNickName()));
+			}
 		}
 		return buddies;
-		
 	}
 
 	@Override
 	public void listenChat(Identity identity, OLATResourceable chatResource, GenericEventListener listener) {
+		String fullName = userManager.getUserDisplayName(identity.getUser());
+		rosterDao.createRosterEntry(chatResource, identity, fullName, null, false);
 		coordinator.getCoordinator().getEventBus().registerFor(listener, identity, chatResource);
 	}
 
 	@Override
-	public void unlistenChat(OLATResourceable chatResource, GenericEventListener listener) {
+	public void unlistenChat(Identity identity, OLATResourceable chatResource, GenericEventListener listener) {
+		rosterDao.deleteEntry(identity, chatResource);
 		coordinator.getCoordinator().getEventBus().deregisterFor(listener, chatResource);
 	}
 
@@ -253,10 +254,4 @@ public class InstantMessagingServiceImpl extends BasicManager implements Instant
 	public void enableChat(Identity identity) {
 		//
 	}
-	
-	
-
-	
-
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/instantMessaging/manager/RosterDAO.java b/src/main/java/org/olat/instantMessaging/manager/RosterDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..b07b8fd4b78d6f112baf7d847b93be5e23a8d3e1
--- /dev/null
+++ b/src/main/java/org/olat/instantMessaging/manager/RosterDAO.java
@@ -0,0 +1,85 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <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 the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <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>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.instantMessaging.manager;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.TypedQuery;
+
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.id.Identity;
+import org.olat.core.id.OLATResourceable;
+import org.olat.instantMessaging.model.RosterEntryImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 
+ * Initial date: 07.12.2012<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+@Service
+public class RosterDAO {
+	
+	@Autowired
+	private DB dbInstance;
+	
+	public RosterEntryImpl createRosterEntry(OLATResourceable chatResource, Identity from, String fullName, String nickName, boolean anonym) {
+		RosterEntryImpl entry = new RosterEntryImpl();
+		entry.setIdentityKey(from.getKey());
+		entry.setNickName(nickName);
+		entry.setFullName(fullName);
+		entry.setAnonym(anonym);
+		entry.setResourceTypeName(chatResource.getResourceableTypeName());
+		entry.setResourceId(chatResource.getResourceableId());
+		entry.setCreationDate(new Date());
+		dbInstance.getCurrentEntityManager().persist(entry);
+		return entry;
+	}
+
+	public List<RosterEntryImpl> getRoster(OLATResourceable ores, int firstResult, int maxResults) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("select entry from ").append(RosterEntryImpl.class.getName()).append(" entry ")
+		  .append(" where entry.resourceId=:resid and entry.resourceTypeName=:resname");
+		
+		TypedQuery<RosterEntryImpl> query = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), RosterEntryImpl.class)
+				.setParameter("resid", ores.getResourceableId())
+				.setParameter("resname", ores.getResourceableTypeName())
+				.setFirstResult(firstResult);
+		if(maxResults > 0) {
+			query.setMaxResults(maxResults);
+		}
+		return query.getResultList();
+	}
+	
+	public void deleteEntry(Identity identity, OLATResourceable ores) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("delete from ").append(RosterEntryImpl.class.getName()).append(" entry ")
+		  .append(" where entry.identityKey=:identityKey")
+		  .append(" and entry.resourceId=:resid and entry.resourceTypeName=:resname");
+		
+		dbInstance.getCurrentEntityManager().createQuery(sb.toString())
+				.setParameter("identityKey", identity.getKey())
+				.setParameter("resid", ores.getResourceableId())
+				.setParameter("resname", ores.getResourceableTypeName())
+				.executeUpdate();
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/instantMessaging/model/Buddy.java b/src/main/java/org/olat/instantMessaging/model/Buddy.java
index 9abbcd994da074bfab341317e62562895f85360b..0783fb40e375fcacebe31399c759a0f0b59635d7 100644
--- a/src/main/java/org/olat/instantMessaging/model/Buddy.java
+++ b/src/main/java/org/olat/instantMessaging/model/Buddy.java
@@ -31,10 +31,12 @@ public class Buddy implements OLATResourceable, Comparable<Buddy> {
 
 	private final Long identityKey;
 	private final String fullname;
+	private final String nickName;
 	
-	public Buddy(Long identityKey, String fullname) {
+	public Buddy(Long identityKey, String fullname, String nickName) {
 		this.identityKey = identityKey;
 		this.fullname = fullname;
+		this.nickName = nickName;
 	}
 	
 	public String getStatus() {
@@ -45,6 +47,9 @@ public class Buddy implements OLATResourceable, Comparable<Buddy> {
 		return identityKey;
 	}
 
+	public String getNickName() {
+		return nickName;
+	}
 
 	public String getFullname() {
 		return fullname;
diff --git a/src/main/java/org/olat/instantMessaging/model/RosterEntryImpl.java b/src/main/java/org/olat/instantMessaging/model/RosterEntryImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..12971cd967a4d2569eb24b935eb61c2f0ee9ee09
--- /dev/null
+++ b/src/main/java/org/olat/instantMessaging/model/RosterEntryImpl.java
@@ -0,0 +1,134 @@
+package org.olat.instantMessaging.model;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.olat.core.id.CreateInfo;
+import org.olat.core.id.Persistable;
+
+@Entity
+@Table(name="o_im_roster_entry")
+public class RosterEntryImpl implements Persistable, CreateInfo {
+
+	private static final long serialVersionUID = -4265724240924748369L;
+
+	@Id
+  @GeneratedValue(generator = "system-uuid")
+  @GenericGenerator(name = "system-uuid", strategy = "hilo")
+	@Column(name="id", nullable=false, unique=true, insertable=true, updatable=false)
+	private Long key;
+	
+	@Temporal(TemporalType.TIMESTAMP)
+	@Column(name="creationdate", nullable=false, insertable=true, updatable=false)
+	private Date creationDate;
+
+	@Column(name="fk_identity_id", nullable=false, insertable=true, updatable=false)
+	private Long identityKey;
+	@Column(name="r_nickname", nullable=true, insertable=true, updatable=true)
+	private String nickName;
+	@Column(name="r_fullname", nullable=true, insertable=true, updatable=true)
+	private String fullName;
+	@Column(name="r_anonym", nullable=true, insertable=true, updatable=true)
+	private boolean anonym;
+	
+	@Column(name="r_resname", nullable=false, insertable=true, updatable=false)
+	private String resourceTypeName;
+	@Column(name="r_resid", nullable=false, insertable=true, updatable=false)
+	private Long resourceId;
+	
+	@Override
+	public Long getKey() {
+		return key;
+	}
+	
+	public void setKey(Long key) {
+		this.key = key;
+	}
+		
+	@Override
+	public Date getCreationDate() {
+		return creationDate;
+	}
+	
+	public void setCreationDate(Date creationDate) {
+		this.creationDate = creationDate;
+	}
+
+	public Long getIdentityKey() {
+		return identityKey;
+	}
+
+	public void setIdentityKey(Long identityKey) {
+		this.identityKey = identityKey;
+	}
+
+	public String getNickName() {
+		return nickName;
+	}
+
+	public void setNickName(String nickName) {
+		this.nickName = nickName;
+	}
+
+	public String getFullName() {
+		return fullName;
+	}
+
+	public void setFullName(String fullName) {
+		this.fullName = fullName;
+	}
+
+	public boolean isAnonym() {
+		return anonym;
+	}
+
+	public void setAnonym(boolean anonym) {
+		this.anonym = anonym;
+	}
+	
+	public String getResourceTypeName() {
+		return resourceTypeName;
+	}
+
+	public void setResourceTypeName(String resourceTypeName) {
+		this.resourceTypeName = resourceTypeName;
+	}
+
+	public Long getResourceId() {
+		return resourceId;
+	}
+
+	public void setResourceId(Long resourceId) {
+		this.resourceId = resourceId;
+	}
+
+	@Override
+	public int hashCode() {
+		return key == null ? 92867 : key.hashCode();
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if(this == obj) {
+			return true;
+		}
+		if(obj instanceof RosterEntryImpl) {
+			RosterEntryImpl entry = (RosterEntryImpl)obj;
+			return key != null && key.equals(entry.key);
+		}
+		return false;
+	}
+
+	@Override
+	public boolean equalsByPersistableKey(Persistable persistable) {	
+		return equals(persistable);
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/instantMessaging/ui/ChatController.java b/src/main/java/org/olat/instantMessaging/ui/ChatController.java
index 7ab506ac3ad89c55d0e0312a700f7aee2414caa8..2de14d7e6ea1d3b88c5cd913e2da9f7019b96658 100644
--- a/src/main/java/org/olat/instantMessaging/ui/ChatController.java
+++ b/src/main/java/org/olat/instantMessaging/ui/ChatController.java
@@ -165,6 +165,7 @@ public class ChatController extends BasicController implements GenericEventListe
 		refresh.setTitle("im.refresh");
 
 		putInitialPanel(chatPanelCtr.getInitialComponent());
+		doSendPresence(toggleAnonymousForm.getNickName(), toggleAnonymousForm.isUseNickName());
 	}
 	
 	public OLATResourceable getOlatResourceable() {
@@ -174,7 +175,7 @@ public class ChatController extends BasicController implements GenericEventListe
 	@Override
 	protected void doDispose() {
 		allChats.remove(Integer.toString(hashCode()));
-		imService.unlistenChat(getOlatResourceable(), this);
+		imService.unlistenChat(getIdentity(), getOlatResourceable(), this);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/instantMessaging/ui/ChatManagerController.java b/src/main/java/org/olat/instantMessaging/ui/ChatManagerController.java
index 27ee32c3659d921c0273e3d273860d8888c50780..6cf88edcd8a2eaa61ccf8d33383f4e8a0010d024 100644
--- a/src/main/java/org/olat/instantMessaging/ui/ChatManagerController.java
+++ b/src/main/java/org/olat/instantMessaging/ui/ChatManagerController.java
@@ -83,7 +83,7 @@ public class ChatManagerController extends BasicController {
 				container.remove(c);
 				
 				ChatController chatCtr = (ChatController)source;
-				imService.unlistenChat(chatCtr.getOlatResourceable(), chatCtr);
+				imService.unlistenChat(getIdentity(), chatCtr.getOlatResourceable(), chatCtr);
 			}
 			//forward event also to main controller
 			fireEvent(ureq, event);
diff --git a/src/main/java/org/olat/instantMessaging/ui/InstantMessagingMainController.java b/src/main/java/org/olat/instantMessaging/ui/InstantMessagingMainController.java
index 5822afd9820861a5d85a7cee29d07f0765849c1a..54895b862e605ae45327c60ad0d403be5d4697f0 100644
--- a/src/main/java/org/olat/instantMessaging/ui/InstantMessagingMainController.java
+++ b/src/main/java/org/olat/instantMessaging/ui/InstantMessagingMainController.java
@@ -163,7 +163,7 @@ public class InstantMessagingMainController extends BasicController implements G
 	 */
 	@Override
 	protected void doDispose() {
-		imService.unlistenChat(getPrivatListenToResourceable(), this);
+		imService.unlistenChat(getIdentity(), getPrivatListenToResourceable(), this);
 		singleUserEventCenter.deregisterFor(this, InstantMessagingService.ASSESSMENT_EVENT_ORES);
 		singleUserEventCenter.deregisterFor(this, InstantMessagingService.TOWER_EVENT_ORES);
 	}
diff --git a/src/main/java/org/olat/instantMessaging/ui/Roster.java b/src/main/java/org/olat/instantMessaging/ui/Roster.java
index 6d00e35e1be8dca551c04d8a6c4ff59095471527..c516fb7e7e45ac9ddc65c3a26f17fc228a1981f6 100644
--- a/src/main/java/org/olat/instantMessaging/ui/Roster.java
+++ b/src/main/java/org/olat/instantMessaging/ui/Roster.java
@@ -68,6 +68,8 @@ public class Roster {
 			for(Buddy buddy:buddies) {
 				if(identityKey != null && identityKey.equals(buddy.getIdentityKey())) {
 					//continue
+				} else if(buddy.getIdentityKey() == null) {
+					//do nothing
 				} else if(contains(buddy.getIdentityKey())) {
 					//update status
 					get(buddy.getIdentityKey()).setStatus(buddy.getStatus());
diff --git a/src/main/java/org/olat/login/LoginModule.java b/src/main/java/org/olat/login/LoginModule.java
index 3a4ee5f350d67c4f51351a8f649925bf22b7000c..5f55b2bf2f2106c31e209b0a64b51859229e86cb 100644
--- a/src/main/java/org/olat/login/LoginModule.java
+++ b/src/main/java/org/olat/login/LoginModule.java
@@ -33,7 +33,7 @@ import org.olat.core.configuration.AbstractOLATModule;
 import org.olat.core.configuration.PersistedProperties;
 import org.olat.core.logging.StartupException;
 import org.olat.core.logging.Tracing;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.login.auth.AuthenticationProvider;
 
diff --git a/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java b/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java
index aed7ae34f17e4a16b8f01613834300d5daa527f4..38d3f9ce2650d9e8db03eebd87aad192f87ff690 100644
--- a/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java
+++ b/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java
@@ -43,7 +43,7 @@ import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.WebappHelper;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.group.BusinessGroup;
 import org.olat.modules.openmeetings.OpenMeetingsModule;
diff --git a/src/main/java/org/olat/modules/webFeed/dispatching/Path.java b/src/main/java/org/olat/modules/webFeed/dispatching/Path.java
index 4116647ddea414abf22df0aaf56d8c1bbd54dbad..cc4540b2403d2f5f57846e5572c84c148bf8d599 100644
--- a/src/main/java/org/olat/modules/webFeed/dispatching/Path.java
+++ b/src/main/java/org/olat/modules/webFeed/dispatching/Path.java
@@ -31,7 +31,7 @@ import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.core.helpers.Settings;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerExecutor;
 import org.olat.modules.webFeed.managers.FeedManager;
diff --git a/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java b/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java
index 2d74ed78901e9fc6bd079d7d702653e7c0b80d2e..4aa588550fe05877a55b787d3892452fc25a8b0c 100644
--- a/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java
+++ b/src/main/java/org/olat/modules/webFeed/managers/FeedManagerImpl.java
@@ -45,7 +45,7 @@ import org.olat.core.util.Formatter;
 import org.olat.core.util.ImageHelper;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.ZipUtil;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.Coordinator;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.LockResult;
diff --git a/src/main/java/org/olat/modules/wiki/WikiManager.java b/src/main/java/org/olat/modules/wiki/WikiManager.java
index 5c7cfb668e211b10411351a999b01454fa8f3c40..c1423b7288c11d40842ee5fef01224895f3f1e8e 100644
--- a/src/main/java/org/olat/modules/wiki/WikiManager.java
+++ b/src/main/java/org/olat/modules/wiki/WikiManager.java
@@ -44,7 +44,7 @@ import org.olat.core.logging.activity.LearningResourceLoggingAction;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.manager.BasicManager;
 import org.olat.core.util.FileUtils;
-import org.olat.core.util.cache.n.CacheWrapper;
+import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.controller.OLATResourceableListeningWrapperController;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerExecutor;
diff --git a/src/main/resources/database/mysql/alter_8_3_0_to_8_4_0.sql b/src/main/resources/database/mysql/alter_8_3_0_to_8_4_0.sql
index 4baa9053a7be745752ddc41ef4f2b6db56ee93b0..c77e1d1f987819d92f7f4bcc35f59a5179b49f25 100644
--- a/src/main/resources/database/mysql/alter_8_3_0_to_8_4_0.sql
+++ b/src/main/resources/database/mysql/alter_8_3_0_to_8_4_0.sql
@@ -26,6 +26,20 @@ alter table o_im_notification add constraint idx_im_not_to_toid foreign key (fk_
 alter table o_im_notification add constraint idx_im_not_to_fromid foreign key (fk_from_identity_id) references o_bs_identity (id);
 create index idx_im_chat_res_idx on o_im_notification (chat_resid,chat_resname);
 
+create table if not exists o_im_roster_entry (
+   id bigint not null,
+   creationdate datetime,
+   r_resname varchar(50) not null,
+   r_resid bigint not null,
+   r_nickname varchar(255),
+   r_fullname varchar(255),
+   r_anonym bit default 0,
+   fk_identity_id bigint not null,
+   primary key (id)
+);
+alter table o_im_roster_entry add constraint idx_im_rost_to_id foreign key (fk_identity_id) references o_bs_identity (id);
+create index idx_im_rost_res_idx on o_im_roster_entry (r_resid,r_resname);
+
 create table if not exists o_im_preferences (
    id bigint not null,
    creationdate datetime,
diff --git a/src/main/resources/serviceconfig/org/olat/core/_spring/olatcoreconfig.xml b/src/main/resources/serviceconfig/org/olat/core/_spring/olatcoreconfig.xml
index c48a04b9e180422105d9a7d33f967f1fab0beb15..b49e9e78f4678930900793ece2aeadec78baa4be 100644
--- a/src/main/resources/serviceconfig/org/olat/core/_spring/olatcoreconfig.xml
+++ b/src/main/resources/serviceconfig/org/olat/core/_spring/olatcoreconfig.xml
@@ -46,15 +46,15 @@
 	<property name="cacher" ref="infinispanCacher"/>
 </bean>
 
-<bean id="infinispanCacheManager" class="org.olat.core.util.cache.n.InfinispanCacheManager">
+<bean id="infinispanCacheManager" class="org.olat.core.util.cache.infinispan.InfinispanCacheManager">
 	<property name="configuration" value="infinispan-config.xml"/>
 	<property name="jndiName" value="${infinispan.jndi}"/>
 </bean>
 
-<bean id="infinispanCacher" class="org.olat.core.util.cache.n.InfinispanCacher" init-method="init">
+<bean id="infinispanCacher" class="org.olat.core.util.cache.infinispan.InfinispanCacher" init-method="init">
 	<constructor-arg index="0" ref="infinispanCacheManager"/>
 	<property name="rootConfig">
-		<bean class="org.olat.core.util.cache.n.CacheConfig">
+		<bean class="org.olat.core.util.cache.CacheConfig">
 			<property name="childrenConfig">
 				<map>
 					<entry key="org.olat.login.LoginModule_blockafterfailedattempts" value-ref="org.olat.login.LoginModule_blockafterfailedattempts" />
@@ -78,72 +78,72 @@
 	
 <!-- cache beans -->
 	
-<bean id="org.olat.login.LoginModule_blockafterfailedattempts" class="org.olat.core.util.cache.n.CacheConfig" >
+<bean id="org.olat.login.LoginModule_blockafterfailedattempts" class="org.olat.core.util.cache.CacheConfig" >
 	<property name="timeToLive" value="300" />
 	<property name="timeToIdle" value="0" />
 	<property name="maxElementsInMemory" value="1000" />
 </bean>
 
-<bean id="org.olat.commons.servlets.RSSServlet_rssdocs" class="org.olat.core.util.cache.n.CacheConfig">
+<bean id="org.olat.commons.servlets.RSSServlet_rssdocs" class="org.olat.core.util.cache.CacheConfig">
 	<property name="timeToLive" value="190" />
 	<property name="timeToIdle" value="0" />
 	<property name="maxElementsInMemory" value="200" />								
 </bean>
-<bean id="org.olat.ims.qti.process.QTIHelper_QTI_xml_Documents" class="org.olat.core.util.cache.n.CacheConfig">
+<bean id="org.olat.ims.qti.process.QTIHelper_QTI_xml_Documents" class="org.olat.core.util.cache.CacheConfig">
 	<property name="timeToLive" value="3600" />
 	<property name="timeToIdle" value="1800" />
 	<!-- qti files may be large -->
 	<property name="maxElementsInMemory" value="20" />
 </bean>					
-<bean id="org.olat.modules.wiki.WikiManager_wiki" class="org.olat.core.util.cache.n.CacheConfig">
+<bean id="org.olat.modules.wiki.WikiManager_wiki" class="org.olat.core.util.cache.CacheConfig">
 	<property name="timeToLive" value="14400" />
 	<property name="timeToIdle" value="1800" />
 	<property name="maxElementsInMemory" value="50" />								
 </bean>
-<bean id="org.olat.commons.calendar.ICalFileCalendarManager_calendar" class="org.olat.core.util.cache.n.CacheConfig">
+<bean id="org.olat.commons.calendar.ICalFileCalendarManager_calendar" class="org.olat.core.util.cache.CacheConfig">
 	<property name="timeToLive" value="3600" />
 	<property name="timeToIdle" value="3600" />
 	<property name="maxElementsInMemory" value="50" />								
 </bean>
-<bean id="org.olat.course.CourseFactory_courses" class="org.olat.core.util.cache.n.CacheConfig">
+<bean id="org.olat.course.CourseFactory_courses" class="org.olat.core.util.cache.CacheConfig">
 	<property name="timeToLive" value="0" />
 	<property name="timeToIdle" value="3600" />
 	<property name="maxElementsInMemory" value="${course.cache.elements}" />								
 </bean>
-<bean id="org.olat.collaboration.CollaborationToolsFactory_tools" class="org.olat.core.util.cache.n.CacheConfig">
+<bean id="org.olat.collaboration.CollaborationToolsFactory_tools" class="org.olat.core.util.cache.CacheConfig">
 		<property name="timeToLive" value="3600" />
 		<property name="timeToIdle" value="1800" />
 		<property name="maxElementsInMemory" value="5000" />								
 </bean>
-<bean id="org.olat.core.modules.glossary.GlossaryItemManager_glossary" class="org.olat.core.util.cache.n.CacheConfig">
+<bean id="org.olat.core.modules.glossary.GlossaryItemManager_glossary" class="org.olat.core.util.cache.CacheConfig">
 		<property name="timeToLive" value="7200" />
 		<property name="timeToIdle" value="1800" />
 		<property name="maxElementsInMemory" value="50" />								
 </bean>
-<bean id="org.olat.course.nodes.projectbroker.service.ProjectBrokerManagerImpl_pb" class="org.olat.core.util.cache.n.CacheConfig">
+<bean id="org.olat.course.nodes.projectbroker.service.ProjectBrokerManagerImpl_pb" class="org.olat.core.util.cache.CacheConfig">
 	<property name="timeToLive" value="3600" />
 	<property name="timeToIdle" value="3600" />
 	<property name="maxElementsInMemory" value="50" />								
 </bean>
-<bean id="org.olat.commons.servlets.WebDAVManagerImpl_webdav" class="org.olat.core.util.cache.n.CacheConfig">
+<bean id="org.olat.commons.servlets.WebDAVManagerImpl_webdav" class="org.olat.core.util.cache.CacheConfig">
 	<property name="timeToLive" value="1800" />
 	<property name="timeToIdle" value="300" />
 	<property name="maxElementsInMemory" value="200" />								
 </bean>
 
 <!--  caching for the olat course. a cache is segemented as follows: first per course, then per identity -->
-<bean id="org.olat.course.assessment.NewCachePersistingAssessmentManager" class="org.olat.core.util.cache.n.CacheConfig">
+<bean id="org.olat.course.assessment.NewCachePersistingAssessmentManager" class="org.olat.core.util.cache.CacheConfig">
 	<property name="timeToLive" value="1" />
 	<property name="timeToIdle" value="1" />
 	<property name="maxElementsInMemory" value="1" />	
 	<property name="childrenConfig">
 		<map>
 			<entry key="CourseModule">
-				<bean class="org.olat.core.util.cache.n.CacheConfig">													
+				<bean class="org.olat.core.util.cache.CacheConfig">													
 					<property name="childrenConfig">
 						<map>
 							<entry key="Identity">
-								<bean class="org.olat.core.util.cache.n.CacheConfig">
+								<bean class="org.olat.core.util.cache.CacheConfig">
 									<property name="timeToLive" value="0" />
 									<property name="timeToIdle" value="60" />
 									<property name="maxElementsInMemory" value="1000" />
@@ -157,11 +157,11 @@
 				here: a course (e.g. when a course has either tons of visitors, or tons of (assessable) nodes.
 			 -->
 			<entry key="CourseModule_dfdsf">
-				<bean class="org.olat.core.util.cache.n.CacheConfig">													
+				<bean class="org.olat.core.util.cache.CacheConfig">													
 					<property name="childrenConfig">
 						<map>
 							<entry key="Identity">
-								<bean class="org.olat.core.util.cache.n.CacheConfig">
+								<bean class="org.olat.core.util.cache.CacheConfig">
 									<property name="timeToLive" value="0" />
 									<property name="timeToIdle" value="60" />
 									<property name="maxElementsInMemory" value="1000" />
@@ -175,7 +175,7 @@
 	</property>							
 </bean>
 
-<bean id="org.olat.core.util.UserSession" class="org.olat.core.util.cache.n.CacheConfig">
+<bean id="org.olat.core.util.UserSession" class="org.olat.core.util.cache.CacheConfig">
 	<property name="timeToLive" value="3600" />
 	<property name="timeToIdle" value="3600" />
 	<property name="maxElementsInMemory" value="2000" />								
diff --git a/src/test/java/org/olat/core/id/context/HistoryManagerTest.java b/src/test/java/org/olat/core/id/context/HistoryManagerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..fe4aba0c37d1e70b828be08deb06d27c2b49d253
--- /dev/null
+++ b/src/test/java/org/olat/core/id/context/HistoryManagerTest.java
@@ -0,0 +1,53 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <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 the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <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>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.core.id.context;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.olat.test.OlatTestCase;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 19.12.2012<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class HistoryManagerTest extends OlatTestCase {
+
+	@Autowired
+	private HistoryManager historyManager;
+	
+	@Test
+	public void xstreamBackwardsCompatibility() throws IOException, URISyntaxException {
+		URL xmlUrl = HistoryManagerTest.class.getResource("resume_ver1.xml");
+		assertNotNull(xmlUrl);
+		File resumeXml = new File(xmlUrl.toURI());
+		HistoryPoint history = historyManager.readHistory(resumeXml);
+		Assert.assertNotNull(history);
+	}
+}
diff --git a/src/test/java/org/olat/core/id/context/resume_ver1.xml b/src/test/java/org/olat/core/id/context/resume_ver1.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8dc1fbedc102bcc16e5a9ec5a65bfafa3ba569d1
--- /dev/null
+++ b/src/test/java/org/olat/core/id/context/resume_ver1.xml
@@ -0,0 +1,19 @@
+<org.olat.core.id.context.HistoryPointImpl>
+  <uuid>2</uuid>
+  <businessPath>[RepositorySite:0][search.my:0]</businessPath>
+  <entries>
+    <org.olat.core.id.context.MyContextEntry>
+      <olatResourceable class="org.olat.core.util.resource.OresHelper$1">
+        <val_-type>RepositorySite</val_-type>
+        <val_-key>0</val_-key>
+      </olatResourceable>
+      <state class="org.olat.core.id.context.StateSite"/>
+    </org.olat.core.id.context.MyContextEntry>
+    <org.olat.core.id.context.MyContextEntry>
+      <olatResourceable class="org.olat.core.util.resource.OresHelper$1">
+        <val_-type>search.my</val_-type>
+        <val_-key>0</val_-key>
+      </olatResourceable>
+    </org.olat.core.id.context.MyContextEntry>
+  </entries>
+</org.olat.core.id.context.HistoryPointImpl>
\ No newline at end of file