Index: libcfa/src/concurrency/kernel/startup.cfa
===================================================================
--- libcfa/src/concurrency/kernel/startup.cfa	(revision da3963ae1399ac41655fc82eda47fad820dd3ccf)
+++ libcfa/src/concurrency/kernel/startup.cfa	(revision d60d30ef3cbda3a4010ce92c21dcd3ce89fb6684)
@@ -104,5 +104,5 @@
 KERNEL_STORAGE($thread,	             mainThread);
 KERNEL_STORAGE(__stack_t,            mainThreadCtx);
-KERNEL_STORAGE(io_context,           mainPollerThread);
+KERNEL_STORAGE(io_context,           mainIoContext);
 KERNEL_STORAGE(__scheduler_RWLock_t, __scheduler_lock);
 #if !defined(__CFA_NO_STATISTICS__)
@@ -231,4 +231,7 @@
 	__kernel_io_startup();
 
+	io_context * mainio = (io_context *)&storage_mainIoContext;
+	(*mainio){ *mainCluster };
+
 	// Add the main thread to the ready queue
 	// once resume is called on mainProcessor->runner the mainThread needs to be scheduled like any normal thread
@@ -243,14 +246,4 @@
 	// THE SYSTEM IS NOW COMPLETELY RUNNING
 
-
-	// SKULLDUGGERY: The constructor for the mainCluster will call alloc with a dimension of 0
-	// malloc *can* return a non-null value, we should free it if that is the case
-	free( mainCluster->io.ctxs );
-
-	// Now that the system is up, finish creating systems that need threading
-	mainCluster->io.ctxs = (io_context *)&storage_mainPollerThread;
-	mainCluster->io.cnt  = 1;
-	(*mainCluster->io.ctxs){ *mainCluster };
-
 	__cfadbg_print_safe(runtime_core, "Kernel : Started\n--------------------------------------------------\n\n");
 
@@ -263,7 +256,6 @@
 static void __kernel_shutdown(void) {
 	//Before we start shutting things down, wait for systems that need threading to shutdown
-	^(*mainCluster->io.ctxs){};
-	mainCluster->io.cnt  = 0;
-	mainCluster->io.ctxs = 0p;
+	io_context * mainio = (io_context *)&storage_mainIoContext;
+	^(*mainio){};
 
 	/* paranoid */ verify( __preemption_enabled() );
@@ -486,4 +478,7 @@
 	pending_preemption = false;
 
+	this.io.ctx = 0p;
+	this.io.lock = false;
+
 	#if !defined(__CFA_NO_STATISTICS__)
 		print_stats = 0;
@@ -584,4 +579,7 @@
 	threads{ __get };
 
+	io.arbiter = create();
+	io.params = io_params;
+
 	doregister(this);
 
@@ -596,18 +594,8 @@
 	ready_mutate_unlock( last_size );
 	enable_interrupts_noPoll(); // Don't poll, could be in main cluster
-
-
-	this.io.cnt  = num_io;
-	this.io.ctxs = aalloc(num_io);
-	for(i; this.io.cnt) {
-		(this.io.ctxs[i]){ this, io_params };
-	}
 }
 
 void ^?{}(cluster & this) {
-	for(i; this.io.cnt) {
-		^(this.io.ctxs[i]){ true };
-	}
-	free(this.io.ctxs);
+	destroy(this.io.arbiter);
 
 	// Lock the RWlock so no-one pushes/pops while we are changing the queue
