Index: /soft/giet_vm/giet_boot/boot.c
===================================================================
--- /soft/giet_vm/giet_boot/boot.c	(revision 694)
+++ /soft/giet_vm/giet_boot/boot.c	(revision 695)
@@ -1083,4 +1083,5 @@
         psched->context[IDLE_TASK_INDEX][CTX_VSID_ID]  = 0;
         psched->context[IDLE_TASK_INDEX][CTX_NORUN_ID] = 0;
+        psched->context[IDLE_TASK_INDEX][CTX_SIG_ID]   = 0;
     }
 
@@ -1285,4 +1286,5 @@
                     psched->context[ltid][CTX_VSID_ID]   = vspace_id;
                     psched->context[ltid][CTX_NORUN_ID]  = ctx_norun;
+                    psched->context[ltid][CTX_SIG_ID]    = 0;
 
                     psched->context[ltid][CTX_TTY_ID]    = 0xFFFFFFFF;
@@ -1308,5 +1310,6 @@
         " - ctx[VSID]  = %d\n"
         " - ctx[TRDID] = %d\n"
-        " - ctx[NORUN] = %x\n",
+        " - ctx[NORUN] = %x\n"
+        " - ctx[SIG]   = %x\n",
         task[task_id].name,
         vspace[vspace_id].name,
@@ -1320,5 +1323,6 @@
         psched->context[ltid][CTX_VSID_ID],
         psched->context[ltid][CTX_TRDID_ID],
-        psched->context[ltid][CTX_NORUN_ID] );
+        psched->context[ltid][CTX_NORUN_ID],
+        psched->context[ltid][CTX_SIG_ID] );
 #endif
                 } // end if FIT
Index: /soft/giet_vm/giet_kernel/ctx_handler.c
===================================================================
--- /soft/giet_vm/giet_kernel/ctx_handler.c	(revision 694)
+++ /soft/giet_vm/giet_kernel/ctx_handler.c	(revision 695)
@@ -7,4 +7,5 @@
 
 #include <ctx_handler.h>
+#include <sys_handler.h>
 #include <giet_config.h>
 #include <hard_config.h>
@@ -22,4 +23,43 @@
 // allocated in boot.c or kernel_init.c files
 extern static_scheduler_t* _schedulers[X_SIZE][Y_SIZE][NB_PROCS_MAX];
+
+//////////////////
+static void _ctx_kill_task( unsigned int ltid )
+{
+    // get scheduler address
+    static_scheduler_t* psched = (static_scheduler_t*)_get_sched();
+
+    // release private TTY terminal if required
+    if ( psched->context[ltid][CTX_TTY_ID] < NB_TTY_CHANNELS )
+    {
+        psched->context[ltid][CTX_TTY_ID] = 0xFFFFFFFF;
+        _sys_tty_release();
+    }
+
+    // release private TIM channel if required
+    if ( psched->context[ltid][CTX_TIM_ID] < NB_TIM_CHANNELS )
+    {
+        psched->context[ltid][CTX_TIM_ID] = 0xFFFFFFFF;
+        _sys_tim_release();
+    }
+
+    // release private NIC_RX channel if required
+    if ( psched->context[ltid][CTX_NIC_RX_ID] < NB_NIC_CHANNELS )
+    {
+        psched->context[ltid][CTX_NIC_RX_ID] = 0xFFFFFFFF;
+        _sys_nic_release( 1 );
+    }
+
+    // release private NIC_TX channel if required
+    if ( psched->context[ltid][CTX_NIC_TX_ID] < NB_NIC_CHANNELS )
+    {
+        psched->context[ltid][CTX_NIC_TX_ID] = 0xFFFFFFFF;
+        _sys_nic_release( 0 );
+    }
+
+    // set NORUN_MASK_TASK bit
+    _atomic_or( &psched->context[ltid][CTX_NORUN_ID], NORUN_MASK_TASK );
+}
+
 
 //////////////////////////////////
@@ -40,4 +80,5 @@
             " - CTX_SP    = %x\n"
             " - CTX_NORUN = %x\n"
