Index: benchmark/io/readv.cfa
===================================================================
--- benchmark/io/readv.cfa	(revision 40b54179e79c7f8d042e041392f0013ec10ed81b)
+++ benchmark/io/readv.cfa	(revision 2a01c9b2889ff03ce2683f454c6a85e073053e02)
@@ -17,4 +17,5 @@
 #include <time.hfa>
 
+extern bool traceHeapOn();
 extern ssize_t async_preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
 
@@ -38,6 +39,4 @@
 }
 
-Time now(void);
-
 int main(int argc, char * argv[]) {
 	double duration   = 5.0;
@@ -45,5 +44,7 @@
 	unsigned long int nprocs   = 1;
 
+	printf("Setting local\n");
 	setlocale(LC_NUMERIC, "");
+
 
 	arg_loop:
@@ -76,5 +77,5 @@
 			case 't':
 				nthreads = strtoul(arg, &end, 10);
-				if(*end != '\0') {
+				if(*end != '\0' || nthreads < 1) {
 					fprintf(stderr, "Number of threads must be a positive integer, was %s\n", arg);
 					goto usage;
@@ -83,5 +84,5 @@
 			case 'p':
 				nprocs = strtoul(arg, &end, 10);
-				if(*end != '\0') {
+				if(*end != '\0' || nprocs < 1) {
 					fprintf(stderr, "Number of processors must be a positive integer, was %s\n", arg);
 					goto usage;
@@ -119,5 +120,5 @@
 	Time start, end;
 	{
-		processor procs[nprocs];
+		processor procs[nprocs - 1];
 		{
 			Reader threads[nthreads];
@@ -134,5 +135,4 @@
 		}
 	}
-	printf("Done\n");
 	printf("Took %ld ms\n", (end - start)`ms);
 	printf("Total reads:      %'zu\n", count);
@@ -140,3 +140,4 @@
 
 	close(fd);
+	printf("Done\n");
 }
Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision 40b54179e79c7f8d042e041392f0013ec10ed81b)
+++ libcfa/src/concurrency/io.cfa	(revision 2a01c9b2889ff03ce2683f454c6a85e073053e02)
@@ -36,4 +36,32 @@
 
 	static void * __io_poller( void * arg );
+
+       // Weirdly, some systems that do support io_uring don't actually define these
+       #ifdef __alpha__
+       /*
+       * alpha is the only exception, all other architectures
+       * have common numbers for new system calls.
+       */
+       # ifndef __NR_io_uring_setup
+       #  define __NR_io_uring_setup           535
+       # endif
+       # ifndef __NR_io_uring_enter
+       #  define __NR_io_uring_enter           536
+       # endif
+       # ifndef __NR_io_uring_register
+       #  define __NR_io_uring_register        537
+       # endif
+       #else /* !__alpha__ */
+       # ifndef __NR_io_uring_setup
+       #  define __NR_io_uring_setup           425
+       # endif
+       # ifndef __NR_io_uring_enter
+       #  define __NR_io_uring_enter           426
+       # endif
+       # ifndef __NR_io_uring_register
+       #  define __NR_io_uring_register        427
+       # endif
+       #endif
+
 
 //=============================================================================================
@@ -188,5 +216,5 @@
 
 		struct io_user_data * data = (struct io_user_data *)cqe.user_data;
-		__cfaabi_bits_print_safe( STDERR_FILENO, "Performed reading io cqe %p, result %d for %p\n", data, cqe.res, data->thrd );
+		// __cfaabi_bits_print_safe( STDERR_FILENO, "Performed reading io cqe %p, result %d for %p\n", data, cqe.res, data->thrd );
 
 		data->result = cqe.res;
@@ -296,5 +324,5 @@
 	// Submit however, many entries need to be submitted
 	int ret = syscall( __NR_io_uring_enter, ring.fd, 1, 0, 0, 0p, 0);
-	__cfaabi_bits_print_safe( STDERR_FILENO, "Performed io_submit, returned %d\n", ret );
+	// __cfaabi_bits_print_safe( STDERR_FILENO, "Performed io_submit, returned %d\n", ret );
 	if( ret < 0 ) {
 		switch((int)errno) {
@@ -352,5 +380,5 @@
 	#define __submit_wait \
 		io_user_data data = { 0, active_thread() }; \
-		__cfaabi_bits_print_safe( STDERR_FILENO, "Preparing user data %p for %p\n", &data, data.thrd ); \
+		/*__cfaabi_bits_print_safe( STDERR_FILENO, "Preparing user data %p for %p\n", &data, data.thrd );*/ \
 		sqe->user_data = (uint64_t)&data; \
 		__submit( ring, idx ); \
@@ -575,5 +603,6 @@
 	int async_statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf) {
 		#if !defined(IORING_OP_STATX)
-			return statx( dirfd, pathname, flags, mask, statxbuf );
+			//return statx( dirfd, pathname, flags, mask, statxbuf );
+			return syscall( __NR_io_uring_setup, dirfd, pathname, flags, mask, statxbuf );
 		#else
 			__submit_prelude
Index: libcfa/src/concurrency/preemption.cfa
===================================================================
--- libcfa/src/concurrency/preemption.cfa	(revision 40b54179e79c7f8d042e041392f0013ec10ed81b)
+++ libcfa/src/concurrency/preemption.cfa	(revision 2a01c9b2889ff03ce2683f454c6a85e073053e02)
@@ -97,4 +97,8 @@
 	while( node = get_expired( alarms, currtime ) ) {
 		// __cfaabi_dbg_print_buffer_decl( " KERNEL: preemption tick.\n" );
+		Duration period = node->period;
+		if( period == 0) {
+			node->set = false;                  // Node is one-shot, just mark it as not pending
+		}
 
 		// Check if this is a kernel
@@ -107,12 +111,8 @@
 
 		// Check if this is a periodic alarm
-		Duration period = node->period;
 		if( period > 0 ) {
 			// __cfaabi_dbg_print_buffer_local( " KERNEL: alarm period is %lu.\n", period.tv );
 			node->alarm = currtime + period;    // Alarm is periodic, add currtime to it (used cached current time)
 			insert( alarms, node );             // Reinsert the node for the next time it triggers
-		}
-		else {
-			node->set = false;                  // Node is one-shot, just mark it as not pending
 		}
 	}
Index: tests/vector.cfa
===================================================================
--- tests/vector.cfa	(revision 40b54179e79c7f8d042e041392f0013ec10ed81b)
+++ tests/vector.cfa	(revision 2a01c9b2889ff03ce2683f454c6a85e073053e02)
@@ -14,6 +14,6 @@
 //
 
+#include <vector.hfa>
 #include <fstream.hfa>
-#include <vector.hfa>
 
 #undef assert
@@ -28,4 +28,8 @@
 int main() {
 	vector( int ) iv;
+
+	assert( ((uintptr_t)&iv.storage.storage ) == (((uintptr_t)&iv)) );
+	assert( ((uintptr_t)&iv.storage.capacity) == (((uintptr_t)&iv) + sizeof(void *)) );
+	assert( ((uintptr_t)&iv.size            ) == (((uintptr_t)&iv) + sizeof(void *) + sizeof(size_t)) );
 
 	assert( empty( &iv ) );
