Index: libcfa/src/concurrency/clib/cfathread.cfa
===================================================================
--- libcfa/src/concurrency/clib/cfathread.cfa	(revision e0c072c3bbbe8115f3120141f3503d077cada4be)
+++ libcfa/src/concurrency/clib/cfathread.cfa	(revision c407434eeb45d5de6bcb9d33c9b5a7fde9346ceb)
@@ -21,4 +21,12 @@
 
 #include "cfathread.h"
+
+extern void ?{}(processor &, const char[], cluster &, $thread *);
+extern "C" {
+      extern void __cfactx_invoke_thread(void (*main)(void *), void * this);
+}
+
+//================================================================================
+// Thread run y the C Interface
 
 struct cfathread_object {
@@ -65,7 +73,62 @@
 }
 
-processor * procs = 0p;
-int proc_cnt = 1;
-
+//================================================================================
+// Special Init Thread responsible for the initialization or processors
+struct __cfainit {
+	$thread self;
+	void (*init)( void * );
+	void * arg;
+};
+void main(__cfainit & this);
+void ^?{}(__cfainit & mutex this);
+
+static inline $thread * get_thread( __cfainit & this ) { return &this.self; }
+
+typedef ThreadCancelled(__cfainit) __cfainit_exception;
+typedef ThreadCancelled_vtable(__cfainit) __cfainit_vtable;
+
+void defaultResumptionHandler(ThreadCancelled(__cfainit) & except) {
+	abort | "The init thread was cancelled";
+}
+
+__cfainit_vtable ___cfainit_vtable_instance;
+
+__cfainit_vtable const & get_exception_vtable(__cfainit_exception *) {
+	return ___cfainit_vtable_instance;
+}
+
+static void ?{}( __cfainit & this, void (*init)( void * ), void * arg ) {
+	this.init = init;
+	this.arg = arg;
+	((thread&)this){"Processir Init"};
+
+	// Don't use __thrd_start! just prep the context manually
+	$thread * this_thrd = get_thread(this);
+	void (*main_p)(__cfainit &) = main;
+
+	disable_interrupts();
+	__cfactx_start(main_p, get_coroutine(this), this, __cfactx_invoke_thread);
+
+	this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP];
+	/* paranoid */ verify( this_thrd->context.SP );
+
+	this_thrd->state = Ready;
+	enable_interrupts( __cfaabi_dbg_ctx );
+}
+
+void ^?{}(__cfainit & mutex this) {
+	^(this.self){};
+}
+
+void main( __cfainit & this ) {
+	__attribute__((unused)) void * const thrd_obj = (void*)&this;
+	__attribute__((unused)) void * const thrd_hdl = (void*)active_thread();
+	/* paranoid */ verify( thrd_obj == thrd_hdl );
+
+	this.init( this.arg );
+}
+
+//================================================================================
+// Main Api
 extern "C" {
 	int cfathread_cluster_create(cfathread_cluster_t * cl) __attribute__((nonnull(1))) {
@@ -79,7 +142,18 @@
 
 	int cfathread_cluster_add_worker(cfathread_cluster_t cl, pthread_t* tid, void (*init_routine) (void *), void * arg) {
-		// processor * proc = new("C-processor", *cl, init_routine, arg);
+		__cfainit * it = 0p;
+		if(init_routine) {
+			it = alloc();
+			(*it){init_routine, arg};
+		}
 		processor * proc = alloc();
-		(*proc){ "C-processor", *cl, init_routine, arg };
+		(*proc){ "C-processor", *cl, get_thread(*it) };
+
+		// Wait for the init thread to return before continuing
+		if(it) {
+			^(*it){};
+			free(it);
+		}
+
 		if(tid) *tid = proc->kernel_thread;
 		return 0;
