Index: libcfa/src/concurrency/kernel/cluster.cfa
===================================================================
--- libcfa/src/concurrency/kernel/cluster.cfa	(revision 22226e4c0c12d34b6c6883c00f1607a84fce93f5)
+++ libcfa/src/concurrency/kernel/cluster.cfa	(revision adb3ea11cfb69cd28183899617b6ad0124801eb1)
@@ -253,11 +253,14 @@
 }
 
-static void assign_list(unsigned & value, dlist(processor) & list, unsigned count) {
+static void assign_list(unsigned & valrq, unsigned & valio, dlist(processor) & list, unsigned count) {
 	processor * it = &list`first;
 	for(unsigned i = 0; i < count; i++) {
 		/* paranoid */ verifyf( it, "Unexpected null iterator, at index %u of %u\n", i, count);
-		it->rdq.id = value;
+		it->rdq.id = valrq;
 		it->rdq.target = MAX;
-		value += __shard_factor.readyq;
+		it->io.id = valio;
+		it->io.target = MAX;
+		valrq += __shard_factor.readyq;
+		valio += __shard_factor.io;
 		it = &(*it)`next;
 	}
@@ -265,7 +268,23 @@
 
 static void reassign_cltr_id(struct cluster * cltr) {
-	unsigned preferred = 0;
-	assign_list(preferred, cltr->procs.actives, cltr->procs.total - cltr->procs.idle);
-	assign_list(preferred, cltr->procs.idles  , cltr->procs.idle );
+	unsigned prefrq = 0;
+	unsigned prefio = 0;
+	assign_list(prefrq, prefio, cltr->procs.actives, cltr->procs.total - cltr->procs.idle);
+	assign_list(prefrq, prefio, cltr->procs.idles  , cltr->procs.idle );
+}
+
+static void assign_io($io_context ** data, size_t count, dlist(processor) & list) {
+	processor * it = &list`first;
+	while(it) {
+		/* paranoid */ verifyf( it, "Unexpected null iterator\n");
+		/* paranoid */ verifyf( it->io.id < count, "Processor %p has id %u above count %zu\n", it, it->rdq.id, count);
+		data[it->io.id] = it->io.ctx;
+		it = &(*it)`next;
+	}
+}
+
+static void reassign_cltr_io(struct cluster * cltr) {
+	assign_io(cltr->sched.io.data, cltr->sched.io.count, cltr->procs.actives);
+	assign_io(cltr->sched.io.data, cltr->sched.io.count, cltr->procs.idles  );
 }
 
@@ -322,5 +341,5 @@
 
 	// Fix the io times
-	cltr->sched.io.count = target;
+	cltr->sched.io.count = target * __shard_factor.io;
 	fix_times(cltr->sched.io.tscs, cltr->sched.io.count);
 
@@ -330,4 +349,7 @@
 	// reassign the clusters.
 	reassign_cltr_id(cltr);
+
+	cltr->sched.io.data = alloc( cltr->sched.io.count, cltr->sched.io.data`realloc );
+	reassign_cltr_io(cltr);
 
 	// Make sure that everything is consistent
@@ -411,8 +433,11 @@
 
 	// Fix the io times
-	cltr->sched.io.count = target;
+	cltr->sched.io.count = target * __shard_factor.io;
 	fix_times(cltr->sched.io.tscs, cltr->sched.io.count);
 
 	reassign_cltr_id(cltr);
+
+	cltr->sched.io.data = alloc( cltr->sched.io.count, cltr->sched.io.data`realloc );
+	reassign_cltr_io(cltr);
 
 	// Make sure that everything is consistent
Index: libcfa/src/concurrency/kernel/cluster.hfa
===================================================================
--- libcfa/src/concurrency/kernel/cluster.hfa	(revision 22226e4c0c12d34b6c6883c00f1607a84fce93f5)
+++ libcfa/src/concurrency/kernel/cluster.hfa	(revision adb3ea11cfb69cd28183899617b6ad0124801eb1)
@@ -72,5 +72,6 @@
 static struct {
 	const unsigned readyq;
-} __shard_factor = { 2 };
+	const unsigned io;
+} __shard_factor = { 2, 1 };
 
 // Local Variables: //
