Index: src/proc/scheduler.c
===================================================================
--- src/proc/scheduler.c	(revision be56c17fb7a40db7401fc109228679d3c7c5cb40)
+++ src/proc/scheduler.c	(revision 2cd073bd305a3aa8a90fe7bded715be42456db62)
@@ -61,8 +61,40 @@
 void before_thread_runs(void)
 {
-	before_thread_runs_arch(); 
-	fpu_context_restore(&(THREAD->saved_fpu_context));
-}
-
+	before_thread_runs_arch();
+#ifdef FPU_LAZY
+	if(THREAD==CPU->fpu_owner) 
+		fpu_enable();
+	else
+		fpu_disable(); 
+#else
+	fpu_enable();
+	if (THREAD->fpu_context_exists)
+		fpu_context_restore(&(THREAD->saved_fpu_context));
+	else {
+		fpu_init();
+		THREAD->fpu_context_exists=1;
+	}
+#endif
+}
+
+#ifdef FPU_LAZY
+void scheduler_fpu_lazy_request(void)
+{
+	fpu_enable();
+	if (CPU->fpu_owner != NULL) {  
+		fpu_context_save(&CPU->fpu_owner->saved_fpu_context);
+		/* don't prevent migration */
+		CPU->fpu_owner->fpu_context_engaged=0; 
+	}
+	if (THREAD->fpu_context_exists)
+		fpu_context_restore(&THREAD->saved_fpu_context);
+	else {
+		fpu_init();
+		THREAD->fpu_context_exists=1;
+	}
+	CPU->fpu_owner=THREAD;
+	THREAD->fpu_context_engaged = 1;
+}
+#endif
 
 /** Initialize scheduler
@@ -241,5 +273,7 @@
 	if (THREAD) {
 		spinlock_lock(&THREAD->lock);
+#ifndef FPU_LAZY
 		fpu_context_save(&(THREAD->saved_fpu_context));
+#endif
 		if (!context_save(&THREAD->saved_context)) {
 			/*
