Index: soft/giet_vm/giet_boot/boot.c
===================================================================
--- soft/giet_vm/giet_boot/boot.c	(revision 266)
+++ soft/giet_vm/giet_boot/boot.c	(revision 267)
@@ -1157,9 +1157,11 @@
     //   are reserved for the kernel (context switch)
 
-    unsigned int alloc_tty_channel = 1;            // TTY channel allocator
+    unsigned int alloc_tty_channel = 0;            // TTY channel allocator
     unsigned int alloc_nic_channel = 0;            // NIC channel allocator
     unsigned int alloc_cma_channel = 0;            // CMA channel allocator
     unsigned int alloc_hba_channel = 0;            // IOC channel allocator
     unsigned int alloc_tim_channel[X_SIZE*Y_SIZE]; // user TIMER allocators
+
+    if (!GIET_MONO_TTY) alloc_tty_channel++;
 
     /////////////////////////////////////////////////////////////////////////
@@ -1364,5 +1366,5 @@
                 }
                 ctx_tty = alloc_tty_channel;
-                alloc_tty_channel++;
+                if (!GIET_MONO_TTY) alloc_tty_channel++;
             }
             // ctx_nic : NIC channel global index provided by the global allocator
@@ -1468,4 +1470,7 @@
             // get local task index in scheduler
             unsigned int ltid = psched->tasks;
+
+            // get vspace thread index
+            unsigned int thread_id = task[task_id].trdid;
 
             if (ltid >= IDLE_TASK_INDEX) 
@@ -1500,4 +1505,5 @@
             psched->context[ltid][CTX_LTID_ID]  = ltid;
             psched->context[ltid][CTX_GTID_ID]  = task_id;
+            psched->context[ltid][CTX_TRDID_ID] = thread_id;
             psched->context[ltid][CTX_VSID_ID]  = vspace_id;
             psched->context[ltid][CTX_RUN_ID]   = 1;
@@ -1505,8 +1511,6 @@
 #if BOOT_DEBUG_SCHED
 _puts("\nTask ");
-_puts( task[task_id].name );
-_puts(" (");
 _putd( task_id );
-_puts(") allocated to processor ");
+_puts(" allocated to processor ");
 _putd( gpid );
 _puts("\n  - ctx[LTID]   = ");
@@ -1536,4 +1540,6 @@
 _puts("\n  - ctx[VSID]   = ");
 _putd( psched->context[ltid][CTX_VSID_ID] );
+_puts("\n  - ctx[TRDID]  = ");
+_putd( psched->context[ltid][CTX_TRDID_ID] );
 _puts("\n");
 #endif
Index: soft/giet_vm/giet_config.h
===================================================================
--- soft/giet_vm/giet_config.h	(revision 266)
+++ soft/giet_vm/giet_config.h	(revision 267)
@@ -35,4 +35,8 @@
 
 #define GIET_IDLE_TASK_PERIOD    10000000   /* Idle Task message period */
+#define GIET_IDLE_TASK_VERBOSITY 1
+
+#define GIET_MONO_TTY            0          /* Only one terminal is used */
+
 #define GIET_MAX_ELF_FILES       20         /* max .elf files loaded by boot-loader */
 #define GIET_OPEN_FILES_MAX      16         /* max simultaneously open files */
Index: soft/giet_vm/giet_drivers/dma_driver.c
===================================================================
--- soft/giet_vm/giet_drivers/dma_driver.c	(revision 266)
+++ soft/giet_vm/giet_drivers/dma_driver.c	(revision 267)
@@ -134,5 +134,5 @@
     return dma_address[channel_id * DMA_SPAN + DMA_LEN];
 #else
-    return DMA_ERROR;
+    return DMA_IDLE;
 #endif
 }
Index: soft/giet_vm/giet_kernel/ctx_handler.c
===================================================================
--- soft/giet_vm/giet_kernel/ctx_handler.c	(revision 266)
+++ soft/giet_vm/giet_kernel/ctx_handler.c	(revision 267)
@@ -41,5 +41,6 @@
 // - LTID   : Task local index (in scheduler)
 // - VSID   : Virtual space index
-// - RUN    : Task state (0 => sleeping / 1 => runable ) 
+// - RUN    : Task state (0 => sleeping / 1 => runnable ) 
+// - TRDID  : Thread ID index (in vspace)
 //
 // ctx[0]<- ***|ctx[8] <- $8 |ctx[16]<- $16|ctx[24]<- $24|ctx[32]<- EPC  |ctx[40]<- TTY
