Index: src/libcfa/concurrency/invoke.h
===================================================================
--- src/libcfa/concurrency/invoke.h	(revision e2f7bc3f75223dd833821863a884160e203bb19d)
+++ src/libcfa/concurrency/invoke.h	(revision 4cc9b13dc2db7b8a44af9143406aa8fd30bec6d3)
@@ -125,4 +125,5 @@
 
             static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) {
+                  if( (lhs.list != 0) != (rhs.list != 0) ) return false;
                   if( lhs.size != rhs.size ) return false;
                   if( lhs.func != rhs.func ) return false;
Index: src/libcfa/concurrency/monitor.c
===================================================================
--- src/libcfa/concurrency/monitor.c	(revision e2f7bc3f75223dd833821863a884160e203bb19d)
+++ src/libcfa/concurrency/monitor.c	(revision 4cc9b13dc2db7b8a44af9143406aa8fd30bec6d3)
@@ -431,4 +431,6 @@
 	short actual_count = aggregate( mon_storage, mask );
 
+	if(actual_count == 0) return;
+
 	// Create storage for monitor context
 	monitor_ctx( mon_storage, actual_count );
@@ -455,5 +457,8 @@
 
 
-	if( duration == 0 ) return -1;
+	if( duration == 0 ) {
+		unlock_all( locks, count );
+		return;
+	}
 
 
@@ -642,8 +647,8 @@
 	for(	thread_desc ** thrd_it = &entry_queue->head;
 		*thrd_it;
-		thrd_it = &(*thrd_it)->next)
-	{
+		thrd_it = &(*thrd_it)->next
+	) {
 		// For each acceptable check if it matches
-		int i;
+		int i = 0;
 		__acceptable_t * end = mask.clauses + mask.size;
 		for( __acceptable_t * it = mask.clauses; it != end; it++, i++ ) {
Index: src/tests/.expect/sched-ext-else.txt
===================================================================
--- src/tests/.expect/sched-ext-else.txt	(revision 4cc9b13dc2db7b8a44af9143406aa8fd30bec6d3)
+++ src/tests/.expect/sched-ext-else.txt	(revision 4cc9b13dc2db7b8a44af9143406aa8fd30bec6d3)
@@ -0,0 +1,9 @@
+Starting
+Step 0
+else called
+Step 1
+else called
+Step 2
+else called
+Step 3
+Done
Index: src/tests/sched-ext-else.c
===================================================================
--- src/tests/sched-ext-else.c	(revision 4cc9b13dc2db7b8a44af9143406aa8fd30bec6d3)
+++ src/tests/sched-ext-else.c	(revision 4cc9b13dc2db7b8a44af9143406aa8fd30bec6d3)
@@ -0,0 +1,48 @@
+#include <fstream>
+#include <monitor>
+
+#include <stdbool.h>
+
+monitor M {};
+
+void notcalled( M & mutex m ) {
+	abort();
+}
+
+void test( M & mutex m ) {
+	int i = 0;
+	sout | "Starting" | endl;
+
+	when( false ) waitfor( notcalled, m );
+
+	sout | "Step" | i++ | endl;
+
+	waitfor( notcalled, m ); or else {
+		sout | "else called" | endl;
+	}
+
+	sout | "Step" | i++ | endl;
+
+	when( true ) waitfor( notcalled, m ); or when( true ) else {
+		sout | "else called" | endl;
+	}
+
+	sout | "Step" | i++ | endl;
+
+	when( false ) waitfor( notcalled, m ); or when( true ) else {
+		sout | "else called" | endl;
+	}
+
+	sout | "Step" | i++ | endl;
+
+	when( false ) waitfor( notcalled, m ); or when( false ) else {
+		sout | "else called" | endl;
+	}
+
+	sout | "Done" | endl;
+}
+
+int main() {
+	M m;
+	test(m);
+}
