Index: /soft/giet_vm/giet_kernel/ctx_handler.c
===================================================================
--- /soft/giet_vm/giet_kernel/ctx_handler.c	(revision 628)
+++ /soft/giet_vm/giet_kernel/ctx_handler.c	(revision 629)
@@ -39,5 +39,5 @@
             " - CTX_RA    = %x\n"
             " - CTX_SP    = %x\n"
-            " - CTX_RUN   = %x\n"
+            " - CTX_NORUN = %x\n"
             "########## %s\n",
             x , y , p , ltid ,
@@ -49,5 +49,5 @@
             psched->context[ltid][CTX_RA_ID], 
             psched->context[ltid][CTX_SP_ID], 
-            psched->context[ltid][CTX_RUN_ID],
+            psched->context[ltid][CTX_NORUN_ID],
             string );
 }  // _ctx_display()
@@ -79,5 +79,5 @@
         next_task_id = tid % tasks;
         // test if the task is runable
-        if ( psched->context[next_task_id][CTX_RUN_ID] ) 
+        if ( psched->context[next_task_id][CTX_NORUN_ID] == 0 ) 
         {
             found = 1;
Index: /soft/giet_vm/giet_kernel/ctx_handler.h
===================================================================
--- /soft/giet_vm/giet_kernel/ctx_handler.h	(revision 628)
+++ /soft/giet_vm/giet_kernel/ctx_handler.h	(revision 629)
@@ -14,8 +14,9 @@
 // is launched by the scheduler when there is no other runable task.
 /////////////////////////////////////////////////////////////////////////////////
-// A task context is an array of 64 words = 256 bytes. 
+// A task context is an array of 64 uint32 words => 256 bytes. 
 // It contains copies of processor registers (when the task is preempted)
-// and some general informations associated to a task, such as the peripherals
-// allocated to the task (private peripheral channel)
+// and some general informations associated to a task, such as the private
+// peripheral channels allocated to the task, the vspace index, the various
+// task index (local / global / application), and the runnable status.
 /////////////////////////////////////////////////////////////////////////////////
 // ctx[0] <- ***   |ctx[8] <- $8     |ctx[16]<- $16    |ctx[24]<- $24
@@ -30,5 +31,5 @@
 // ctx[32]<- EPC   |ctx[40]<- TTY    |ctx[48]<- TRDID  |ctx[56]<- ***
 // ctx[33]<- CR    |ctx[41]<- CMA_FB |ctx[49]<- GTID   |ctx[57]<- ***
-// ctx[34]<- SR    |ctx[42]<- CMA_RX |ctx[50]<- RUN    |ctx[58]<- ***
+// ctx[34]<- SR    |ctx[42]<- CMA_RX |ctx[50]<- NORUN  |ctx[58]<- ***
 // ctx[35]<- BVAR  |ctx[43]<- CMA_TX |ctx[51]<- COPROC |ctx[59]<- ***
 // ctx[36]<- PTAB  |ctx[44]<- NIC_RX |ctx[52]<- ***    |ctx[60]<- ***
@@ -47,31 +48,37 @@
 /////////////////////////////////////////////////////////////////////////////////
 
-#define CTX_SP_ID        29  // Stack Pointer
-#define CTX_RA_ID        31  // Return Address
+#define CTX_SP_ID        29    // Stack Pointer
+#define CTX_RA_ID        31    // Return Address
 
-#define CTX_EPC_ID       32  // Exception Program Counter (CP0)
-#define CTX_CR_ID        33  // Cause Register (CP0)
-#define CTX_SR_ID        34  // Status Register (CP0)
-#define CTX_BVAR_ID      35	 // Bad Virtual Address Register (CP0)
-#define CTX_PTAB_ID      36  // Page Table Virtual address
-#define CTX_LTID_ID      37  // Local  Task Index (in scheduler)
-#define CTX_VSID_ID      38  // Vspace Index     
-#define CTX_PTPR_ID      39  // Page Table Pointer Register (PADDR>>13)
+#define CTX_EPC_ID       32    // Exception Program Counter (CP0)
+#define CTX_CR_ID        33    // Cause Register (CP0)
+#define CTX_SR_ID        34    // Status Register (CP0)
+#define CTX_BVAR_ID      35	   // Bad Virtual Address Register (CP0)
+#define CTX_PTAB_ID      36    // Page Table Virtual address
+#define CTX_LTID_ID      37    // Local  Task Index (in scheduler)
+#define CTX_VSID_ID      38    // Vspace Index     
+#define CTX_PTPR_ID      39    // Page Table Pointer Register (PADDR>>13)
 
-#define CTX_TTY_ID       40  // private TTY channel index  
-#define CTX_CMA_FB_ID    41  // private CMA channel index for FBF write
-#define CTX_CMA_RX_ID    42  // private CMA channel index for NIC_TX
-#define CTX_CMA_TX_ID    43  // private CMA channel index for NIC_RX
-#define CTX_NIC_RX_ID    44  // private NIC channel index RX transfer
-#define CTX_NIC_TX_ID    45  // private NIC channel index TX transfer
-#define CTX_TIM_ID       46  // ptivate TIM channel index
-#define CTX_HBA_ID       47  // private HBA channel index
+#define CTX_TTY_ID       40    // private TTY channel index  
+#define CTX_CMA_FB_ID    41    // private CMA channel index for FBF write
+#define CTX_CMA_RX_ID    42    // private CMA channel index for NIC_TX
+#define CTX_CMA_TX_ID    43    // private CMA channel index for NIC_RX
+#define CTX_NIC_RX_ID    44    // private NIC channel index RX transfer
+#define CTX_NIC_TX_ID    45    // private NIC channel index TX transfer
+#define CTX_TIM_ID       46    // ptivate TIM channel index
+#define CTX_HBA_ID       47    // private HBA channel index
 
-#define CTX_TRDID_ID     48  // Thread Task Index in vspace
-#define CTX_GTID_ID      49  // Global Task Index in all system
-#define CTX_RUN_ID       50  // Boolean: task runable
-#define CTX_COPROC_ID    51  // cluster_xy : coprocessor coordinates
+#define CTX_TRDID_ID     48    // Thread Task Index in vspace
+#define CTX_GTID_ID      49    // Global Task Index in all system
+#define CTX_NORUN_ID     50    // bit-vector : task runable if all zero
+#define CTX_COPROC_ID    51    // cluster_xy : coprocessor coordinates
 
 /////////////////////////////////////////////////////////////////////////////////
+//    Definition of the NORUN bit-vector masks
+/////////////////////////////////////////////////////////////////////////////////
+
+#define NORUN_MASK_TASK       0x00000001   // Task not active  
+#define NORUN_MASK_IOC        0x00000002   // Task blocked on IOC transfer
+#define NORUN_MASK_COPROC     0x00000004   // Task blocked on COPROC transfer
 
 /////////////////////////////////////////////////////////////////////////////////
Index: /soft/giet_vm/giet_kernel/exc_handler.c
===================================================================
--- /soft/giet_vm/giet_kernel/exc_handler.c	(revision 628)
+++ /soft/giet_vm/giet_kernel/exc_handler.c	(revision 629)
@@ -85,8 +85,8 @@
 
     // goes to sleeping state
-    _set_context_slot(CTX_RUN_ID, 0);
+    _set_context_slot( CTX_NORUN_ID , 1 );
 
-    // deschedule (suicide)
-    unsigned int save_sr;  // unused 
+    // deschedule 
+    unsigned int save_sr;  
     _it_disable( &save_sr );
     _ctx_switch();
Index: /soft/giet_vm/giet_kernel/irq_handler.h
===================================================================
--- /soft/giet_vm/giet_kernel/irq_handler.h	(revision 628)
+++ /soft/giet_vm/giet_kernel/irq_handler.h	(revision 629)
@@ -8,4 +8,6 @@
 // They contain the code of used to handlle HWI, WTI, PTI interrupts.
 ///////////////////////////////////////////////////////////////////////////
+
+#include <giet_config.h>
 
 #ifndef _IRQ_HANDLER_H
Index: /soft/giet_vm/giet_kernel/kernel_init.c
===================================================================
--- /soft/giet_vm/giet_kernel/kernel_init.c	(revision 628)
+++ /soft/giet_vm/giet_kernel/kernel_init.c	(revision 629)
@@ -113,8 +113,4 @@
 unsigned int   _tty0_boot_mode = 0;
 
-// Kernel uses distributed locks to protect MMC   
-__attribute__((section(".kdata")))
-unsigned int   _mmc_boot_mode = 0;
-
 // Kernel uses sqt_lock to protect command allocator in HBA        
 __attribute__((section(".kdata")))
@@ -131,4 +127,7 @@
 // this variable is defined in tty0.c file
 extern sqt_lock_t _tty0_sqt_lock;
+
+// this variable is allocated in mmc_kernel.c
+extern unsigned int _mmc_boot_mode;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -167,4 +166,5 @@
 #endif
         //////  distributed lock for MMC
+        _mmc_boot_mode = 0;
         _mmc_init_locks();
 
@@ -293,5 +293,5 @@
         // compute ctx_epc
         unsigned int* ptr = (unsigned int*)_get_task_slot(x,y,p,ltid,CTX_EPC_ID);
-        _set_task_slot(x,y,p,ltid,CTX_EPC_ID,*ptr);
+        _set_task_slot( x , y , p , ltid , CTX_EPC_ID , *ptr );
 
 #if GIET_DEBUG_INIT
Index: /soft/giet_vm/giet_kernel/sys_handler.c
===================================================================
--- /soft/giet_vm/giet_kernel/sys_handler.c	(revision 628)
+++ /soft/giet_vm/giet_kernel/sys_handler.c	(revision 629)
@@ -81,4 +81,7 @@
 extern unsigned int _tty_rx_buf[NB_TTY_CHANNELS];
 
+// allocated in kernel_init.c file
+extern static_scheduler_t* _schedulers[X_SIZE][Y_SIZE][NB_PROCS_MAX]; 
+
 ////////////////////////////////////////////////////////////////////////////
 //     Channel allocators for peripherals
@@ -158,6 +161,6 @@
     &_sys_tim_start,                 /* 0x15 */ 
     &_sys_tim_stop,                  /* 0x16 */
-    &_sys_ukn,                       /* 0x17 */
-    &_sys_ukn,                       /* 0x18 */   
+    &_sys_kill_application,          /* 0x17 */
+    &_sys_exec_application,          /* 0x18 */   
     &_sys_context_switch,            /* 0x19 */
     &_sys_vseg_get_vbase,            /* 0x1A */
@@ -495,6 +498,8 @@
         _it_disable( &save_sr ); 
 
-        // reset runnable 
-        _set_task_slot( x, y, p, ltid, CTX_RUN_ID, 0 );  
+        // set NORUN_MASK_COPROC bit
+        static_scheduler_t* psched  = (static_scheduler_t*)_schedulers[x][y][p];
+        unsigned int*       ptr     = &psched->context[ltid][CTX_NORUN_ID];
+        _atomic_or( ptr , NORUN_MASK_COPROC );
 
         // start coprocessor
@@ -1785,15 +1790,17 @@
     unsigned int y          = cluster_xy & ((1<<Y_WIDTH)-1);
     unsigned int x          = cluster_xy >> Y_WIDTH;
-    unsigned int lpid       = gpid & ((1<<P_WIDTH)-1);
-
-    unsigned int task_id    = _get_context_slot(CTX_LTID_ID);
+    unsigned int p          = gpid & ((1<<P_WIDTH)-1);
+
+    unsigned int ltid       = _get_context_slot(CTX_LTID_ID);
 
     // print exit message
     _printf("\n[GIET] Exit task %d on processor[%d,%d,%d] at cycle %d"
             "\n       Cause : %s\n\n",
-            task_id, x, y, lpid, date, string );
-
-    // goes to sleeping state
-    _set_context_slot(CTX_RUN_ID, 0);
+            ltid, x, y, p, date, string );
+
+    // set NORUN_MASK_TASK bit (non runnable state)
+    static_scheduler_t*  psched  = (static_scheduler_t*)_schedulers[x][y][p];
+    unsigned int*        ptr     = &psched->context[ltid][CTX_NORUN_ID];
+    _atomic_or( ptr , NORUN_MASK_TASK );
 
     // deschedule
