diff --git a/src/main/java/org/olat/core/gui/components/table/DefaultColumnDescriptor.java b/src/main/java/org/olat/core/gui/components/table/DefaultColumnDescriptor.java
index 5c66b832bc1544bdd2456b9ac310342dca47de32..a4d005cc075af7c3caa3bf6fcf220b14a5925945 100644
--- a/src/main/java/org/olat/core/gui/components/table/DefaultColumnDescriptor.java
+++ b/src/main/java/org/olat/core/gui/components/table/DefaultColumnDescriptor.java
@@ -157,32 +157,39 @@ public class DefaultColumnDescriptor implements ColumnDescriptor {
 		} else if (a instanceof Comparable && b instanceof Comparable) {
 			return compareComparablesAndTimestamps(a, b);
 		} else if (a instanceof Boolean && b instanceof Boolean) { // faster than string compare
-			return compareBooleansHandlingNulls(a, b);
+			return compareBooleans((Boolean)a, (Boolean)b);
 		} else { // don't know how to compare, use the String value
 			return a.toString().compareTo(b.toString());
 		}
 	}
+	
+	protected int compareString(final String a, final String b) {
+		return collator.compare(a, b);
+	}
 
-	private int compareBooleansHandlingNulls(final Object a, final Object b) {
-		boolean ba = ((Boolean)a).booleanValue();
-		boolean bb = ((Boolean)b).booleanValue();
+	protected int compareBooleans(final Boolean a, final Boolean b) {
+		boolean ba = a.booleanValue();
+		boolean bb = b.booleanValue();
 		return ba? (bb? 0: -1):(bb? 1: 0);
 	}
 
-	private int compareComparablesAndTimestamps(final Object a, final Object b) {
+	protected int compareComparablesAndTimestamps(final Object a, final Object b) {
 		// grmpf, we need to check on timestamp since Timestamp cannot compare dates (ClassCastException)
 		// See also http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103041 for the java 1.4/1.5 code bug
-		if (a instanceof Timestamp) { // a timestamp (a) cannot compare a date (b), but vice versa is ok.
+		if (a instanceof Timestamp && b instanceof Date) { // a timestamp (a) cannot compare a date (b), but vice versa is ok.
 			Timestamp ta = (Timestamp)a;
-			Date aAsDate = new Date(ta.getTime());  // nanos get lost here, but milis should be enough in most cases, TODO:fj:c better solution here
-			return ((Comparable)aAsDate).compareTo(b);
-			//TODO:fj:a see also the todo in AuditInterceptor.java!
-		}else{
+			Date aAsDate = new Date(ta.getTime());
+			return aAsDate.compareTo((Date)b);
+		} else if (a instanceof Date && b instanceof Timestamp) {
+			Timestamp tb = (Timestamp)b;
+			Date bAsDate = new Date(tb.getTime());
+			return ((Date)a).compareTo(bAsDate);
+		} else {
 			return ((Comparable)a).compareTo(b);
 		}
 	}
 
-	private int compareNullObjects(final Object a, final Object b) {
+	protected int compareNullObjects(final Object a, final Object b) {
 		boolean ba = (a == null);
 		boolean bb = (b == null);
 		return ba? (bb? 0: -1):(bb? 1: 0);
diff --git a/src/main/java/org/olat/repository/RepositoryTableModel.java b/src/main/java/org/olat/repository/RepositoryTableModel.java
index a4623f0e2c4f9b1abb943ad268ff4bc8af96aa12..ae41bea840f85543edcdde94df5446d93ce4a3db 100644
--- a/src/main/java/org/olat/repository/RepositoryTableModel.java
+++ b/src/main/java/org/olat/repository/RepositoryTableModel.java
@@ -98,7 +98,33 @@ public class RepositoryTableModel extends DefaultTableDataModel<RepositoryEntry>
 				translator.getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, acRenderer));
 		tableCtr.addColumnDescriptor(new RepositoryEntryTypeColumnDescriptor("table.header.typeimg", 1, null, 
 				translator.getLocale(), ColumnDescriptor.ALIGNMENT_LEFT));
-		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.displayname", 2, enableDirectLaunch ? TABLE_ACTION_SELECT_ENTRY : null, translator.getLocale()));
+		
+		ColumnDescriptor nameColDesc = new DefaultColumnDescriptor("table.header.displayname", 2, enableDirectLaunch ? TABLE_ACTION_SELECT_ENTRY : null, translator.getLocale()) {
+			@Override
+			public int compareTo(int rowa, int rowb) {
+				Object o1 =table.getTableDataModel().getValueAt(rowa, 1);
+				Object o2 = table.getTableDataModel().getValueAt(rowb, 1);
+				
+				if(o1 == null || !(o1 instanceof RepositoryEntry)) return -1;
+				if(o2 == null || !(o2 instanceof RepositoryEntry)) return 1;
+				RepositoryEntry re1 = (RepositoryEntry)o1;
+				RepositoryEntry re2 = (RepositoryEntry)o2;
+				boolean c1 = RepositoryManager.getInstance().createRepositoryEntryStatus(re1.getStatusCode()).isClosed();
+				boolean c2 = RepositoryManager.getInstance().createRepositoryEntryStatus(re2.getStatusCode()).isClosed();
+				int result = (c2 == c1 ? 0 : (c1 ? 1 : -1));//same as Boolean compare
+				if(result == 0) {
+					Object a = table.getTableDataModel().getValueAt(rowa, dataColumn);
+					Object b = table.getTableDataModel().getValueAt(rowb, dataColumn);
+					if(a == null || !(a instanceof String)) return -1;
+					if(b == null || !(b instanceof String)) return 1;
+					String s1 = (String)a;
+					String s2 = (String)b;
+					result = compareString(s1, s2);
+				}
+				return result;
+			}
+		};
+		tableCtr.addColumnDescriptor(nameColDesc);
 		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.author", 3, null, translator.getLocale()));
 		tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.access", 4, null, translator.getLocale()));
 		tableCtr.addColumnDescriptor(false, new DefaultColumnDescriptor("table.header.date", 5, null, translator.getLocale()));