@@ -51,4 +52,6 @@
 // ctx[6]<- $6 |ctx[14]<- $14|ctx[22]<- $22|ctx[30]<- $30|ctx[38]<- VSID |ctx[46]<- GTID
 // ctx[7]<- $7 |ctx[15]<- $15|ctx[23]<- $23|ctx[31]<- RA |ctx[39]<- PTPR |ctx[47]<- RUN
+//
+// ctx[48]<- TRDID
 //////////////////////////////////////////////////////////////////////////////////////////
 
@@ -164,4 +167,5 @@
                 : "$3" ); 
 
+#if GIET_IDLE_TASK_VERBOSITY == 1
         _tty_get_lock( 0 );
         _puts("\n[GIET WARNING] Processor ");
@@ -171,4 +175,5 @@
         _puts("\n");
         _tty_release_lock( 0 );
+#endif
 
          count = GIET_IDLE_TASK_PERIOD;
Index: soft/giet_vm/giet_kernel/ctx_handler.h
===================================================================
--- soft/giet_vm/giet_kernel/ctx_handler.h	(revision 266)
+++ soft/giet_vm/giet_kernel/ctx_handler.h	(revision 267)
@@ -48,4 +48,5 @@
 #define CTX_GTID_ID      46  // Global Task Index
 #define CTX_RUN_ID       47  // Boolean: task runable
+#define CTX_TRDID_ID     48  // Thread Index in vspace
 
 //////////////////////////////////////////////////////////////////////////////////
Index: soft/giet_vm/giet_kernel/giet.s
===================================================================
--- soft/giet_vm/giet_kernel/giet.s	(revision 266)
+++ soft/giet_vm/giet_kernel/giet.s	(revision 267)
@@ -9,5 +9,5 @@
 * - the _cause_vector[16] array defines the 16 causes to enter the GIET
 *   it is initialized in th exc_handler.c file
-* - the _syscall_vector[32] array defines the 32 system calls entry points
+* - the _syscall_vector[64] array defines the 64 system calls entry points
 *   it is initialised in the sys_handler.c file 
 ***********************************************************************************/
Index: soft/giet_vm/giet_kernel/sys_handler.c
===================================================================
--- soft/giet_vm/giet_kernel/sys_handler.c	(revision 266)
+++ soft/giet_vm/giet_kernel/sys_handler.c	(revision 267)
@@ -48,6 +48,6 @@
     &_fb_sync_write,       /* 0x10 */
     &_fb_sync_read,        /* 0x11 */
-    &_sys_ukn,             /* 0x12 */
-    &_sys_ukn,             /* 0x13 */
+    &_thread_id,           /* 0x12 */
+    &_tty_get_release_lock,/* 0x13 */
     &_sys_ukn,             /* 0x14 */
     &_sys_ukn,             /* 0x15 */ 
@@ -180,4 +180,28 @@
 {
     return _get_context_slot(CTX_GTID_ID);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// _thread_id()
+// Returns current thread index.
+/////////////////////////////////////////////////////////////////////////////
+unsigned int _thread_id()
+{
+    return _get_context_slot(CTX_TRDID_ID);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// _tty_get_release_lock(int val)
+// Get or release the hardware TTY lock depending on val (0: get,1: release)
+/////////////////////////////////////////////////////////////////////////////
+int _tty_get_release_lock(unsigned int val)
+{
+    unsigned int channel = _get_context_slot(CTX_TTY_ID);
+
+    if      ( val == 0 ) _tty_get_lock(channel);
+    else if ( val == 1 ) _tty_release_lock(channel);
+    else return -1; // Wrong action
+
+    return 0;
 }
 
Index: soft/giet_vm/giet_kernel/sys_handler.h
===================================================================
--- soft/giet_vm/giet_kernel/sys_handler.h	(revision 266)
+++ soft/giet_vm/giet_kernel/sys_handler.h	(revision 267)
@@ -24,4 +24,7 @@
 unsigned int _local_task_id();
 unsigned int _global_task_id();
+unsigned int _thread_id();
+
+int          _tty_get_release_lock(unsigned int val);
 
 unsigned int _procs_number( unsigned int  cluster_id, 
Index: soft/giet_vm/giet_libs/stdio.c
===================================================================
--- soft/giet_vm/giet_libs/stdio.c	(revision 266)
+++ soft/giet_vm/giet_libs/stdio.c	(revision 267)
@@ -12,4 +12,5 @@
 #include <stdarg.h>
 #include <stdio.h>
+#include <giet_config.h>
 
 
@@ -298,4 +299,9 @@
     unsigned int ret;
 
+    if (GIET_MONO_TTY)
+    {
+        ret = sys_call(SYSCALL_TTY_LOCK, 0, 0, 0, 0); // Get TTY lock
+    }
+
 printf_text:
 
@@ -311,5 +317,7 @@
                            0xFFFFFFFF,
                            0);
-            if (ret != i)  return 1;     /* return error */ 
+
+            if (ret != i) goto return_error;
+
             format += i;
         }
@@ -319,4 +327,9 @@
             goto printf_arguments;
         }
