Index: /soft/giet_vm/giet_kernel/ctx_handler.c
===================================================================
--- /soft/giet_vm/giet_kernel/ctx_handler.c	(revision 701)
+++ /soft/giet_vm/giet_kernel/ctx_handler.c	(revision 702)
@@ -13,4 +13,6 @@
 #include <tty0.h>
 #include <xcu_driver.h>
+#include <fat32.h>
+#include <elf-types.h>
 
 /////////////////////////////////////////////////////////////////////////////////
@@ -24,5 +26,6 @@
 extern static_scheduler_t* _schedulers[X_SIZE][Y_SIZE][NB_PROCS_MAX];
 
-//////////////////
+
+///////////////////////////////////////////////
 static void _ctx_kill_task( unsigned int ltid )
 {
@@ -74,21 +77,151 @@
     // set NORUN_MASK_TASK bit
     _atomic_or( &psched->context[ltid][CTX_NORUN_ID], NORUN_MASK_TASK );
-}
-
-
-//////////////////
+
+} // end _ctx_kill_task()
+
+
+
+////////////////////////////////////////////////////////////////////////
+static unsigned int _load_writable_segments( mapping_vspace_t*  vspace )
+{
+
+#if GIET_DEBUG_SWITCH 
+unsigned int gpid       = _get_procid();
+unsigned int cluster_xy = gpid >> P_WIDTH;
+unsigned int p          = gpid & ((1<<P_WIDTH)-1);
+unsigned int x          = cluster_xy >> Y_WIDTH;
+unsigned int y          = cluster_xy & ((1<<Y_WIDTH)-1);
+if ( _get_proctime() > GIET_DEBUG_SWITCH )
+_printf("\n[DEBUG SWITCH] P[%d,%d,%d] _load_writable_segments() : enters for %s\n",
+        x , y , p , vspace->name );
+#endif
+
+    mapping_header_t*  header  = (mapping_header_t *)SEG_BOOT_MAPPING_BASE;
+    mapping_vseg_t*    vseg    = _get_vseg_base(header);
+
+    // buffer to store one cluster
+    char  buf[4096];
+
+    // open the .elf file associated to vspace
+    unsigned int      vseg_id;
+    unsigned int      fd = 0;
+    
+    for (vseg_id = vspace->vseg_offset;
+         vseg_id < (vspace->vseg_offset + vspace->vsegs);
+         vseg_id++) 
+    {
+        if(vseg[vseg_id].type == VSEG_TYPE_ELF) 
+        {   
+            fd = _fat_open( vseg[vseg_id].binpath , O_RDONLY ); 
+
+#if GIET_DEBUG_SWITCH
+if ( _get_proctime() > GIET_DEBUG_SWITCH )
+_printf("\n[DEBUG SWITCH] P[%d,%d,%d] _load_writable_segments() : open %s / fd = %d\n",
+        x , y , p , vseg[vseg_id].binpath , fd );
+#endif
+
+            if ( fd < 0 ) return 1;
+            break;
+        }
+    }
+
+    // load Elf-Header into buffer from .elf file
+    if ( _fat_lseek( fd, 0, SEEK_SET ) ) return 1; 
+    if ( _fat_read( fd, buf, 4096 ) ) return 1;
+
+#if GIET_DEBUG_SWITCH
+if ( _get_proctime() > GIET_DEBUG_SWITCH )
+_printf("\n[DEBUG SWITCH] P[%d,%d,%d] _load_writable_segments() : load Elf-Header\n",
+        x , y , p );
+#endif
+
+    // get nsegments and Program-Header-Table offset from Elf-Header
+    Elf32_Ehdr*  elf_header_ptr = (Elf32_Ehdr*)buf;
+    unsigned int offset         = elf_header_ptr->e_phoff;
+    unsigned int nsegments      = elf_header_ptr->e_phnum;
+
+    // load Program-Header-Table from .elf file 
+    if ( _fat_lseek( fd, offset, SEEK_SET ) ) return 1;
+    if ( _fat_read( fd, buf, 4096 ) ) return 1;
+
+#if GIET_DEBUG_SWITCH
+if ( _get_proctime() > GIET_DEBUG_SWITCH )
+_printf("\n[DEBUG SWITCH] P[%d,%d,%d] _load_writable_segments() : "
+        "load Program-Header-Table\n", x , y , p );
+#endif
+
+    // set Program-Header-Table pointer 
+    Elf32_Phdr*  elf_pht_ptr = (Elf32_Phdr*)buf;
+    
+    // scan segments to  load all loadable & writable segments
+    unsigned int seg_id;
+    for (seg_id = 0 ; seg_id < nsegments ; seg_id++)
+    {
+        if ( (elf_pht_ptr[seg_id].p_type == PT_LOAD) &&    // loadable
+             (elf_pht_ptr[seg_id].p_flags & PF_W) )        // writable
+        {
+            // Get segment attributes
+            unsigned int seg_vaddr  = elf_pht_ptr[seg_id].p_vaddr;
+            unsigned int seg_offset = elf_pht_ptr[seg_id].p_offset;
+            unsigned int seg_size   = elf_pht_ptr[seg_id].p_filesz;
+
+            // load the segment
+            if ( _fat_lseek( fd, seg_offset, SEEK_SET ) ) return 1;
+            if ( _fat_read( fd, (void*)seg_vaddr, seg_size ) ) return 1;
+
+#if GIET_DEBUG_SWITCH
+if ( _get_proctime() > GIET_DEBUG_SWITCH )
+_printf("\n[DEBUG SWITCH] P[%d,%d,%d] _load_writable_segments() : load segment %x\n",
+        x , y , p , seg_vaddr );
+#endif
+
+        }
+    }  // end loop on writable & loadable segments
+
+    // close .elf file
+    _fat_close( fd );
+
+    return 0;
+}  // end load_writable_segments()
+                             
+
+
+///////////////////////////////////////////////
 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
