Index: Jenkinsfile
===================================================================
--- Jenkinsfile	(revision 41d3c8d53e47a61467628191045f040de3226cb8)
+++ Jenkinsfile	(revision 98d1b90b045a68a7489e5600d3622bfe2d876b7e)
@@ -108,5 +108,5 @@
 
 			// Configure libcfa
-			sh 'make -j 8 --no-print-directory configure-libcfa'
+			sh 'make -j $(nproc) --no-print-directory configure-libcfa'
 		}
 	}
@@ -116,8 +116,8 @@
 		dir (BuildDir) {
 			// Build driver
-			sh 'make -j 8 --no-print-directory -C driver'
+			sh 'make -j $(nproc) --no-print-directory -C driver'
 
 			// Build translator
-			sh 'make -j 8 --no-print-directory -C src'
+			sh 'make -j $(nproc) --no-print-directory -C src'
 		}
 	}
@@ -126,5 +126,5 @@
 		// Build outside of the src tree to ease cleaning
 		dir (BuildDir) {
-			sh "make -j 8 --no-print-directory -C libcfa/${Settings.Architecture.name}-debug"
+			sh "make -j $(nproc) --no-print-directory -C libcfa/${Settings.Architecture.name}-debug"
 		}
 	}
@@ -133,5 +133,5 @@
 		// Build outside of the src tree to ease cleaning
 		dir (BuildDir) {
-			sh "make -j 8 --no-print-directory -C libcfa/${Settings.Architecture.name}-nodebug"
+			sh "make -j $(nproc) --no-print-directory -C libcfa/${Settings.Architecture.name}-nodebug"
 		}
 	}
@@ -140,5 +140,5 @@
 		// Build outside of the src tree to ease cleaning
 		dir (BuildDir) {
-			sh "make -j 8 --no-print-directory install"
+			sh "make -j $(nproc) --no-print-directory install"
 		}
 	}
@@ -161,5 +161,5 @@
 		Tools.BuildStage('Test: full', Settings.RunAllTests) {
 			dir (BuildDir) {
-					jopt = ""
+					jopt = "-j $(nproc)"
 					if( Settings.Architecture.node == 'x86' ) {
 						jopt = "-j2"
Index: libcfa/src/concurrency/kernel.hfa
===================================================================
--- libcfa/src/concurrency/kernel.hfa	(revision 41d3c8d53e47a61467628191045f040de3226cb8)
+++ libcfa/src/concurrency/kernel.hfa	(revision 98d1b90b045a68a7489e5600d3622bfe2d876b7e)
@@ -108,4 +108,6 @@
 	struct {
 		$io_context * ctx;
+		unsigned id;
+		unsigned target;
 		volatile bool pending;
 		volatile bool dirty;
@@ -209,8 +211,8 @@
 		struct {
 			// Arary of subqueues
-	 		__intrusive_lane_t * volatile data;
+			__intrusive_lane_t * data;
 
 			// Time since subqueues were processed
-			__timestamp_t * volatile tscs;
+			__timestamp_t * tscs;
 
 			// Number of subqueue / timestamps
@@ -219,6 +221,9 @@
 
 		struct {
+			// Array of $io_
+			$io_context ** data;
+
  			// Time since subqueues were processed
-			__timestamp_t * volatile tscs;
+			__timestamp_t * tscs;
 
 			// Number of I/O subqueues
@@ -227,5 +232,5 @@
 
 		// Cache each kernel thread belongs to
-		__cache_id_t * volatile caches;
+		__cache_id_t * caches;
 	} sched;
 
Index: libcfa/src/concurrency/kernel/cluster.cfa
===================================================================
--- libcfa/src/concurrency/kernel/cluster.cfa	(revision 41d3c8d53e47a61467628191045f040de3226cb8)
+++ libcfa/src/concurrency/kernel/cluster.cfa	(revision 98d1b90b045a68a7489e5600d3622bfe2d876b7e)
@@ -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 41d3c8d53e47a61467628191045f040de3226cb8)
+++ libcfa/src/concurrency/kernel/cluster.hfa	(revision 98d1b90b045a68a7489e5600d3622bfe2d876b7e)
@@ -72,5 +72,6 @@
 static struct {
 	const unsigned readyq;
-} __shard_factor = { 2 };
+	const unsigned io;
+} __shard_factor = { 2, 1 };
 
 // Local Variables: //
