diff --git a/src/main/java/org/olat/repository/RepositoryTableModel.java b/src/main/java/org/olat/repository/RepositoryTableModel.java
index 0ebaaef1ab6a9360342a23adf1cd5790152dfa91..e3bdd586db9e8f964f4a2e787f5df1ccfcf98f01 100644
--- a/src/main/java/org/olat/repository/RepositoryTableModel.java
+++ b/src/main/java/org/olat/repository/RepositoryTableModel.java
@@ -117,7 +117,48 @@ public class RepositoryTableModel extends DefaultTableDataModel<RepositoryEntry>
 		//fxdiff VCRP-1,2: access control of resources
 		CustomCellRenderer acRenderer = new RepositoryEntryACColumnDescriptor();
 		tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.ac", RepoCols.ac.ordinal(), null, 
-				loc, ColumnDescriptor.ALIGNMENT_LEFT, acRenderer));
+				loc, ColumnDescriptor.ALIGNMENT_LEFT, acRenderer) {
+
+			@Override
+			public int compareTo(int rowa, int rowb) {
+				Object o1 = table.getTableDataModel().getObject(rowa);
+				Object o2 = table.getTableDataModel().getObject(rowb);
+				if(o1 == null || !(o1 instanceof RepositoryEntry)) return -1;
+				if(o2 == null || !(o2 instanceof RepositoryEntry)) return 1;
+				RepositoryEntry re1 = (RepositoryEntry)o1;
+				RepositoryEntry re2 = (RepositoryEntry)o2;
+				
+				if(re1.isMembersOnly()) {
+					if(!re2.isMembersOnly()) {
+						return 1;
+					}
+				} else if(re2.isMembersOnly()) {
+					return -1;
+				}
+				
+				OLATResourceAccess ac1 = repoEntriesWithOffer.get(re1.getOlatResource().getKey());
+				OLATResourceAccess ac2 = repoEntriesWithOffer.get(re2.getOlatResource().getKey());
+				
+				if(ac1 == null && ac2 != null) return -1;
+				if(ac1 != null && ac2 == null) return 1;
+				if(ac1 != null && ac2 != null) return compareAccess(re1, ac1, re2, ac2);	
+				return super.compareString(re1.getDisplayname(), re2.getDisplayname());
+			}
+			
+			private int compareAccess(RepositoryEntry re1, OLATResourceAccess ac1,  RepositoryEntry re2, OLATResourceAccess ac2) {
+				int s1 = ac1.getMethods().size();
+				int s2 = ac2.getMethods().size();
+				int compare = s1 - s2;
+				if(compare != 0) return compare;
+				if(s1 > 0 && s2 > 0) {
+					String t1 = ac1.getMethods().get(0).getMethod().getType();
+					String t2 = ac2.getMethods().get(0).getMethod().getType();
+					int compareType = super.compareString(t1, t2);
+					if(compareType != 0) return compareType;
+				}
+				return super.compareString(re1.getDisplayname(), re2.getDisplayname());
+			}
+		});
 		tableCtr.addColumnDescriptor(new RepositoryEntryTypeColumnDescriptor("table.header.typeimg", RepoCols.repoEntry.ordinal(), null, 
 				loc, ColumnDescriptor.ALIGNMENT_LEFT));
 		
@@ -133,7 +174,7 @@ public class RepositoryTableModel extends DefaultTableDataModel<RepositoryEntry>
 		ColumnDescriptor nameColDesc = new DefaultColumnDescriptor("table.header.displayname", RepoCols.displayname.ordinal(), enableDirectLaunch ? TABLE_ACTION_SELECT_ENTRY : null, loc) {
 			@Override
 			public int compareTo(int rowa, int rowb) {
-				Object o1 =table.getTableDataModel().getValueAt(rowa, 1);
+				Object o1 = table.getTableDataModel().getValueAt(rowa, 1);
 				Object o2 = table.getTableDataModel().getValueAt(rowb, 1);
 				
 				if(o1 == null || !(o1 instanceof RepositoryEntry)) return -1;
@@ -191,7 +232,7 @@ public class RepositoryTableModel extends DefaultTableDataModel<RepositoryEntry>
 	 * @see org.olat.core.gui.components.table.TableDataModel#getValueAt(int, int)
 	 */
 	public Object getValueAt(int row, int col) {
-		RepositoryEntry re = (RepositoryEntry)getObject(row);
+		RepositoryEntry re = getObject(row);
 		switch (RepoCols.values()[col]) {
 			//fxdiff VCRP-1,2: access control of resources
 			case ac: {