Index: libcfa/src/concurrency/channel.hfa
===================================================================
--- libcfa/src/concurrency/channel.hfa	(revision 2fe64ba26227e1e591b44541e61ad07f4d8d7946)
+++ libcfa/src/concurrency/channel.hfa	(revision bbecdd4e92ef5af54bd26d222e3783bf68890eaf)
@@ -444,8 +444,11 @@
 }
 static inline bool unregister_select( chan_read(T) & this, select_node & node ) { return unregister_chan( this.chan, node ); }
-static inline void on_selected( chan_read(T) & this, select_node & node ) with(this) {
-    if ( node.extra == 0p ) // check if woken up due to closed channel
-        __closed_remove( chan, ret );
+static inline bool on_selected( chan_read(T) & this, select_node & node ) with(this) {
+    if ( unlikely(node.extra == 0p) ) {
+        if ( !exception_in_flight() ) __closed_remove( chan, ret ); // check if woken up due to closed channel
+        else return false;
+    }
     // This is only reachable if not closed or closed exception was handled
+    return true;
 }
 
@@ -536,9 +539,11 @@
 static inline bool unregister_select( chan_write(T) & this, select_node & node ) { return unregister_chan( this.chan, node ); }
 
-static inline void on_selected( chan_write(T) & this, select_node & node ) with(this) { 
-    if ( node.extra == 0p ) // check if woken up due to closed channel
-        __closed_insert( chan, elem );
-
+static inline bool on_selected( chan_write(T) & this, select_node & node ) with(this) { 
+    if ( unlikely(node.extra == 0p) ) {
+        if ( !exception_in_flight() ) __closed_insert( chan, elem ); // check if woken up due to closed channel
+        else return false;
+    }
     // This is only reachable if not closed or closed exception was handled
+    return true;
 }
 
Index: libcfa/src/concurrency/future.hfa
===================================================================
--- libcfa/src/concurrency/future.hfa	(revision 2fe64ba26227e1e591b44541e61ad07f4d8d7946)
+++ libcfa/src/concurrency/future.hfa	(revision bbecdd4e92ef5af54bd26d222e3783bf68890eaf)
@@ -180,5 +180,5 @@
         }
 		
-        void on_selected( future(T) & this, select_node & node ) {}
+        bool on_selected( future(T) & this, select_node & node ) { return true; }
 	}
 }
Index: libcfa/src/concurrency/invoke.h
===================================================================
--- libcfa/src/concurrency/invoke.h	(revision 2fe64ba26227e1e591b44541e61ad07f4d8d7946)
+++ libcfa/src/concurrency/invoke.h	(revision bbecdd4e92ef5af54bd26d222e3783bf68890eaf)
@@ -255,4 +255,8 @@
 	#ifdef __cforall
 	extern "Cforall" {
+        static inline bool exception_in_flight() {
+            return __get_stack( &active_thread()->self_cor )->exception_context.current_exception != 0p;
+        }
+
 		static inline thread$ * volatile & ?`next ( thread$ * this ) {
 			return this->user_link.next;
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision 2fe64ba26227e1e591b44541e61ad07f4d8d7946)
+++ libcfa/src/concurrency/kernel.cfa	(revision bbecdd4e92ef5af54bd26d222e3783bf68890eaf)
@@ -569,5 +569,4 @@
 		returnToKernel();
 	__enable_interrupts_checked();
-
 }
 
Index: libcfa/src/concurrency/locks.cfa
===================================================================
--- libcfa/src/concurrency/locks.cfa	(revision 2fe64ba26227e1e591b44541e61ad07f4d8d7946)
+++ libcfa/src/concurrency/locks.cfa	(revision bbecdd4e92ef5af54bd26d222e3783bf68890eaf)
@@ -239,5 +239,5 @@
 }
 
-void on_selected( blocking_lock & this, select_node & node ) {}
+bool on_selected( blocking_lock & this, select_node & node ) { return true; }
 
 //-----------------------------------------------------------------------------
Index: libcfa/src/concurrency/locks.hfa
===================================================================
--- libcfa/src/concurrency/locks.hfa	(revision 2fe64ba26227e1e591b44541e61ad07f4d8d7946)
+++ libcfa/src/concurrency/locks.hfa	(revision bbecdd4e92ef5af54bd26d222e3783bf68890eaf)
@@ -112,5 +112,5 @@
 static inline bool   register_select( single_acquisition_lock & this, select_node & node ) { return register_select( (blocking_lock &)this, node ); }
 static inline bool   unregister_select( single_acquisition_lock & this, select_node & node ) { return unregister_select( (blocking_lock &)this, node ); }
-static inline void   on_selected( single_acquisition_lock & this, select_node & node ) { on_selected( (blocking_lock &)this, node ); }
+static inline bool   on_selected( single_acquisition_lock & this, select_node & node ) { return on_selected( (blocking_lock &)this, node ); }
 
 //----------
@@ -129,5 +129,5 @@
 static inline bool   register_select( owner_lock & this, select_node & node ) { return register_select( (blocking_lock &)this, node ); }
 static inline bool   unregister_select( owner_lock & this, select_node & node ) { return unregister_select( (blocking_lock &)this, node ); }
-static inline void   on_selected( owner_lock & this, select_node & node ) { on_selected( (blocking_lock &)this, node ); }
+static inline bool   on_selected( owner_lock & this, select_node & node ) { return on_selected( (blocking_lock &)this, node ); }
 
 //-----------------------------------------------------------------------------
@@ -619,5 +619,5 @@
 }
 
-static inline void on_selected( simple_owner_lock & this, select_node & node ) {}
+static inline bool on_selected( simple_owner_lock & this, select_node & node ) { return true; }
 
 
Index: libcfa/src/concurrency/select.cfa
===================================================================
--- libcfa/src/concurrency/select.cfa	(revision 2fe64ba26227e1e591b44541e61ad07f4d8d7946)
+++ libcfa/src/concurrency/select.cfa	(revision bbecdd4e92ef5af54bd26d222e3783bf68890eaf)
@@ -49,5 +49,5 @@
     return false;
 }
-void on_selected( select_timeout_node & this, select_node & node ) {}
+bool on_selected( select_timeout_node & this, select_node & node ) { return true; }
 
 // Gateway routine to wait on duration
Index: libcfa/src/concurrency/select.hfa
===================================================================
--- libcfa/src/concurrency/select.hfa	(revision 2fe64ba26227e1e591b44541e61ad07f4d8d7946)
+++ libcfa/src/concurrency/select.hfa	(revision bbecdd4e92ef5af54bd26d222e3783bf68890eaf)
@@ -96,5 +96,5 @@
     //    passed as an arg to this routine
     // If on_selected returns false, the statement is not run, if it returns true it is run.
-    void on_selected( T &, select_node & );
+    bool on_selected( T &, select_node & );
 };
 
@@ -208,5 +208,5 @@
 bool register_select( select_timeout_node & this, select_node & node );
 bool unregister_select( select_timeout_node & this, select_node & node );
-void on_selected( select_timeout_node & this, select_node & node );
+bool on_selected( select_timeout_node & this, select_node & node );
 
 // Gateway routines to waituntil on duration