@@ -1803,4 +1810,101 @@
 } 
 
+///////////////////////////////////////
+int _sys_kill_application( char* name )
+{
+    mapping_header_t * header  = (mapping_header_t *)SEG_BOOT_MAPPING_BASE;
+    mapping_vspace_t * vspace  = _get_vspace_base(header);
+    mapping_task_t   * task    = _get_task_base(header);
+
+    unsigned int vspace_id;
+    unsigned int task_id;
+    unsigned int y_size = header->y_size;
+
+    // scan vspaces
+    for (vspace_id = 0; vspace_id < header->vspaces; vspace_id++) 
+    {
+        if ( _strcmp( vspace[vspace_id].name, name ) == 0 ) 
+        {
+            // scan tasks in vspace
+            for (task_id = vspace[vspace_id].task_offset; 
+                 task_id < (vspace[vspace_id].task_offset + vspace[vspace_id].tasks); 
+                 task_id++) 
+            {
+                unsigned int cid   = task[task_id].clusterid;
+                unsigned int x     = cid / y_size;
+                unsigned int y     = cid % y_size;
+                unsigned int p     = task[task_id].proclocid;
+                unsigned int ltid  = task[task_id].ltid;
+
+                // set NORUN_MASK_TASK bit
+                static_scheduler_t* psched  = (static_scheduler_t*)_schedulers[x][y][p];
+                unsigned int*       ptr     = &psched->context[ltid][CTX_NORUN_ID];
+                _atomic_or( ptr , NORUN_MASK_TASK );
+            } 
+            return 0;
+        }
+    } 
+    return -1;    // not found 
+}
+    
+///////////////////////////////////////
+int _sys_exec_application( char* name )
+{
+    mapping_header_t * header  = (mapping_header_t *)SEG_BOOT_MAPPING_BASE;
+    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;
+
+    // scan vspaces
+    for (vspace_id = 0 ; vspace_id < header->vspaces ; vspace_id++) 
+    {
+        if ( _strcmp( vspace[vspace_id].name, name ) == 0 ) 
+        {
+            // scan tasks in vspace
+            for (task_id = vspace[vspace_id].task_offset; 
+                 task_id < (vspace[vspace_id].task_offset + vspace[vspace_id].tasks); 
+                 task_id++) 
+            {
+                unsigned int cid   = task[task_id].clusterid;
+                unsigned int x     = cid / y_size;
+                unsigned int y     = cid % y_size;
+                unsigned int p     = task[task_id].proclocid;
+                unsigned int ltid  = task[task_id].ltid;
+
+                // compute stack pointer value (sp_value)
+                vseg_id = task[task_id].stack_vseg_id;
+                unsigned int sp_value = vseg[vseg_id].vbase + vseg[vseg_id].length;
+
+                // compute task entry point value (epc_value)
+                vseg_id = vspace[vspace_id].start_vseg_id;     
+                unsigned int* vaddr = (unsigned int*)( vseg[vseg_id].vbase + 
+                                                       ((task[task_id].startid)<<2) );
+                unsigned int  epc_value = *vaddr;
+
+                // compute reurn address value (ra_value)
+                unsigned int ra_value = (unsigned int)(&_ctx_eret);
+
+                // get scheduler pointer 
+                static_scheduler_t* psched  = (static_scheduler_t*)_schedulers[x][y][p];
+
+                // 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;
+            } 
+            return 0;
+        }
+    }
+    return -1;    // not found 
+}
+    
 /////////////////////////
 int _sys_context_switch() 
Index: /soft/giet_vm/giet_kernel/sys_handler.h
===================================================================
--- /soft/giet_vm/giet_kernel/sys_handler.h	(revision 628)
+++ /soft/giet_vm/giet_kernel/sys_handler.h	(revision 629)
@@ -204,4 +204,8 @@
 int _sys_task_exit( char* string );
 
+int _sys_kill_application( char* name );
+
+int _sys_exec_application( char* name );
+
 int _sys_context_switch();
 
