Index: kernel/generic/include/cpu.h
===================================================================
--- kernel/generic/include/cpu.h	(revision 2593999761151633e3726d421b2f67d1f2bcbbe0)
+++ kernel/generic/include/cpu.h	(revision c1eaec452eea24d23cfcba31035c7fa507f2a011)
@@ -76,4 +76,6 @@
 
 	context_t scheduler_context;
+
+	state_t exiting_state;
 } cpu_local_t;
 
Index: kernel/generic/src/proc/scheduler.c
===================================================================
--- kernel/generic/src/proc/scheduler.c	(revision 2593999761151633e3726d421b2f67d1f2bcbbe0)
+++ kernel/generic/src/proc/scheduler.c	(revision c1eaec452eea24d23cfcba31035c7fa507f2a011)
@@ -361,4 +361,6 @@
 	/* Save current CPU cycle */
 	THREAD->last_cycle = get_cycle();
+
+	irq_spinlock_unlock(&THREAD->lock, false);
 }
 
@@ -440,15 +442,14 @@
 	}
 
-	/*
-	 * Through the 'CURRENT' structure, we keep track of THREAD, TASK, CPU, AS
-	 * and preemption counter. At this point CURRENT could be coming either
-	 * from THREAD's or CPU's stack.
-	 *
-	 */
+	irq_spinlock_unlock(&THREAD->lock, false);
+
+	CPU_LOCAL->exiting_state = new_state;
 
 	current_copy(CURRENT, (current_t *) CPU_LOCAL->stack);
 	context_swap(&THREAD->saved_context, &CPU_LOCAL->scheduler_context);
 
-	irq_spinlock_unlock(&THREAD->lock, false);
+	assert(CURRENT->mutex_locks == 0);
+	assert(interrupts_disabled());
+
 	interrupts_restore(ipl);
 }
@@ -476,5 +477,4 @@
 		int rq_index;
 		THREAD = find_best_thread(&rq_index);
-
 		prepare_to_run_thread(rq_index);
 
@@ -488,15 +488,11 @@
 		context_swap(&CPU_LOCAL->scheduler_context, &THREAD->saved_context);
 
-		/* Back from the thread. */
-
+		/* Back from another thread. */
 		assert(CPU != NULL);
 		assert(THREAD != NULL);
-		assert(irq_spinlock_locked(&THREAD->lock));
+		assert(CURRENT->mutex_locks == 0);
 		assert(interrupts_disabled());
 
-		state_t state = THREAD->state;
-		irq_spinlock_unlock(&THREAD->lock, false);
-
-		cleanup_after_thread(THREAD, state);
+		cleanup_after_thread(THREAD, CPU_LOCAL->exiting_state);
 
 		/*
Index: kernel/generic/src/proc/thread.c
===================================================================
--- kernel/generic/src/proc/thread.c	(revision 2593999761151633e3726d421b2f67d1f2bcbbe0)
+++ kernel/generic/src/proc/thread.c	(revision c1eaec452eea24d23cfcba31035c7fa507f2a011)
@@ -122,5 +122,4 @@
 
 	/* This is where each thread wakes up after its creation */
-	irq_spinlock_unlock(&THREAD->lock, false);
 	interrupts_enable();
 