+    // get pointers in mapping
     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);
+    mapping_vspace_t * vspace  = _get_vspace_base(header);
+
+    // get scheduler address for processor running the calling task
+    static_scheduler_t* psched = (static_scheduler_t*)_get_sched();
+
+    // get global task index, vspace index, and stack vseg index
     unsigned int task_id       = psched->context[ltid][CTX_GTID_ID];
+    unsigned int vspace_id     = psched->context[ltid][CTX_VSID_ID];
     unsigned int vseg_id       = task[task_id].stack_vseg_id;
+
+#if GIET_DEBUG_SWITCH 
+unsigned int gpid       = _get_procid();
+unsigned int cluster_xy = gpid >> P_WIDTH;
+unsigned int p          = gpid & ((1<<P_WIDTH)-1);
+unsigned int x          = cluster_xy >> Y_WIDTH;
+unsigned int y          = cluster_xy & ((1<<Y_WIDTH)-1);
+if ( _get_proctime() > GIET_DEBUG_SWITCH )
+_printf("\n[DEBUG SWITCH] P[%d,%d,%d] _ctx_exec_task() : enters for %s\n",
+        x , y , p , task[task_id].name );
+#endif
+
+    // reload writable segments
+    if ( _load_writable_segments( &vspace[vspace_id] ) )
+    {
+         _printf("[GIET ERROR] in _ctx_exec_task() for task %s\n",
+                 task[task_id].name );
+         return;
+    } 
+
+    // find initial stack pointer
     unsigned int sp_value      = vseg[vseg_id].vbase + vseg[vseg_id].length;
 
@@ -190,7 +323,8 @@
     if (found == 0) next_task_id = IDLE_TASK_INDEX;
 
-#if GIET_DEBUG_SWITCH
+#if ( GIET_DEBUG_SWITCH & 0x1 )
 unsigned int x = cluster_xy >> Y_WIDTH;
 unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
+if ( _get_proctime() > GIET_DEBUG_SWITCH )
 _printf("\n[DEBUG SWITCH] (%d) -> (%d) on processor[%d,%d,%d] at cycle %d\n",
         curr_task_id, next_task_id, x, y , lpid, _get_proctime() );
Index: /soft/giet_vm/giet_kernel/irq_handler.c
===================================================================
--- /soft/giet_vm/giet_kernel/irq_handler.c	(revision 701)
+++ /soft/giet_vm/giet_kernel/irq_handler.c	(revision 702)
@@ -415,6 +415,7 @@
     _xcu_timer_reset_irq( cluster_xy, irq_id );
 
-#if GIET_DEBUG_SWITCH
+#if (GIET_DEBUG_SWITCH & 0x1)
 unsigned int ltid  = _get_current_task_id();
+if ( _get_proctime() > GIET_DEBUG_SWITCH )
 _printf("\n[DEBUG SWITCH] P[%d,%d,%d] enters _isr_tick() at cycle %d\n"
         "  WTI index = %d / current ltid = %d\n",
