Index: libcfa/src/concurrency/channel.hfa
===================================================================
--- libcfa/src/concurrency/channel.hfa	(revision c6350470ab390c9044f97a10e8ed8ca3242b2f48)
+++ libcfa/src/concurrency/channel.hfa	(revision 49caf644673489257d0bcb88de5d3e741aeb0047)
@@ -326,4 +326,6 @@
     return retval;
 }
+static inline void remove( channel(T) & chan ) { T elem = (T)remove( chan ); }
+
 
 ///////////////////////////////////////////////////////////////////////////////////////////
@@ -461,4 +463,19 @@
 }
 
+// type used by select statement to capture a chan read as the selected operation that doesn't have a param to read to
+struct chan_read_no_ret {
+    T ret;
+    chan_read( T ) cr;
+};
+__CFA_SELECT_GET_TYPE( chan_read_no_ret(T) );
+
+static inline void ?{}( chan_read_no_ret(T) & this, channel(T) & chan ) {
+    this.cr{ chan, this.ret };
+}
+static inline chan_read_no_ret(T) remove( channel(T) & chan ) { chan_read_no_ret(T) cr{ chan }; return cr; }
+static inline bool register_select( chan_read_no_ret(T) & this, select_node & node ) { return register_select( this.cr, node ); }
+static inline bool unregister_select( chan_read_no_ret(T) & this, select_node & node ) { return unregister_select( this.cr, node ); }
+static inline bool on_selected( chan_read_no_ret(T) & this, select_node & node ) { return on_selected( this.cr, node ); }
+
 // type used by select statement to capture a chan write as the selected operation
 struct chan_write {
Index: tests/concurrency/waituntil/repeat_close.cfa
===================================================================
--- tests/concurrency/waituntil/repeat_close.cfa	(revision c6350470ab390c9044f97a10e8ed8ca3242b2f48)
+++ tests/concurrency/waituntil/repeat_close.cfa	(revision 49caf644673489257d0bcb88de5d3e741aeb0047)
@@ -31,10 +31,10 @@
     try {
         for( ;; ) {
-            waituntil( in << F ) { F_removes++; }
-            or waituntil( in << E ) { E_removes++; }
-            or waituntil( in << D ) { D_removes++; }
-            or waituntil( in << C ) { C_removes++; }
-            or waituntil( in << B ) { B_removes++; }
-            or waituntil( in << A ) { A_removes++; }
+            waituntil( remove(F) ) { F_removes++; }
+            or waituntil( remove(E) ) { E_removes++; }
+            or waituntil( remove(D) ) { D_removes++; }
+            or waituntil( remove(C) ) { C_removes++; }
+            or waituntil( remove(B) ) { B_removes++; }
+            or waituntil( remove(A) ) { A_removes++; }
         }
     } catchResume ( channel_closed * e ) { } // continue to remove until would block
