Index: libcfa/src/concurrency/channel.hfa
===================================================================
--- libcfa/src/concurrency/channel.hfa	(revision 0e6cadf17f96f2948028d7a51ba20e3fe63a524c)
+++ libcfa/src/concurrency/channel.hfa	(revision a5aa5bf540d60862fa4c03609b41cf72df5835d0)
@@ -62,5 +62,5 @@
     bool closed;                      // indicates channel close/open
     #ifdef CHAN_STATS
-    size_t blocks, operations;      // counts total ops and ops resulting in a blocked thd
+    size_t p_blocks, p_ops, c_blocks, c_ops;      // counts total ops and ops resulting in a blocked thd
     #endif
 };
@@ -75,6 +75,8 @@
     closed = false;
     #ifdef CHAN_STATS
-    blocks = 0;
-    operations = 0;
+    p_blocks = 0;
+    p_ops = 0;
+    c_blocks = 0;
+    c_ops = 0;
     #endif
 }
@@ -83,7 +85,10 @@
 static inline void ^?{}( channel(T) &c ) with(c) {
     #ifdef CHAN_STATS
-    printf("Channel %p Blocks: %lu, Operations: %lu, %.2f%% of ops blocked\n", &c, blocks, operations, ((double)blocks)/operations * 100);
-    #endif
-    verifyf( cons`isEmpty && prods`isEmpty, "Attempted to delete channel with waiting threads (Deadlock).\n" );
+    printf("Channel %p Blocks: %lu,\t\tOperations: %lu,\t%.2f%% of ops blocked\n", &c, p_blocks + c_blocks, p_ops + c_ops, ((double)p_blocks + c_blocks)/(p_ops + c_ops) * 100);
+    printf("Channel %p Consumer Blocks: %lu,\tConsumer Ops: %lu,\t%.2f%% of Consumer ops blocked\n", &c, p_blocks, p_ops, ((double)p_blocks)/p_ops * 100);
+    printf("Channel %p Producer Blocks: %lu,\tProducer Ops: %lu,\t%.2f%% of Producer ops blocked\n", &c, c_blocks, c_ops, ((double)c_blocks)/c_ops * 100);
+    #endif
+    verifyf( __handle_waituntil_OR( cons ) || __handle_waituntil_OR( prods ) || cons`isEmpty && prods`isEmpty, 
+        "Attempted to delete channel with waiting threads (Deadlock).\n" );
     if ( size != 0 ) delete( buffer );
 }
@@ -149,5 +154,5 @@
     lock( mutex_lock );
     #ifdef CHAN_STATS
-    operations++;
+    p_ops++;
     #endif
 
@@ -187,5 +192,5 @@
 
     #ifdef CHAN_STATS
-    if ( !closed ) operations++;
+    if ( !closed ) p_ops++;
     #endif
 
@@ -208,5 +213,5 @@
     if ( count == size ) {
         #ifdef CHAN_STATS
-        blocks++;
+        p_blocks++;
         #endif
 
@@ -237,5 +242,5 @@
     lock( mutex_lock );
     #ifdef CHAN_STATS
-    operations++;
+    c_ops++;
     #endif
 
@@ -285,5 +290,5 @@
 
     #ifdef CHAN_STATS
-    if ( !closed ) operations++;
+    if ( !closed ) c_ops++;
     #endif
 
@@ -305,5 +310,5 @@
     if ( count == 0 ) {
         #ifdef CHAN_STATS
-        blocks++;
+        c_blocks++;
         #endif
         // check for if woken due to close
@@ -323,10 +328,7 @@
 ///////////////////////////////////////////////////////////////////////////////////////////
 static inline bool unregister_chan( channel(T) & chan, select_node & node ) with(chan) {
-    // if ( !node`isListed && !node.park_counter ) return false; // handle special OR case C_TODO: try adding this back
+    if ( !node`isListed && !node.park_counter ) return false; // handle special OR case
     lock( mutex_lock );
     if ( node`isListed ) { // op wasn't performed
-        #ifdef CHAN_STATS
-        operations--;
-        #endif
         remove( node );
         unlock( mutex_lock );
@@ -362,5 +364,5 @@
 
     #ifdef CHAN_STATS
-    if ( !closed ) operations++;
+    if ( !closed ) c_ops++;
     #endif
 
@@ -407,5 +409,5 @@
     if ( count == 0 ) {
         #ifdef CHAN_STATS
-        blocks++;
+        c_blocks++;
         #endif
         
@@ -451,5 +453,5 @@
 
     #ifdef CHAN_STATS
-    if ( !closed ) operations++;
+    if ( !closed ) p_ops++;
     #endif
 
@@ -498,5 +500,5 @@
     if ( count == size ) {
         #ifdef CHAN_STATS
-        blocks++;
+        p_blocks++;
         #endif
 
Index: libcfa/src/concurrency/locks.hfa
===================================================================
--- libcfa/src/concurrency/locks.hfa	(revision 0e6cadf17f96f2948028d7a51ba20e3fe63a524c)
+++ libcfa/src/concurrency/locks.hfa	(revision a5aa5bf540d60862fa4c03609b41cf72df5835d0)
@@ -176,8 +176,4 @@
 static inline void ?{}(mcs_spin_node & this) { this.next = 0p; this.locked = true; }
 
-static inline mcs_spin_node * volatile & ?`next ( mcs_spin_node * node ) {
-	return node->next;
-}
-
 struct mcs_spin_lock {
 	mcs_spin_queue queue;
@@ -185,9 +181,9 @@
 
 static inline void lock(mcs_spin_lock & l, mcs_spin_node & n) {
+    n.locked = true;
 	mcs_spin_node * prev = __atomic_exchange_n(&l.queue.tail, &n, __ATOMIC_SEQ_CST);
-	n.locked = true;
-	if(prev == 0p) return;
+	if( prev == 0p ) return;
 	prev->next = &n;
-	while(__atomic_load_n(&n.locked, __ATOMIC_RELAXED)) Pause();
+	while( __atomic_load_n(&n.locked, __ATOMIC_RELAXED) ) Pause();
 }
 
@@ -195,5 +191,5 @@
 	mcs_spin_node * n_ptr = &n;
 	if (__atomic_compare_exchange_n(&l.queue.tail, &n_ptr, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) return;
-	while (__atomic_load_n(&n.next, __ATOMIC_RELAXED) == 0p) {}
+	while (__atomic_load_n(&n.next, __ATOMIC_RELAXED) == 0p) Pause();
 	n.next->locked = false;
 }
