Index: /soft/giet_vm/giet_kernel/ctx_handler.c
===================================================================
--- /soft/giet_vm/giet_kernel/ctx_handler.c	(revision 695)
+++ /soft/giet_vm/giet_kernel/ctx_handler.c	(revision 696)
@@ -60,4 +60,29 @@
     // set NORUN_MASK_TASK bit
     _atomic_or( &psched->context[ltid][CTX_NORUN_ID], NORUN_MASK_TASK );
+}
+
+
+//////////////////
+static void _ctx_exec_task( unsigned int ltid )
+{
+    // get scheduler address
+    static_scheduler_t* psched = (static_scheduler_t*)_get_sched();
+
+    // TODO: reload .data segment
+
+    // find initial stack pointer
+    mapping_header_t * header  = (mapping_header_t *)SEG_BOOT_MAPPING_BASE;
+    mapping_task_t   * task    = _get_task_base(header);
+    mapping_vseg_t   * vseg    = _get_vseg_base(header);
+    unsigned int task_id       = psched->context[ltid][CTX_GTID_ID];
+    unsigned int vseg_id       = task[task_id].stack_vseg_id;
+    unsigned int sp_value      = vseg[vseg_id].vbase + vseg[vseg_id].length;
+
+    // reset task context: RA / SR / SP / EPC / NORUN
+    psched->context[ltid][CTX_RA_ID]    = (unsigned int)&_ctx_eret;
+    psched->context[ltid][CTX_SR_ID]    = GIET_SR_INIT_VALUE;
+    psched->context[ltid][CTX_SP_ID]    = sp_value;
+    psched->context[ltid][CTX_EPC_ID]   = psched->context[ltid][CTX_ENTRY_ID];
+    psched->context[ltid][CTX_NORUN_ID] = 0;
 }
 
@@ -128,7 +153,13 @@
             // acknowledge signal
             _atomic_and( &psched->context[next_task_id][CTX_SIG_ID], ~SIG_MASK_KILL );
-
-            // skip
-            continue;
+        }
+
+        // this task needs to be executed
+        if ( psched->context[next_task_id][CTX_SIG_ID] & SIG_MASK_EXEC )
+        {
+            _ctx_exec_task( next_task_id );
+
+            // acknowledge signal
+            _atomic_and( &psched->context[next_task_id][CTX_SIG_ID], ~SIG_MASK_EXEC );
         }
 
Index: /soft/giet_vm/giet_kernel/ctx_handler.h
===================================================================
--- /soft/giet_vm/giet_kernel/ctx_handler.h	(revision 695)
+++ /soft/giet_vm/giet_kernel/ctx_handler.h	(revision 696)
@@ -89,4 +89,5 @@
 
 #define SIG_MASK_KILL         0x00000001   // Task will be killed at next tick
+#define SIG_MASK_EXEC         0x00000002   // Task will be executed at next tick
 
 /////////////////////////////////////////////////////////////////////////////////
Index: /soft/giet_vm/giet_kernel/sys_handler.c
===================================================================
--- /soft/giet_vm/giet_kernel/sys_handler.c	(revision 695)
+++ /soft/giet_vm/giet_kernel/sys_handler.c	(revision 696)
@@ -277,10 +277,7 @@
     mapping_vspace_t * vspace  = _get_vspace_base(header);
     mapping_task_t   * task    = _get_task_base(header);
-    mapping_vseg_t   * vseg    = _get_vseg_base(header);
 
     unsigned int vspace_id;
     unsigned int task_id;
-    unsigned int vseg_id;
-
     unsigned int y_size = header->y_size;
 
@@ -307,37 +304,14 @@
                 unsigned int ltid  = task[task_id].ltid;
 
-                // get scheduler pointer for the processor running the task
+                // get scheduler pointer for processor running the task
                 static_scheduler_t* psched  = (static_scheduler_t*)_schedulers[x][y][p];
 
-                // sp_value : initial stack pointer 
-                vseg_id = task[task_id].stack_vseg_id;
-                unsigned int sp_value = vseg[vseg_id].vbase + vseg[vseg_id].length;
-
-                // epc value : task entry point
-                unsigned int  epc_value = psched->context[ltid][CTX_ENTRY_ID];
-
-                // ra_value : initial return address
-                unsigned int ra_value = (unsigned int)(&_ctx_eret);
-
-                // initialise task context: RA / SR / EPC / SP / NORUN slots
-                psched->context[ltid][CTX_RA_ID]    = ra_value;
-                psched->context[ltid][CTX_SR_ID]    = GIET_SR_INIT_VALUE;
-                psched->context[ltid][CTX_SP_ID]    = sp_value;
-                psched->context[ltid][CTX_EPC_ID]   = epc_value;
-                psched->context[ltid][CTX_NORUN_ID] = 0;
+                // set EXEC signal bit
+                _atomic_or( &psched->context[ltid][CTX_SIG_ID] , SIG_MASK_EXEC );
+            } 
 
 #if GIET_DEBUG_EXEC 
 if ( _get_proctime() > GIET_DEBUG_EXEC )
-_printf("\n[DEBUG EXEC] _sys_exec_application() start task %d on P[%d,%d,%d]\n"
-        " - ctx_ra    = %x\n"
-        " - ctx_sp    = %x\n"
-        " - ctx_epc   = %x\n",
-        task_id , x , y , p , ra_value , sp_value , epc_value );
-#endif
-            } 
-
-#if GIET_DEBUG_EXEC 
-if ( _get_proctime() > GIET_DEBUG_EXEC )
-_printf("\n[DEBUG EXEC] exit _sys_exec_application() at cycle %d : %s activated\n",
+_printf("\n[DEBUG EXEC] exit _sys_exec_application() at cycle %d : %s will be executed\n",
         _get_proctime() , name );
 #endif
