Index: kernel/generic/include/cpu.h
===================================================================
--- kernel/generic/include/cpu.h	(revision 46b305ad06b46ff90c280b198a0339a0ea00df22)
+++ kernel/generic/include/cpu.h	(revision 61ae4b0b6558981d7828515caf6ff3bd96aa1577)
@@ -74,4 +74,5 @@
 	size_t missed_clock_ticks;
 
+	/** Can only be accessed when interrupts are disabled. */
 	uint64_t current_clock_tick;
 
Index: kernel/generic/src/time/timeout.c
===================================================================
--- kernel/generic/src/time/timeout.c	(revision 46b305ad06b46ff90c280b198a0339a0ea00df22)
+++ kernel/generic/src/time/timeout.c	(revision 61ae4b0b6558981d7828515caf6ff3bd96aa1577)
@@ -87,4 +87,6 @@
 	irq_spinlock_lock(&CPU->timeoutlock, true);
 
+	assert(!link_in_use(&timeout->link));
+
 	timeout->cpu = CPU;
 	timeout->deadline = CPU->current_clock_tick + us2ticks(time);
@@ -92,24 +94,19 @@
 	timeout->arg = arg;
 
-	/*
-	 * Insert timeout into the active timeouts list according to timeout->deadline.
-	 */
-	timeout_t *target = NULL;
-	link_t *cur, *prev;
-	prev = NULL;
-	for (cur = list_first(&CPU->timeout_active_list);
-	    cur != NULL; cur = list_next(cur, &CPU->timeout_active_list)) {
-		target = list_get_instance(cur, timeout_t, link);
+	/* Insert timeout into the active timeouts list according to timeout->deadline. */
 
-		if (timeout->deadline < target->deadline)
-			break;
+	link_t *last = list_last(&CPU->timeout_active_list);
+	if (last == NULL || timeout->deadline >= list_get_instance(last, timeout_t, link)->deadline) {
+		list_append(&timeout->link, &CPU->timeout_active_list);
+	} else {
+		for (link_t *cur = list_first(&CPU->timeout_active_list); cur != NULL;
+		    cur = list_next(cur, &CPU->timeout_active_list)) {
 
-		prev = cur;
+			if (timeout->deadline < list_get_instance(cur, timeout_t, link)->deadline) {
+				list_insert_before(&timeout->link, cur);
+				break;
+			}
+		}
 	}
-
-	if (prev == NULL)
-		list_prepend(&timeout->link, &CPU->timeout_active_list);
-	else
-		list_insert_after(&timeout->link, prev);
 
 	irq_spinlock_unlock(&CPU->timeoutlock, true);
