diff --git a/.hgtags b/.hgtags
index 7e048eb6f10234f290fb13990e10c68c10cab65f..f32a0af7474186871a270e73e82c8f17338161a5 100644
--- a/.hgtags
+++ b/.hgtags
@@ -41,3 +41,4 @@ c705216e80316b862757515d1a9f0f772393fbc8 OpenOLAT 8.3.4
 138f584995d4a899f812e5a921ba079aed8d9e48 OpenOLAT 8.3.4
 f944e71e243fc3fd4b9af3538049373e7eb692b0 OpenOLAT 8.3.5
 6e636da488eacb07dbe681fb00922a8ed1b54eb9 OpenOLAT 8.4.0beta
+c7d08eee4220f425bd2aaf354e985f366840fa8d OpenOLAT 8.4.0
diff --git a/INSTALL.README.HEAD b/INSTALL.README.HEAD
index 86b8f1115e17999f9fe8f00566825a2cb8e3c1ad..7f3b19a5e2cdcd4ec9217d0229dc859cbc21c2ee 100644
--- a/INSTALL.README.HEAD
+++ b/INSTALL.README.HEAD
@@ -61,8 +61,12 @@ Preconditions:
       In the "Context" element set parameter reloadable="false" 
       In all "Connector" elements set paramter URIEncoding="UTF-8"
   7.7 Option: to use the application server database connection pool configure a jdbc data resource in the the 
-      "Context" element, set db.source=jndi in the olat.local.properties and  db.jndi to the name of the data soruce
-      If unsure, set db.source=local to use the bundled data connection pool (not recommendet for production)
+      "Context" element, set db.source=jndi in the olat.local.properties and  db.jndi to the name of the data source:
+        db.source=jndi
+	    db.jndi=java:comp/env/jdbc/OpenOLATDS
+	  Next add the resource descriptor to your tomcat context descriptor:
+	  	<Resource name="jdbc/OpenOLATDS" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="60000" username="openolat" password="openolat" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/openolat?useUnicode=true&amp;characterEncoding=UTF-8&amp;cachePrepStmts=true&amp;cacheCallableStmts=true&amp;autoReconnectForPools=true"/>	  
+      If unsure, set db.source=local to use the bundled data connection pool (not recommended for production)
 8. In Eclipse: start the server
 
 9. In your browser open URL http://localhost:8080/olat
diff --git a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
index e66b373a705af9597948602ee91c655a71c17e62..6b6809e9755338d2d0c3a7d08f305f5f313e4136 100644
--- a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
+++ b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
@@ -27,7 +27,11 @@ package org.olat.admin.securitygroup.gui;
 
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
 
 import org.olat.admin.securitygroup.gui.multi.UsersToGroupWizardStep00;
