diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java
index 432ebece1240012c68a7ba9df509287485396a60..0725828f44787c2336bbcf62eb87763df1bfb39a 100644
--- a/src/main/java/org/olat/repository/RepositoryManager.java
+++ b/src/main/java/org/olat/repository/RepositoryManager.java
@@ -41,6 +41,7 @@ import org.olat.admin.securitygroup.gui.IdentitiesAddEvent;
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.Constants;
+import org.olat.basesecurity.IdentityImpl;
 import org.olat.basesecurity.PolicyImpl;
 import org.olat.basesecurity.SecurityGroup;
 import org.olat.basesecurity.SecurityGroupMembershipImpl;
@@ -77,6 +78,7 @@ import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSManager;
 import org.olat.course.assessment.manager.UserCourseInformationsManager;
+import org.olat.group.BusinessGroupImpl;
 import org.olat.group.GroupLoggingAction;
 import org.olat.group.context.BGContext2Resource;
 import org.olat.group.model.BGResourceRelation;
@@ -1335,20 +1337,35 @@ public class RepositoryManager extends BasicManager {
 	//fxdiff VCRP-1,2: access control
 	public boolean isMember(Identity identity, RepositoryEntry entry) {
 		StringBuilder sb = new StringBuilder();
-		sb.append("select count(v) from ").append(RepositoryEntry.class.getName()).append(" as v ")
-			.append(" where v.key=:repositoryEntryKey and v.key in (")
-			.append("   select vmember.key from ").append(RepositoryEntryMember.class.getName()).append(" vmember")
-			.append("   where vmember.key=:repositoryEntryKey and ")
-			.append("     (vmember.repoParticipantKey=:identityKey or vmember.repoTutorKey=:identityKey or vmember.repoOwnerKey=:identityKey")
-			.append("     or vmember.groupParticipantKey=:identityKey or vmember.groupOwnerKey=:identityKey)")
+		sb.append("select re.key, ident.key ")
+		  .append("from ").append(RepositoryEntry.class.getName()).append(" as re, ")
+		  .append(IdentityImpl.class.getName()).append(" as ident ")
+		  .append("where ident.key=:identityKey and re.key=:repositoryEntryKey ")
+		  .append(" and (exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember ")
+			.append("     where ident=vmember.identity and vmember.securityGroup=re.participantGroup")
+			.append("  ) or exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember ")
+			.append("     where ident=vmember.identity and vmember.securityGroup=re.tutorGroup")
+			.append("  ) or exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember ")
+			.append("     where ident=vmember.identity and vmember.securityGroup=re.ownerGroup")
+			.append("  ) or exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember, ")
+			.append("      ").append(BGResourceRelation.class.getName()).append(" as bresource, ")
+			.append("      ").append(BusinessGroupImpl.class.getName()).append(" as bgroup")
+			.append("      where bgroup.partipiciantGroup=vmember.securityGroup and re.olatResource=bresource.resource ")
+			.append("        and bgroup=bresource.group and ident=vmember.identity")
+			.append("  ) or exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember, ")
+			.append("      ").append(BGResourceRelation.class.getName()).append(" as bresource, ")
+			.append("      ").append(BusinessGroupImpl.class.getName()).append(" as bgroup")
+			.append("      where bgroup.ownerGroup=vmember.securityGroup and re.olatResource=bresource.resource ")
+			.append("        and bgroup=bresource.group and ident=vmember.identity")
+			.append("  )")
 			.append(" )");
 
-		Number counter = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Number.class)
+		List<Object[]> counter = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Object[].class)
 				.setParameter("identityKey", identity.getKey())
 				.setParameter("repositoryEntryKey", entry.getKey())
 				.setHint("org.hibernate.cacheable", Boolean.TRUE)
-				.getSingleResult();
-		return counter.intValue() > 0;
+				.getResultList();
+		return !counter.isEmpty();
 	}
 	
 	/**
diff --git a/src/test/java/org/olat/repository/RepositoryManagerTest.java b/src/test/java/org/olat/repository/RepositoryManagerTest.java
index b0c11e1886fbcf4c368bfb184195e6c80e5f4273..859d17cc602138ac7a783a5bac4d9f3f4da2f433 100644
--- a/src/test/java/org/olat/repository/RepositoryManagerTest.java
+++ b/src/test/java/org/olat/repository/RepositoryManagerTest.java
@@ -329,6 +329,52 @@ public class RepositoryManagerTest extends OlatTestCase {
 		Assert.assertFalse(member2);
 	}
 	
+	@Test
+	public void isMember_v2() {
+		Identity id1 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-1-lc-" + UUID.randomUUID().toString());
+		Identity id2 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-2-lc-" + UUID.randomUUID().toString());
+		Identity id3 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-3-lc-" + UUID.randomUUID().toString());
+		Identity id4 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-4-lc-" + UUID.randomUUID().toString());
+		Identity id5 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-5-lc-" + UUID.randomUUID().toString());
+		Identity id6 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-6-lc-" + UUID.randomUUID().toString());
+		Identity idNull = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-null-lc-" + UUID.randomUUID().toString());
+		RepositoryEntry re = JunitTestHelper.createAndPersistRepositoryEntry();
+		BusinessGroup group1 = businessGroupService.createBusinessGroup(null, "member-1-g", "tg", null, null, false, false, re);
+		BusinessGroup group2 = businessGroupService.createBusinessGroup(null, "member-2-g", "tg", null, null, false, false, re);
+		BusinessGroup group3 = businessGroupService.createBusinessGroup(null, "member-3-g", "tg", null, null, true, false, re);
+		BusinessGroup groupNull = businessGroupService.createBusinessGroup(null, "member-null-g", "tg", null, null, true, false, null);
+		securityManager.addIdentityToSecurityGroup(id1, re.getOwnerGroup());
+		securityManager.addIdentityToSecurityGroup(id2, re.getTutorGroup());
+		securityManager.addIdentityToSecurityGroup(id3, re.getParticipantGroup());
+		securityManager.addIdentityToSecurityGroup(id4, group1.getOwnerGroup());
+		securityManager.addIdentityToSecurityGroup(id5, group2.getPartipiciantGroup());
+		securityManager.addIdentityToSecurityGroup(id6, group3.getWaitingGroup());
+		securityManager.addIdentityToSecurityGroup(idNull, groupNull.getPartipiciantGroup());
+		dbInstance.commitAndCloseSession();
+
+		//id1 is owner
+		boolean member1 = repositoryManager.isMember(id1, re);
+		Assert.assertTrue(member1);
+		//id2 is tutor
+		boolean member2 = repositoryManager.isMember(id2, re);
+		Assert.assertTrue(member2);
+		//id3 is repo participant
+		boolean member3 = repositoryManager.isMember(id3, re);
+		Assert.assertTrue(member3);
+		//id4 is group coach
+		boolean member4= repositoryManager.isMember(id4, re);
+		Assert.assertTrue(member4);
+		//id5 is group participant
+		boolean member5 = repositoryManager.isMember(id5, re);
+		Assert.assertTrue(member5);
+		//id6 is waiting
+		boolean member6 = repositoryManager.isMember(id6, re);
+		Assert.assertFalse(member6);
+		//idNull is not member
+		boolean memberNull = repositoryManager.isMember(idNull, re);
+		Assert.assertFalse(memberNull);
+	}
+	
 	@Test
 	public void isOwnerOfRepositoryEntry() {
 		//create a repository entry with an owner and a participant