+            " - CTX_SIG   = %x\n"
             "########## %s\n",
             x , y , p , ltid ,
@@ -50,4 +91,5 @@
             psched->context[ltid][CTX_SP_ID], 
             psched->context[ltid][CTX_NORUN_ID],
+            psched->context[ltid][CTX_SIG_ID],
             string );
 }  // _ctx_display()
@@ -78,8 +120,22 @@
     {
         next_task_id = tid % tasks;
+
+        // this task needs to be killed
+        if ( psched->context[next_task_id][CTX_SIG_ID] & SIG_MASK_KILL )
+        {
+            _ctx_kill_task( next_task_id );
+
+            // acknowledge signal
+            _atomic_and( &psched->context[next_task_id][CTX_SIG_ID], ~SIG_MASK_KILL );
+
+            // skip
+            continue;
+        }
+
         // test if the task is runable
         if ( psched->context[next_task_id][CTX_NORUN_ID] == 0 ) 
         {
             found = 1;
+            // TODO: don't break to process all pending signals.
             break;
         }
Index: /soft/giet_vm/giet_kernel/ctx_handler.h
===================================================================
--- /soft/giet_vm/giet_kernel/ctx_handler.h	(revision 694)
+++ /soft/giet_vm/giet_kernel/ctx_handler.h	(revision 695)
@@ -34,5 +34,5 @@
 // ctx[35]<- BVAR  |ctx[43]<- CMA_TX |ctx[51]<- COPROC |ctx[59]<- ***
 // ctx[36]<- PTAB  |ctx[44]<- NIC_RX |ctx[52]<- ENTRY  |ctx[60]<- ***
-// ctx[37]<- LTID  |ctx[45]<- NIC_TX |ctx[53]<- ***    |ctx[61]<- ***
+// ctx[37]<- LTID  |ctx[45]<- NIC_TX |ctx[53]<- SIG    |ctx[61]<- ***
 // ctx[38]<- VSID  |ctx[46]<- TIM    |ctx[54]<- ***    |ctx[62]<- ***
 // ctx[39]<- PTPR  |ctx[47]<- HBA    |ctx[55]<- ***    |ctx[63]<- ***
@@ -74,4 +74,5 @@
 #define CTX_COPROC_ID    51    // cluster_xy : coprocessor coordinates
 #define CTX_ENTRY_ID     52    // Virtual address of task entry point
+#define CTX_SIG_ID       53    // bit-vector : pending signals for task
 
 /////////////////////////////////////////////////////////////////////////////////
@@ -82,4 +83,10 @@
 #define NORUN_MASK_IOC        0x00000002   // Task blocked on IOC transfer
 #define NORUN_MASK_COPROC     0x00000004   // Task blocked on COPROC transfer
+
+/////////////////////////////////////////////////////////////////////////////////
+//    Definition of the SIG bit-vector masks
+/////////////////////////////////////////////////////////////////////////////////
+
+#define SIG_MASK_KILL         0x00000001   // Task will be killed at next tick
 
 /////////////////////////////////////////////////////////////////////////////////
Index: /soft/giet_vm/giet_kernel/sys_handler.c
===================================================================
--- /soft/giet_vm/giet_kernel/sys_handler.c	(revision 694)
+++ /soft/giet_vm/giet_kernel/sys_handler.c	(revision 695)
@@ -232,5 +232,5 @@
         if ( _strcmp( vspace[vspace_id].name, name ) == 0 ) 
         {
-            // check if pplication can be killed
+            // check if application can be killed
             if ( vspace[vspace_id].active ) return -2;
 
@@ -249,40 +249,11 @@
                 static_scheduler_t* psched  = (static_scheduler_t*)_schedulers[x][y][p];
 
-                // release private TTY terminal if required
-                if ( psched->context[ltid][CTX_TTY_ID] < NB_TTY_CHANNELS ) 
-                {
-                    psched->context[ltid][CTX_TTY_ID] = 0xFFFFFFFF;
-                    _atomic_increment( &_tty_channel_allocator , 0xFFFFFFFF );
-                }
-
-                // release private TIM channel if required
-                if ( psched->context[ltid][CTX_TIM_ID] < NB_TIM_CHANNELS ) 
-                {
-                    psched->context[ltid][CTX_TIM_ID] = 0xFFFFFFFF;
-                    _atomic_increment( &_tim_channel_allocator , 0xFFFFFFFF );
-                }
-
-                // release private NIC_RX channel if required
-                if ( psched->context[ltid][CTX_NIC_RX_ID] < NB_NIC_CHANNELS ) 
-                {
-                    psched->context[ltid][CTX_NIC_RX_ID] = 0xFFFFFFFF;
-                    _atomic_increment( &_nic_rx_channel_allocator , 0xFFFFFFFF );
-                }
-
-                // release private NIC_TX channel if required
-                if ( psched->context[ltid][CTX_NIC_TX_ID] < NB_NIC_CHANNELS ) 
-                {
-                    psched->context[ltid][CTX_NIC_TX_ID] = 0xFFFFFFFF;
-                    _atomic_increment( &_nic_tx_channel_allocator , 0xFFFFFFFF );
-                }
-
-                // set NORUN_MASK_TASK bit
-                unsigned int*       ptr     = &psched->context[ltid][CTX_NORUN_ID];
-                _atomic_or( ptr , NORUN_MASK_TASK );
+                // set KILL signal bit
+                _atomic_or( &psched->context[ltid][CTX_SIG_ID] , SIG_MASK_KILL );
             } 
 
 #if GIET_DEBUG_EXEC 
 if ( _get_proctime() > GIET_DEBUG_EXEC )
-_printf("\n[DEBUG EXEC] exit _sys_kill_application() : %s desactivated\n", name );
+_printf("\n[DEBUG EXEC] exit _sys_kill_application() : %s will be killed\n", name );
 #endif
 
@@ -848,4 +819,14 @@
 }
 
