Index: kernel/generic/src/proc/scheduler.c
===================================================================
--- kernel/generic/src/proc/scheduler.c	(revision 3d847347f888f972daf8f49a6b67dbe9a1cc220e)
+++ kernel/generic/src/proc/scheduler.c	(revision 41bfc6447bca0a648f115c2d22f120a4f5aca2ab)
@@ -313,5 +313,5 @@
 	assert(atomic_get_unordered(&THREAD->cpu) == CPU);
 
-	THREAD->state = Running;
+	atomic_set_unordered(&THREAD->state, Running);
 	atomic_set_unordered(&THREAD->priority, rq_index);  /* Correct rq index */
 
@@ -386,5 +386,5 @@
 	irq_spinlock_lock(&thread->lock, false);
 
-	assert(thread->state == Running);
+	assert(atomic_get_unordered(&thread->state) == Running);
 	assert(atomic_get_unordered(&thread->cpu) == CPU);
 
@@ -396,5 +396,5 @@
 	}
 
-	thread->state = Ready;
+	atomic_set_unordered(&thread->state, Ready);
 
 	irq_spinlock_unlock(&thread->lock, false);
@@ -409,8 +409,8 @@
 	irq_spinlock_lock(&thread->lock, false);
 
-	assert(thread->state == Sleeping || thread->state == Entering);
+	assert(atomic_get_unordered(&thread->state) == Sleeping || atomic_get_unordered(&thread->state) == Entering);
 
 	atomic_set_unordered(&thread->priority, 0);
-	thread->state = Ready;
+	atomic_set_unordered(&thread->state, Ready);
 
 	/* Prefer the CPU on which the thread ran last */
@@ -471,5 +471,5 @@
 		 */
 		panic("tid%" PRIu64 ": unexpected state %s.",
-		    thread->tid, thread_states[thread->state]);
+		    thread->tid, thread_states[out_state]);
 		break;
 	}
@@ -501,5 +501,6 @@
 
 	irq_spinlock_lock(&THREAD->lock, false);
-	THREAD->state = new_state;
+
+	atomic_set_unordered(&THREAD->state, new_state);
 
 	/* Update thread kernel accounting */
@@ -809,5 +810,5 @@
 			    thread) {
 				printf("%" PRIu64 "(%s) ", thread->tid,
-				    thread_states[thread->state]);
+				    thread_states[atomic_get_unordered(&thread->state)]);
 			}
 			printf("\n");
Index: kernel/generic/src/proc/thread.c
===================================================================
--- kernel/generic/src/proc/thread.c	(revision 3d847347f888f972daf8f49a6b67dbe9a1cc220e)
+++ kernel/generic/src/proc/thread.c	(revision 41bfc6447bca0a648f115c2d22f120a4f5aca2ab)
@@ -209,5 +209,5 @@
 void thread_start(thread_t *thread)
 {
-	assert(thread->state == Entering);
+	assert(atomic_get_unordered(&thread->state) == Entering);
 	thread_requeue_sleeping(thread_ref(thread));
 }
@@ -269,5 +269,5 @@
 
 	thread->nomigrate = 0;
-	thread->state = Entering;
+	atomic_init(&thread->state, Entering);
 
 	atomic_init(&thread->sleep_queue, NULL);
@@ -339,5 +339,5 @@
 	irq_spinlock_unlock(&thread->task->lock, false);
 
-	assert((thread->state == Exiting) || (thread->state == Lingering));
+	assert((atomic_get_unordered(&thread->state) == Exiting) || (atomic_get_unordered(&thread->state) == Lingering));
 
 	/* Clear cpu->fpu_owner if set to this thread. */
@@ -637,7 +637,5 @@
 		return EINVAL;
 
-	irq_spinlock_lock(&thread->lock, true);
-	state_t state = thread->state;
-	irq_spinlock_unlock(&thread->lock, true);
+	state_t state = atomic_get_unordered(&thread->state);
 
 	errno_t rc = EOK;
@@ -686,4 +684,6 @@
 	order_suffix(thread->ucycles, &ucycles, &usuffix);
 	order_suffix(thread->kcycles, &kcycles, &ksuffix);
+
+	state_t state = atomic_get_unordered(&thread->state);
 
 	char *name;
@@ -699,5 +699,5 @@
 	else
 		printf("%-8" PRIu64 " %-14s %p %-8s %p %-5" PRIu32 "\n",
-		    thread->tid, name, thread, thread_states[thread->state],
+		    thread->tid, name, thread, thread_states[state],
 		    thread->task, thread->task->container);
 
@@ -709,5 +709,5 @@
 			printf("none ");
 
-		if (thread->state == Sleeping) {
+		if (state == Sleeping) {
 			printf(" %p", thread->sleep_queue);
 		}
@@ -914,5 +914,5 @@
 		printf("Scheduling thread stack trace.\n");
 		thread->btrace = true;
-		if (thread->state == Sleeping)
+		if (atomic_get_unordered(&thread->state) == Sleeping)
 			sleeping = true;
 	} else
Index: kernel/generic/src/sysinfo/stats.c
===================================================================
--- kernel/generic/src/sysinfo/stats.c	(revision 3d847347f888f972daf8f49a6b67dbe9a1cc220e)
+++ kernel/generic/src/sysinfo/stats.c	(revision 41bfc6447bca0a648f115c2d22f120a4f5aca2ab)
@@ -303,5 +303,5 @@
 	stats_thread->thread_id = thread->tid;
 	stats_thread->task_id = thread->task->taskid;
-	stats_thread->state = thread->state;
+	stats_thread->state = atomic_get_unordered(&thread->state);
 	stats_thread->priority = atomic_get_unordered(&thread->priority);
 	stats_thread->ucycles = thread->ucycles;
