Index: /soft/giet_vm/giet_config.h
===================================================================
--- /soft/giet_vm/giet_config.h	(revision 215)
+++ /soft/giet_vm/giet_config.h	(revision 216)
@@ -19,5 +19,5 @@
 #define BOOT_DEBUG_PT		0			/* trace page tables initialisation on TTY0 */
 #define BOOT_DEBUG_VOBJS	0			/* trace vobjs initialisation on TTY0 */
-#define BOOT_DEBUG_SCHED 	1			/* trace schedulers initialisation on TTY0 */
+#define BOOT_DEBUG_SCHED 	0			/* trace schedulers initialisation on TTY0 */
 
 #define GIET_DEBUG_INIT		0			/* trace parallel kernel initialisation on TTY0 */
@@ -29,5 +29,5 @@
 
 #define GIET_NB_VSPACE_MAX	64			/* max number of virtual spaces */
-#define GIET_TICK_VALUE	    0x4000		/* context switch period (number of cycles) */
+#define GIET_TICK_VALUE	    0x1000		/* context switch period (number of cycles) */
 
 #endif
Index: /soft/giet_vm/sys/drivers.c
===================================================================
--- /soft/giet_vm/sys/drivers.c	(revision 215)
+++ /soft/giet_vm/sys/drivers.c	(revision 216)
@@ -78,5 +78,5 @@
 #endif
 
-#if ( (NB_TIMERS_MAX + NB_PROCS_MAX) > 32 )
+#if ( (NB_TIMERS_MAX) > 32 )
 # error: NB_TIMERS_MAX + NB_PROCS_MAX cannot be larger than 32
 #endif
@@ -111,5 +111,4 @@
 //   local_id in [0, NB_PROCS_MAX-1],
 // - "user" timers : requested by the task in the mapping_info data structure.
-//   local_id in [NB_PROC_MAX, NB_PROCS_MAX + NB_TIMERS_MAX - 1]
 //   For each user timer, the timer_id is stored in the context of the task.
 // The global index is cluster_id * (NB_PROCS_MAX+NB_TIMERS_MAX) + local_id