+/////////////////////////////////////////
+// NOTE: not a syscall
+int _sys_tty_release()
+{
+    // release one TTY terminal
+    _atomic_increment( &_tty_channel_allocator , 0xFFFFFFFF );
+
+    return 0;
+}
+
 /////////////////////////////////////////////////
 int _sys_tty_write( const char*  buffer,    
@@ -942,4 +923,14 @@
         return 0;
     }
+}
+
+////////////////////
+// NOTE: not a syscall
+int _sys_tim_release()
+{
+    // release one timer
+    _atomic_increment( &_tim_channel_allocator, 0xFFFFFFFF );
+
+    return 0;
 }
 
@@ -1225,4 +1216,17 @@
     return nic_channel;
 } // end _sys_nic_alloc()
+
+
+////////////////////////////////////////
+// NOTE: not a syscall
+int _sys_nic_release( unsigned int is_rx )
+{
+    if ( is_rx )
+        _atomic_increment( &_nic_rx_channel_allocator , 0xFFFFFFFF );
+    else
+        _atomic_increment( &_nic_tx_channel_allocator , 0xFFFFFFFF );
+
+    return 0;
+}
 
 
Index: /soft/giet_vm/giet_kernel/sys_handler.h
===================================================================
--- /soft/giet_vm/giet_kernel/sys_handler.h	(revision 694)
+++ /soft/giet_vm/giet_kernel/sys_handler.h	(revision 695)
@@ -118,4 +118,6 @@
 int _sys_tty_alloc( unsigned int shared );
 
+int _sys_tty_release();
+
 int _sys_tty_write( const char*  buffer,
                     unsigned int length,
@@ -131,4 +133,6 @@
 
 int _sys_tim_alloc();
+
+int _sys_tim_release();
 
 int _sys_tim_start( unsigned int period );
@@ -144,4 +148,5 @@
                     unsigned int ymax );
 
+int _sys_nic_release( unsigned int is_rx );
 
 int _sys_nic_start( unsigned int is_rx,
