Index: src/proc/scheduler.c
===================================================================
--- src/proc/scheduler.c	(revision 02a99d21d0192f978464b19bf7f00c5e24b276b7)
+++ src/proc/scheduler.c	(revision 6a27d63e7b18736b0881629dbb6394d379111ab4)
@@ -268,4 +268,9 @@
 			    list_remove(&THREAD->threads_link);
 			    spinlock_unlock(&threads_lock);
+
+			    spinlock_lock(&THREAD->cpu->lock);
+			    if(THREAD->cpu->arch.fpu_owner==THREAD) THREAD->cpu->arch.fpu_owner=NULL;
+			    spinlock_unlock(&THREAD->cpu->lock);
+
 			    
 			    free(THREAD);
@@ -428,7 +433,8 @@
 		    		 * We don't want to steal CPU-wired threads neither threads already stolen.
 				 * The latter prevents threads from migrating between CPU's without ever being run.
-		        	 */
+		        	 * We don't want to steal threads whose FPU context is still in CPU
+				 */
 				spinlock_lock(&t->lock);
-				if (!(t->flags & (X_WIRED | X_STOLEN))) {
+				if ( (!(t->flags & (X_WIRED | X_STOLEN))) && (!(t->fpu_context_engaged)) ) {
 					/*
 					 * Remove t from r.
Index: src/proc/thread.c
===================================================================
--- src/proc/thread.c	(revision 02a99d21d0192f978464b19bf7f00c5e24b276b7)
+++ src/proc/thread.c	(revision 6a27d63e7b18736b0881629dbb6394d379111ab4)
@@ -190,4 +190,7 @@
 		t->task = task;
 		
+		t->fpu_context_exists=0;
+		t->fpu_context_engaged=0;
+		
 		/*
 		 * Register this thread in the system-wide list.
