Index: kernel/generic/include/cpu.h
===================================================================
--- kernel/generic/include/cpu.h	(revision 0d59ea7ea0080e71c460e8251bb84b50f0ed8bc8)
+++ kernel/generic/include/cpu.h	(revision d9dda2612b8bec14386b89ede7d9591a2ddacd44)
@@ -74,4 +74,6 @@
 	size_t missed_clock_ticks;
 
+	uint64_t current_clock_tick;
+
 	/**
 	 * Processor cycle accounting.
Index: kernel/generic/src/time/clock.c
===================================================================
--- kernel/generic/src/time/clock.c	(revision 0d59ea7ea0080e71c460e8251bb84b50f0ed8bc8)
+++ kernel/generic/src/time/clock.c	(revision d9dda2612b8bec14386b89ede7d9591a2ddacd44)
@@ -65,11 +65,4 @@
 static parea_t clock_parea;
 
-/** Fragment of second
- *
- * For updating  seconds correctly.
- *
- */
-static sysarg_t secfrag = 0;
-
 /** Initialize realtime clock counter
  *
@@ -109,20 +102,18 @@
  *
  * Update it only on first processor
- * TODO: Do we really need so many write barriers?
- *
- */
-static void clock_update_counters(void)
+ */
+static void clock_update_counters(uint64_t current_tick)
 {
 	if (CPU->id == 0) {
-		secfrag += 1000000 / HZ;
-		if (secfrag >= 1000000) {
-			secfrag -= 1000000;
-			uptime->seconds1++;
-			write_barrier();
-			uptime->useconds = secfrag;
-			write_barrier();
-			uptime->seconds2 = uptime->seconds1;
-		} else
-			uptime->useconds += 1000000 / HZ;
+		uint64_t usec = (1000000 / HZ) * current_tick;
+
+		sysarg_t secs = usec / 1000000;
+		sysarg_t usecs = usec % 1000000;
+
+		uptime->seconds1 = secs;
+		write_barrier();
+		uptime->useconds = usecs;
+		write_barrier();
+		uptime->seconds2 = secs;
 	}
 }
@@ -147,4 +138,7 @@
 {
 	size_t missed_clock_ticks = CPU->missed_clock_ticks;
+	CPU->current_clock_tick += missed_clock_ticks + 1;
+	uint64_t current_clock_tick = CPU->current_clock_tick;
+	clock_update_counters(current_clock_tick);
 
 	/* Account CPU usage */
@@ -159,5 +153,5 @@
 	for (i = 0; i <= missed_clock_ticks; i++) {
 		/* Update counters and accounting */
-		clock_update_counters();
+
 		cpu_update_accounting();
 
