Index: src/libcfa/concurrency/monitor
===================================================================
--- src/libcfa/concurrency/monitor	(revision 5ea06d660ab6356382606a997c07e3b85c308c4d)
+++ src/libcfa/concurrency/monitor	(revision ed8a0d2378d457af8e5826c9d961a9d400fcc6c1)
@@ -46,8 +46,32 @@
 //-----------------------------------------------------------------------------
 // Internal scheduling
+
+struct __condition_criterion_t {
+	bool ready;						//Whether or not the criterion is met (True if met)
+	monitor_desc * target;				//The monitor this criterion concerns
+	struct __condition_node_t * owner;		//The parent node to which this criterion belongs
+	__condition_criterion_t * next;		//Intrusive linked list Next field
+};
+
+struct __condition_node_t {
+	thread_desc * waiting_thread;			//Thread that needs to be woken when all criteria are met
+	__condition_criterion_t * criteria; 	//Array of criteria (Criterions are contiguous in memory)
+	unsigned short count;				//Number of criterions in the criteria
+	__condition_node_t * next;			//Intrusive linked list Next field
+};
+
+struct __condition_blocked_queue_t {
+	__condition_node_t * head;
+	__condition_node_t ** tail;
+};
+
+void ?{}( __condition_blocked_queue_t * );
+void append( __condition_blocked_queue_t *, __condition_node_t * );
+__condition_node_t * pop_head( __condition_blocked_queue_t * );
+
 struct condition {
-	__thread_queue_t blocked;
-	monitor_desc ** monitors;
-	unsigned short monitor_count;
+	__condition_blocked_queue_t blocked;	//Link list which contains the blocked threads as-well as the information needed to unblock them
+	monitor_desc ** monitors;			//Array of monitor pointers (Monitors are NOT contiguous in memory)
+	unsigned short monitor_count;			//Number of monitors in the array
 };
 
