Index: libcfa/src/concurrency/channel.hfa
===================================================================
--- libcfa/src/concurrency/channel.hfa	(revision f3c02ea84a63625016ece7e8242ce13812968ae2)
+++ libcfa/src/concurrency/channel.hfa	(revision bf55f32002b8b72c8afd1e1f8c3258bd8d3b36ec)
@@ -330,6 +330,6 @@
 ///////////////////////////////////////////////////////////////////////////////////////////
 
-// static inline void ?>>?( T elem, channel(T) & chan ) { insert( chan, elem ); }
-// static inline void ?<<?( T & ret, channel(T) & chan ) { ret = remove( chan ); }
+static inline void ?>>?( T elem, channel(T) & chan ) { insert( chan, elem ); }
+static inline void ?<<?( T & ret, channel(T) & chan ) { ret = remove( chan ); }
 
 ///////////////////////////////////////////////////////////////////////////////////////////
@@ -372,4 +372,5 @@
     channel(T) & chan;
 };
+__CFA_SELECT_GET_TYPE( chan_read(T) );
 
 static inline void ?{}( chan_read(T) & cr, channel(T) & chan, T & ret ) {
@@ -464,4 +465,5 @@
     channel(T) & chan;
 };
+__CFA_SELECT_GET_TYPE( chan_write(T) );
 
 static inline void ?{}( chan_write(T) & cw, channel(T) & chan, T elem ) {
Index: libcfa/src/concurrency/future.hfa
===================================================================
--- libcfa/src/concurrency/future.hfa	(revision f3c02ea84a63625016ece7e8242ce13812968ae2)
+++ libcfa/src/concurrency/future.hfa	(revision bf55f32002b8b72c8afd1e1f8c3258bd8d3b36ec)
@@ -39,4 +39,5 @@
         futex_mutex lock;
 	};
+    __CFA_SELECT_GET_TYPE( future(T) );
 
     struct future_node {
Index: libcfa/src/concurrency/locks.hfa
===================================================================
--- libcfa/src/concurrency/locks.hfa	(revision f3c02ea84a63625016ece7e8242ce13812968ae2)
+++ libcfa/src/concurrency/locks.hfa	(revision bf55f32002b8b72c8afd1e1f8c3258bd8d3b36ec)
@@ -113,4 +113,5 @@
 static inline bool   unregister_select( single_acquisition_lock & this, select_node & node ) { return unregister_select( (blocking_lock &)this, node ); }
 static inline bool   on_selected( single_acquisition_lock & this, select_node & node ) { return on_selected( (blocking_lock &)this, node ); }
+__CFA_SELECT_GET_TYPE( single_acquisition_lock );
 
 //----------
@@ -130,4 +131,5 @@
 static inline bool   unregister_select( owner_lock & this, select_node & node ) { return unregister_select( (blocking_lock &)this, node ); }
 static inline bool   on_selected( owner_lock & this, select_node & node ) { return on_selected( (blocking_lock &)this, node ); }
+__CFA_SELECT_GET_TYPE( owner_lock );
 
 //-----------------------------------------------------------------------------
@@ -620,5 +622,5 @@
 
 static inline bool on_selected( simple_owner_lock & this, select_node & node ) { return true; }
-
+__CFA_SELECT_GET_TYPE( simple_owner_lock );
 
 //-----------------------------------------------------------------------------
Index: libcfa/src/concurrency/select.hfa
===================================================================
--- libcfa/src/concurrency/select.hfa	(revision f3c02ea84a63625016ece7e8242ce13812968ae2)
+++ libcfa/src/concurrency/select.hfa	(revision bf55f32002b8b72c8afd1e1f8c3258bd8d3b36ec)
@@ -94,10 +94,11 @@
 
     // This routine is run on the selecting thread prior to executing the statement corresponding to the select_node
-    //    passed as an arg to this routine
-    // If on_selected returns false, the statement is not run if the on_selected call occured as 
-    //    part of a statement block that only ran due to an unregister_select that returned true
-    //    In all other executions the return value is ignored.
+    //    passed as an arg to this routine. If true is returned proceed as normal, if false is returned the statement is skipped
     bool on_selected( T &, select_node & );
 };
+// Used inside the compiler to allow for overloading on return type for operations such as '?<<?' for channels
+// YOU MUST USE THIS MACRO OR INCLUDE AN EQUIVALENT DECL FOR YOUR TYPE TO SUPPORT WAITUNTIL
+#define __CFA_SELECT_GET_TYPE( typename ) typename __CFA_select_get_type( typename __CFA_t )
+
 
 //=============================================================================================
@@ -211,6 +212,8 @@
 bool unregister_select( select_timeout_node & this, select_node & node );
 bool on_selected( select_timeout_node & this, select_node & node );
+select_timeout_node __CFA_select_get_type( select_timeout_node this );
 
 // Gateway routines to waituntil on duration
 select_timeout_node timeout( Duration duration );
 select_timeout_node sleep( Duration duration );
+
