diff --git a/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamLaunchDAO.java b/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamLaunchDAO.java
index 6c3502456478724a6705add2c236e9d0536fae03..922a6bf5fe1ea54eae4306b684cdb813c73a4887 100644
--- a/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamLaunchDAO.java
+++ b/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamLaunchDAO.java
@@ -22,9 +22,12 @@ package org.olat.course.nodes.livestream.manager;
 import java.util.Date;
 import java.util.List;
 
+import javax.persistence.TypedQuery;
+
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.QueryBuilder;
 import org.olat.core.id.Identity;
+import org.olat.core.util.StringHelper;
 import org.olat.course.nodes.livestream.Launch;
 import org.olat.course.nodes.livestream.model.LaunchImpl;
 import org.olat.repository.RepositoryEntry;
@@ -60,17 +63,21 @@ public class LiveStreamLaunchDAO {
 		sb.append("select count(distinct launch.identity.key)");
 		sb.append("  from livestreamlaunch launch");
 		sb.and().append("launch.courseEntry.key = :courseEntryKey");
-		sb.and().append("launch.subIdent = :subIdent");
 		sb.and().append("launch.launchDate >= :from");
 		sb.and().append("launch.launchDate <= :to");
+		if (StringHelper.containsNonWhitespace(subIdent)) {
+			sb.and().append("launch.subIdent = :subIdent");
+		}
 		
-		List<Long> counts = dbInstance.getCurrentEntityManager()
+		TypedQuery<Long> query = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), Long.class)
 				.setParameter("courseEntryKey", courseEntry.getKey())
-				.setParameter("subIdent", subIdent)
 				.setParameter("from", from)
-				.setParameter("to", to)
-				.getResultList();
+				.setParameter("to", to);
+		if (StringHelper.containsNonWhitespace(subIdent)) {
+			query.setParameter("subIdent", subIdent);
+		}
+		List<Long> counts = query.getResultList();
 		return !counts.isEmpty()? counts.get(0): null;
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamEventDataModel.java b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamEventDataModel.java
index 7b4daec2c73188122ca45c28595a1003d6f85200..da0af44234856e994be8dc08d75a553c1242f57f 100644
--- a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamEventDataModel.java
+++ b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamEventDataModel.java
@@ -19,11 +19,15 @@
  */
 package org.olat.course.nodes.livestream.ui;
 
+import java.util.List;
 import java.util.Locale;
 
+import org.olat.core.commons.persistence.SortKey;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnDef;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate;
 
 /**
  * 
@@ -31,7 +35,8 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStreamEventRow> {
+public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStreamEventRow>
+		implements SortableFlexiTableDataModel<LiveStreamEventRow> {
 	
 	private final Locale locale;
 	
@@ -39,6 +44,13 @@ public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStr
 		super(columnsModel);
 		this.locale = locale;
 	}
+	
+	@Override
+	public void sort(SortKey orderBy) {
+		SortableFlexiTableModelDelegate<LiveStreamEventRow> sorter = new SortableFlexiTableModelDelegate<>(orderBy, this, null);
+		List<LiveStreamEventRow> rows = sorter.sort();
+		super.setObjects(rows);
+	}
 
 	@Override
 	public Object getValueAt(int row, int col) {
@@ -46,6 +58,7 @@ public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStr
 		return getValueAt(reason, col);
 	}
 
+	@Override
 	public Object getValueAt(LiveStreamEventRow row, int col) {
 		switch(EventCols.values()[col]) {
 			case begin: return row.getEvent().getBegin();
@@ -63,7 +76,7 @@ public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStr
 		return new LiveStreamEventDataModel(getTableColumnModel(), locale);
 	}
 	
-	public enum EventCols implements FlexiColumnDef {
+	public enum EventCols implements FlexiSortableColumnDef {
 		subject("table.header.subject"),
 		begin("table.header.begin"),
 		end("table.header.end"),
@@ -81,5 +94,15 @@ public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStr
 		public String i18nHeaderKey() {
 			return i18nKey;
 		}
+
+		@Override
+		public boolean sortable() {
+			return true;
+		}
+
+		@Override
+		public String sortKey() {
+			return name();
+		}
 	}
 }
diff --git a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamListController.java b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamListController.java
index 6e3997f5a212fe4b041847b2096cdaae55852b0d..9279f5a29047cfbefc7451f1715b66947ed9f5b0 100644
--- a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamListController.java
+++ b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamListController.java
@@ -97,6 +97,7 @@ public class LiveStreamListController extends FormBasicController {
 		for (LiveStreamEvent liveStreamEvent : upcomingEvents) {
 			rows.add(new LiveStreamEventRow(liveStreamEvent));
 		}
+		// ascending
 		Collections.sort(rows, (e1, e2) -> e1.getEvent().getBegin().compareTo(e2.getEvent().getBegin()));
 		dataModel.setObjects(rows);
 		tableEl.reset(false, false, true);
diff --git a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamStatisticController.java b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamStatisticController.java
index d8b33f2f5f6f5e06f709239b89444d24a0edb215..47c96e70536338175495c0c08fc7edad484d19c3 100644
--- a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamStatisticController.java
+++ b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamStatisticController.java
@@ -101,12 +101,13 @@ public class LiveStreamStatisticController extends FormBasicController {
 		List<LiveStreamEventRow> rows = new ArrayList<>(upcomingEvents.size());
 		for (LiveStreamEvent liveStreamEvent : upcomingEvents) {
 			LiveStreamEventRow row = new LiveStreamEventRow(liveStreamEvent);
-			Long viewers = liveStreamService.getLaunchers(courseEntry, courseNodeIdent, liveStreamEvent.getBegin(),
+			Long viewers = liveStreamService.getLaunchers(courseEntry, null, liveStreamEvent.getBegin(),
 					liveStreamEvent.getEnd());
 			row.setViewers(viewers);
 			rows.add(row);
 		}
-		Collections.sort(rows, (e1, e2) -> e1.getEvent().getBegin().compareTo(e2.getEvent().getBegin()));
+		// descending
+		Collections.sort(rows, (e1, e2) -> e2.getEvent().getBegin().compareTo(e1.getEvent().getBegin()));
 		dataModel.setObjects(rows);
 		tableEl.reset(false, false, true);
 	}