Index: libcfa/src/concurrency/select.cfa
===================================================================
--- libcfa/src/concurrency/select.cfa	(revision e23b3ce3f4ce1a6fe6be08990f27f69e64036545)
+++ libcfa/src/concurrency/select.cfa	(revision e23b3ce3f4ce1a6fe6be08990f27f69e64036545)
@@ -0,0 +1,59 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2021 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// channel.hfa -- LIBCFATHREAD
+// Runtime locks that used with the runtime thread system.
+//
+// Author           : Colby Alexander Parsons
+// Created On       : Thu Apr 21 19:46:50 2023
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#define __cforall_thread__
+#include "select.hfa"
+
+#pragma GCC visibility push(default)
+
+// As much code as possible is put in select.hfa to allow for inlining, 
+//    but this .cfa is needed to link with alarm.cfa correctly ( and possibly some other things )
+
+//=============================================================================================
+// Waituntil Timeout support
+//=============================================================================================
+
+void ?{}( select_timeout_node & this, Duration duration, Alarm_Callback callback ) {
+    this.a_node{ callback, duration, 0`s };
+}
+void ^?{}( select_timeout_node & this ) {}
+
+void timeout_handler( select_timeout_node & this ) with( this ) {
+    if ( !__make_select_node_available( *s_node ) ) return;
+    unpark( s_node->blocked_thread );
+}
+void timeout_handler_select_cast( alarm_node_t & node ) { timeout_handler( ((select_timeout_node &) node) ); }
+
+// Selectable trait routines
+bool register_select( select_timeout_node & this, select_node & node ) {
+    this.s_node = &node;
+    node.extra = 0p;
+    register_self( &this.a_node );
+    return false;
+}
+bool unregister_select( select_timeout_node & this, select_node & node ) {
+    unregister_self( &this.a_node );
+    return false;
+}
+bool on_selected( select_timeout_node & this, select_node & node ) { return true; }
+
+// Gateway routine to wait on duration
+select_timeout_node timeout( Duration duration ) {
+	select_timeout_node node{ duration, timeout_handler_select_cast };
+    return node;
+}
+select_timeout_node sleep( Duration duration ) { return timeout( duration ); }
+
Index: libcfa/src/concurrency/select.hfa
===================================================================
--- libcfa/src/concurrency/select.hfa	(revision c0ec8b6fe7503c70e9db17395e0d922d5b1dc28f)
+++ libcfa/src/concurrency/select.hfa	(revision e23b3ce3f4ce1a6fe6be08990f27f69e64036545)
@@ -1,7 +1,22 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2021 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// channel.hfa -- LIBCFATHREAD
+// Runtime locks that used with the runtime thread system.
+//
+// Author           : Colby Alexander Parsons
+// Created On       : Thu Jan 21 19:46:50 2023
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
 #pragma once
 
 #include "containers/list.hfa"
-// #include "alarm.hfa"
-#include "stdint.h"
+#include "alarm.hfa"
 #include "kernel.hfa"
 #include "time.hfa"
@@ -14,5 +29,4 @@
 static const unsigned long int __SELECT_SAT = 2;
 static const unsigned long int __SELECT_RUN = 3;
-
 
 // these are used inside the compiler to aid in code generation
@@ -105,4 +119,7 @@
     __atomic_store_n( clause_status, __SELECT_UNSAT, __ATOMIC_SEQ_CST );
 }
+static inline void __make_select_node_sat( select_node & this ) with( this ) {
+    __atomic_store_n( clause_status, __SELECT_SAT, __ATOMIC_SEQ_CST );
+}
 
 static inline bool __make_select_node_pending( select_node & this ) with( this ) {
@@ -116,6 +133,4 @@
     if( !park_counter )
         return __mark_select_node( this, (unsigned long int)&this );
-    // return *clause_status == 0 
-    //     && __atomic_compare_exchange_n( clause_status, &cmp_status, (unsigned long int)&this, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ); // OR specific case where race was won
 
     unsigned long int cmp_status = __SELECT_UNSAT;
@@ -135,5 +150,6 @@
         while ( !queue`isEmpty ) {
             // if node not a special OR case or if we win the special OR case race break
-            if ( !queue`first.clause_status || queue`first.park_counter || __make_select_node_available( queue`first ) ) { return true; }
+            if ( !queue`first.clause_status || queue`first.park_counter || __make_select_node_available( queue`first ) )
+                return true;
             // otherwise we lost the special OR race so discard node
             try_pop_front( queue );
@@ -160,3 +176,19 @@
 }
 
+// waituntil ( timeout( ... ) ) support
+struct select_timeout_node {
+    alarm_node_t a_node;
+    select_node * s_node;
+};
+void ?{}( select_timeout_node & this, Duration duration, Alarm_Callback callback );
+void ^?{}( select_timeout_node & this );
+void timeout_handler_select_cast( alarm_node_t & node );
 
+// Selectable trait routines
+bool register_select( select_timeout_node & this, select_node & node );
+bool unregister_select( select_timeout_node & this, select_node & node );
+bool on_selected( select_timeout_node & this, select_node & node );
+
+// Gateway routines to waituntil on duration
+select_timeout_node timeout( Duration duration );
+select_timeout_node sleep( Duration duration );
