diff --git a/src/main/java/org/olat/basesecurity/AuthHelper.java b/src/main/java/org/olat/basesecurity/AuthHelper.java
index 96322db5829fdcc121d3490d291d9211f810e5aa..205ae0adb3dc9bbe54d8d202099669a628234c8c 100644
--- a/src/main/java/org/olat/basesecurity/AuthHelper.java
+++ b/src/main/java/org/olat/basesecurity/AuthHelper.java
@@ -117,7 +117,7 @@ public class AuthHelper {
 	 * @return True if success, false otherwise.
 	 */
 	public static int doLogin(Identity identity, String authProvider, UserRequest ureq) {
-		int initializeStatus = initializeLogin(identity, authProvider, ureq);
+		int initializeStatus = initializeLogin(identity, authProvider, ureq, false);
 		if (initializeStatus != LOGIN_OK) { 
 			return initializeStatus; // login not successfull
 		}
@@ -153,10 +153,11 @@ public class AuthHelper {
 	 * @param identity
 	 * @param authProvider
 	 * @param ureq
+	 * @param Is login via REST API?
 	 * @return
 	 */
-	public static int doHeadlessLogin(Identity identity, String authProvider, UserRequest ureq) {
-		int initializeStatus = initializeLogin(identity, authProvider, ureq);
+	public static int doHeadlessLogin(Identity identity, String authProvider, UserRequest ureq, boolean rest) {
+		int initializeStatus = initializeLogin(identity, authProvider, ureq, rest);
 		if (initializeStatus != LOGIN_OK) { 
 			return initializeStatus; // login not successful
 		}
@@ -297,7 +298,7 @@ public class AuthHelper {
 	 * @param ureq
 	 * @return boolean
 	 */
-	private static int initializeLogin(Identity identity, String authProvider, UserRequest ureq) {
+	private static int initializeLogin(Identity identity, String authProvider, UserRequest ureq, boolean rest) {
 		// continue only if user has login permission.
 		if (identity == null) return LOGIN_FAILED;
 		//test if a user may not logon, since he/she is in the PERMISSION_LOGON
@@ -334,7 +335,7 @@ public class AuthHelper {
 		// put users personal rss token into session
 		RSSUtil.putPersonalRssTokenInSession(ureq);
 		// calculate session info and attach it to the user session
-		setSessionInfoFor(identity, authProvider, ureq);
+		setSessionInfoFor(identity, authProvider, ureq, rest);
 		//confirm signedOn
 		usess.signOn();
 		// set users web delivery mode
@@ -488,7 +489,7 @@ public class AuthHelper {
 	 * @param authProvider
 	 * @param ureq
 	 */
-	public static void setSessionInfoFor(Identity identity, String authProvider, UserRequest ureq) {
+	public static void setSessionInfoFor(Identity identity, String authProvider, UserRequest ureq, boolean rest) {
 		HttpSession session = ureq.getHttpReq().getSession();
 		SessionInfo sinfo = new SessionInfo(identity.getName(), session);
 		sinfo.setFirstname(identity.getUser().getProperty(UserConstants.FIRSTNAME, ureq.getLocale()));
@@ -505,6 +506,7 @@ public class AuthHelper {
 		sinfo.setUserAgent(ureq.getHttpReq().getHeader("User-Agent"));
 		sinfo.setSecure(ureq.getHttpReq().isSecure());
 		sinfo.setLastClickTime();
+		sinfo.setREST(rest);
 		// set session info for this session
 		UserSession usess = ureq.getUserSession();
 		usess.setSessionInfo(sinfo);
@@ -513,6 +515,7 @@ public class AuthHelper {
 		sessionInfoForUsertracking.put("language", usess.getLocale().toString());
 		sessionInfoForUsertracking.put("authprovider", authProvider);
 		sessionInfoForUsertracking.put("iswebdav", String.valueOf(sinfo.isWebDAV()));
+		sessionInfoForUsertracking.put("isrest", String.valueOf(sinfo.isREST()));
 		usess.getIdentityEnvironment().setAttributes(sessionInfoForUsertracking);
 		
 	}
diff --git a/src/main/java/org/olat/core/util/UserSession.java b/src/main/java/org/olat/core/util/UserSession.java
index 6de8deaa2c5a3492d0b152f43fa71716af35e091..570d1c8d00dfd0a2b6c87668802cf330de3483d9 100644
--- a/src/main/java/org/olat/core/util/UserSession.java
+++ b/src/main/java/org/olat/core/util/UserSession.java
@@ -86,19 +86,19 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 
   //clusterNOK cache ??
 	private static Set<UserSession> authUserSessions = new HashSet<UserSession>(101);
-	private static Map<String, Identity> userNameToIdentity = new HashMap<String, Identity>(101);
+	private static Set<String> userNameToIdentity = new HashSet<String>(101);
 	private static int sessionTimeoutInSec = 300;
 	private static int sessionTimeoutAuthInSec = 7200;
 	private static Set<String> authUsersNamesOtherNodes = new HashSet<String>(101);
 
 	// things to put into that should not be clear when signing on (e.g. remember
 	// url for a direct jump)
-	private Map nonClearedStore = new HashMap();
+	private Map<String,Object> nonClearedStore = new HashMap<String,Object>();
 
 	// the environment (identity, locale, ..) of the identity
 	private IdentityEnvironment identityEnvironment;
-	private SessionInfo sessionInfo = null;
-	private Map store = null;
+	private SessionInfo sessionInfo;
+	private Map<String,Object> store;
 	private boolean authenticated = false;
 	private boolean registeredWithBus = false;
 	private Preferences guiPreferences;
@@ -122,7 +122,7 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 	 * 
 	 */
 	private void init() {
-		store = new HashMap(4);
+		store = new HashMap<String,Object>(4);
 		identityEnvironment = new IdentityEnvironment();
 		singleUserSystemBus = CoordinatorManager.getInstance().getCoordinator().createSingleUserInstance();
 		authenticated = false;
@@ -214,7 +214,7 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 	 * @param key
 	 * @return removed entry
 	 */
-	public Object removeEntry(Object key) {
+	public Object removeEntry(String key) {
 		return store.remove(key);
 	}
 
@@ -227,7 +227,7 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 	 * @param key
 	 * @param o
 	 */
-	public void putEntryInNonClearedStore(Object key, Object o) {
+	public void putEntryInNonClearedStore(String key, Object o) {
 		nonClearedStore.put(key, o);
 	}
 
@@ -235,7 +235,7 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 	 * @param key
 	 * @return removed entry
 	 */
-	public Object removeEntryFromNonClearedStore(Object key) {
+	public Object removeEntryFromNonClearedStore(String key) {
 		return nonClearedStore.remove(key);
 	}
 
@@ -434,7 +434,7 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 					// if
 					// Disposable
 
-					for (Iterator it_storevals = new ArrayList(store.values()).iterator(); it_storevals.hasNext();) {
+					for (Iterator<Object> it_storevals = new ArrayList<Object>(store.values()).iterator(); it_storevals.hasNext();) {
 						obj = it_storevals.next();
 						if (obj instanceof Disposable) {
 							// synchronous, since triggered by tomcat session timeout or user
@@ -545,9 +545,9 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 		
 		UserSession invalidatedSession = null;
 		synchronized (authUserSessions) {  //o_clusterOK by:fj
-		    // check if allready a session exist for this user
-		    if ( (userNameToIdentity.containsKey(identity.getName().toLowerCase()) || authUsersNamesOtherNodes.contains(identity.getName()) ) 
-		         && !sessionInfo.isWebDAV() && !this.getRoles().isGuestOnly()) {
+		    // check if already a session exist for this user
+		    if ( (userNameToIdentity.contains(identity.getName().toLowerCase()) || authUsersNamesOtherNodes.contains(identity.getName()) ) 
+		         && !sessionInfo.isWebDAV() && !sessionInfo.isREST() && !getRoles().isGuestOnly()) {
 		        Tracing.logInfo("Loggin-process II: User has already a session => signOffAndClear existing session", this.getClass());
 		        
 		        invalidatedSession = getUserSessionFor(identity.getName().toLowerCase());
@@ -563,7 +563,7 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 			// database queries, the login form or the IM account. IM works only with lowercase
 			// characters -> map stores values as such
 			Tracing.logDebug("signOn() adding to userNameToIdentity: "+identity.getName().toLowerCase(), getClass());
-			userNameToIdentity.put(identity.getName().toLowerCase(), identity);
+			userNameToIdentity.add(identity.getName().toLowerCase());
 		}
 		// load user prefs
 		guiPreferences = PreferencesFactory.getInstance().getPreferencesFor(identity, identityEnvironment.getRoles().isGuestOnly());
@@ -593,16 +593,17 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 
 
 	/**
-	 * Lookup non-webdav UserSession for username.
+	 * Lookup non-webdav, non-REST UserSession for username.
 	 * @param userName
 	 * @return user-session or null when no session was founded. 
 	 */
 	private UserSession getUserSessionFor(String userName) {
 		//do not call from somewhere else then signOffAndClear!!
-		Set authUserSessionsCopy = new HashSet(authUserSessions);
-		for (Iterator iterator = authUserSessionsCopy.iterator(); iterator.hasNext();) {
+		Set<UserSession> authUserSessionsCopy = new HashSet<UserSession>(authUserSessions);
+		for (Iterator<UserSession> iterator = authUserSessionsCopy.iterator(); iterator.hasNext();) {
 			UserSession userSession = (UserSession) iterator.next();			
-			if (userName.equalsIgnoreCase(userSession.getIdentity().getName()) && userSession.getSessionInfo()!=null && !userSession.getSessionInfo().isWebDAV()) {
+			if (userName.equalsIgnoreCase(userSession.getIdentity().getName()) && userSession.getSessionInfo()!=null
+					&& !userSession.getSessionInfo().isWebDAV() && !userSession.getSessionInfo().isREST() ) {
 				return userSession;
 			}
 		}
@@ -616,19 +617,19 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 	 * @return the identity or null if no user with userName is currently logged
 	 *         on
 	 */
-	public static Identity getSignedOnIdentity(String userName) {
+	public static boolean isSignedOnIdentity(String userName) {
 		synchronized (authUserSessions) {  //o_clusterOK by:fj
-			return (Identity) userNameToIdentity.get(userName.toLowerCase());
+			return userNameToIdentity.contains(userName.toLowerCase());
 		}
 	}
 	
 	/**
 	 * @return set of authenticated active user sessions
 	 */
-	public static Set getAuthenticatedUserSessions() {
-		Set copy;
+	public static Set<UserSession> getAuthenticatedUserSessions() {
+		Set<UserSession> copy;
 		synchronized (authUserSessions) {  //o_clusterOK by:fj
-			copy = new HashSet(authUserSessions);
+			copy = new HashSet<UserSession>(authUserSessions);
 		}
 		return copy;
 	}
@@ -744,8 +745,8 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 		int invalidateCounter = 0;
 		Tracing.logAudit("All sessions were invalidated by an administrator", UserSession.class);
 		//clusterNOK ?? invalidate only locale sessions ?
-		Set iterCopy = new HashSet(authUserSessions);
-		for (Iterator iterator = iterCopy.iterator(); iterator.hasNext();) {
+		Set<UserSession> iterCopy = new HashSet<UserSession>(authUserSessions);
+		for (Iterator<UserSession> iterator = iterCopy.iterator(); iterator.hasNext();) {
 			UserSession userSession = (UserSession) iterator.next();
 			Roles userRoles = userSession != null ? userSession.getRoles() : null; 
 			if (userRoles != null && !userRoles.isOLATAdmin()) {
@@ -771,18 +772,18 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList
 		int invalidateCounter = 0;
 		// 1. Copy authUserSessions in sorted TreeMap
 		// This is the Comparator that will be used to sort the TreeSet:
-		Comparator sessionComparator = new Comparator() {
-			public int compare(Object o1, Object o2) {
-				Long long1 = new Long(((UserSession) o1).getSessionInfo().getLastClickTime());
-				Long long2 = new Long(((UserSession) o2).getSessionInfo().getLastClickTime());
+		Comparator<UserSession> sessionComparator = new Comparator<UserSession>() {
+			public int compare(UserSession o1, UserSession o2) {
+				Long long1 = new Long((o1).getSessionInfo().getLastClickTime());
+				Long long2 = new Long((o2).getSessionInfo().getLastClickTime());
 				return long1.compareTo(long2);
 			}
 		};
 		// clusterNOK ?? invalidate only locale sessions ?
-		TreeSet sortedSet = new TreeSet(sessionComparator);
+		TreeSet<UserSession> sortedSet = new TreeSet<UserSession>(sessionComparator);
 		sortedSet.addAll(authUserSessions);
 		int i = 0;	
-		for (Iterator iterator = sortedSet.iterator(); iterator.hasNext() && i++<nbrSessions;) {
+		for (Iterator<UserSession> iterator = sortedSet.iterator(); iterator.hasNext() && i++<nbrSessions;) {
 			try {
 				UserSession userSession = (UserSession) iterator.next();
 				if (!userSession.getRoles().isOLATAdmin() && !userSession.getSessionInfo().isWebDAV()) {
diff --git a/src/main/java/org/olat/dispatcher/TemporaryAutoDispatcher.java b/src/main/java/org/olat/dispatcher/TemporaryAutoDispatcher.java
deleted file mode 100644
index 8284e0a857c56350dcc0e4c7bf3e6dcdef1839d0..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/dispatcher/TemporaryAutoDispatcher.java
+++ /dev/null
@@ -1,150 +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.dispatcher;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.olat.basesecurity.AuthHelper;
-import org.olat.basesecurity.BaseSecurityManager;
-import org.olat.basesecurity.BaseSecurityModule;
-import org.olat.commons.rss.RSSUtil;
-import org.olat.core.commons.chiefcontrollers.BaseChiefControllerCreator;
-import org.olat.core.commons.fullWebApp.BaseFullWebappController;
-import org.olat.core.commons.fullWebApp.BaseFullWebappControllerParts;
-import org.olat.core.dispatcher.Dispatcher;
-import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.Windows;
-import org.olat.core.gui.components.Window;
-import org.olat.core.gui.control.ChiefController;
-import org.olat.core.gui.control.Controller;
-import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.control.creator.ControllerCreator;
-import org.olat.core.gui.exception.MsgFactory;
-import org.olat.core.id.Identity;
-import org.olat.core.id.Roles;
-import org.olat.core.logging.AssertException;
-import org.olat.core.logging.Tracing;
-import org.olat.core.util.UserSession;
-import org.olat.core.util.WebappHelper;
-import org.olat.core.util.i18n.I18nManager;
-import org.olat.login.AuthBFWCParts;
-import org.olat.login.OLATAuthenticationController;
-
-/**
- * 
- * @author Felix Jost
- */
-public class TemporaryAutoDispatcher implements Dispatcher {
-
-	/**
-	 * @param ureq
-	 * @return chiefcontroller
-	 */
-	private ChiefController createAuthHome(UserRequest ureq) {
-		if (!ureq.getUserSession().isAuthenticated()) throw new AssertException("not authenticated!");
-
-		BaseChiefControllerCreator bbc = new BaseChiefControllerCreator();
-		bbc.setContentControllerCreator(/*this is later injected by spring*/new ControllerCreator() {
-			public Controller createController(UserRequest lureq, WindowControl lwControl) {
-				BaseFullWebappControllerParts authSitesAndNav = new AuthBFWCParts();
-				return new BaseFullWebappController(lureq, lwControl, authSitesAndNav );
-			}
-		});
-
-		ChiefController cc = bbc.createChiefController(ureq);
-		return cc;
-	}
-
-	/**
-	 * Main method called by DispatcherAction. This processess all requests for
-	 * authenticated users.
-	 * 
-	 * @param request
-	 * @param response
-	 * @param uriPrefix
-	 */
-	public void execute(HttpServletRequest request, HttpServletResponse response, String uriPrefix) {
-		UserSession usess = UserSession.getUserSession(request);
-		UserRequest ureq = null;
-
-		try {
-			ureq = new UserRequest(uriPrefix, request, response);
-			boolean auth = usess.isAuthenticated();
-
-			if (!auth || 	!ureq.isValidDispatchURI()) {
-				// String lang =
-				// I18nManager.getInstance().getDefaultLocale().toString();
-				Identity ident = BaseSecurityManager.getInstance().findIdentityByName("administrator");
-
-				usess.signOffAndClear();
-				usess.setIdentity(ident);
-				usess.setRoles(new Roles(true, true, true, true, false, true, false));
-				usess.setLocale(I18nManager.getInstance().getLocaleOrDefault(ident.getUser().getPreferences().getLanguage()));
-
-				// brasato:: was
-				// Windows.getWindows(ureq).getWindowManager().getGlobalSettings().setFontSize(
-				// identity.getUser().getPreferences().getFontsize() );
-				Windows.getWindows(ureq).setAttribute("fontsize", ident.getUser().getPreferences().getFontsize());
-
-				AuthHelper.setSessionInfoFor(ident, BaseSecurityModule.getDefaultAuthProviderIdentifier(), ureq);
-				// put users personal rss token into session
-				RSSUtil.putPersonalRssTokenInSession(ureq);
-				// confirm signedOn
-				usess.signOn();
-
-				// 
-				Windows.getWindows(ureq).getWindowManager().setAjaxWanted(ureq, true);
-
-				// successfull login, reregister window
-				ChiefController occ = createAuthHome(ureq);
-				Window currentWindow = occ.getWindow();
-				currentWindow.setUriPrefix(WebappHelper.getServletContextPath() + "/temp/");
-				Windows.getWindows(ureq).registerWindow(currentWindow);
-				// render only
-				currentWindow.dispatchRequest(ureq, true);
-				
-			} else {
-				// auth: get window
-				Windows ws = Windows.getWindows(ureq);
-				Window window = ws.getWindow(ureq);
-				window.dispatchRequest(ureq);				
-			}
-
-
-		} catch (Throwable th) {
-			try {
-				ChiefController msgcc = MsgFactory.createMessageChiefController(ureq, th);
-				// the controller's window must be failsafe also
-				msgcc.getWindow().dispatchRequest(ureq, true);
-				// do not dispatch (render only), since this is a new Window created as
-				// a result of another window's click.
-			} catch (Throwable t) {
-				Tracing.logError("We're fucked up....", t, TemporaryAutoDispatcher.class);
-			}
-		}
-	}
-}
diff --git a/src/main/java/org/olat/instantMessaging/ImPrefsManager.java b/src/main/java/org/olat/instantMessaging/ImPrefsManager.java
index 8488c219879602e8c6ff56aaab400419b4a1f892..cdb81c5aeca2f5c7ce9d650c9d87f405907d39b0 100644
--- a/src/main/java/org/olat/instantMessaging/ImPrefsManager.java
+++ b/src/main/java/org/olat/instantMessaging/ImPrefsManager.java
@@ -87,6 +87,11 @@ public class ImPrefsManager extends BasicManager {
 	 */
 	public ImPreferences loadOrCreatePropertiesFor(final Identity identity) {
 		//o_clusterOK by guido
+		ImPreferences imPrefs = findPropertiesFor(identity);
+		if(imPrefs != null) {
+			return imPrefs;
+		}
+
 		return CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(
 				OresHelper.createOLATResourceableInstanceWithoutCheck(LOCK_KEY, identity.getKey()), new SyncerCallback<ImPreferences>(){
 
diff --git a/src/main/java/org/olat/instantMessaging/SmackInstantMessagingImpl.java b/src/main/java/org/olat/instantMessaging/SmackInstantMessagingImpl.java
index 3c8db0425eab70bd8cc55048b62d5561877d436e..19fb18e92340d5053329375271fb21aae5f28e4d 100644
--- a/src/main/java/org/olat/instantMessaging/SmackInstantMessagingImpl.java
+++ b/src/main/java/org/olat/instantMessaging/SmackInstantMessagingImpl.java
@@ -240,14 +240,14 @@ public class SmackInstantMessagingImpl extends LogDelegator implements InstantMe
 	/**
 	 * @return Set containing the usernames
 	 */
-	public Set getUsernamesFromConnectedUsers() {
+	public Set<String> getUsernamesFromConnectedUsers() {
 		return new HashSet<String>(getClients().keySet());
 	}
 
 	/**
 	 * @see org.olat.instantMessaging.InstantMessaging#getClients()
 	 */
-	public Map getClients() {
+	public Map<String,InstantMessagingClient> getClients() {
 		return clientManager.getClients();
 	}
 
diff --git a/src/main/java/org/olat/instantMessaging/rosterandchat/ChangePresenceJob.java b/src/main/java/org/olat/instantMessaging/rosterandchat/ChangePresenceJob.java
index 17eeb700f5e41dd493eb4656a7a224b0e791f605..a522d161fe44a5a6bcd7d71b0039e80d2c8f0ffd 100644
--- a/src/main/java/org/olat/instantMessaging/rosterandchat/ChangePresenceJob.java
+++ b/src/main/java/org/olat/instantMessaging/rosterandchat/ChangePresenceJob.java
@@ -72,15 +72,15 @@ public class ChangePresenceJob extends JobWithDB  {
 			long lastAccessTime = 0;
 			String username = null;
 			InstantMessagingClient client = null;
-			boolean isWebDav = false;
+			boolean isWebDavOrRest = false;
 			try {
 				lastAccessTime = session.getSessionInfo().getLastClickTime();
 				username = session.getIdentity().getName();
-				isWebDav = session.getSessionInfo().isWebDAV();
+				isWebDavOrRest = session.getSessionInfo().isWebDAV() || session.getSessionInfo().isREST();
 			} catch (Exception e) {
 				log.info("Tried to get LastAccessTime from session that became in the meantime invalid", e.toString());
 			}
-			if (!isWebDav) { // leave webdav sessions untouched
+			if (!isWebDavOrRest) { // leave webdav sessions untouched
 
 				if (InstantMessagingModule.isEnabled()) {
 					// avoid reconnection of dead or duplicate sessions
diff --git a/src/main/java/org/olat/instantMessaging/ui/ConnectedUsersLocal.java b/src/main/java/org/olat/instantMessaging/ui/ConnectedUsersLocal.java
index df026051c031a6415ea8e8767eaa21f30c822b38..b554d915492e86f80f96635a62bff848abd33842 100644
--- a/src/main/java/org/olat/instantMessaging/ui/ConnectedUsersLocal.java
+++ b/src/main/java/org/olat/instantMessaging/ui/ConnectedUsersLocal.java
@@ -31,7 +31,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.olat.core.commons.persistence.DBFactory;
+import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.core.id.Identity;
 import org.olat.core.id.UserConstants;
 import org.olat.core.logging.AssertException;
@@ -88,8 +88,7 @@ public class ConnectedUsersLocal implements InstantMessagingSessionItems {
 		List<ConnectedUsersListEntry> entries = new ArrayList<ConnectedUsersListEntry>();
 		Map<String, Long> lastActivity = new HashMap<String, Long>();
 		Set<String> usernames = InstantMessagingModule.getAdapter().getUsernamesFromConnectedUsers();
-		List<UserSession> authSessions = new ArrayList(UserSession.getAuthenticatedUserSessions());
-		
+		Set<UserSession> authSessions = UserSession.getAuthenticatedUserSessions();
 		for (Iterator<UserSession> iter = authSessions.iterator(); iter.hasNext();) {
 			UserSession userSession = iter.next();
 			long lastAccTime = 0;
@@ -108,14 +107,14 @@ public class ConnectedUsersLocal implements InstantMessagingSessionItems {
 			
 			ConnectedUsersListEntry entry = (ConnectedUsersListEntry)sessionItemsCache.get(olatusername);
 			if (entry != null && !olatusername.equals(username)) {
+				entry.setLastActivity(lastActivity.get(olatusername));
 				entries.add(entry);
 				if (log.isDebug()) log.debug("loading item from cache: "+olatusername);
 			
 			} else {
 				//item not in cache
-				Identity identity = UserSession.getSignedOnIdentity(olatusername);
-				if (identity != null) {
-					identity = (Identity) DBFactory.getInstance().loadObject(identity);
+				if (UserSession.isSignedOnIdentity(olatusername)) {
+					Identity identity = (Identity)BaseSecurityManager.getInstance().findIdentityByName(olatusername);
 					try {
 						ImPreferences imPrefs = imPrefsManager.loadOrCreatePropertiesFor(identity);
 						if ( (imPrefs != null) ) {
diff --git a/src/main/java/org/olat/restapi/security/Authentication.java b/src/main/java/org/olat/restapi/security/Authentication.java
index c228dfdadac62363ae15c131df93c0e7ed65294a..19755cb40eb377f4e8afa159de41e0370782e17c 100644
--- a/src/main/java/org/olat/restapi/security/Authentication.java
+++ b/src/main/java/org/olat/restapi/security/Authentication.java
@@ -93,7 +93,7 @@ public class Authentication {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
-		int loginStatus = AuthHelper.doHeadlessLogin(identity, BaseSecurityModule.getDefaultAuthProviderIdentifier(), ureq);
+		int loginStatus = AuthHelper.doHeadlessLogin(identity, BaseSecurityModule.getDefaultAuthProviderIdentifier(), ureq, true);
 		if (loginStatus == AuthHelper.LOGIN_OK) {
 			//fxdiff: FXOLAT-268 update last login date and register active user
 			UserDeletionManager.getInstance().setIdentityAsActiv(identity);
diff --git a/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java b/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java
index b6e6e1dc6df2786b1bca7c033b135f48e80a27ed..5e8bb7274143739fe68e346566a0ba4cce574f63 100644
--- a/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java
+++ b/src/main/java/org/olat/restapi/security/RestApiLoginFilter.java
@@ -172,7 +172,7 @@ public class RestApiLoginFilter implements Filter {
 						}
 						request.setAttribute(RestSecurityHelper.SEC_USER_REQUEST, ureq);
 						
-						int loginStatus = AuthHelper.doHeadlessLogin(identity, BaseSecurityModule.getDefaultAuthProviderIdentifier(), ureq);
+						int loginStatus = AuthHelper.doHeadlessLogin(identity, BaseSecurityModule.getDefaultAuthProviderIdentifier(), ureq, true);
 						if (loginStatus == AuthHelper.LOGIN_OK) {
 							//fxdiff: FXOLAT-268 update last login date and register active user
 							UserDeletionManager.getInstance().setIdentityAsActiv(identity);
@@ -279,7 +279,7 @@ public class RestApiLoginFilter implements Filter {
 			request.setAttribute(RestSecurityHelper.SEC_USER_REQUEST, ureq);
 			RestSecurityBean securityBean = (RestSecurityBean)CoreSpringFactory.getBean(RestSecurityBean.class);
 			Identity identity = securityBean.getIdentity(token);
-			int loginStatus = AuthHelper.doHeadlessLogin(identity, BaseSecurityModule.getDefaultAuthProviderIdentifier(), ureq);
+			int loginStatus = AuthHelper.doHeadlessLogin(identity, BaseSecurityModule.getDefaultAuthProviderIdentifier(), ureq, true);
 			if(loginStatus == AuthHelper.LOGIN_OK) {
 				response.setHeader(RestSecurityHelper.SEC_TOKEN, securityBean.renewToken(token));
 				synchronized(uress) {
diff --git a/src/main/java/org/olat/user/ChangePrefsController.java b/src/main/java/org/olat/user/ChangePrefsController.java
index c813f07161c188824813a371fdb96dbccb85ace3..fe414dbc7709ed5b06cf2be4c18b24401dab5609 100644
--- a/src/main/java/org/olat/user/ChangePrefsController.java
+++ b/src/main/java/org/olat/user/ChangePrefsController.java
@@ -198,7 +198,7 @@ class SpecialPrefsForm extends FormBasicController {
 	protected void formOK(UserRequest ureq) {
 		// OLAT-6429 don't change another users GUI prefs when he is logged in 
 		if (!ureq.getIdentity().equalsByPersistableKey(tobeChangedIdentity)) {
-			if (UserSession.getSignedOnIdentity(tobeChangedIdentity.getName()) != null) {
+			if (UserSession.isSignedOnIdentity(tobeChangedIdentity.getName())) {
 				showError("error.user.logged.in", tobeChangedIdentity.getName());
 				prefsElement.reset();
 				return;
diff --git a/src/main/resources/serviceconfig/org/olat/_spring/brasatoconfigpart.xml b/src/main/resources/serviceconfig/org/olat/_spring/brasatoconfigpart.xml
index 96c3f2ef1f957b4ecf92b3ebd65951a404203130..cd10e6b8c0ca7ae3a81aa5332d474a9c0539c0d0 100644
--- a/src/main/resources/serviceconfig/org/olat/_spring/brasatoconfigpart.xml
+++ b/src/main/resources/serviceconfig/org/olat/_spring/brasatoconfigpart.xml
@@ -23,13 +23,7 @@
 				<entry key="/url/">
 					<!-- if you change /url make sure you also modify olatcore/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/_static/js/BTinyHelper.js accordingly -->
 					<ref bean="restdispatcher" />
-				</entry> <!-- 
-				 -->
-				<!-- for fast developement mode  
-				<entry key="/temp/">
-					<ref bean="tempdispatcher" />
 				</entry>
-				-->
 				<entry key="/">
 					<ref bean="redirect2defaultbean" />
 				</entry>
@@ -178,9 +172,6 @@
 		form action: /olat/remotelogin/
 	-->
 	<bean id="remoteloginbean" class="org.olat.dispatcher.RemoteLoginformDispatcher" />
-	
-	<bean id="tempdispatcher"
-		class="org.olat.dispatcher.TemporaryAutoDispatcher" />
 
 	<bean id="shibbean"
 		class="org.olat.shibboleth.ShibbolethDispatcher" />