@@ -142,6 +146,7 @@ public class GroupController extends BasicController {
 	protected static final String usageIdentifyer = IdentitiesOfGroupTableDataModel.class.getCanonicalName();
 	protected boolean isAdministrativeUser;
 	protected boolean mandatoryEmail;
+	private boolean chatEnabled;
 
 	protected BaseSecurity securityManager;
 	private UserManager userManager;
@@ -183,6 +188,7 @@ public class GroupController extends BasicController {
 		Roles roles = ureq.getUserSession().getRoles();
 		BaseSecurityModule securityModule = CoreSpringFactory.getImpl(BaseSecurityModule.class);
 		isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles);
+		chatEnabled = imModule.isEnabled() && imModule.isPrivateEnabled();
 
 		// default group controller has no mail functionality
 		this.addUserMailDefaultTempl = null;
@@ -550,14 +556,7 @@ public class GroupController extends BasicController {
 		fireEvent(ureq, identitiesAddedEvent); 
 		if (!identitiesAddedEvent.getAddedIdentities().isEmpty()) {
   		// update table model
-			List<Identity> addedIdentities = identitiesAddedEvent.getAddedIdentities();
-			List<GroupMemberView> newMembers = new ArrayList<GroupMemberView>(addedIdentities.size());
-			Date currentDate = new Date();
-			for(Identity addedIdentity:addedIdentities) {
-				newMembers.add(forgeGroupMemberView(addedIdentity, currentDate));
-			}
-      identitiesTableModel.add(newMembers);
-			tableCtr.modelChanged();			
+			reloadData();			
 		}
 		// build info message for identities which could be added.
 		StringBuilder infoMessage = new StringBuilder();
@@ -591,18 +590,6 @@ public class GroupController extends BasicController {
 		if (infoMessage.length() > 0) getWindowControl().setWarning(infoMessage.toString());
 		if (errorMessage.length() > 0) getWindowControl().setError(errorMessage.toString());
 	}
-	
-	private GroupMemberView forgeGroupMemberView(Identity identity, Date addedAt) {
-		String onlineStatus;
-		if(getIdentity().equals(identity)) {
-			onlineStatus = "me";
-		} else if(sessionManager.isOnline(identity.getKey())) {
-			onlineStatus = Presence.available.name();
-		} else {
-			onlineStatus = Presence.unavailable.name();
-		}
-		return new GroupMemberView(identity, addedAt, onlineStatus);
-	}
 
 	protected void doDispose() {
     // DialogBoxController and TableController get disposed by BasicController
@@ -622,7 +609,7 @@ public class GroupController extends BasicController {
 			cd0.setIsPopUpWindowAction(true, "height=700, width=900, location=no, menubar=no, resizable=yes, status=no, scrollbars=yes, toolbar=no");
 			tableCtr.addColumnDescriptor(cd0);
 		}
-		if(imModule.isEnabled() && imModule.isPrivateEnabled()) {
+		if(chatEnabled) {
 			tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.online", 1, COMMAND_IM, getLocale(),
 					ColumnDescriptor.ALIGNMENT_LEFT, new OnlineIconRenderer()));
 		}
@@ -663,9 +650,41 @@ public class GroupController extends BasicController {
 		// refresh view		
 		List<Object[]> combo = securityManager.getIdentitiesAndDateOfSecurityGroup(securityGroup); 
 		List<GroupMemberView> views = new ArrayList<GroupMemberView>(combo.size());
+		Map<Long,GroupMemberView> idToViews = new HashMap<Long,GroupMemberView>();
+
+		Set<Long> loadStatus = new HashSet<Long>();
 		for(Object[] co:combo) {
-			views.add(forgeGroupMemberView((Identity)co[0], (Date)co[1]));
+			Identity identity = (Identity)co[0];
+			Date addedAt = (Date)co[1];
+			String onlineStatus = null;
+			if(chatEnabled) {
+				if(getIdentity().equals(identity)) {
+					onlineStatus = "me";
+				} else if(sessionManager.isOnline(identity.getKey())) {
+					loadStatus.add(identity.getKey());
+				} else {
+					onlineStatus = Presence.unavailable.name();
+				}
+			}
+			GroupMemberView member = new GroupMemberView(identity, addedAt, onlineStatus);
+			views.add(member);
+			idToViews.put(identity.getKey(), member);
 		}
+		
+		if(loadStatus.size() > 0) {
+			List<Long> statusToLoadList = new ArrayList<Long>(loadStatus);
+			Map<Long,String> statusMap = imService.getBuddyStatus(statusToLoadList);
+			for(Long toLoad:statusToLoadList) {
+				String status = statusMap.get(toLoad);
+				GroupMemberView member = idToViews.get(toLoad);
+				if(status == null) {
+					member.setOnlineStatus(Presence.available.name());	
+				} else {
+					member.setOnlineStatus(status);	
+				}
+			}
+		}
+		
 		List<UserPropertyHandler> userPropertyHandlers = userManager.getUserPropertyHandlersFor(usageIdentifyer, isAdministrativeUser);
 		identitiesTableModel = new IdentitiesOfGroupTableDataModel(views, getLocale(), userPropertyHandlers, isAdministrativeUser);
 		tableCtr.setTableDataModel(identitiesTableModel);
diff --git a/src/main/java/org/olat/admin/securitygroup/gui/GroupMemberView.java b/src/main/java/org/olat/admin/securitygroup/gui/GroupMemberView.java
index 78c35b369ef63a65dc3c048019520957ef655f8e..a65dc6cb8bf99ccef64316c503c0fc4a44b5d3af 100644
--- a/src/main/java/org/olat/admin/securitygroup/gui/GroupMemberView.java
+++ b/src/main/java/org/olat/admin/securitygroup/gui/GroupMemberView.java
@@ -33,7 +33,7 @@ public class GroupMemberView {
 	
 	private final Date addedAt;
 	private final Identity identity;
-	private final String onlineStatus;
+	private String onlineStatus;
 	
 	public GroupMemberView(Identity identity, Date addedAt, String onlineStatus) {
 		this.identity = identity;
@@ -52,4 +52,8 @@ public class GroupMemberView {
 	public String getOnlineStatus() {
 		return onlineStatus;
 	}
+	
+	public void setOnlineStatus(String onlineStatus) {
+		this.onlineStatus = onlineStatus;
+	}
 }
diff --git a/src/main/java/org/olat/core/commons/services/mark/ui/BookmarksPortletRunController.java b/src/main/java/org/olat/core/commons/services/mark/ui/BookmarksPortletRunController.java
index d31de3a1e8324701595282788ffd61795bef0eaf..1d12fd848dcb035d9967384130b9aac09f162bd0 100644
--- a/src/main/java/org/olat/core/commons/services/mark/ui/BookmarksPortletRunController.java
+++ b/src/main/java/org/olat/core/commons/services/mark/ui/BookmarksPortletRunController.java
@@ -166,7 +166,9 @@ public class BookmarksPortletRunController extends AbstractPortletRunController<
 
 		for(Mark mark:items) {
 			RepositoryEntry repositoryEntry = keyToRepositoryEntryMap.get(mark.getOLATResourceable().getResourceableId());
-			convertedList.add(new Bookmark(mark, repositoryEntry));
+			if(repositoryEntry != null) {
+				convertedList.add(new Bookmark(mark, repositoryEntry));
+			}
 		}
 		return convertedList;
 	}
diff --git a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
index 29233e739600ab3f04cae4492ef9dcb4996fb155..da330102da26b002daf10a89cfecb43994d42c39 100644
--- a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
@@ -116,6 +116,8 @@ public abstract class AbstractBusinessGroupListController extends BasicControlle
 	protected static final String TABLE_ACTION_DELETE = "bgTblDelete";
 	protected static final String TABLE_ACTION_SELECT = "bgTblSelect";
 	
+	protected static final BusinessGroupMembershipComparator MEMBERSHIP_COMPARATOR = new BusinessGroupMembershipComparator();
+	
 	protected final VelocityContainer mainVC;
 
 	protected final TableController groupListCtr;
@@ -132,7 +134,7 @@ public abstract class AbstractBusinessGroupListController extends BasicControlle
 	private BusinessGroupDeleteDialogBoxController deleteDialogBox;
 	private StepsMainRunController businessGroupWizard;
 	protected CloseableModalController cmc;
-	
+
 	private final boolean admin;
 	protected final MarkManager markManager;
 	protected final BaseSecurity securityManager;
diff --git a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java
index 1794fa6ab319ee977c6a0cdebc907cdda20c4b54..a508de1b557719bb5906456acb0e168329a10c17 100644
--- a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java
+++ b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java
@@ -116,6 +116,7 @@ public abstract class AbstractMemberListController extends BasicController imple
 	private final RepositoryEntry repoEntry;
 	private final BusinessGroup businessGroup;
 	private final boolean isAdministrativeUser;
+	private final boolean chatEnabled;
 	
 	private final UserManager userManager;
 	
@@ -157,7 +158,8 @@ public abstract class AbstractMemberListController extends BasicController imple
 		imService = CoreSpringFactory.getImpl(InstantMessagingService.class);
 		sessionManager = CoreSpringFactory.getImpl(UserSessionManager.class);
 		memberViewComparator = new GroupMemberViewComparator(Collator.getInstance(getLocale()));
-
+		
+		chatEnabled = imModule.isEnabled() && imModule.isPrivateEnabled();
 		isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles());
 		mainVC = createVelocityContainer(page);
 
@@ -190,7 +192,7 @@ public abstract class AbstractMemberListController extends BasicController imple
 	
 	protected void initColumns() {
 		int offset = Cols.values().length;
-		if(imModule.isEnabled() && imModule.isPrivateEnabled()) {
+		if(chatEnabled) {
 			memberListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.online.i18n(), Cols.online.ordinal(), TABLE_ACTION_IM, getLocale(),
 					ColumnDescriptor.ALIGNMENT_LEFT, new OnlineIconRenderer()));
 		}
@@ -565,20 +567,38 @@ public abstract class AbstractMemberListController extends BasicController imple
 			}
 		}
 		
+		
 		Long me = getIdentity().getKey();
+		Set<Long> loadStatus = new HashSet<Long>();
 		for(Identity identity:identities) {
 			MemberView member = new MemberView(identity);
-			if(identity.getKey().equals(me)) {
-				member.setOnlineStatus("me");
-			} else if(sessionManager.isOnline(identity.getKey())) {
-				member.setOnlineStatus(Presence.available.name());
-			} else {
-				member.setOnlineStatus(Presence.unavailable.name());
+			if(chatEnabled) {
+				if(identity.getKey().equals(me)) {
+					member.setOnlineStatus("me");
+				} else if(sessionManager.isOnline(identity.getKey())) {
+					loadStatus.add(identity.getKey());
+				} else {
+					member.setOnlineStatus(Presence.unavailable.name());
+				}
 			}
 			memberList.add(member);
 			keyToMemberMap.put(identity.getKey(), member);
 		}
 		
+		if(loadStatus.size() > 0) {
+			List<Long> statusToLoadList = new ArrayList<Long>(loadStatus);
+			Map<Long,String> statusMap = imService.getBuddyStatus(statusToLoadList);
+			for(Long toLoad:statusToLoadList) {
+				String status = statusMap.get(toLoad);
+				MemberView member = keyToMemberMap.get(toLoad);
+				if(status == null) {
+					member.setOnlineStatus(Presence.available.name());	
+				} else {
+					member.setOnlineStatus(status);	
+				}
+			}
+		}
+
 		for(BusinessGroupMembership membership:memberships) {
 			Long identityKey = membership.getIdentityKey();
 			MemberView memberView = keyToMemberMap.get(identityKey);
diff --git a/src/main/java/org/olat/group/ui/main/AdminBusinessGroupsController.java b/src/main/java/org/olat/group/ui/main/AdminBusinessGroupsController.java
index 1005f237a2be113e7aafa12664c6847a842a1213..d7b5585be055a8072f5082fb3f5d45cc8a8e7238 100644
--- a/src/main/java/org/olat/group/ui/main/AdminBusinessGroupsController.java
+++ b/src/main/java/org/olat/group/ui/main/AdminBusinessGroupsController.java
@@ -34,6 +34,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupMembership;
 import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.group.ui.main.BusinessGroupTableModelWithType.Cols;
 
@@ -85,7 +86,17 @@ public class AdminBusinessGroupsController extends AbstractBusinessGroupListCont
 		groupListCtr.addColumnDescriptor(false, new DefaultColumnDescriptor(Cols.lastTime.i18n(), Cols.lastTime.ordinal(), null, getLocale()));
 		groupListCtr.addColumnDescriptor(new DefaultColumnDescriptor(Cols.lastUsage.i18n(), Cols.lastUsage.ordinal(), null, getLocale()));
 		CustomCellRenderer roleRenderer = new BGRoleCellRenderer(getLocale());
-		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer));
+		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer){
+			@Override
+			public int compareTo(final int rowa, final int rowb) {
+				Object a = table.getTableDataModel().getValueAt(rowa,dataColumn);
+				Object b = table.getTableDataModel().getValueAt(rowb,dataColumn);
+				if(a instanceof BusinessGroupMembership && b instanceof BusinessGroupMembership) {
+					return MEMBERSHIP_COMPARATOR.compare((BusinessGroupMembership)a, (BusinessGroupMembership)b);
+				}
+				return super.compareTo(rowa, rowb);
+			}
+		});
 		groupListCtr.addColumnDescriptor(false, new BooleanColumnDescriptor(Cols.allowLeave.i18n(), Cols.allowLeave.ordinal(), TABLE_ACTION_LEAVE, translate("table.header.leave"), null));
 		groupListCtr.addColumnDescriptor(new BooleanColumnDescriptor(Cols.allowDelete.i18n(), Cols.allowDelete.ordinal(), TABLE_ACTION_DELETE, translate("table.header.delete"), null));
 		groupListCtr.addColumnDescriptor(new DefaultColumnDescriptor(Cols.accessControlLaunch.i18n(), Cols.accessControlLaunch.ordinal(), TABLE_ACTION_ACCESS, getLocale()));