+    }
+
+    if (GIET_MONO_TTY)
+    {
+        ret = sys_call(SYSCALL_TTY_LOCK, 1, 0, 0, 0); // Release TTY lock
     }
 
@@ -349,5 +362,5 @@
                                    0xFFFFFFFF,
                                    0);
-                    if (ret != 1)  return 1;     /* return error */
+                    if (ret != 1) goto return_error;
                 }
             case ('u'):             /* decimal unsigned integer */
@@ -366,5 +379,5 @@
                                0xFFFFFFFF,
                                0);
-                if (ret != 2) return 1;       /* return error */
+                if (ret != 2) goto return_error;       /* return error */
                 for(i = 0; i < 8; i++) 
                 {
@@ -394,7 +407,16 @@
                        0xFFFFFFFF,
                        0);
-        if (ret != len)  return 1;
+        if (ret != len)  goto return_error;
+        
         goto printf_text;
     }
+
+return_error:
+    if (GIET_MONO_TTY)
+    {
+        ret = sys_call(SYSCALL_TTY_LOCK, 1, 0, 0, 0); // Release TTY lock
+    }
+
+    return 1;
 }
 
@@ -663,4 +685,15 @@
 }
 
+//////////////////////////////////////////////////////////////////////////////////
+// giet_thread_id()
+//////////////////////////////////////////////////////////////////////////////////
+// This functions returns the thread index of the current task.
+//////////////////////////////////////////////////////////////////////////////////
+int giet_thread_id() 
+{
+    return sys_call( SYSCALL_THREAD_ID, 
+                     0, 0, 0, 0 );
+}
+
 ///////////////////////////////////////////////////////////////////////////////////
 ///////////////////// FAT related system calls ////////////////////////////////////
Index: soft/giet_vm/giet_libs/stdio.h
===================================================================
--- soft/giet_vm/giet_libs/stdio.h	(revision 266)
+++ soft/giet_vm/giet_libs/stdio.h	(revision 267)
@@ -31,6 +31,6 @@
 #define SYSCALL_FB_SYNC_WRITE     0x10
 #define SYSCALL_FB_SYNC_READ      0x11
-#define SYSCALL_FREE_12           0x12
-#define SYSCALL_FREE_13           0x13
+#define SYSCALL_THREAD_ID         0x12
+#define SYSCALL_TTY_LOCK          0x13
 #define SYSCALL_FREE_14           0x14
 #define SYSCALL_FREE_15           0x15
@@ -209,4 +209,6 @@
 extern int giet_global_task_id();
 
+extern int giet_thread_id();
+
 extern void giet_assert( unsigned int, 
                          char* string );
Index: soft/giet_vm/giet_xml/mapping_info.h
===================================================================
--- soft/giet_vm/giet_xml/mapping_info.h	(revision 266)
+++ soft/giet_vm/giet_xml/mapping_info.h	(revision 267)
@@ -252,4 +252,5 @@
     unsigned int    clusterid;       // linear index in array of clusters
     unsigned int    proclocid;       // processor local index (inside cluster)
+    unsigned int    trdid;           // thread index in vspace
     unsigned int    stack_vobjid;    // stack vobj index in vspace
     unsigned int    heap_vobjid;     // heap vobj index in vspace
Index: soft/giet_vm/giet_xml/xml_parser.c
===================================================================
--- soft/giet_vm/giet_xml/xml_parser.c	(revision 266)
+++ soft/giet_vm/giet_xml/xml_parser.c	(revision 267)
@@ -463,5 +463,18 @@
 
     ///////// get x coordinate 
-     x = getIntValue(reader, "x", &ok);
+    task[task_index]->trdid = getIntValue(reader, "trdid", &ok);
+#if XML_PARSER_DEBUG
+printf("      x         = %d\n", x);
+#endif
+    if ( !ok ) 
+    {
+        task[task_index]->trdid = task_loc_index;
+        printf("[XML WARNING] missing trdid (thread index) attribute "
+               "for task in vspace %d. Using value %d\n"
+               , vspace_index, task_loc_index);
+    }  
+
+    ///////// get x coordinate 
+    x = getIntValue(reader, "x", &ok);
 #if XML_PARSER_DEBUG
 printf("      x         = %d\n", x);
@@ -475,5 +488,5 @@
 
     ///////// get y coordinate 
-     y = getIntValue(reader, "y", &ok);
+    y = getIntValue(reader, "y", &ok);
 #if XML_PARSER_DEBUG
 printf("      y         = %d\n", y);
