Index: libcfa/src/concurrency/channel.hfa
===================================================================
--- libcfa/src/concurrency/channel.hfa	(revision 4c8ce47cc0e5bf21ab409146e9a060bf5f45aac5)
+++ libcfa/src/concurrency/channel.hfa	(revision b93bf851cd2f4c65993fbbd554e9a71949aa906d)
@@ -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 4c8ce47cc0e5bf21ab409146e9a060bf5f45aac5)
+++ libcfa/src/concurrency/future.hfa	(revision b93bf851cd2f4c65993fbbd554e9a71949aa906d)
@@ -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 4c8ce47cc0e5bf21ab409146e9a060bf5f45aac5)
+++ libcfa/src/concurrency/invoke.h	(revision b93bf851cd2f4c65993fbbd554e9a71949aa906d)
@@ -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 4c8ce47cc0e5bf21ab409146e9a060bf5f45aac5)
+++ libcfa/src/concurrency/kernel.cfa	(revision b93bf851cd2f4c65993fbbd554e9a71949aa906d)
@@ -569,5 +569,4 @@
 		returnToKernel();
 	__enable_interrupts_checked();
-
 }
 
Index: libcfa/src/concurrency/locks.cfa
===================================================================
--- libcfa/src/concurrency/locks.cfa	(revision 4c8ce47cc0e5bf21ab409146e9a060bf5f45aac5)
+++ libcfa/src/concurrency/locks.cfa	(revision b93bf851cd2f4c65993fbbd554e9a71949aa906d)
@@ -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 4c8ce47cc0e5bf21ab409146e9a060bf5f45aac5)
+++ libcfa/src/concurrency/locks.hfa	(revision b93bf851cd2f4c65993fbbd554e9a71949aa906d)
@@ -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 4c8ce47cc0e5bf21ab409146e9a060bf5f45aac5)
+++ libcfa/src/concurrency/select.cfa	(revision b93bf851cd2f4c65993fbbd554e9a71949aa906d)
@@ -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 4c8ce47cc0e5bf21ab409146e9a060bf5f45aac5)
+++ libcfa/src/concurrency/select.hfa	(revision b93bf851cd2f4c65993fbbd554e9a71949aa906d)
@@ -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
Index: src/Concurrency/Waituntil.cpp
===================================================================
--- src/Concurrency/Waituntil.cpp	(revision 4c8ce47cc0e5bf21ab409146e9a060bf5f45aac5)
+++ src/Concurrency/Waituntil.cpp	(revision b93bf851cd2f4c65993fbbd554e9a71949aa906d)
@@ -1290,10 +1290,8 @@
     // Collection of unregister calls on resources to be put in finally clause
     // for each clause: 
-    // when_cond_i = (!__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei );
+    // if ( !__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei ) ) { ... clausei stmt ... }
     // OR if when( ... ) defined on resource
-    // if ( when_cond_i ) 
-    //   when_cond_i =  (!__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei );
+    // if ( when_cond_i && (!__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei ) ) { ... clausei stmt ... }
     CompoundStmt * unregisters = new CompoundStmt( loc );
-
 
     Expr * statusExpr; // !__CFA_has_clause_run( clause_statuses[i] )
@@ -1348,7 +1346,23 @@
             new IfStmt( cLoc,
                 statusExpr,
-                genStmtBlock( stmt->clauses.at(i), clauseData.at(i) )
-            )
-        );
+                new CompoundStmt( cLoc,
+                    {
+                        new IfStmt( cLoc,
+                            genSelectTraitCall( stmt->clauses.at(i), clauseData.at(i), "on_selected" ),
+                            ast::deepCopy( stmt->clauses.at(i)->stmt )
+                        )
+                    }
+                )
+            )
+        );
+
+        // // generates:
+        // // if ( statusExpr ) { ... clausei stmt ... }
+        // unregisters->push_back( 
+        //     new IfStmt( cLoc,
+        //         statusExpr,
+        //         genStmtBlock( stmt->clauses.at(i), clauseData.at(i) )
+        //     )
+        // );
     }
 
