diff --git a/src/main/java/org/olat/group/BusinessGroupService.java b/src/main/java/org/olat/group/BusinessGroupService.java
index 78f18613648dea89c1021837d9e5b7f815dd3985..99aebca8bc727b9cabb537c61d0d14a68078ae9f 100644
--- a/src/main/java/org/olat/group/BusinessGroupService.java
+++ b/src/main/java/org/olat/group/BusinessGroupService.java
@@ -520,6 +520,15 @@ public interface BusinessGroupService {
 	 */
 	public List<BusinessGroupMembership> getBusinessGroupMembership(Collection<Long> businessGroups, Identity... identity);
 
+	/**
+	 * Return the list of membership of the groups. A membership per user and per group, but
+	 * a membership can be owner and participant at the same time if the user is owner and
+	 * participant of the group.
+	 * @param businessGroups
+	 * @return
+	 */
+	public List<BusinessGroupMembership> getBusinessGroupsMembership(Collection<BusinessGroup> businessGroups);
+	
 	/**
 	 * Checks if an identity is in a business group with a specific key, either as owner or
 	 * as participant
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java
index 7387910ec3d59581bdc4dd6fb5fe25fb12376a28..a512ed2201597d6be29b2b6cf5b14de39ce920d6 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java
@@ -23,7 +23,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.persistence.EntityManager;
 import javax.persistence.LockModeType;
@@ -45,14 +47,17 @@ import org.olat.core.util.StringHelper;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupImpl;
 import org.olat.group.BusinessGroupLazy;
+import org.olat.group.BusinessGroupMembership;
 import org.olat.group.BusinessGroupOrder;
 import org.olat.group.BusinessGroupShort;
 import org.olat.group.BusinessGroupView;
 import org.olat.group.model.BGRepositoryEntryRelation;
 import org.olat.group.model.BGResourceRelation;
+import org.olat.group.model.BusinessGroupMembershipImpl;
 import org.olat.group.model.BusinessGroupMembershipViewImpl;
 import org.olat.group.model.BusinessGroupShortImpl;
 import org.olat.group.model.BusinessGroupViewImpl;
+import org.olat.group.model.IdentityGroupKey;
 import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.properties.Property;
 import org.olat.repository.model.RepositoryEntryMembership;
@@ -249,6 +254,82 @@ public class BusinessGroupDAO {
 		return group;
 	}
 	
+	public List<BusinessGroupMembership> getBusinessGroupsMembership(Collection<BusinessGroup> groups) {
+		
+		List<Long> ownerGroupKeys = new ArrayList<Long>();
+		List<Long> participantGroupKeys = new ArrayList<Long>();
+		List<Long> waitingGroupKeys = new ArrayList<Long>();
+		Map<Long,Long> secGroupToGroup = new HashMap<Long,Long>();
+		for(BusinessGroup group:groups) {
+			if(group.getOwnerGroup() != null) {
+				ownerGroupKeys.add(group.getOwnerGroup().getKey());
+				secGroupToGroup.put(group.getOwnerGroup().getKey(), group.getKey());
+			}
+			if(group.getPartipiciantGroup() != null) {
+				participantGroupKeys.add(group.getPartipiciantGroup().getKey());
+				secGroupToGroup.put(group.getPartipiciantGroup().getKey(), group.getKey());
+			}
+			if(group.getWaitingListEnabled() != null && group.getWaitingListEnabled().booleanValue()
+					&& group.getWaitingGroup() != null) {
+				waitingGroupKeys.add(group.getWaitingGroup().getKey());
+				secGroupToGroup.put(group.getWaitingGroup().getKey(), group.getKey());
+			}
+		}
+
+		Map<IdentityGroupKey, BusinessGroupMembershipImpl> memberships = new HashMap<IdentityGroupKey, BusinessGroupMembershipImpl>();
+		
+		loadBusinessGroupsMembership(ownerGroupKeys, memberships, secGroupToGroup, true, false, false);
+		loadBusinessGroupsMembership(participantGroupKeys, memberships, secGroupToGroup, false, true, false);
+		loadBusinessGroupsMembership(waitingGroupKeys, memberships, secGroupToGroup, false, false, true);
+
+		return new ArrayList<BusinessGroupMembership>(memberships.values());
+	}
+	
+	private void loadBusinessGroupsMembership(Collection<Long> secGroupKeys,
+			Map<IdentityGroupKey, BusinessGroupMembershipImpl> memberships,
+			Map<Long,Long> secGroupToGroup, boolean owner, boolean participant, boolean waiting) {
+		
+		if(secGroupKeys == null || secGroupKeys.isEmpty()) {
+			return;
+		}
+		
+		StringBuilder sb = new StringBuilder(); 
+		sb.append("select membership.identity.key, membership.creationDate, membership.lastModified, membership.securityGroup.key from ")
+		  .append(SecurityGroupMembershipImpl.class.getName()).append(" as membership ")
+		  .append(" where membership.securityGroup.key in (:secGroupKeys)");
+		
+		List<Object[]> members = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), Object[].class)
+				.setParameter("secGroupKeys", secGroupKeys)
+				.getResultList();
+		
+		for(Object[] membership:members) {
+			Long identityKey = (Long)membership[0];
+			Date creationDate = (Date)membership[1];
+			Date lastModified = (Date)membership[2];
+			Long secGroupKey = (Long)membership[3];
+			
+			Long groupKey = secGroupToGroup.get(secGroupKey);
+
+			IdentityGroupKey key = new IdentityGroupKey(identityKey, groupKey);
+			if(!memberships.containsKey(key)) {
+				memberships.put(key, new BusinessGroupMembershipImpl(identityKey, groupKey));
+			}
+			BusinessGroupMembershipImpl mb = memberships.get(key);
+			mb.setCreationDate(creationDate);
+			mb.setLastModified(lastModified);
+			if(owner) {
+				mb.setOwner(true);
+			}
+			if(participant) {
+				mb.setParticipant(true);
+			}
+			if(waiting) {
+				mb.setWaiting(true);
+			}	
+		}
+	}
+	
 	public int countMembershipInfoInBusinessGroups(Identity identity, List<Long> groupKeys) {
 		StringBuilder sb = new StringBuilder(); 
 		sb.append("select count(membership) from ").append(BusinessGroupMembershipViewImpl.class.getName()).append(" as membership ")
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
index 3194f7a05b1fcec7c943655867fdb69e7ed5f364..11ab86fa9bdc85e701545b0ac4d03f2efe9e64cd 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
@@ -1654,6 +1654,11 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 		return false;
 	}
 
+	@Override
+	public List<BusinessGroupMembership> getBusinessGroupsMembership(Collection<BusinessGroup> businessGroups) {
+		return businessGroupDAO.getBusinessGroupsMembership(businessGroups);
+	}
+
 	@Override
 	public List<BusinessGroupMembership> getBusinessGroupMembership(Collection<Long> businessGroups, Identity... identity) {
 		List<BusinessGroupMembershipViewImpl> views =
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 e13baf63e62f5fb4d6ba402c9257d14a11fc068f..fe408942207069d75d197f1e954cf29099fa6661 100644
--- a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java
+++ b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java
@@ -558,8 +558,9 @@ public abstract class AbstractMemberListController extends BasicController imple
 			groupKeys.add(group.getKey());
 			keyToGroupMap.put(group.getKey(), group);
 		}
+
 		List<BusinessGroupMembership> memberships = groups.isEmpty() ? Collections.<BusinessGroupMembership>emptyList() :
-				businessGroupService.getBusinessGroupMembership(groupKeys);
+			businessGroupService.getBusinessGroupsMembership(groups);
 
 		//get identities
 		Set<Long> identityKeys = new HashSet<Long>();
diff --git a/src/test/java/org/olat/group/test/BusinessGroupDAOTest.java b/src/test/java/org/olat/group/test/BusinessGroupDAOTest.java
index b37858cf403a02d32f7699e8eba5d2421b8bc63d..e6ed4e77b5010152ec8b51c3d48559fab0caf57f 100644
--- a/src/test/java/org/olat/group/test/BusinessGroupDAOTest.java
+++ b/src/test/java/org/olat/group/test/BusinessGroupDAOTest.java
@@ -44,6 +44,7 @@ import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupLazy;
+import org.olat.group.BusinessGroupMembership;
 import org.olat.group.BusinessGroupOrder;
 import org.olat.group.BusinessGroupShort;
 import org.olat.group.BusinessGroupView;
@@ -1264,6 +1265,65 @@ public class BusinessGroupDAOTest extends OlatTestCase {
 		Assert.assertEquals(3, found);
 	}
 	
+	@Test
+	public void getBusinessGroupsMembership() {
+		Identity id1 = JunitTestHelper.createAndPersistIdentityAsUser("is-in-grp-rev-1" + UUID.randomUUID().toString());
+		Identity id2 = JunitTestHelper.createAndPersistIdentityAsUser("is-in-grp-rev-2" + UUID.randomUUID().toString());
+		BusinessGroup group1 = businessGroupDao.createAndPersist(id1, "is-in-grp-rev-1", "is-in-grp-rev-1-desc", 0, 5, true, false, true, false, false);
+		BusinessGroup group2 = businessGroupDao.createAndPersist(id2, "is-in-grp-rev-2", "is-in-grp-rev-2-desc", 0, 5, true, false, true, false, false);
+		BusinessGroup group3 = businessGroupDao.createAndPersist(null, "is-in-grp-rev-3", "is-in-grp-rev-3-desc", 0, 5, true, false, true, false, false);
+		dbInstance.commitAndCloseSession();
+
+		securityManager.addIdentityToSecurityGroup(id1, group2.getPartipiciantGroup());
+		securityManager.addIdentityToSecurityGroup(id1, group3.getWaitingGroup());
+		securityManager.addIdentityToSecurityGroup(id2, group2.getPartipiciantGroup());
+		securityManager.addIdentityToSecurityGroup(id2, group3.getPartipiciantGroup());
+		dbInstance.commitAndCloseSession();
+		
+		List<BusinessGroup> groups = new ArrayList<BusinessGroup>();
+		groups.add(group1);
+		groups.add(group2);
+		groups.add(group3);
+		List<Long> groupKeys = new ArrayList<Long>();
+		groupKeys.add(group1.getKey());
+		groupKeys.add(group2.getKey());
+		groupKeys.add(group3.getKey());
+
+		//check owner + attendee
+		int countMembership1 = businessGroupDao.countMembershipInfoInBusinessGroups(id1, groupKeys);
+		int countMembership2 = businessGroupDao.countMembershipInfoInBusinessGroups(id2, groupKeys);
+		Assert.assertEquals(3, countMembership1);
+		Assert.assertEquals(3, countMembership2);
+		List<BusinessGroupMembership> memberships = businessGroupDao.getBusinessGroupsMembership(groups);
+		Assert.assertNotNull(memberships);
+		//5: id1 3 membership in group1, group2, group3 and id2 2 memberships in group2 and group3
+		Assert.assertEquals(5, memberships.size());
+
+		int foundOwn = 0;
+		int foundPart = 0;
+		int foundWait = 0;
+		for(BusinessGroupMembership membership:memberships) {
+			Assert.assertNotNull(membership.getIdentityKey());
+			Assert.assertNotNull(membership.getCreationDate());
+			Assert.assertNotNull(membership.getLastModified());
+			Assert.assertNotNull(membership.getGroupKey());
+			Assert.assertTrue(groupKeys.contains(membership.getGroupKey()));
+			if(membership.isOwner()) {
+				foundOwn++;
+			}
+			if(membership.isParticipant()) {
+				foundPart++;
+			}
+			if(membership.isWaiting()) {
+				foundWait++;
+			}
+		}
+		Assert.assertEquals(2, foundOwn);
+		Assert.assertEquals(3, foundPart);
+		Assert.assertEquals(1, foundWait);
+	}
+	
+	
 	@Test
 	public void getMembershipInfoInBusinessGroupsWithoutIdentityParam() {
 		Identity id1 = JunitTestHelper.createAndPersistIdentityAsUser("is-in-grp-" + UUID.randomUUID().toString());