Index: libcfa/src/concurrency/channel.hfa
===================================================================
--- libcfa/src/concurrency/channel.hfa	(revision bf55f32002b8b72c8afd1e1f8c3258bd8d3b36ec)
+++ libcfa/src/concurrency/channel.hfa	(revision a1467c15bcdb30eb56f4f77b0df0290b9011744a)
@@ -460,4 +460,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 {
@@ -472,4 +487,5 @@
 }
 static inline chan_write(T) ?>>?( T elem, channel(T) & chan ) { chan_write(T) cw{ chan, elem }; return cw; }
+static inline chan_write(T) insert( T elem, channel(T) & chan) { chan_write(T) cw{ chan, elem }; return cw; }
 
 static inline void __handle_select_closed_write( chan_write(T) & this, select_node & node ) with(this.chan, this) {