diff --git a/src/main/java/org/olat/group/ui/main/BGRoleCellRenderer.java b/src/main/java/org/olat/group/ui/main/BGRoleCellRenderer.java
index d42b377a0d1d68c6765e4d45b329df659de81789..acf5b04452c363b2a4cc93bc5de15d6a5d723ec4 100644
--- a/src/main/java/org/olat/group/ui/main/BGRoleCellRenderer.java
+++ b/src/main/java/org/olat/group/ui/main/BGRoleCellRenderer.java
@@ -27,6 +27,7 @@ import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
 import org.olat.group.BusinessGroupMembership;
+import org.olat.group.model.BGMembership;
 
 /**
  * 
@@ -58,6 +59,13 @@ public class BGRoleCellRenderer implements CustomCellRenderer {
 				and = and(sb, and);
 				sb.append(translator.translate("search.waiting"));
 			}
+		} else if (val instanceof BGMembership) {
+			BGMembership membership = (BGMembership)val;
+			switch(membership) {
+				case owner: sb.append(translator.translate("owned.groups")); break;
+				case participant: sb.append(translator.translate("search.attendee")); break;
+				case waiting: sb.append(translator.translate("search.waiting")); break;
+			}
 		}
 	}
 	
diff --git a/src/main/java/org/olat/group/ui/main/BusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/BusinessGroupListController.java
index ccb99943f58467c45f020785a11b6358b53c76bc..61e0ba10ffc84c7e793dc4780e008a0a216738ae 100644
--- a/src/main/java/org/olat/group/ui/main/BusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/BusinessGroupListController.java
@@ -27,6 +27,7 @@ import org.olat.core.gui.components.table.CustomCssCellRenderer;
 import org.olat.core.gui.components.table.CustomRenderColumnDescriptor;
 import org.olat.core.gui.components.table.DefaultColumnDescriptor;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.group.BusinessGroupMembership;
 import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.group.ui.main.BusinessGroupTableModelWithType.Cols;
 
@@ -61,7 +62,17 @@ public class BusinessGroupListController extends AbstractBusinessGroupListContro
 		groupListCtr.addColumnDescriptor(new DefaultColumnDescriptor(Cols.lastTime.i18n(), Cols.lastTime.ordinal(), null, getLocale()));
 		groupListCtr.addColumnDescriptor(false, new DefaultColumnDescriptor(Cols.lastUsage.i18n(), Cols.lastUsage.ordinal(), null, getLocale()));
 		CustomCellRenderer roleRenderer = new BGRoleCellRenderer(getLocale());
-		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer));
+		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer){
+			@Override
+			public int compareTo(final int rowa, final int rowb) {
+				Object a = table.getTableDataModel().getValueAt(rowa,dataColumn);
+				Object b = table.getTableDataModel().getValueAt(rowb,dataColumn);
+				if(a instanceof BusinessGroupMembership && b instanceof BusinessGroupMembership) {
+					return MEMBERSHIP_COMPARATOR.compare((BusinessGroupMembership)a, (BusinessGroupMembership)b);
+				}
+				return super.compareTo(rowa, rowb);
+			}
+		});
 		groupListCtr.addColumnDescriptor(new BooleanColumnDescriptor(Cols.allowLeave.i18n(), Cols.allowLeave.ordinal(), TABLE_ACTION_LEAVE, translate("table.header.leave"), null));
 		return 11;
 	}
diff --git a/src/main/java/org/olat/group/ui/main/BusinessGroupMembershipComparator.java b/src/main/java/org/olat/group/ui/main/BusinessGroupMembershipComparator.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d401a5fa0681dea548e367cccc5e0b1a65ec3f7
--- /dev/null
+++ b/src/main/java/org/olat/group/ui/main/BusinessGroupMembershipComparator.java
@@ -0,0 +1,63 @@
+/**
+ * <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.group.ui.main;
+
+import java.util.Comparator;
+
+import org.olat.group.BusinessGroupMembership;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class BusinessGroupMembershipComparator implements Comparator<BusinessGroupMembership> {
+
+	@Override
+	public int compare(BusinessGroupMembership m1, BusinessGroupMembership m2) {
+		if(m1.isOwner()) {
+			if(m2.isOwner()) {
+				return 0;
+			}
+			return 1;
+		} else if(m2.isOwner()) {
+			return -1;
+		}
+		
+		if(m1.isParticipant() || m1.isParticipant()) {
+			if(m2.isParticipant() || m2.isParticipant()) {
+				return 0;
+			}
+			return 1;
+		} else if(m2.isParticipant() || m2.isParticipant()) {
+			return -1;
+		}
+		
+		if(m1.isWaiting()) {
+			if(m2.isWaiting()) {
+				return 0;
+			}
+			return 1;
+		} else if(m2.isWaiting()) {
+			return -1;
+		}
+		return 0;
+	}
+}
diff --git a/src/main/java/org/olat/group/ui/main/FavoritBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/FavoritBusinessGroupListController.java
index cf38232a6c9cec498edd62e4045a909fcf6812c7..b45c7b556201a7db3c6d0aeb89341f695cf89cbc 100644
--- a/src/main/java/org/olat/group/ui/main/FavoritBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/FavoritBusinessGroupListController.java
@@ -27,6 +27,7 @@ import org.olat.core.gui.components.table.CustomCssCellRenderer;
 import org.olat.core.gui.components.table.CustomRenderColumnDescriptor;
 import org.olat.core.gui.components.table.DefaultColumnDescriptor;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.group.BusinessGroupMembership;
 import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.group.ui.main.BusinessGroupTableModelWithType.Cols;
 
@@ -61,7 +62,17 @@ public class FavoritBusinessGroupListController extends AbstractBusinessGroupLis
 		groupListCtr.addColumnDescriptor(new DefaultColumnDescriptor(Cols.lastTime.i18n(), Cols.lastTime.ordinal(), null, getLocale()));
 		groupListCtr.addColumnDescriptor(false, new DefaultColumnDescriptor(Cols.lastUsage.i18n(), Cols.lastUsage.ordinal(), null, getLocale()));
 		CustomCellRenderer roleRenderer = new BGRoleCellRenderer(getLocale());
-		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer));
+		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer){
+			@Override
+			public int compareTo(final int rowa, final int rowb) {
+				Object a = table.getTableDataModel().getValueAt(rowa,dataColumn);
+				Object b = table.getTableDataModel().getValueAt(rowb,dataColumn);
+				if(a instanceof BusinessGroupMembership && b instanceof BusinessGroupMembership) {
+					return MEMBERSHIP_COMPARATOR.compare((BusinessGroupMembership)a, (BusinessGroupMembership)b);
+				}
+				return super.compareTo(rowa, rowb);
+			}
+		});
 		groupListCtr.addColumnDescriptor(new BooleanColumnDescriptor(Cols.allowLeave.i18n(), Cols.allowLeave.ordinal(), TABLE_ACTION_LEAVE, translate("table.header.leave"), null));
 		return 11;
 	}
diff --git a/src/main/java/org/olat/group/ui/main/OnlineIconRenderer.java b/src/main/java/org/olat/group/ui/main/OnlineIconRenderer.java
index 2901cf8ed6affb1510892008dd60883e0f420ecb..9eda49d264e1f0635f51da5d7b09a6ad2597b1f7 100644
--- a/src/main/java/org/olat/group/ui/main/OnlineIconRenderer.java
+++ b/src/main/java/org/olat/group/ui/main/OnlineIconRenderer.java
@@ -40,9 +40,11 @@ public class OnlineIconRenderer extends CustomCssCellRenderer {
 			// don't show the users status when not configured, only an icon to start a chat/message
 			return "b_small_icon o_instantmessaging_chat_icon";
 		}
-		// standard case: available or unavailble (offline or dnd)
+		// standard case: available or unavailable (offline or dnd)
 		else if(Presence.available.name().equals(val)) {
 			return "b_small_icon o_instantmessaging_available_icon";
+		} else if(Presence.dnd.name().equals(val)) {
+			return "b_small_icon o_instantmessaging_dnd_icon";
 		} else {
 			return "b_small_icon o_instantmessaging_unavailable_icon";
 		}
diff --git a/src/main/java/org/olat/group/ui/main/OpenBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/OpenBusinessGroupListController.java
index 48be5060598e503793ace5d7f7b3e353d30e2a86..ac1f2b0fd7f6b289e352d3494eb15cddf662ffb8 100644
--- a/src/main/java/org/olat/group/ui/main/OpenBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/OpenBusinessGroupListController.java
@@ -31,6 +31,7 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupMembership;
 import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.group.ui.main.BusinessGroupTableModelWithType.Cols;
 import org.olat.util.logging.activity.LoggingResourceable;
@@ -64,7 +65,17 @@ public class OpenBusinessGroupListController extends AbstractBusinessGroupListCo
 		CustomCellRenderer acRenderer = new BGAccessControlledCellRenderer();
 		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.accessTypes.i18n(), Cols.accessTypes.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, acRenderer));
 		CustomCellRenderer roleRenderer = new BGRoleCellRenderer(getLocale());
-		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer));
+		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer){
+			@Override
+			public int compareTo(final int rowa, final int rowb) {
+				Object a = table.getTableDataModel().getValueAt(rowa,dataColumn);
+				Object b = table.getTableDataModel().getValueAt(rowb,dataColumn);
+				if(a instanceof BusinessGroupMembership && b instanceof BusinessGroupMembership) {
+					return MEMBERSHIP_COMPARATOR.compare((BusinessGroupMembership)a, (BusinessGroupMembership)b);
+				}
+				return super.compareTo(rowa, rowb);
+			}
+		});
 		groupListCtr.addColumnDescriptor(new AccessActionColumnDescriptor(Cols.accessControlLaunch.i18n(), Cols.accessControlLaunch.ordinal(), getTranslator()));
 		return 8;
 	}
diff --git a/src/main/java/org/olat/group/ui/main/OwnedBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/OwnedBusinessGroupListController.java
index 1e0f79b4105852203cf68d35b83043bef655f24d..a28288c7aab8d3fa767b0dbd7d475a4762f0c459 100644
--- a/src/main/java/org/olat/group/ui/main/OwnedBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/OwnedBusinessGroupListController.java
@@ -27,6 +27,7 @@ import org.olat.core.gui.components.table.CustomCssCellRenderer;
 import org.olat.core.gui.components.table.CustomRenderColumnDescriptor;
 import org.olat.core.gui.components.table.DefaultColumnDescriptor;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.group.BusinessGroupMembership;
 import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.group.ui.main.BusinessGroupTableModelWithType.Cols;
 
@@ -73,7 +74,17 @@ public class OwnedBusinessGroupListController extends AbstractBusinessGroupListC
 		groupListCtr.addColumnDescriptor(new DefaultColumnDescriptor(Cols.lastTime.i18n(), Cols.lastTime.ordinal(), null, getLocale()));
 		groupListCtr.addColumnDescriptor(false, new DefaultColumnDescriptor(Cols.lastUsage.i18n(), Cols.lastUsage.ordinal(), null, getLocale()));
 		CustomCellRenderer roleRenderer = new BGRoleCellRenderer(getLocale());
-		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer));
+		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer){
+			@Override
+			public int compareTo(final int rowa, final int rowb) {
+				Object a = table.getTableDataModel().getValueAt(rowa,dataColumn);
+				Object b = table.getTableDataModel().getValueAt(rowb,dataColumn);
+				if(a instanceof BusinessGroupMembership && b instanceof BusinessGroupMembership) {
+					return MEMBERSHIP_COMPARATOR.compare((BusinessGroupMembership)a, (BusinessGroupMembership)b);
+				}
+				return super.compareTo(rowa, rowb);
+			}
+		});
 		groupListCtr.addColumnDescriptor(new BooleanColumnDescriptor(Cols.allowLeave.i18n(), Cols.allowLeave.ordinal(), TABLE_ACTION_LEAVE, translate("table.header.leave"), null));
 		groupListCtr.addColumnDescriptor(new BooleanColumnDescriptor(Cols.allowDelete.i18n(), Cols.allowDelete.ordinal(), TABLE_ACTION_DELETE, translate("table.header.delete"), null));
 		return 12;
diff --git a/src/main/java/org/olat/group/ui/main/SearchBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/SearchBusinessGroupListController.java
index 0e926263faae4725fb3b2a49f17395ef22403966..3ff29215784866c4a35ed1440efece7217176295 100644
--- a/src/main/java/org/olat/group/ui/main/SearchBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/SearchBusinessGroupListController.java
@@ -33,6 +33,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
+import org.olat.group.BusinessGroupMembership;
 import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.group.ui.main.BusinessGroupTableModelWithType.Cols;
 
@@ -88,7 +89,17 @@ public class SearchBusinessGroupListController extends AbstractBusinessGroupList
 		groupListCtr.addColumnDescriptor(new DefaultColumnDescriptor(Cols.lastTime.i18n(), Cols.lastTime.ordinal(), null, getLocale()));
 		groupListCtr.addColumnDescriptor(false, new DefaultColumnDescriptor(Cols.lastUsage.i18n(), Cols.lastUsage.ordinal(), null, getLocale()));
 		CustomCellRenderer roleRenderer = new BGRoleCellRenderer(getLocale());
-		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer));
+		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer){
+			@Override
+			public int compareTo(final int rowa, final int rowb) {
+				Object a = table.getTableDataModel().getValueAt(rowa,dataColumn);
+				Object b = table.getTableDataModel().getValueAt(rowb,dataColumn);
+				if(a instanceof BusinessGroupMembership && b instanceof BusinessGroupMembership) {
+					return MEMBERSHIP_COMPARATOR.compare((BusinessGroupMembership)a, (BusinessGroupMembership)b);
+				}
+				return super.compareTo(rowa, rowb);
+			}
+		});
 		groupListCtr.addColumnDescriptor(new BooleanColumnDescriptor(Cols.allowLeave.i18n(), Cols.allowLeave.ordinal(), TABLE_ACTION_LEAVE, translate("table.header.leave"), null));
 		return 11;
 	}
diff --git a/src/main/java/org/olat/group/ui/main/SearchOpenBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/SearchOpenBusinessGroupListController.java
index 3638956cc5863e9807815700c1060c257149e895..d14a8074af0a4acc810a8e898ed1c4b6f2c7a277 100644
--- a/src/main/java/org/olat/group/ui/main/SearchOpenBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/SearchOpenBusinessGroupListController.java
@@ -34,6 +34,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupMembership;
 import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.group.ui.main.BusinessGroupTableModelWithType.Cols;
 
@@ -71,7 +72,17 @@ public class SearchOpenBusinessGroupListController extends AbstractBusinessGroup
 		CustomCellRenderer acRenderer = new BGAccessControlledCellRenderer();
 		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.accessTypes.i18n(), Cols.accessTypes.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, acRenderer));
 		CustomCellRenderer roleRenderer = new BGRoleCellRenderer(getLocale());
-		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer));
+		groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(),  ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer){
+			@Override
+			public int compareTo(final int rowa, final int rowb) {
+				Object a = table.getTableDataModel().getValueAt(rowa,dataColumn);
+				Object b = table.getTableDataModel().getValueAt(rowb,dataColumn);
+				if(a instanceof BusinessGroupMembership && b instanceof BusinessGroupMembership) {
+					return MEMBERSHIP_COMPARATOR.compare((BusinessGroupMembership)a, (BusinessGroupMembership)b);
+				}
+				return super.compareTo(rowa, rowb);
+			}
+		});
 		groupListCtr.addColumnDescriptor(new AccessActionColumnDescriptor(Cols.accessControlLaunch.i18n(), Cols.accessControlLaunch.ordinal(), getTranslator()));
 		return 8;
 	}
diff --git a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties
index e376c097f5bf5d95a60cec82c38712b4dfb6dcb7..c6ce03858108e108c5ebda1a2ff88e95e7be971d 100644
--- a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties
@@ -29,7 +29,6 @@ index.intro=In der untenstehenden Liste finden Sie alle Gruppen, an denen Sie te
 index.table.nogroup=Sie sind in keiner Gruppe eingetragen.
 info.group.deleted=Die Gruppe wurde gel\u00F6scht.
 
-
 menu.group.admin=Gruppenverwaltung
 menu.group.admin.alt=Gruppenverwaltung
 menu.index=Gruppen
diff --git a/src/main/java/org/olat/group/ui/wizard/BGUserManagementController.java b/src/main/java/org/olat/group/ui/wizard/BGUserManagementController.java
index d1279c91a9325902785c903b0c72638bf1177bf0..2477f2038fab70441267c2568b11abbd1ad3053d 100644
--- a/src/main/java/org/olat/group/ui/wizard/BGUserManagementController.java
+++ b/src/main/java/org/olat/group/ui/wizard/BGUserManagementController.java
@@ -53,6 +53,7 @@ import org.olat.group.BusinessGroup;
 import org.olat.group.model.BGMembership;
 import org.olat.group.model.MembershipModification;
 import org.olat.group.ui.main.BGRoleCellRenderer;
+import org.olat.group.ui.main.BusinessGroupMembershipComparator;
 import org.olat.user.UserManager;
 import org.olat.user.propertyhandlers.UserPropertyHandler;
 
@@ -67,6 +68,7 @@ public class BGUserManagementController extends BasicController {
 	protected static final String COMMAND_REMOVEUSER = "removesubjectofgroup";
 	protected static final String COMMAND_VCARD = "show.vcard";
 	protected static final String COMMAND_SELECTUSER = "select.user";
+	protected static final BusinessGroupMembershipComparator MEMBERSHIP_COMPARATOR = new BusinessGroupMembershipComparator();
 	
 	private VelocityContainer mainVC;
 	private Link addOwner, addParticipant, addToWaitingList;
@@ -94,7 +96,7 @@ public class BGUserManagementController extends BasicController {
 
 		Translator userTrans = UserManager.getInstance().getPropertyHandlerTranslator(getTranslator());;
 		TableGuiConfiguration tableConfig = new TableGuiConfiguration();
-		tableConfig.setTableEmptyMessage(translate("resources.noresources"));
+		tableConfig.setTableEmptyMessage(translate("resources.nomembers"));
 		usersCtrl = new TableController(tableConfig, ureq, getWindowControl(), userTrans);
 		listenTo(usersCtrl);
 
diff --git a/src/main/java/org/olat/group/ui/wizard/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/group/ui/wizard/_i18n/LocalStrings_de.properties
index 43bfe20dc2d1ddd3ed00f0f5e292c9c50c633018..812dc3a6e9275482b37b8129d2474aed72204b8b 100644
--- a/src/main/java/org/olat/group/ui/wizard/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/group/ui/wizard/_i18n/LocalStrings_de.properties
@@ -81,6 +81,7 @@ table.subject.action=Aktion
 table.status=Status
 table.role=Rolle
 
+resources.nomembers=Es wurde keine Mitglieder für diese Gruppe gefunden.
 mailtemplateform.defaultTemplate=Standard Email Vorlage
 mailnotification.title=$org.olat.core.util.mail\:mailnotification.title
 mailtemplateform.sendMailSwitchElem=$org.olat.core.util.mail\:mailtemplateform.sendMailSwitchElem
diff --git a/src/main/java/org/olat/group/ui/wizard/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/group/ui/wizard/_i18n/LocalStrings_en.properties
index 9b376510af3a4eae5d362d8f607c63f9355534ba..8a827ccc58715cce8ddcb9311db3f87313113896 100644
--- a/src/main/java/org/olat/group/ui/wizard/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/group/ui/wizard/_i18n/LocalStrings_en.properties
@@ -74,6 +74,7 @@ merge.target.group=Target group
 merge.target.title=Choose the target group
 merge.wizard.title=Merge groups
 remove=Remove
+resources.nomembers=No course found for these groups.
 showfile=Download file
 table.role=Role
 table.status=Status
diff --git a/src/main/java/org/olat/instantMessaging/InstantMessagingService.java b/src/main/java/org/olat/instantMessaging/InstantMessagingService.java
index 3b1b0835dd11382b9f9e7fcaed4267cac64ad486..9c2063c6825678545ca9a042f677335d7658176b 100644
--- a/src/main/java/org/olat/instantMessaging/InstantMessagingService.java
+++ b/src/main/java/org/olat/instantMessaging/InstantMessagingService.java
@@ -21,6 +21,7 @@ package org.olat.instantMessaging;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
@@ -64,6 +65,8 @@ public interface InstantMessagingService {
 	
 	public BuddyStats getBuddyStats(Identity me);
 	
+	public Map<Long,String> getBuddyStatus(List<Long> identityKeys);
+	
 	/**
 	 * Enter a chat conversation
 	 * @param identity
diff --git a/src/main/java/org/olat/instantMessaging/manager/InstantMessagingServiceImpl.java b/src/main/java/org/olat/instantMessaging/manager/InstantMessagingServiceImpl.java
index f33c6832acc69325f5bcad247b2a7729349a7dce..1bbf5a6446bdc70a4290c1b23655a672bb505255 100644
--- a/src/main/java/org/olat/instantMessaging/manager/InstantMessagingServiceImpl.java
+++ b/src/main/java/org/olat/instantMessaging/manager/InstantMessagingServiceImpl.java
@@ -219,10 +219,21 @@ public class InstantMessagingServiceImpl extends BasicManager implements Instant
 	public Buddy getBuddyById(Long identityKey) {
 		IdentityShort identity = securityManager.loadIdentityShortByKey(identityKey);
 		String fullname = userManager.getUserDisplayName(identity);
-		String status = getOnlineStatus(identityKey);
+		
+		String status;
+		boolean online = isOnline(identityKey);
+		if(online) {
+			String prefStatus = prefsDao.getStatus(identityKey);
+			if(prefStatus == null) {
+				status = Presence.available.name();
+			} else {
+				status = prefStatus;
+			}
+		} else {
+			status = Presence.unavailable.name();
+		}
 		return new Buddy(identity.getKey(), identity.getName(), fullname, false, status);
 	}
-	
 
 	@Override
 	public BuddyStats getBuddyStats(Identity me) {
@@ -249,6 +260,11 @@ public class InstantMessagingServiceImpl extends BasicManager implements Instant
 		return stats;
 	}
 
+	@Override
+	public Map<Long, String> getBuddyStatus(List<Long> identityKeys) {
+		return prefsDao.getBuddyStatus(identityKeys);
+	}
+
 	@Override
 	public List<BuddyGroup> getBuddyGroups(Identity me, boolean offlineUsers) {
 		List<BuddyGroup> groups = new ArrayList<BuddyGroup>(25);
diff --git a/src/main/java/org/olat/instantMessaging/ui/ChatController.java b/src/main/java/org/olat/instantMessaging/ui/ChatController.java
index e1b0b4a99c5a3e5622b344ab62923304563ecb46..143c587a84bf3b6514a284c114eb491d37e932e6 100644
--- a/src/main/java/org/olat/instantMessaging/ui/ChatController.java
+++ b/src/main/java/org/olat/instantMessaging/ui/ChatController.java
@@ -54,8 +54,6 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.event.GenericEventListener;
-import org.olat.core.util.resource.OresHelper;
-import org.olat.group.BusinessGroup;
 import org.olat.instantMessaging.CloseInstantMessagingEvent;
 import org.olat.instantMessaging.InstantMessage;
 import org.olat.instantMessaging.InstantMessagingEvent;
diff --git a/src/main/java/org/olat/user/HomePageDisplayController.java b/src/main/java/org/olat/user/HomePageDisplayController.java
index b3c7552aaeb2601e2226f192a15d92438d0021e4..b573824540214037181ea8ecdc0c4a9f8ec767b8 100644
--- a/src/main/java/org/olat/user/HomePageDisplayController.java
+++ b/src/main/java/org/olat/user/HomePageDisplayController.java
@@ -110,6 +110,7 @@ public class HomePageDisplayController extends BasicController {
 				imLink = LinkFactory.createCustomLink("im.link", "im.link", "im.link", Link.NONTRANSLATED, mainVC, this);
 				imLink.setCustomDisplayText(translate("im.link", new String[] {fName,lName}));
 				Buddy buddy = imService.getBuddyById(homeIdentity.getKey());
+				
 				String css = (imModule.isOnlineStatusEnabled() ? getStatusCss(buddy) : "o_instantmessaging_chat_icon");
 				imLink.setCustomEnabledLinkCSS(css);
 				imLink.setUserObject(buddy);
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index 39d0f20e92ef540dcc04d5690a1938cbee964c10..fa5df89b9a2e06e994b6be526033016e461d712f 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -162,6 +162,8 @@ registration.enableDisclaimer=true
 # add a second checkbox to the disclaimer
 registration.disclaimerAdditionalCheckbox=false
 # add a link to the disclaimer with a file download
+# if set to true you can add downloadable disclaimer files in olatdata/customizing/disclaimer/ 
+# the names of the files can be configured in the i18n key org.olat.registration:disclaimer.filedownloadurl
 registration.disclaimerAdditionaLinkText=false
 
 # setting for the bean interceptor in the registration process, disabled mean that no interceptor