@@ -136,6 +135,6 @@
 {
     // parameters checking 
-    if ( cluster_id >= NB_CLUSTERS)					return 1;
-    if ( local_id >= NB_TIMERS_MAX + NB_PROCS_MAX ) return 1;
+    if ( cluster_id >= NB_CLUSTERS)	return 1;
+    if ( local_id >= NB_TIMERS_MAX) return 2;
 
 #if USE_XICU
@@ -164,6 +163,6 @@
 {
     // parameters checking 
-    if ( cluster_id >= NB_CLUSTERS)					return 1;
-    if ( local_id >= NB_TIMERS_MAX + NB_PROCS_MAX ) return 1;
+    if ( cluster_id >= NB_CLUSTERS)	 return 1;
+    if ( local_id >= NB_TIMERS_MAX ) return 2;
 
 #if USE_XICU
@@ -193,6 +192,6 @@
 {
     // parameters checking 
-    if ( cluster_id >= NB_CLUSTERS)					return 1;
-    if ( local_id >= NB_TIMERS_MAX + NB_PROCS_MAX ) return 1;
+    if ( cluster_id >= NB_CLUSTERS)	 return 1;
+    if ( local_id >= NB_TIMERS_MAX ) return 2;
 
 #if USE_XICU
Index: /soft/giet_vm/sys/irq_handler.c
===================================================================
--- /soft/giet_vm/sys/irq_handler.c	(revision 215)
+++ /soft/giet_vm/sys/irq_handler.c	(revision 216)
@@ -45,4 +45,5 @@
     unsigned int	irq_id;
 
+
     // get the highest priority active IRQ index 
     if ( _icu_get_index( pid / NB_PROCS_MAX,
@@ -55,4 +56,5 @@
     }
 
+
     if ( irq_id < 32 )	// do nothing if no interrupt active 
     {
@@ -60,5 +62,5 @@
         unsigned int isr_id     = entry & 0x000000FF;
         unsigned int channel_id = (entry>>16) & 0x0000FFFF;
-        if      ( isr_id == ISR_SWITCH  ) _isr_switch();
+        if      ( isr_id == ISR_SWITCH  ) _isr_switch( channel_id );
         else if ( isr_id == ISR_IOC     ) _isr_ioc();
         else if ( isr_id == ISR_DMA     ) _isr_dma( channel_id );
@@ -169,5 +171,5 @@
     // aknowledge IRQ 
     if ( _timer_reset_irq( cluster_id, 
-                           NB_PROCS_MAX + timer_id ) )
+                           timer_id ) )
     {
         _get_lock(&_tty_put_lock);
@@ -230,13 +232,11 @@
 // The ISR acknowledges the IRQ and calls the _ctx_switch() function.
 /////////////////////////////////////////////////////////////////////////////////////
-void _isr_switch()
+void _isr_switch( unsigned int timer_id)
 {
     // get cluster index and proc local index
-    unsigned int pid        = _procid();
-    unsigned int local_id   = pid % NB_PROCS_MAX;
-    unsigned int cluster_id = pid / NB_PROCS_MAX;
+    unsigned int cluster_id = _procid() / NB_PROCS_MAX;
 
     // acknowledge IRQ
-    if ( _timer_reset_irq( cluster_id, local_id ) ) 
+    if ( _timer_reset_irq( cluster_id, timer_id ) ) 
     {
         _get_lock(&_tty_put_lock);
Index: /soft/giet_vm/sys/kernel_init.c
===================================================================
--- /soft/giet_vm/sys/kernel_init.c	(revision 215)
+++ /soft/giet_vm/sys/kernel_init.c	(revision 216)
@@ -124,4 +124,6 @@
     }
  
+    unsigned int isr_switch_channel = 0xFFFFFFFF;
+
     // step 3 : compute and set ICU masks
     //          there is at most 32 interrupts per processor
@@ -131,6 +133,4 @@
     unsigned int hwi_mask = 0;
     unsigned int pti_mask = 0;
-
-    unsigned int isr_switch_channel = 0xFFFFFFFF;
 
     for ( irq_id = 0 ; irq_id < 32 ; irq_id++ )
@@ -173,12 +173,21 @@
         if(isr_switch_channel == 0xFFFFFFFF)
         {
+            _get_lock(&_tty_put_lock);
             _puts("\n[GIET ERROR] ISR_SWITCH not found on proc ");
             _putd( proc_id);
             _puts("\n");
+            _release_lock(&_tty_put_lock);
             _sys_exit();
         }
-        _timer_start( cluster_id, 
-                      isr_switch_channel, 
-                      GIET_TICK_VALUE );
+
+        if(_timer_start( cluster_id, isr_switch_channel, GIET_TICK_VALUE ))
+        {
+            _get_lock(&_tty_put_lock);
+            _puts("\n[GIET ERROR] ISR_SWITCH init error for proc ");
+            _putd( proc_id);
+            _puts("\n");
+            _release_lock(&_tty_put_lock);
+            _sys_exit();
+        }
         
 #if GIET_DEBUG_INIT
Index: /soft/giet_vm/xml/xml_parser.c
===================================================================
--- /soft/giet_vm/xml/xml_parser.c	(revision 215)
+++ /soft/giet_vm/xml/xml_parser.c	(revision 216)
@@ -1129,4 +1129,7 @@
             if(icu_base_offset == 0xFFFFFFFF)
                 icu_base_offset = pseg[ periph[periph_index]->psegid ]->base;
+
+            if(nb_timer_channel_max == 0)
+                nb_timer_channel_max = 32;
         }
         else if ( strcmp( str, "DMA" ) == 0 ) 
