Index: kernel/generic/include/time/timeout.h
===================================================================
--- kernel/generic/include/time/timeout.h	(revision d9dda2612b8bec14386b89ede7d9591a2ddacd44)
+++ kernel/generic/include/time/timeout.h	(revision 742f95ecf654c520834dbc577753c18d66995c14)
@@ -47,6 +47,6 @@
 	/** Link to the list of active timeouts on CURRENT->cpu */
 	link_t link;
-	/** Timeout will be activated in this amount of clock() ticks. */
-	uint64_t ticks;
+	/** Timeout will be activated when current clock tick reaches this value. */
+	uint64_t deadline;
 	/** Function that will be called on timeout activation. */
 	timeout_handler_t handler;
Index: kernel/generic/src/time/clock.c
===================================================================
--- kernel/generic/src/time/clock.c	(revision d9dda2612b8bec14386b89ede7d9591a2ddacd44)
+++ kernel/generic/src/time/clock.c	(revision 742f95ecf654c520834dbc577753c18d66995c14)
@@ -164,5 +164,5 @@
 
 			irq_spinlock_lock(&timeout->lock, false);
-			if (timeout->ticks-- != 0) {
+			if (current_clock_tick <= timeout->deadline) {
 				irq_spinlock_unlock(&timeout->lock, false);
 				break;
Index: kernel/generic/src/time/timeout.c
===================================================================
--- kernel/generic/src/time/timeout.c	(revision d9dda2612b8bec14386b89ede7d9591a2ddacd44)
+++ kernel/generic/src/time/timeout.c	(revision 742f95ecf654c520834dbc577753c18d66995c14)
@@ -67,5 +67,5 @@
 {
 	timeout->cpu = NULL;
-	timeout->ticks = 0;
+	timeout->deadline = 0;
 	timeout->handler = NULL;
 	timeout->arg = NULL;
@@ -108,13 +108,11 @@
 
 	timeout->cpu = CPU;
-	timeout->ticks = us2ticks(time);
-
+	timeout->deadline = CPU->current_clock_tick + us2ticks(time);
 	timeout->handler = handler;
 	timeout->arg = arg;
 
 	/*
-	 * Insert timeout into the active timeouts list according to timeout->ticks.
+	 * Insert timeout into the active timeouts list according to timeout->deadline.
 	 */
-	uint64_t sum = 0;
 	timeout_t *target = NULL;
 	link_t *cur, *prev;
@@ -125,10 +123,9 @@
 		irq_spinlock_lock(&target->lock, false);
 
-		if (timeout->ticks < sum + target->ticks) {
+		if (timeout->deadline < target->deadline) {
 			irq_spinlock_unlock(&target->lock, false);
 			break;
 		}
 
-		sum += target->ticks;
 		irq_spinlock_unlock(&target->lock, false);
 		prev = cur;
@@ -139,19 +136,4 @@
 	else
 		list_insert_after(&timeout->link, prev);
-
-	/*
-	 * Adjust timeout->ticks according to ticks
-	 * accumulated in target's predecessors.
-	 */
-	timeout->ticks -= sum;
-
-	/*
-	 * Decrease ticks of timeout's immediate succesor by timeout->ticks.
-	 */
-	if (cur != NULL) {
-		irq_spinlock_lock(&target->lock, false);
-		target->ticks -= timeout->ticks;
-		irq_spinlock_unlock(&target->lock, false);
-	}
 
 	irq_spinlock_unlock(&timeout->lock, false);
@@ -195,5 +177,4 @@
 		timeout_t *tmp = list_get_instance(cur, timeout_t, link);
 		irq_spinlock_lock(&tmp->lock, false);
-		tmp->ticks += timeout->ticks;
 		irq_spinlock_unlock(&tmp->lock, false);
 	}
