diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 17e2072d00ebcaebece57149f3005d3461ea82f5..5efb13594f5f0bea5dba30a590d1b3e5d9235391 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -1880,9 +1880,13 @@ endif (${T_TRACER})
 #This rule and the following deal with it.
 add_custom_command (
   OUTPUT ${OPENAIR_DIR}/common/utils/T/T_IDs.h
-  COMMAND make
+  COMMAND $(MAKE) clean
+  COMMAND $(MAKE)
+  COMMAND $(MAKE) check_vcd
   WORKING_DIRECTORY ${OPENAIR_DIR}/common/utils/T
   DEPENDS ${OPENAIR_DIR}/common/utils/T/T_messages.txt
+          ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c
+          ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.h
   )
 
 #This rule is specifically needed to generate T files
@@ -2187,7 +2191,8 @@ if (${T_TRACER})
         oai_eth_transpro
         FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA
         SECU_CN SCHED_LIB PHY L2 default_sched remote_sched RAL CN_UTILS
-        GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB PHY_MEX)
+        GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB PHY_MEX
+        coding)
     if (TARGET ${i})
       add_dependencies(${i} generate_T)
     endif()
@@ -2230,7 +2235,7 @@ function(make_driver name dir)
   endforeach()
   CONFIGURE_FILE(${OPENAIR_CMAKE}/tools/Kbuild.cmake ${OPENAIR_BIN_DIR}/${name}/Kbuild)
   add_custom_command(OUTPUT ${name}.ko
-    COMMAND make -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name}
+    COMMAND $(MAKE) -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name}
     WORKING_DIRECTORY ${OPENAIR_BIN_DIR}/${name}
     COMMENT "building ${module}.ko"
     VERBATIM
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 5ddce2340bebafaeb8894aae33ca7714fd36f7a0..3363bd2e7658feef8f91ec18b80f738b43cc440b 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -683,7 +683,7 @@ install_asn1c_from_source(){
     # better to use a given commit than a branch in case the branch
     # is updated and requires modifications in the source of OAI
     #git checkout velichkov_s1ap_plus_option_group
-    git checkout ec830d70bbb014b769810355a2f321a91ccd8a58
+    git checkout 73d6b23dcec9ab36605b4af884143824392134c1
     autoreconf -iv
     ./configure
     make -j`nproc`
diff --git a/common/utils/LOG/vcd_signal_dumper.h b/common/utils/LOG/vcd_signal_dumper.h
index 3c722ac49aa1335b18497e360e142b46040f4f9c..749978bb48da6a0cae665968d04db65b97800925 100644
--- a/common/utils/LOG/vcd_signal_dumper.h
+++ b/common/utils/LOG/vcd_signal_dumper.h
@@ -39,7 +39,7 @@
 
 /* WARNING: if you edit the enums below, update also string definitions in vcd_signal_dumper.c */
 typedef enum {
-  VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB = 0,
+  VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB=0,
   VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_ENB,
   VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_ENB,
   VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB,
@@ -91,12 +91,12 @@ typedef enum {
   VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM,
   VCD_SIGNAL_DUMPER_VARIABLES_CNT,
   VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP,
-  VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG,
-  VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG,
-  VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG,
-  VCD_SIGNAL_DUMPER_VARIABLE_ITTI_ALLOC_MSG,
-  VCD_SIGNAL_DUMPER_VARIABLE_MP_ALLOC,
-  VCD_SIGNAL_DUMPER_VARIABLE_MP_FREE,
+  VCD_SIGNAL_DUMPER_VARIABLES_ITTI_SEND_MSG,
+  VCD_SIGNAL_DUMPER_VARIABLES_ITTI_POLL_MSG,
+  VCD_SIGNAL_DUMPER_VARIABLES_ITTI_RECV_MSG,
+  VCD_SIGNAL_DUMPER_VARIABLES_ITTI_ALLOC_MSG,
+  VCD_SIGNAL_DUMPER_VARIABLES_MP_ALLOC,
+  VCD_SIGNAL_DUMPER_VARIABLES_MP_FREE,
   VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX,
   VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX,
   VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,
diff --git a/common/utils/T/.gitignore b/common/utils/T/.gitignore
index 817780592428b38fd48b57f26be6b3a73868ae63..d754ff7c38730801afa6f6629ef45b9c9d4dcc03 100644
--- a/common/utils/T/.gitignore
+++ b/common/utils/T/.gitignore
@@ -15,4 +15,5 @@ tracer/to_vcd
 tracer/extract_input_subframe
 tracer/extract_output_subframe
 tracer/extract
+tracer/multi
 tracee/tracee
diff --git a/common/utils/T/Makefile b/common/utils/T/Makefile
index 5e1785ea91695ae36e08acab486c14c6b6b79e83..87a6e34c5d1e0ecd4636439d9eccf8aeacd26d38 100644
--- a/common/utils/T/Makefile
+++ b/common/utils/T/Makefile
@@ -18,6 +18,15 @@ T_messages.txt.h: T_messages.txt
 T_IDs.h: $(GENIDS) T_messages.txt
 	./$(GENIDS) T_messages.txt T_IDs.h
 
+check_vcd:
+	gcc -Wall -I. -I.. -I../itti -Itracer -o _check_vcd check_vcd.c tracer/database.c tracer/utils.c -lm -pthread
+	./_check_vcd || (rm -f ./_check_vcd ./T_IDs.h ./T_messages.txt.h && false)
+	rm -f ./_check_vcd
+
+.PHONY: check_vcd
+
 clean:
-	rm -f *.o $(GENIDS) core T_IDs.h T_messages.txt.h
-	cd tracer && make clean
+	rm -f *.o $(GENIDS) core T_IDs.h T_messages.txt.h _check_vcd
+
+cleanall: clean
+	cd tracer && $(MAKE) clean
diff --git a/common/utils/T/T.c b/common/utils/T/T.c
index 8679a4185fdf2905b2850ce7115641827aef05a9..fbd3f75a0c195fbb9d41e927fe6b3bf13150ee41 100644
--- a/common/utils/T/T.c
+++ b/common/utils/T/T.c
@@ -31,6 +31,12 @@ volatile int _T_freelist_head;
 volatile int *T_freelist_head = &_T_freelist_head;
 T_cache_t *T_cache;
 
+#if BASIC_SIMULATOR
+/* global variables used by T_GET_SLOT, see in T.h */
+volatile uint64_t T_next_id;
+volatile uint64_t T_active_id;
+#endif
+
 static void get_message(int s)
 {
   char t;
@@ -91,7 +97,7 @@ static void new_thread(void *(*f)(void *), void *data)
 
 /* defined in local_tracer.c */
 void T_local_tracer_main(int remote_port, int wait_for_tracer,
-    int local_socket, char *shm_file);
+    int local_socket, void *shm_array);
 
 /* We monitor the tracee and the local tracer processes.
  * When one dies we forcefully kill the other.
@@ -114,22 +120,31 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork)
 {
   int socket_pair[2];
   int s;
-  int T_shm_fd;
   int child1, child2;
-  char shm_file[128];
-
-  sprintf(shm_file, "/%s%d", T_SHM_FILENAME, getpid());
+  int i;
 
   if (socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair))
     { perror("socketpair"); abort(); }
 
+  /* setup shared memory */
+  T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t),
+                 PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+  if (T_cache == MAP_FAILED)
+    { perror("mmap"); abort(); }
+
+  /* let's garbage the memory to catch some potential problems
+   * (think multiprocessor sync issues, barriers, etc.)
+   */
+  memset(T_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t));
+  for (i = 0; i < T_CACHE_SIZE; i++) T_cache[i].busy = 0;
+
   /* child1 runs the local tracer and child2 (or main) runs the tracee */
 
   child1 = fork(); if (child1 == -1) abort();
   if (child1 == 0) {
     close(socket_pair[1]);
     T_local_tracer_main(remote_port, wait_for_tracer, socket_pair[0],
-                        shm_file);
+                        T_cache);
     exit(0);
   }
   close(socket_pair[0]);
@@ -138,6 +153,7 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork)
     child2 = fork(); if (child2 == -1) abort();
     if (child2 != 0) {
       close(socket_pair[1]);
+      munmap(T_cache, T_CACHE_SIZE * sizeof(T_cache_t));
       monitor_and_kill(child1, child2);
     }
   }
@@ -148,34 +164,29 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork)
 
   T_socket = s;
 
-  /* setup shared memory */
-  T_shm_fd = shm_open(shm_file, O_RDWR /*| O_SYNC*/, 0666);
-  shm_unlink(shm_file);
-  if (T_shm_fd == -1) { perror(shm_file); abort(); }
-  T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t),
-                 PROT_READ | PROT_WRITE, MAP_SHARED, T_shm_fd, 0);
-  if (T_cache == MAP_FAILED)
-    { perror(shm_file); abort(); }
-  close(T_shm_fd);
-
   new_thread(T_receive_thread, NULL);
 }
 
 void T_Config_Init(void)
 {
-int T_port;            /* by default we wait for the tracer */
-int T_nowait;	      /* default port to listen to to wait for the tracer */
-int T_dont_fork;       /* default is to fork, see 'T_init' to understand */
+  int T_port;         /* by default we wait for the tracer */
+  int T_nowait;       /* default port to listen to to wait for the tracer */
+  int T_dont_fork;    /* default is to fork, see 'T_init' to understand */
 
-paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC ;
+  paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC;
 
-/* for a cleaner config file, TTracer params should be defined in a specific section... */
-  config_get( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),TTRACER_CONFIG_PREFIX);
+  /* for a cleaner config file, TTracer params should be defined in a
+   * specific section...
+   */
+  config_get(ttraceparams,
+             sizeof(ttraceparams) / sizeof(paramdef_t),
+             TTRACER_CONFIG_PREFIX);
 
-/* compatibility: look for TTracer command line options in root section */
-  config_process_cmdline( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),NULL);
+  /* compatibility: look for TTracer command line options in root section */
+  config_process_cmdline(ttraceparams,
+                         sizeof(ttraceparams) / sizeof(paramdef_t),
+                         NULL);
 
-  if (T_stdout == 0) {
+  if (T_stdout == 0)
     T_init(T_port, 1-T_nowait, T_dont_fork);
-  }
 }
diff --git a/common/utils/T/T.h b/common/utils/T/T.h
index 755f5d4e3981fa0424a3a89436e343c6b7c83adc..18e4a590d9444d12257d5207b4e00446d2811f6b 100644
--- a/common/utils/T/T.h
+++ b/common/utils/T/T.h
@@ -112,13 +112,37 @@ extern volatile int *T_freelist_head;
 extern T_cache_t *T_cache;
 extern int *T_active;
 /* When running the basic simulator, we may fill the T cache too fast.
- * Let's not crash if it's full, just wait.
+ * Let's serialize write accesses to the T cache. For that, we use a
+ * 'ticket' mechanism. To acquire a T slot the caller needs to own the
+ * current active ticket. We also wait for the slot to be free if
+ * it is already in use.
  */
 #if BASIC_SIMULATOR
-#  define T_BASIC_SIMULATOR_WAIT \
-     while (T_cache[T_LOCAL_slot].busy) usleep(100)
+#  define T_GET_SLOT \
+     do { \
+       extern volatile uint64_t T_next_id; \
+       extern volatile uint64_t T_active_id; \
+       uint64_t id; \
+       /* get a ticket */ \
+       id = __sync_fetch_and_add(&T_next_id, 1); \
+       /* wait for our turn */ \
+       while (id != __sync_fetch_and_add(&T_active_id, 0)) /* busy wait */; \
+       /* this is our turn, try to acquire the slot until it's free */ \
+       do { \
+         T_LOCAL_busy = __sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x01); \
+         if (T_LOCAL_busy & 0x01) usleep(100); \
+       } while (T_LOCAL_busy & 0x01); \
+       /* check that there are still some tickets */ \
+       if (__sync_fetch_and_add(&T_active_id, 0) == 0xffffffffffffffff) { \
+         printf("T: reached the end of times, bye...\n"); \
+         abort(); \
+       } \
+       /* free our ticket, which signals the next waiter that it's its turn */ \
+       (void)__sync_fetch_and_add(&T_active_id, 1); \
+     } while (0)
 #else
-#  define T_BASIC_SIMULATOR_WAIT /* */
+#  define T_GET_SLOT \
+     T_LOCAL_busy = __sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x01);
 #endif
 
 /* used at header of Tn, allocates buffer */
@@ -126,11 +150,12 @@ extern int *T_active;
   char *T_LOCAL_buf; \
   int T_LOCAL_size = 0; \
   int T_LOCAL_slot; \
+  int T_LOCAL_busy; \
   T_LOCAL_slot = __sync_fetch_and_add(T_freelist_head, 1) \
                  & (T_CACHE_SIZE - 1); \
   (void)__sync_fetch_and_and(T_freelist_head, T_CACHE_SIZE - 1); \
-  T_BASIC_SIMULATOR_WAIT; \
-  if (T_cache[T_LOCAL_slot].busy) { \
+  T_GET_SLOT; \
+  if (T_LOCAL_busy & 0x01) { \
     printf("%s:%d:%s: T cache is full - consider increasing its size\n", \
            __FILE__, __LINE__, __FUNCTION__); \
     abort(); \
@@ -142,7 +167,7 @@ extern int *T_active;
 #define T_COMMIT() \
   T_cache[T_LOCAL_slot].length = T_LOCAL_size; \
   __sync_synchronize(); \
-  T_cache[T_LOCAL_slot].busy = 1; \
+  (void)__sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x02);
 
 #define T_CHECK_SIZE(len, argnum) \
   if (T_LOCAL_size + (len) > T_BUFFER_MAX) { \
@@ -578,10 +603,10 @@ extern int *T_active;
 /*   optname                     helpstr                paramflags           XXXptr           defXXXval         type       numelt           */
 /*------------------------------------------------------------------------------------------------------------------------------------------*/
 #define CMDLINE_TTRACEPARAMS_DESC {  \
-{"T_port",                     CONFIG_HLP_TPORT,      0,		iptr:&T_port,	     defintval:2021,	TYPE_INT,   0},	   \
-{"T_nowait",                   CONFIG_HLP_NOTWAIT,    PARAMFLAG_BOOL,	iptr:&T_nowait,      defintval:0,	TYPE_INT,   0},	   \
-{"T_dont_fork",                CONFIG_HLP_TNOFORK,    PARAMFLAG_BOOL,	iptr:&T_dont_fork,   defintval:0,	TYPE_INT,   0},	   \
-{"T_stdout",                   CONFIG_HLP_STDOUT,     PARAMFLAG_BOOL,	iptr:&T_stdout,      defintval:1,	TYPE_INT,   0},	   \
+{"T_port",                     CONFIG_HLP_TPORT,      0,                iptr:&T_port,        defintval:2021,     TYPE_INT,   0},           \
+{"T_nowait",                   CONFIG_HLP_NOTWAIT,    PARAMFLAG_BOOL,   iptr:&T_nowait,      defintval:0,        TYPE_INT,   0},           \
+{"T_dont_fork",                CONFIG_HLP_TNOFORK,    PARAMFLAG_BOOL,   iptr:&T_dont_fork,   defintval:0,        TYPE_INT,   0},           \
+{"T_stdout",                   CONFIG_HLP_STDOUT,     PARAMFLAG_BOOL,   iptr:&T_stdout,      defintval:1,        TYPE_INT,   0},           \
 } 
 
 
diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h
index b0b9940c30b669832edfe1a817d1f56ebec3a096..83a380662d025fcc8056375667d0d1f0f752998d 100644
--- a/common/utils/T/T_defs.h
+++ b/common/utils/T/T_defs.h
@@ -31,13 +31,15 @@
 #endif
 
 typedef struct {
+  /* 'busy' is a bit field
+   * bit 0: 1 means that slot is acquired by writer
+   * bit 1: 1 means that slot is ready for consumption
+   */
   volatile int busy;
   char buffer[T_BUFFER_MAX];
   int length;
 } T_cache_t;
 
-#define T_SHM_FILENAME "/T_shm_segment"
-
 /* number of VCD functions (to be kept up to date! see in T_messages.txt) */
 #define VCD_NUM_FUNCTIONS 190
 
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index fd4425063b66a9d60f411e4a10560b5825caedce..676f329a0eb08fc4c2fb8e4efb2c69345e671f0e 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -749,6 +749,7 @@ ID = LEGACY_OSA_TRACE
     DESC = OSA legacy logs - trace level
     GROUP = ALL:LEGACY_OSA:LEGACY_GROUP_TRACE:LEGACY
     FORMAT = string,log
+
 ID = LEGACY_SIM_INFO
     DESC = SIM legacy logs - info level
     GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_INFO:LEGACY
@@ -769,6 +770,7 @@ ID = LEGACY_SIM_TRACE
     DESC = SIM legacy logs - trace level
     GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_TRACE:LEGACY
     FORMAT = string,log
+
 # this is a bad hack but I won't fix (function util_print_hex_octets
 # in openairinterface5g/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c
 # does funky things with the LOG_x macros but we work on the C pre-processor
@@ -922,30 +924,9 @@ ID = buf_test
 #VCD variables and functions
 
 #be careful! this must be synchronized with the code!
-#also keep up to date VCD_NUM_VARIABLES and VCD_NUM_FUNCTIONS in T_defs.h
-
-#to synchronize: copy/paste from openair2/UTIL/LOG/vcd_signal_dumper.h
-#the variables and functions name, replace "SIGNAL_DUMPER_VARIABLES" by
-#"VARIABLE" and "SIGNAL_DUMPER_FUNCTIONS" by "FUNCTION" (check that
-#everything is fine! for example we have
-#VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG that has VARIABLE without S)
-#and then process with sed
-
-#to generate variables:
-#sed -e "s/  VCD_VARIABLE_\(.*\)/ID = VCD_VARIABLE_\1\n    DESC = VCD variable \1\n    GROUP = ALL:VCD:ENB\n    FORMAT = ulong,value/" < VCD >> T_messages.txt
-
-#to generate functions:
-#sed -e "s/  VCD_FUNCTION_\(.*\)/ID = VCD_FUNCTION_\1\n    DESC = VCD function \1\n    GROUP = ALL:VCD:ENB\n    FORMAT = int,value/" < VCD.functions >> T_messages.txt
-
-#you may want to manually edit groups for UE instead of eNB
-
-#then count functions and variables and update VCD_NUM_FUNCTIONS and
-#VCD_NUM_VARIABLES in T_defs.h
-
-#also verify that VCD_FIRST_FUNCTION and VCD_FIRST_VARIABLE are correct
-#in T_defs.h. They have to point to the first function and variable
-#as defined below. Note also that the order of the VCD functions
-#and variables must be the same as in the code.
+#also keep up to date VCD_NUM_VARIABLES, VCD_NUM_FUNCTIONS,
+#VCD_FIRST_FUNCTION and VCD_FIRST_VARIABLE in T_defs.h
+#to check that everything is correct you can run: make _check_vcd
 
 #variables
 
@@ -953,514 +934,642 @@ ID = VCD_VARIABLE_FRAME_NUMBER_TX0_ENB
     DESC = VCD variable FRAME_NUMBER_TX0_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX0_eNB
 ID = VCD_VARIABLE_FRAME_NUMBER_TX1_ENB
     DESC = VCD variable FRAME_NUMBER_TX1_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX1_eNB
 ID = VCD_VARIABLE_FRAME_NUMBER_RX0_ENB
     DESC = VCD variable FRAME_NUMBER_RX0_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX0_eNB
 ID = VCD_VARIABLE_FRAME_NUMBER_RX1_ENB
     DESC = VCD variable FRAME_NUMBER_RX1_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX1_eNB
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_ENB
     DESC = VCD variable SUBFRAME_NUMBER_TX0_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_TX0_eNB
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_ENB
     DESC = VCD variable SUBFRAME_NUMBER_TX1_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_TX1_eNB
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_ENB
     DESC = VCD variable SUBFRAME_NUMBER_RX0_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_RX0_eNB
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_ENB
     DESC = VCD variable SUBFRAME_NUMBER_RX1_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_RX1_eNB
 ID = VCD_VARIABLE_FRAME_NUMBER_TX0_RU
     DESC = VCD variable FRAME_NUMBER_TX0_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX0_RU
 ID = VCD_VARIABLE_FRAME_NUMBER_TX1_RU
     DESC = VCD variable FRAME_NUMBER_TX1_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX1_RU
 ID = VCD_VARIABLE_FRAME_NUMBER_RX0_RU
     DESC = VCD variable FRAME_NUMBER_RX0_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX0_RU
 ID = VCD_VARIABLE_FRAME_NUMBER_RX1_RU
     DESC = VCD variable FRAME_NUMBER_RX1_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX1_RU
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_RU
     DESC = VCD variable SUBFRAME_NUMBER_TX0_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_TX0_RU
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_RU
     DESC = VCD variable SUBFRAME_NUMBER_TX1_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_TX1_RU
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_RU
     DESC = VCD variable SUBFRAME_NUMBER_RX0_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_RX0_RU
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_RU
     DESC = VCD variable SUBFRAME_NUMBER_RX1_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_RX1_RU
 ID = VCD_VARIABLE_RUNTIME_TX_ENB
     DESC = VCD variable RUNTIME_TX_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = runtime_TX_eNB
 ID = VCD_VARIABLE_RUNTIME_RX_ENB
     DESC = VCD variable RUNTIME_RX_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = runtime_RX_eNB
 ID = VCD_VARIABLE_FRAME_NUMBER_TX0_UE
     DESC = VCD variable FRAME_NUMBER_TX0_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX0_UE
 ID = VCD_VARIABLE_FRAME_NUMBER_TX1_UE
     DESC = VCD variable FRAME_NUMBER_TX1_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX1_UE
 ID = VCD_VARIABLE_FRAME_NUMBER_RX0_UE
     DESC = VCD variable FRAME_NUMBER_RX0_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX0_UE
 ID = VCD_VARIABLE_FRAME_NUMBER_RX1_UE
     DESC = VCD variable FRAME_NUMBER_RX1_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX1_UE
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_UE
     DESC = VCD variable SUBFRAME_NUMBER_TX0_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_TX0_UE
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_UE
     DESC = VCD variable SUBFRAME_NUMBER_TX1_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_TX1_UE
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_UE
     DESC = VCD variable SUBFRAME_NUMBER_RX0_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_RX0_UE
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_UE
     DESC = VCD variable SUBFRAME_NUMBER_RX1_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_RX1_UE
 ID = VCD_VARIABLE_UE_RX_OFFSET
     DESC = VCD variable UE_RX_OFFSET
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue_rx_offset
 ID = VCD_VARIABLE_DIFF
     DESC = VCD variable DIFF
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = diff2
 ID = VCD_VARIABLE_HW_SUBFRAME
     DESC = VCD variable HW_SUBFRAME
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_subframe
 ID = VCD_VARIABLE_HW_FRAME
     DESC = VCD variable HW_FRAME
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_frame
 ID = VCD_VARIABLE_HW_SUBFRAME_RX
     DESC = VCD variable HW_SUBFRAME_RX
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_subframe_rx
 ID = VCD_VARIABLE_HW_FRAME_RX
     DESC = VCD variable HW_FRAME_RX
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_frame_rx
 ID = VCD_VARIABLE_TXCNT
     DESC = VCD variable TXCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = txcnt
 ID = VCD_VARIABLE_RXCNT
     DESC = VCD variable RXCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = rxcnt
 ID = VCD_VARIABLE_TRX_TS
     DESC = VCD variable TRX_TS
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = trx_ts
 ID = VCD_VARIABLE_TRX_TST
     DESC = VCD variable TRX_TST
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = trx_tst
 ID = VCD_VARIABLE_TRX_TS_UE
     DESC = VCD variable TRX_TS_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = trx_ts_ue
 ID = VCD_VARIABLE_TRX_TST_UE
     DESC = VCD variable TRX_TST_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = trx_tst_ue
 ID = VCD_VARIABLE_TRX_WRITE_FLAGS
     DESC = VCD variable TRX_WRITE_FLAGS
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = trx_write_flags
 ID = VCD_VARIABLE_TX_TS
     DESC = VCD variable TX_TS
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = tx_ts
 ID = VCD_VARIABLE_RX_TS
     DESC = VCD variable RX_TS
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = rx_ts
 ID = VCD_VARIABLE_RX_HWCNT
     DESC = VCD variable RX_HWCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_cnt_rx
 ID = VCD_VARIABLE_RX_LHWCNT
     DESC = VCD variable RX_LHWCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = lhw_cnt_rx
 ID = VCD_VARIABLE_TX_HWCNT
     DESC = VCD variable TX_HWCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_cnt_tx
 ID = VCD_VARIABLE_TX_LHWCNT
     DESC = VCD variable TX_LHWCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = lhw_cnt_tx
 ID = VCD_VARIABLE_RX_PCK
     DESC = VCD variable RX_PCK
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = pck_rx
 ID = VCD_VARIABLE_TX_PCK
     DESC = VCD variable TX_PCK
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = pck_tx
 ID = VCD_VARIABLE_RX_SEQ_NUM
     DESC = VCD variable RX_SEQ_NUM
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = rx_seq_num
 ID = VCD_VARIABLE_RX_SEQ_NUM_PRV
     DESC = VCD variable RX_SEQ_NUM_PRV
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = rx_seq_num_prv
 ID = VCD_VARIABLE_TX_SEQ_NUM
     DESC = VCD variable TX_SEQ_NUM
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = tx_seq_num
 ID = VCD_VARIABLE_CNT
     DESC = VCD variable CNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = cnt
 ID = VCD_VARIABLE_DUMMY_DUMP
     DESC = VCD variable DUMMY_DUMP
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = dummy_dump
 ID = VCD_VARIABLE_ITTI_SEND_MSG
     DESC = VCD variable ITTI_SEND_MSG
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = itti_send_msg
 ID = VCD_VARIABLE_ITTI_POLL_MSG
     DESC = VCD variable ITTI_POLL_MSG
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = itti_poll_msg
 ID = VCD_VARIABLE_ITTI_RECV_MSG
     DESC = VCD variable ITTI_RECV_MSG
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = itti_recv_msg
 ID = VCD_VARIABLE_ITTI_ALLOC_MSG
     DESC = VCD variable ITTI_ALLOC_MSG
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = itti_alloc_msg
 ID = VCD_VARIABLE_MP_ALLOC
     DESC = VCD variable MP_ALLOC
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = mp_alloc
 ID = VCD_VARIABLE_MP_FREE
     DESC = VCD variable MP_FREE
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = mp_free
 ID = VCD_VARIABLE_UE_INST_CNT_RX
     DESC = VCD variable UE_INST_CNT_RX
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue_inst_cnt_rx
 ID = VCD_VARIABLE_UE_INST_CNT_TX
     DESC = VCD variable UE_INST_CNT_TX
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue_inst_cnt_tx
 ID = VCD_VARIABLE_DCI_INFO
     DESC = VCD variable DCI_INFO
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = dci_info
 ID = VCD_VARIABLE_UE0_BSR
     DESC = VCD variable UE0_BSR
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_BSR
 ID = VCD_VARIABLE_UE0_BO
     DESC = VCD variable UE0_BO
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_BO
 ID = VCD_VARIABLE_UE0_SCHEDULED
     DESC = VCD variable UE0_SCHEDULED
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_scheduled
 ID = VCD_VARIABLE_UE0_TIMING_ADVANCE
     DESC = VCD variable UE0_TIMING_ADVANCE
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_timing_advance
 ID = VCD_VARIABLE_UE0_SR_ENERGY
     DESC = VCD variable UE0_SR_ENERGY
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SR_ENERGY
 ID = VCD_VARIABLE_UE0_SR_THRES
     DESC = VCD variable UE0_SR_THRES
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SR_THRES
 ID = VCD_VARIABLE_UE0_RSSI0
     DESC = VCD variable UE0_RSSI0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi0
 ID = VCD_VARIABLE_UE0_RSSI1
     DESC = VCD variable UE0_RSSI1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi1
 ID = VCD_VARIABLE_UE0_RSSI2
     DESC = VCD variable UE0_RSSI2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi2
 ID = VCD_VARIABLE_UE0_RSSI3
     DESC = VCD variable UE0_RSSI3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi3
 ID = VCD_VARIABLE_UE0_RSSI4
     DESC = VCD variable UE0_RSSI4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi4
 ID = VCD_VARIABLE_UE0_RSSI5
     DESC = VCD variable UE0_RSSI5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi5
 ID = VCD_VARIABLE_UE0_RSSI6
     DESC = VCD variable UE0_RSSI6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi6
 ID = VCD_VARIABLE_UE0_RSSI7
     DESC = VCD variable UE0_RSSI7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi7
 ID = VCD_VARIABLE_UE0_RES0
     DESC = VCD variable UE0_RES0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res0
 ID = VCD_VARIABLE_UE0_RES1
     DESC = VCD variable UE0_RES1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res1
 ID = VCD_VARIABLE_UE0_RES2
     DESC = VCD variable UE0_RES2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res2
 ID = VCD_VARIABLE_UE0_RES3
     DESC = VCD variable UE0_RES3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res3
 ID = VCD_VARIABLE_UE0_RES4
     DESC = VCD variable UE0_RES4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res4
 ID = VCD_VARIABLE_UE0_RES5
     DESC = VCD variable UE0_RES5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res5
 ID = VCD_VARIABLE_UE0_RES6
     DESC = VCD variable UE0_RES6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res6
 ID = VCD_VARIABLE_UE0_RES7
     DESC = VCD variable UE0_RES7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res7
 ID = VCD_VARIABLE_UE0_MCS0
     DESC = VCD variable UE0_MCS0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS0
 ID = VCD_VARIABLE_UE0_MCS1
     DESC = VCD variable UE0_MCS1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS1
 ID = VCD_VARIABLE_UE0_MCS2
     DESC = VCD variable UE0_MCS2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS2
 ID = VCD_VARIABLE_UE0_MCS3
     DESC = VCD variable UE0_MCS3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS3
 ID = VCD_VARIABLE_UE0_MCS4
     DESC = VCD variable UE0_MCS4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS4
 ID = VCD_VARIABLE_UE0_MCS5
     DESC = VCD variable UE0_MCS5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS5
 ID = VCD_VARIABLE_UE0_MCS6
     DESC = VCD variable UE0_MCS6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS6
 ID = VCD_VARIABLE_UE0_MCS7
     DESC = VCD variable UE0_MCS7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS7
 ID = VCD_VARIABLE_UE0_RB0
     DESC = VCD variable UE0_RB0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB0
 ID = VCD_VARIABLE_UE0_RB1
     DESC = VCD variable UE0_RB1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB1
 ID = VCD_VARIABLE_UE0_RB2
     DESC = VCD variable UE0_RB2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB2
 ID = VCD_VARIABLE_UE0_RB3
     DESC = VCD variable UE0_RB3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB3
 ID = VCD_VARIABLE_UE0_RB4
     DESC = VCD variable UE0_RB4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB4
 ID = VCD_VARIABLE_UE0_RB5
     DESC = VCD variable UE0_RB5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB5
 ID = VCD_VARIABLE_UE0_RB6
     DESC = VCD variable UE0_RB6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB6
 ID = VCD_VARIABLE_UE0_RB7
     DESC = VCD variable UE0_RB7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB7
 ID = VCD_VARIABLE_UE0_ROUND0
     DESC = VCD variable UE0_ROUND0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND0
 ID = VCD_VARIABLE_UE0_ROUND1
     DESC = VCD variable UE0_ROUND1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND1
 ID = VCD_VARIABLE_UE0_ROUND2
     DESC = VCD variable UE0_ROUND2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND2
 ID = VCD_VARIABLE_UE0_ROUND3
     DESC = VCD variable UE0_ROUND3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND3
 ID = VCD_VARIABLE_UE0_ROUND4
     DESC = VCD variable UE0_ROUND4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND4
 ID = VCD_VARIABLE_UE0_ROUND5
     DESC = VCD variable UE0_ROUND5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND5
 ID = VCD_VARIABLE_UE0_ROUND6
     DESC = VCD variable UE0_ROUND6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND6
 ID = VCD_VARIABLE_UE0_ROUND7
     DESC = VCD variable UE0_ROUND7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND7
 ID = VCD_VARIABLE_UE0_SFN0
     DESC = VCD variable UE0_SFN0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN0
 ID = VCD_VARIABLE_UE0_SFN1
     DESC = VCD variable UE0_SFN1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN1
 ID = VCD_VARIABLE_UE0_SFN2
     DESC = VCD variable UE0_SFN2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN2
 ID = VCD_VARIABLE_UE0_SFN3
     DESC = VCD variable UE0_SFN3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN3
 ID = VCD_VARIABLE_UE0_SFN4
     DESC = VCD variable UE0_SFN4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN4
 ID = VCD_VARIABLE_UE0_SFN5
     DESC = VCD variable UE0_SFN5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN5
 ID = VCD_VARIABLE_UE0_SFN6
     DESC = VCD variable UE0_SFN6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN6
 ID = VCD_VARIABLE_UE0_SFN7
     DESC = VCD variable UE0_SFN7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN7
 ID = VCD_VARIABLE_SEND_IF4_SYMBOL
     DESC = VCD variable SEND_IF4_SYMBOL
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = send_if4_symbol
 ID = VCD_VARIABLE_RECV_IF4_SYMBOL
     DESC = VCD variable RECV_IF4_SYMBOL
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = recv_if4_symbol
 ID = VCD_VARIABLE_SEND_IF5_PKT_ID
     DESC = VCD variable SEND_IF5_PKT_ID
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = send_if5_pkt_id
 ID = VCD_VARIABLE_RECV_IF5_PKT_ID
     DESC = VCD variable RECV_IF5_PKT_ID
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = recv_if5_pkt_id
 ID = VCD_VARIABLE_UE_PDCP_FLUSH_SIZE
     DESC = VCD variable UE_PDCP_FLUSH_SIZE
     GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue_pdcp_flush_size
 ID = VCD_VARIABLE_UE_PDCP_FLUSH_ERR
     DESC = VCD variable UE_PDCP_FLUSH_ERR
     GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue_pdcp_flush_err
 ID = VCD_VARIABLE_UE0_TRX_READ_NS
     DESC = VCD variable UE0_TRX_READ_NS
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_trx_read_ns
 ID = VCD_VARIABLE_UE0_TRX_WRITE_NS
     DESC = VCD variable UE0_TRX_WRITE_NS
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_trx_write_ns
 ID = VCD_VARIABLE_UE0_TRX_READ_NS_MISSING
     DESC = VCD variable UE0_TRX_READ_NS_MISSING
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_trx_read_ns_missing
 ID = VCD_VARIABLE_UE0_TRX_WRITE_NS_MISSING
     DESC = VCD variable UE0_TRX_WRITE_NS_MISSING
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_trx_write_ns_missing
 ID = VCD_VARIABLE_CPUID_ENB_THREAD_RXTX
     DESC = VCD variable CPUID_ENB_THREAD_RXTX
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = enb_thread_rxtx_CPUID
 ID = VCD_VARIABLE_CPUID_RU_THREAD
     DESC = VCD variable CPUID_RU_THREAD
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ru_thread_CPUID
 ID = VCD_VARIABLE_CPUID_RU_THREAD_TX
     DESC = VCD variable CPUID_RU_THREAD_TX
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ru_thread_tx_CPUID
 
 #functions
 
@@ -1468,763 +1577,954 @@ ID = VCD_FUNCTION_RT_SLEEP
     DESC = VCD function RT_SLEEP
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rt_sleep
 ID = VCD_FUNCTION_TRX_READ
     DESC = VCD function TRX_READ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_read
 ID = VCD_FUNCTION_TRX_WRITE
     DESC = VCD function TRX_WRITE
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_write
 ID = VCD_FUNCTION_TRX_READ_UE
     DESC = VCD function TRX_READ_UE
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_read_ue
 ID = VCD_FUNCTION_TRX_WRITE_UE
     DESC = VCD function TRX_WRITE_UE
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_write_ue
 ID = VCD_FUNCTION_TRX_READ_IF
     DESC = VCD function TRX_READ_IF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_read_if
 ID = VCD_FUNCTION_TRX_WRITE_IF
     DESC = VCD function TRX_WRITE_IF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_write_if
 ID = VCD_FUNCTION_eNB_PROC_RXTX0
     DESC = VCD function eNB_PROC_RXTX0
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_thread_rxtx0
 ID = VCD_FUNCTION_eNB_PROC_RXTX1
     DESC = VCD function eNB_PROC_RXTX1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_thread_rxtx1
 ID = VCD_FUNCTION_UE_THREAD_SYNCH
     DESC = VCD function UE_THREAD_SYNCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_thread_synch
 ID = VCD_FUNCTION_UE_THREAD_RXTX0
     DESC = VCD function UE_THREAD_RXTX0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_thread_rxtx0
 ID = VCD_FUNCTION_UE_THREAD_RXTX1
     DESC = VCD function UE_THREAD_RXTX1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_thread_rxtx1
 ID = VCD_FUNCTION_TRX_READ_SF9
     DESC = VCD function TRX_READ_SF9
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_read_sf9
 ID = VCD_FUNCTION_TRX_WRITE_SF9
     DESC = VCD function TRX_WRITE_SF9
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_write_sf9
 ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX0
     DESC = VCD function UE_SIGNAL_COND_RXTX0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_signal_cond_rxtx0
 ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX1
     DESC = VCD function UE_SIGNAL_COND_RXTX1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_signal_cond_rxtx1
 ID = VCD_FUNCTION_UE_WAIT_COND_RXTX0
     DESC = VCD function UE_WAIT_COND_RXTX0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_wait_cond_rxtx0
 ID = VCD_FUNCTION_UE_WAIT_COND_RXTX1
     DESC = VCD function UE_WAIT_COND_RXTX1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_wait_cond_rxtx1
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cond_wait0
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cond_wait1
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cnt_decrement0
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cnt_decrement1
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cnt_increment0
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cnt_increment1
 ID = VCD_FUNCTION_SIM_DO_DL_SIGNAL
     DESC = VCD function SIM_DO_DL_SIGNAL
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = do_DL_sig
 ID = VCD_FUNCTION_SIM_DO_UL_SIGNAL
     DESC = VCD function SIM_DO_UL_SIGNAL
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = do_UL_sig
 ID = VCD_FUNCTION_SIM_UE_TRX_READ
     DESC = VCD function SIM_UE_TRX_READ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = UE_trx_read
 ID = VCD_FUNCTION_eNB_TX
     DESC = VCD function eNB_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_tx
 ID = VCD_FUNCTION_eNB_RX
     DESC = VCD function eNB_RX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_rx
 ID = VCD_FUNCTION_eNB_TRX
     DESC = VCD function eNB_TRX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_trx
 ID = VCD_FUNCTION_eNB_TM
     DESC = VCD function eNB_TM
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_tm
 ID = VCD_FUNCTION_eNB_RX_SLEEP
     DESC = VCD function eNB_RX_SLEEP
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_rx_sleep
 ID = VCD_FUNCTION_eNB_TX_SLEEP
     DESC = VCD function eNB_TX_SLEEP
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_tx_sleep
 ID = VCD_FUNCTION_eNB_PROC_SLEEP
     DESC = VCD function eNB_PROC_SLEEP
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_proc_sleep
 ID = VCD_FUNCTION_TRX_READ_RF
     DESC = VCD function TRX_READ_RF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_read_rf
 ID = VCD_FUNCTION_TRX_WRITE_RF
     DESC = VCD function TRX_WRITE_RF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_write_rf
 ID = VCD_FUNCTION_UE_SYNCH
     DESC = VCD function UE_SYNCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_synch
 ID = VCD_FUNCTION_UE_SLOT_FEP
     DESC = VCD function UE_SLOT_FEP
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_slot_fep
 ID = VCD_FUNCTION_UE_RRC_MEASUREMENTS
     DESC = VCD function UE_RRC_MEASUREMENTS
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_rrc_measurements
 ID = VCD_FUNCTION_UE_GAIN_CONTROL
     DESC = VCD function UE_GAIN_CONTROL
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_gain_control
 ID = VCD_FUNCTION_UE_ADJUST_SYNCH
     DESC = VCD function UE_ADJUST_SYNCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_adjust_synch
 ID = VCD_FUNCTION_UE_MEASUREMENT_PROCEDURES
     DESC = VCD function UE_MEASUREMENT_PROCEDURES
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = lte_ue_measurement_procedures
 ID = VCD_FUNCTION_UE_PDCCH_PROCEDURES
     DESC = VCD function UE_PDCCH_PROCEDURES
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = lte_ue_pdcch_procedures
 ID = VCD_FUNCTION_UE_PBCH_PROCEDURES
     DESC = VCD function UE_PBCH_PROCEDURES
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = lte_ue_pbch_procedures
 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX
     DESC = VCD function PHY_PROCEDURES_ENB_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_eNb_tx0
 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX1
     DESC = VCD function PHY_PROCEDURES_ENB_TX1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_eNb_tx1
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX
     DESC = VCD function PHY_PROCEDURES_RU_FEPRX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feprx0
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX1
     DESC = VCD function PHY_PROCEDURES_RU_FEPRX1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feprx1
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM
     DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feptx_ofdm0
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM1
     DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feptx_ofdm1
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC
     DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feptx_prec0
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC1
     DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feptx_prec1
 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC
     DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_eNb_rx_uespec0
 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC1
     DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_eNb_rx_uespec1
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX
     DESC = VCD function PHY_PROCEDURES_UE_TX
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_RX
     DESC = VCD function PHY_PROCEDURES_UE_RX
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_rx
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC
     DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_UESPEC
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx_ulsch_uespec
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PUCCH
     DESC = VCD function PHY_PROCEDURES_UE_TX_PUCCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx_pucch
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_COMMON
     DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_COMMON
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx_ulsch_common
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PRACH
     DESC = VCD function PHY_PROCEDURES_UE_TX_PRACH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx_prach
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_RAR
     DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_RAR
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx_ulsch_rar
 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_LTE
     DESC = VCD function PHY_PROCEDURES_ENB_LTE
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_eNB_lte
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_LTE
     DESC = VCD function PHY_PROCEDURES_UE_LTE
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_UE_lte
 ID = VCD_FUNCTION_PDSCH_THREAD
     DESC = VCD function PDSCH_THREAD
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdsch_thread
 ID = VCD_FUNCTION_DLSCH_THREAD0
     DESC = VCD function DLSCH_THREAD0
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread0
 ID = VCD_FUNCTION_DLSCH_THREAD1
     DESC = VCD function DLSCH_THREAD1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread1
 ID = VCD_FUNCTION_DLSCH_THREAD2
     DESC = VCD function DLSCH_THREAD2
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread2
 ID = VCD_FUNCTION_DLSCH_THREAD3
     DESC = VCD function DLSCH_THREAD3
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread3
 ID = VCD_FUNCTION_DLSCH_THREAD4
     DESC = VCD function DLSCH_THREAD4
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread4
 ID = VCD_FUNCTION_DLSCH_THREAD5
     DESC = VCD function DLSCH_THREAD5
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread5
 ID = VCD_FUNCTION_DLSCH_THREAD6
     DESC = VCD function DLSCH_THREAD6
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread6
 ID = VCD_FUNCTION_DLSCH_THREAD7
     DESC = VCD function DLSCH_THREAD7
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread7
 ID = VCD_FUNCTION_DLSCH_DECODING0
     DESC = VCD function DLSCH_DECODING0
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding0
 ID = VCD_FUNCTION_DLSCH_DECODING1
     DESC = VCD function DLSCH_DECODING1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding1
 ID = VCD_FUNCTION_DLSCH_DECODING2
     DESC = VCD function DLSCH_DECODING2
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding2
 ID = VCD_FUNCTION_DLSCH_DECODING3
     DESC = VCD function DLSCH_DECODING3
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding3
 ID = VCD_FUNCTION_DLSCH_DECODING4
     DESC = VCD function DLSCH_DECODING4
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding4
 ID = VCD_FUNCTION_DLSCH_DECODING5
     DESC = VCD function DLSCH_DECODING5
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding5
 ID = VCD_FUNCTION_DLSCH_DECODING6
     DESC = VCD function DLSCH_DECODING6
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding6
 ID = VCD_FUNCTION_DLSCH_DECODING7
     DESC = VCD function DLSCH_DECODING7
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding7
 ID = VCD_FUNCTION_RX_PDCCH
     DESC = VCD function RX_PDCCH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rx_pdcch
 ID = VCD_FUNCTION_DCI_DECODING
     DESC = VCD function DCI_DECODING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dci_decoding
 ID = VCD_FUNCTION_RX_PHICH
     DESC = VCD function RX_PHICH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rx_phich
 ID = VCD_FUNCTION_PDSCH_PROC
     DESC = VCD function PDSCH_PROC
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdsch_procedures
 ID = VCD_FUNCTION_PDSCH_PROC_SI
     DESC = VCD function PDSCH_PROC_SI
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdsch_procedures_si
 ID = VCD_FUNCTION_PDSCH_PROC_P
     DESC = VCD function PDSCH_PROC_P
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdsch_procedures_p
 ID = VCD_FUNCTION_PDSCH_PROC_RA
     DESC = VCD function PDSCH_PROC_RA
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdsch_procedures_ra
 ID = VCD_FUNCTION_PHY_UE_CONFIG_SIB2
     DESC = VCD function PHY_UE_CONFIG_SIB2
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_config_sib2
 ID = VCD_FUNCTION_PHY_CONFIG_SIB1_ENB
     DESC = VCD function PHY_CONFIG_SIB1_ENB
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_phy_config_sib1_eNB
 ID = VCD_FUNCTION_PHY_CONFIG_SIB2_ENB
     DESC = VCD function PHY_CONFIG_SIB2_ENB
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_phy_config_sib2_eNB
 ID = VCD_FUNCTION_PHY_CONFIG_DEDICATED_ENB
     DESC = VCD function PHY_CONFIG_DEDICATED_ENB
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_phy_config_dedicated_eNB
 ID = VCD_FUNCTION_PHY_UE_COMPUTE_PRACH
     DESC = VCD function PHY_UE_COMPUTE_PRACH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_compute_prach
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_MSG3
     DESC = VCD function PHY_ENB_ULSCH_MSG3
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_msg3
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING0
     DESC = VCD function PHY_ENB_ULSCH_DECODING0
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding0
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING1
     DESC = VCD function PHY_ENB_ULSCH_DECODING1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding1
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING2
     DESC = VCD function PHY_ENB_ULSCH_DECODING2
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding2
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING3
     DESC = VCD function PHY_ENB_ULSCH_DECODING3
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding3
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING4
     DESC = VCD function PHY_ENB_ULSCH_DECODING4
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding4
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING5
     DESC = VCD function PHY_ENB_ULSCH_DECODING5
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding5
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING6
     DESC = VCD function PHY_ENB_ULSCH_DECODING6
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding6
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING7
     DESC = VCD function PHY_ENB_ULSCH_DECODING7
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding7
 ID = VCD_FUNCTION_PHY_ENB_SFGEN
     DESC = VCD function PHY_ENB_SFGEN
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_sfgen
 ID = VCD_FUNCTION_PHY_ENB_PRACH_RX
     DESC = VCD function PHY_ENB_PRACH_RX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_prach_rx
 ID = VCD_FUNCTION_PHY_RU_PRACH_RX
     DESC = VCD function PHY_RU_PRACH_RX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ru_prach_rx
 ID = VCD_FUNCTION_PHY_ENB_PDCCH_TX
     DESC = VCD function PHY_ENB_PDCCH_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_pdcch_tx
 ID = VCD_FUNCTION_PHY_ENB_RS_TX
     DESC = VCD function PHY_ENB_RS_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_rs_tx
 ID = VCD_FUNCTION_UE_GENERATE_PRACH
     DESC = VCD function UE_GENERATE_PRACH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_generate_prach
 ID = VCD_FUNCTION_UE_ULSCH_MODULATION
     DESC = VCD function UE_ULSCH_MODULATION
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_ulsch_modulation
 ID = VCD_FUNCTION_UE_ULSCH_ENCODING
     DESC = VCD function UE_ULSCH_ENCODING
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_ulsch_encoding
 ID = VCD_FUNCTION_UE_ULSCH_ENCODING_FILL_CQI
     DESC = VCD function UE_ULSCH_ENCODING_FILL_CQI
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_ulsch_encoding_fill_cqi
 ID = VCD_FUNCTION_UE_ULSCH_SCRAMBLING
     DESC = VCD function UE_ULSCH_SCRAMBLING
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_ulsch_scrambling
 ID = VCD_FUNCTION_ENB_DLSCH_MODULATION
     DESC = VCD function ENB_DLSCH_MODULATION
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_dlsch_modulation
 ID = VCD_FUNCTION_ENB_DLSCH_ENCODING
     DESC = VCD function ENB_DLSCH_ENCODING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_dlsch_encoding
 ID = VCD_FUNCTION_ENB_DLSCH_ENCODING_W
     DESC = VCD function ENB_DLSCH_ENCODING_W
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_dlsch_encoding_w
 ID = VCD_FUNCTION_ENB_DLSCH_SCRAMBLING
     DESC = VCD function ENB_DLSCH_SCRAMBLING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_dlsch_scrambling
 ID = VCD_FUNCTION_ENB_BEAM_PRECODING
     DESC = VCD function ENB_BEAM_PRECODING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_beam_precoding
 ID = VCD_FUNCTION_ENB_OFDM_MODULATION
     DESC = VCD function ENB_OFDM_MODULATION
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_ofdm_mod_l
 ID = VCD_FUNCTION_MACPHY_INIT
     DESC = VCD function MACPHY_INIT
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_macphy_init
 ID = VCD_FUNCTION_MACPHY_EXIT
     DESC = VCD function MACPHY_EXIT
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_macphy_exit
 ID = VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER
     DESC = VCD function ENB_DLSCH_ULSCH_SCHEDULER
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_eNB_dlsch_ulsch_scheduler
 ID = VCD_FUNCTION_FILL_RAR
     DESC = VCD function FILL_RAR
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_fill_rar
 ID = VCD_FUNCTION_TERMINATE_RA_PROC
     DESC = VCD function TERMINATE_RA_PROC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_terminate_ra_proc
 ID = VCD_FUNCTION_INITIATE_RA_PROC
     DESC = VCD function INITIATE_RA_PROC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_initiate_ra_proc
 ID = VCD_FUNCTION_CANCEL_RA_PROC
     DESC = VCD function CANCEL_RA_PROC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_cancel_ra_proc
 ID = VCD_FUNCTION_GET_DCI_SDU
     DESC = VCD function GET_DCI_SDU
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_get_dci_sdu
 ID = VCD_FUNCTION_GET_DLSCH_SDU
     DESC = VCD function GET_DLSCH_SDU
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_get_dlsch_sdu
 ID = VCD_FUNCTION_RX_SDU
     DESC = VCD function RX_SDU
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_rx_sdu
 ID = VCD_FUNCTION_MRBCH_PHY_SYNC_FAILURE
     DESC = VCD function MRBCH_PHY_SYNC_FAILURE
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_mrbch_phy_sync_failure
 ID = VCD_FUNCTION_SR_INDICATION
     DESC = VCD function SR_INDICATION
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_SR_indication
 ID = VCD_FUNCTION_DLSCH_PREPROCESSOR
     DESC = VCD function DLSCH_PREPROCESSOR
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_dlsch_preprocessor
 ID = VCD_FUNCTION_SCHEDULE_DLSCH
     DESC = VCD function SCHEDULE_DLSCH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_schedule_dlsch
 ID = VCD_FUNCTION_FILL_DLSCH_DCI
     DESC = VCD function FILL_DLSCH_DCI
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_fill_dlsch_dci
 ID = VCD_FUNCTION_OUT_OF_SYNC_IND
     DESC = VCD function OUT_OF_SYNC_IND
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_out_of_sync_ind
 ID = VCD_FUNCTION_UE_DECODE_SI
     DESC = VCD function UE_DECODE_SI
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_decode_si
 ID = VCD_FUNCTION_UE_DECODE_PCCH
     DESC = VCD function UE_DECODE_PCCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_decode_pcch
 ID = VCD_FUNCTION_UE_DECODE_CCCH
     DESC = VCD function UE_DECODE_CCCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_decode_ccch
 ID = VCD_FUNCTION_UE_DECODE_BCCH
     DESC = VCD function UE_DECODE_BCCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_decode_bcch
 ID = VCD_FUNCTION_UE_SEND_SDU
     DESC = VCD function UE_SEND_SDU
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_send_sdu
 ID = VCD_FUNCTION_UE_GET_SDU
     DESC = VCD function UE_GET_SDU
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_get_sdu
 ID = VCD_FUNCTION_UE_GET_RACH
     DESC = VCD function UE_GET_RACH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_get_rach
 ID = VCD_FUNCTION_UE_PROCESS_RAR
     DESC = VCD function UE_PROCESS_RAR
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_process_rar
 ID = VCD_FUNCTION_UE_SCHEDULER
     DESC = VCD function UE_SCHEDULER
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_scheduler
 ID = VCD_FUNCTION_UE_GET_SR
     DESC = VCD function UE_GET_SR
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_get_sr
 ID = VCD_FUNCTION_UE_SEND_MCH_SDU
     DESC = VCD function UE_SEND_MCH_SDU
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_send_mch_sdu
 ID = VCD_FUNCTION_RLC_DATA_REQ
     DESC = VCD function RLC_DATA_REQ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rlc_data_req
 #ID = VCD_FUNCTION_RLC_DATA_IND
 #    DESC = VCD function RLC_DATA_IND
 #    GROUP = ALL:VCD:ENB:VCD_FUNCTION
 #    FORMAT = int,value
+#    VCD_NAME = rlc_data_ind
 ID = VCD_FUNCTION_MAC_RLC_STATUS_IND
     DESC = VCD function MAC_RLC_STATUS_IND
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_rlc_status_ind
 ID = VCD_FUNCTION_MAC_RLC_DATA_REQ
     DESC = VCD function MAC_RLC_DATA_REQ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_rlc_data_req
 ID = VCD_FUNCTION_MAC_RLC_DATA_IND
     DESC = VCD function MAC_RLC_DATA_IND
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_rlc_data_ind
 ID = VCD_FUNCTION_RLC_UM_TRY_REASSEMBLY
     DESC = VCD function RLC_UM_TRY_REASSEMBLY
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rlc_um_try_reassembly
 ID = VCD_FUNCTION_RLC_UM_CHECK_TIMER_DAR_TIME_OUT
     DESC = VCD function RLC_UM_CHECK_TIMER_DAR_TIME_OUT
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rlc_um_check_timer_dar_time_out
 ID = VCD_FUNCTION_RLC_UM_RECEIVE_PROCESS_DAR
     DESC = VCD function RLC_UM_RECEIVE_PROCESS_DAR
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rlc_um_receive_process_dar
 ID = VCD_FUNCTION_PDCP_RUN
     DESC = VCD function PDCP_RUN
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_run
 ID = VCD_FUNCTION_PDCP_DATA_REQ
     DESC = VCD function PDCP_DATA_REQ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_data_req
 ID = VCD_FUNCTION_PDCP_DATA_IND
     DESC = VCD function PDCP_DATA_IND
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_data_ind
 ID = VCD_FUNCTION_PDCP_APPLY_SECURITY
     DESC = VCD function PDCP_APPLY_SECURITY
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_apply_security
 ID = VCD_FUNCTION_PDCP_VALIDATE_SECURITY
     DESC = VCD function PDCP_VALIDATE_SECURITY
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_validate_security
 ID = VCD_FUNCTION_PDCP_FIFO_READ
     DESC = VCD function PDCP_FIFO_READ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_fifo_read
 ID = VCD_FUNCTION_PDCP_FIFO_READ_BUFFER
     DESC = VCD function PDCP_FIFO_READ_BUFFER
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_fifo_read_buffer
 ID = VCD_FUNCTION_PDCP_FIFO_FLUSH
     DESC = VCD function PDCP_FIFO_FLUSH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_fifo_flush
 ID = VCD_FUNCTION_PDCP_FIFO_FLUSH_BUFFER
     DESC = VCD function PDCP_FIFO_FLUSH_BUFFER
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_fifo_flush_buffer
 ID = VCD_FUNCTION_RRC_RX_TX
     DESC = VCD function RRC_RX_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rrc_rx_tx
 ID = VCD_FUNCTION_RRC_MAC_CONFIG
     DESC = VCD function RRC_MAC_CONFIG
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rrc_mac_config_req
 ID = VCD_FUNCTION_RRC_UE_DECODE_SIB1
     DESC = VCD function RRC_UE_DECODE_SIB1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rrc_ue_decode_sib1
 ID = VCD_FUNCTION_RRC_UE_DECODE_SI
     DESC = VCD function RRC_UE_DECODE_SI
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rrc_ue_decode_si
 ID = VCD_FUNCTION_GTPV1U_ENB_TASK
     DESC = VCD function GTPV1U_ENB_TASK
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = gtpv1u_enb_task
 ID = VCD_FUNCTION_GTPV1U_PROCESS_UDP_REQ
     DESC = VCD function GTPV1U_PROCESS_UDP_REQ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = gtpv1u_process_udp_req
 ID = VCD_FUNCTION_GTPV1U_PROCESS_TUNNEL_DATA_REQ
     DESC = VCD function GTPV1U_PROCESS_TUNNEL_DATA_REQ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = gtpv1u_process_tunnel_data_req
 ID = VCD_FUNCTION_UDP_ENB_TASK
     DESC = VCD function UDP_ENB_TASK
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = udp_enb_task
 ID = VCD_FUNCTION_EMU_TRANSPORT
     DESC = VCD function EMU_TRANSPORT
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = emu_transport
 ID = VCD_FUNCTION_LOG_RECORD
     DESC = VCD function LOG_RECORD
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = log_record
 ID = VCD_FUNCTION_ITTI_ENQUEUE_MESSAGE
     DESC = VCD function ITTI_ENQUEUE_MESSAGE
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = itti_enqueue_message
 ID = VCD_FUNCTION_ITTI_DUMP_ENQUEUE_MESSAGE
     DESC = VCD function ITTI_DUMP_ENQUEUE_MESSAGE
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = itti_dump_enqueue_message
 ID = VCD_FUNCTION_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC
     DESC = VCD function ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = itti_dump_enqueue_message_malloc
 ID = VCD_FUNCTION_ITTI_RELAY_THREAD
     DESC = VCD function ITTI_RELAY_THREAD
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = itti_relay_thread
 ID = VCD_FUNCTION_TEST
     DESC = VCD function TEST
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = test
 ID = VCD_FUNCTION_SEND_IF4
     DESC = VCD function SEND_IF4
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = send_if4
 ID = VCD_FUNCTION_RECV_IF4
     DESC = VCD function RECV_IF4
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = recv_if4
 ID = VCD_FUNCTION_SEND_IF5
     DESC = VCD function SEND_IF5
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = send_if5
 ID = VCD_FUNCTION_RECV_IF5
     DESC = VCD function RECV_IF5
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = recv_if5
 ID = VCD_FUNCTION_TRX_COMPR_IF
     DESC = VCD function TRX_COMPR_IF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = compress_if
 ID = VCD_FUNCTION_TRX_DECOMPR_IF
     DESC = VCD function TRX_DECOMPR_IF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = decompress_if
 ID = VCD_FUNCTION_NFAPI
     DESC = VCD function NFAPI
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = nfapi_subframe
 ID = VCD_FUNCTION_GENERATE_PCFICH
     DESC = VCD function GENERATE_PCFICH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = generate_pcfich
 ID = VCD_FUNCTION_GENERATE_DCI0
     DESC = VCD function GENERATE_DCI0
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = generate_dci0
 ID = VCD_FUNCTION_GENERATE_DLSCH
     DESC = VCD function GENERATE_DLSCH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = generate_dlsch
 ID = VCD_FUNCTION_GENERATE_PHICH
     DESC = VCD function GENERATE_PHICH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = generate_phich
 ID = VCD_FUNCTION_PDCCH_SCRAMBLING
     DESC = VCD function PDCCH_SCRAMBLING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcch_scrambling
 ID = VCD_FUNCTION_PDCCH_MODULATION
     DESC = VCD function PDCCH_MODULATION
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcch_modulation
 ID = VCD_FUNCTION_PDCCH_INTERLEAVING
     DESC = VCD function PDCCH_INTERLEAVING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcch_interleaving
 ID = VCD_FUNCTION_PDCCH_TX
     DESC = VCD function PDCCH_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcch_tx
diff --git a/common/utils/T/check_vcd.c b/common/utils/T/check_vcd.c
new file mode 100644
index 0000000000000000000000000000000000000000..1460d7e20a7dd861f39e4a45150e91377e0ed0da
--- /dev/null
+++ b/common/utils/T/check_vcd.c
@@ -0,0 +1,249 @@
+/*
+ * To disable the checks done by this program, see below at the beginning
+ * of the function 'main'.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "database.h"
+
+#define T_TRACER 1
+#include "T.h"
+
+/* VCD specific defines and includes
+ * If the codebase changes, it may need to be updated
+ */
+#define ENB_MODE
+#define ENABLE_USE_CPU_EXECUTION_TIME
+#include "../LOG/vcd_signal_dumper.c"
+
+void err(char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
+void err(char *fmt, ...)
+{
+  va_list ap;
+
+  va_start(ap, fmt);
+
+  printf("\x1b[31m");
+  printf("error: ");
+  vprintf(fmt, ap);
+  printf("\n"
+"\x1b[33m\n"
+"You probably added a VCD trace (variable or function) but you did not\n"
+"update T_messages.txt and/or T_defs.h in common/utils/T/\n"
+"\n"
+"Be sure to add the new trace to T_messages.txt, at the right place in the\n"
+"file. Do not forget to define VCD_NAME with an identical value as found\n"
+"in the array eurecomVariablesNames or eurecomFunctionsNames.\n"
+"\n"
+"Be sure to update VCD_NUM_FUNCTIONS, VCD_NUM_VARIABLES, VCD_FIRST_FUNCTION\n"
+"and VCD_FIRST_VARIABLE in T_defs.h\n"
+"\n"
+"The same procedure has to be followed when you delete a VCD trace.\n"
+"Delete it in T_messages.txt as well and update T_defs.h\n"
+"\n"
+"You can disable those VCD checks at development time.\n"
+"To disable the VCD checks see the file common/utils/T/check_vcd.c\n"
+"Do not push any modification that disables the VCD checks to the\n"
+"main repository.\n");
+
+  printf("\x1b[m\n");
+
+  va_end(ap);
+
+  exit(1);
+}
+
+int main(void)
+{
+  /* to disable the checks done by this program, uncomment the following
+   * line, ie. remove the leading '//'
+   */
+  //return 0;
+
+  void *database = parse_database("T_messages.txt");
+  int number_of_events;
+  int first_var = -1;
+  int last_var;
+  int first_fun = -1;
+  int last_fun;
+  char *prefix;
+  int prefix_len;
+  char *name;
+  char *vcd_name;
+  int i;
+  FILE *in;
+  char *l = NULL;
+  size_t lsize;
+
+  if (database == NULL) err("something wrong with T_messages.txt");
+
+  /* check the value of VCD_NUM_FUNCTIONS */
+  if (VCD_NUM_FUNCTIONS != sizeof(eurecomFunctionsNames) / sizeof(char *))
+    err("VCD_NUM_FUNCTIONS (%d) must be equal to %zd",
+        VCD_NUM_FUNCTIONS,
+        sizeof(eurecomFunctionsNames) / sizeof(char *));
+
+  /* check the value of VCD_NUM_VARIABLES */
+  if (VCD_NUM_VARIABLES != sizeof(eurecomVariablesNames) / sizeof(char *))
+    err("VCD_NUM_VARIABLES (%d) must be equal to %zd",
+        VCD_NUM_VARIABLES,
+        sizeof(eurecomVariablesNames) / sizeof(char *));
+
+  number_of_events = number_of_ids(database);
+  if (number_of_events == 0) err("no event defined in T_messages.txt");
+
+  /* T_messages.txt ends with VCD VARIABLES followed by VCD FUNCTIONS
+   * followed by nothing.
+   * Let's check.
+   */
+
+  /* check VCD VARIABLES traces in T_messages.txt */
+  prefix = "VCD_VARIABLE_";
+  prefix_len = strlen(prefix);
+
+  for (i = 0; i < number_of_events; i++) {
+    name = event_name_from_id(database, i);
+    if (strncmp(name, prefix, prefix_len)) continue;
+    first_var = i;
+    break;
+  }
+  if (first_var == -1)
+    err("no VCD_VARIABLE_ found in T_messages.txt");
+  for (; i < number_of_events; i++) {
+    name = event_name_from_id(database, i);
+    if (strncmp(name, prefix, prefix_len)) break;
+  }
+  last_var = i-1;
+
+  /* check VCD FUNCTIONS traces in T_messages.txt */
+  if (i == number_of_events)
+    err("no VCD_FUNCTION_ found in T_messages.txt");
+
+  prefix = "VCD_FUNCTION_";
+  prefix_len = strlen(prefix);
+
+  first_fun = i;
+
+  name = event_name_from_id(database, i);
+  if (strncmp(name, prefix, prefix_len))
+    err("last VCD_VARIABLE_ not followed by a VCD_FUNCTION_ in T_messages.txt");
+
+  for (; i < number_of_events; i++) {
+    name = event_name_from_id(database, i);
+    if (strncmp(name, prefix, prefix_len)) break;
+  }
+
+  if (i != number_of_events)
+    err("T_messages.txt does not end with a VCD_FUNCTION_ trace");
+
+  last_fun = i-1;
+
+  if (first_var != (unsigned)VCD_FIRST_VARIABLE)
+    err("VCD_FIRST_VARIABLE is not correct in T_defs.h");
+  if (first_fun != (unsigned)VCD_FIRST_FUNCTION)
+    err("VCD_FIRST_FUNCTION is not correct in T_defs.h");
+  if (last_var-first_var+1 != VCD_NUM_VARIABLES)
+    err("VCD_NUM_VARIABLES is not correct in T_defs.h");
+  if (last_fun-first_fun+1 != VCD_NUM_FUNCTIONS)
+    err("VCD_NUM_FUNCTIONS is not correct in T_defs.h");
+
+  /* check that VCD_NAME is identical to
+   * eurecomVariablesNames[x]/eurecomFunctionsNames[x]
+   */
+  prefix = "VCD_VARIABLE_";
+  prefix_len = strlen(prefix);
+
+  for (i = 0; i < number_of_events; i++) {
+    name = event_name_from_id(database, i);
+    if (strncmp(name, prefix, prefix_len)) continue;
+    vcd_name = event_vcd_name_from_id(database, i);
+    if (vcd_name == NULL)
+      err("%s has no VCD_NAME in T_messages.txt", name);
+    if (strcmp(vcd_name, eurecomVariablesNames[i - first_var]))
+      err("%s has a wrong VCD_NAME in T_messages.txt", name);
+  }
+
+  prefix = "VCD_FUNCTION_";
+  prefix_len = strlen(prefix);
+
+  for (i = 0; i < number_of_events; i++) {
+    name = event_name_from_id(database, i);
+    if (strncmp(name, prefix, prefix_len)) continue;
+    vcd_name = event_vcd_name_from_id(database, i);
+    if (vcd_name == NULL)
+      err("%s has no VCD_NAME in T_messages.txt", name);
+    if (strcmp(vcd_name, eurecomFunctionsNames[i - first_fun]))
+      err("%s has a wrong VCD_NAME in T_messages.txt", name);
+  }
+
+  /* check IDs - these checks are difficult because we parse
+   * common/utils/LOG/vcd_signal_dumper.h which is expected to
+   * be formatted as is:
+   * - define vcd_signal_dump_variables then vcd_signal_dump_functions
+   * - one VCD_XXXX per line starting with two spaces
+   *   followed by ',' or '=' with no space in between
+   * - no #ifdef / #if is taken into account
+   * - we require VCD_SIGNAL_DUMPER_VARIABLES_END and
+   *   VCD_SIGNAL_DUMPER_FUNCTIONS_END at the end of each array,
+   *   each on a line of its own with two spaces before and nothing after.
+   *
+   * If these checks fail, consider formatting
+   * common/utils/LOG/vcd_signal_dumper.h as expected here, if
+   * it makes sense of course. Otherwise, change the code below.
+   *
+   * In common/utils/LOG/vcd_signal_dumper.h a valid name is
+   * either VCD_SIGNAL_DUMPER_VARIABLES_ABC or
+   * VCD_SIGNAL_DUMPER_FUNCTIONS_XYZ
+   * and in T_messages.txt the corresponding name has to be
+   * VCD_VARIABLE_ABC or VCD_FUNCTION_XYZ
+   */
+  i = first_var;
+  in = fopen("../LOG/vcd_signal_dumper.h", "r");
+  if (in == NULL) err("could not open ../LOG/vcd_signal_dumper.h");
+  while (1) {
+    char *x = "  VCD_SIGNAL_DUMPER_VARIABLES_";
+    ssize_t r;
+    free(l);
+    l = NULL;
+    lsize = 0;
+    r = getline(&l, &lsize, in);
+    if (r == -1) break;
+    if (!strcmp(l, "  VCD_SIGNAL_DUMPER_VARIABLES_END\n")) break;
+    /* remove ',' or '=' if found */
+    { char *s=l; while (*s) { if (*s==','||*s=='=') { *s=0; break; } s++; } }
+    if (strncmp(l, x, strlen(x))) continue;
+    if (!(i >= first_var && i <= last_var))
+      err("T_messages.txt is not correct with respect to VCD VARIABLES");
+    name = event_name_from_id(database, i);
+    if (strcmp(l+strlen(x), name+strlen("VCD_VARIABLE_")))
+      err("%s is not correct in T_messages.txt", name);
+    i++;
+  }
+  if (i != last_var + 1) err("VCD VARIABLES wrong in T_messages.txt");
+  while (1) {
+    char *x = "  VCD_SIGNAL_DUMPER_FUNCTIONS_";
+    ssize_t r;
+    free(l);
+    l = NULL;
+    lsize = 0;
+    r = getline(&l, &lsize, in);
+    if (r == -1) break;
+    if (!strcmp(l, "  VCD_SIGNAL_DUMPER_FUNCTIONS_END\n")) break;
+    /* remove ',' or '=' if found */
+    { char *s=l; while (*s) { if (*s==','||*s=='=') { *s=0; break; } s++; } }
+    if (strncmp(l, x, strlen(x))) continue;
+    if (!(i >= first_fun && i <= last_fun))
+      err("T_messages.txt is not correct with respect to VCD FUNCTIONS");
+    name = event_name_from_id(database, i);
+    if (strcmp(l+strlen(x), name+strlen("VCD_FUNCTION_")))
+      err("%s is not correct in T_messages.txt", name);
+    i++;
+  }
+  fclose(in);
+  if (i != last_fun + 1) err("VCD FUNCTIONS wrong in T_messages.txt");
+
+  return 0;
+}
diff --git a/common/utils/T/genids.c b/common/utils/T/genids.c
index 734c506368ac348ba9db9ae2eae8048fcec929d6..8e5adbf587081322fc2d6047c7b4d246841bdc94 100644
--- a/common/utils/T/genids.c
+++ b/common/utils/T/genids.c
@@ -14,21 +14,21 @@ int cmp(const void *p1, const void *p2)
 }
 
 /* return 1 if s was not already known, 0 if it was */
-int new_unique_id(char *s)
+int new_unique_id(char *s, char *input_file)
 {
   if (unique_ids_size)
   if (bsearch(&s, unique_ids, unique_ids_size, sizeof(char *), cmp) != NULL) {
-    printf("FATAL: ID %s is not unique\n", s);
+    printf("error: ID %s is not unique in %s\n", s, input_file);
     return 0;
   }
   if (unique_ids_size == unique_ids_maxsize) {
     unique_ids_maxsize += 256;
     unique_ids = realloc(unique_ids, unique_ids_maxsize * sizeof(char *));
-    if (unique_ids == NULL) { printf("out of memory\n"); abort(); }
+    if (unique_ids == NULL) { printf("erorr: out of memory\n"); abort(); }
   }
   unique_ids[unique_ids_size] = strdup(s);
   if (unique_ids[unique_ids_size] == NULL)
-    { printf("out of memory\n"); abort(); }
+    { printf("erorr: out of memory\n"); abort(); }
   unique_ids_size++;
   qsort(unique_ids, unique_ids_size, sizeof(char *), cmp);
   return 1;
@@ -43,7 +43,8 @@ void putname(int c)
   if (bufname_size == bufname_maxsize) {
     bufname_maxsize += 256;
     bufname = realloc(bufname, bufname_maxsize);
-    if (bufname == NULL) { printf("memory allocation error\n"); exit(1); }
+    if (bufname == NULL)
+      { printf("erorr: memory allocation error\n"); exit(1); }
   }
   bufname[bufname_size] = c;
   bufname_size++;
@@ -58,7 +59,8 @@ void putvalue(int c)
   if (bufvalue_size == bufvalue_maxsize) {
     bufvalue_maxsize += 256;
     bufvalue = realloc(bufvalue, bufvalue_maxsize);
-    if (bufvalue == NULL) { printf("memory allocation error\n"); exit(1); }
+    if (bufvalue == NULL)
+      { printf("error: memory allocation error\n"); exit(1); }
   }
   bufvalue[bufvalue_size] = c;
   bufvalue_size++;
@@ -119,7 +121,7 @@ int main(int n, char **v)
   char *in_name;
   char *out_name;
 
-  if (n != 3) { printf("gimme <source> <dest>\n"); exit(1); }
+  if (n != 3) { printf("error: gimme <source> <dest>\n"); exit(1); }
 
   n = 0;
 
@@ -134,14 +136,13 @@ int main(int n, char **v)
   while (1) {
     get_line(in, &name, &value);
     if (name == NULL) break;
-    printf("name '%s' value '%s'\n", name, value);
     if (isspace(value[strlen(value)-1])) {
-      printf("bad value '%s' (no space at the end please!)\n", value);
+      printf("error: bad value '%s' (no space at the end please!)\n", value);
       unlink(out_name);
       exit(1);
     }
     if (!strcmp(name, "ID")) {
-      if (!new_unique_id(value)) { unlink(out_name); exit(1); }
+      if (!new_unique_id(value, in_name)) { unlink(out_name); exit(1); }
       fprintf(out, "#define T_%s T_ID(%d)\n", value, n);
       n++;
     }
diff --git a/common/utils/T/local_tracer.c b/common/utils/T/local_tracer.c
index c331daa4a9f0410d918ea317466b738479328d0a..f8e92881a96e79a000e57fcad814e8440719a895 100644
--- a/common/utils/T/local_tracer.c
+++ b/common/utils/T/local_tracer.c
@@ -337,54 +337,34 @@ static void forward(void *_forwarder, char *buf, int size)
 
 static void wait_message(void)
 {
-  while (T_local_cache[T_busylist_head].busy == 0) usleep(1000);
-}
-
-static void init_shm(char *shm_file)
-{
-  int i;
-  int s = shm_open(shm_file, O_RDWR | O_CREAT /*| O_SYNC*/, 0666);
-  if (s == -1) { perror(shm_file); abort(); }
-  if (ftruncate(s, T_CACHE_SIZE * sizeof(T_cache_t)))
-    { perror(shm_file); abort(); }
-  T_local_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t),
-                       PROT_READ | PROT_WRITE, MAP_SHARED, s, 0);
-  if (T_local_cache == MAP_FAILED)
-    { perror(shm_file); abort(); }
-  close(s);
-
-  /* let's garbage the memory to catch some potential problems
-   * (think multiprocessor sync issues, barriers, etc.)
-   */
-  memset(T_local_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t));
-  for (i = 0; i < T_CACHE_SIZE; i++) T_local_cache[i].busy = 0;
+  while ((T_local_cache[T_busylist_head].busy & 0x02) == 0) usleep(1000);
 }
 
 void T_local_tracer_main(int remote_port, int wait_for_tracer,
-    int local_socket, char *shm_file)
+    int local_socket, void *shm_array)
 {
   int s;
   int port = remote_port;
   int dont_wait = wait_for_tracer ? 0 : 1;
   void *f;
-  printf("local tracer starting\n");
+
   /* write on a socket fails if the other end is closed and we get SIGPIPE */
-  if (signal(SIGPIPE, SIG_IGN) == SIG_ERR){
+  if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
        printf("local tracer received SIGPIPE\n");
        abort();
-   }
+  }
+
+  T_local_cache = shm_array;
 
-  init_shm(shm_file);
   s = local_socket;
-  printf("local tracer starting step 2\n");
+
   if (dont_wait) {
     char t = 2;
-  printf("local tracer in no wait mode \n");
     if (write(s, &t, 1) != 1) abort();
   }
-  printf("local tracer starting step 3\n");
+
   f = forwarder(port, s);
-  printf("local tracer main loop.... \n");
+
   /* read messages */
   while (1) {
     wait_message();
diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile
index 1c4a77587c3916c9140a9ef71465b08e8a9313aa..3da4aa13a17528cc1396f5eedc2e40eee91c2cb1 100644
--- a/common/utils/T/tracer/Makefile
+++ b/common/utils/T/tracer/Makefile
@@ -7,7 +7,7 @@ LIBS=-lm
 XLIBS=-lX11 -lpng -lXft
 
 all: record replay extract_config textlog enb ue vcd macpdu2wireshark \
-     extract_input_subframe extract_output_subframe to_vcd extract
+     extract_input_subframe extract_output_subframe to_vcd extract multi
 
 record: utils.o record.o database.o config.o
 	$(CC) $(CFLAGS) -o record $^ $(LIBS)
@@ -57,19 +57,22 @@ macpdu2wireshark: macpdu2wireshark.o database.o utils.o handler.o event.o \
                   config.o
 	$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
 
+multi: multi.o utils.o database.o config.o
+	$(CC) $(CFLAGS) -o multi $^ $(LIBS)
+
 .PHONY: all gui/gui.a view/view.a logger/logger.a filter/filter.a
 
 gui/gui.a:
-	cd gui && make
+	cd gui && $(MAKE)
 
 view/view.a:
-	cd view && make
+	cd view && $(MAKE)
 
 logger/logger.a:
-	cd logger && make
+	cd logger && $(MAKE)
 
 filter/filter.a:
-	cd filter && make
+	cd filter && $(MAKE)
 
 %.o: %.c
 	$(CC) $(CFLAGS) -c -o $@ $<
@@ -77,9 +80,9 @@ filter/filter.a:
 clean:
 	rm -f *.o core tracer_remote textlog enb ue vcd record replay
 	rm -f extract_config macpdu2wireshark extract_input_subframe
-	rm -f extract_output_subframe to_vcd extract
-	cd gui && make clean
-	cd view && make clean
-	cd logger && make clean
-	cd filter && make clean
-	cd hacks && make clean
+	rm -f extract_output_subframe to_vcd extract multi
+	cd gui && $(MAKE) clean
+	cd view && $(MAKE) clean
+	cd logger && $(MAKE) clean
+	cd filter && $(MAKE) clean
+	cd hacks && $(MAKE) clean
diff --git a/common/utils/T/tracer/config.c b/common/utils/T/tracer/config.c
index f88966ed79a111b2ab2d09d7110ae9da0c3781ea..723902ec9c8bbe518ca2eaad902c1903771e87f4 100644
--- a/common/utils/T/tracer/config.c
+++ b/common/utils/T/tracer/config.c
@@ -60,3 +60,9 @@ void verify_config(void)
     abort();
   }
 }
+
+void get_local_config(char **txt, int *len)
+{
+  *txt = local;
+  *len = local_size;
+}
diff --git a/common/utils/T/tracer/config.h b/common/utils/T/tracer/config.h
index f90869eb6621f89c5be80fc012e4edc7102a4652..07290c71a35c5605596ff3770a34db40ce5dbc0a 100644
--- a/common/utils/T/tracer/config.h
+++ b/common/utils/T/tracer/config.h
@@ -5,5 +5,6 @@ void clear_remote_config(void);
 void append_received_config_chunk(char *buf, int length);
 void load_config_file(char *filename);
 void verify_config(void);
+void get_local_config(char **txt, int *len);
 
 #endif /* _CONFIG_H_ */
diff --git a/common/utils/T/tracer/database.c b/common/utils/T/tracer/database.c
index f0908948e23cb81ac2809faa14b8856f53492075..543ab666640309719c2599ad00e7b4ff6b66caea 100644
--- a/common/utils/T/tracer/database.c
+++ b/common/utils/T/tracer/database.c
@@ -13,6 +13,7 @@ typedef struct {
   char **arg_type;
   char **arg_name;
   int  asize;
+  char *vcd_name;
   int  id;
 } id;
 
@@ -138,6 +139,7 @@ id *add_id(database *r, char *idname, int i)
   r->i[r->isize].arg_type = NULL;
   r->i[r->isize].arg_name = NULL;
   r->i[r->isize].asize = 0;
+  r->i[r->isize].vcd_name = NULL;
   r->i[r->isize].id = i;
   r->isize++;
   qsort(r->i, r->isize, sizeof(id), id_cmp);
@@ -224,6 +226,12 @@ void add_desc(id *i, char *desc)
   i->desc = strdup(desc); if (i->desc == NULL) abort();
 }
 
+void add_vcd_name(id *i, char *vcd_name)
+{
+  if (i == NULL) {printf("ERROR: VCD_NAME line before ID line\n");exit(1);}
+  i->vcd_name = strdup(vcd_name); if (i->vcd_name == NULL) abort();
+}
+
 char *format_get_next_token(char **cur)
 {
   char *start;
@@ -320,6 +328,7 @@ void *parse_database(char *filename)
     if (!strcmp(name, "GROUP")) add_groups(r, last_id, value);
     if (!strcmp(name, "DESC")) add_desc(last_id, value);
     if (!strcmp(name, "FORMAT")) add_format(last_id, value);
+    if (!strcmp(name, "VCD_NAME")) add_vcd_name(last_id, value);
   }
 
   fclose(in);
@@ -424,6 +433,12 @@ char *event_name_from_id(void *_database, int id)
   return d->i[d->id_to_pos[id]].name;
 }
 
+char *event_vcd_name_from_id(void *_database, int id)
+{
+  database *d = _database;
+  return d->i[d->id_to_pos[id]].vcd_name;
+}
+
 int event_id_from_name(void *_database, char *name)
 {
   database *d = _database;
diff --git a/common/utils/T/tracer/database.h b/common/utils/T/tracer/database.h
index c5cab05d9f7be0da0cc8d50fcf3fda243aec556a..9fdbaed7c685fb77979167f243fdd5732597566b 100644
--- a/common/utils/T/tracer/database.h
+++ b/common/utils/T/tracer/database.h
@@ -8,6 +8,7 @@ void list_ids(void *database);
 void list_groups(void *database);
 void on_off(void *d, char *item, int *a, int onoff);
 char *event_name_from_id(void *database, int id);
+char *event_vcd_name_from_id(void *_database, int id);
 int event_id_from_name(void *database, char *name);
 int number_of_ids(void *database);
 int database_get_ids(void *database, char ***ids);
diff --git a/common/utils/T/tracer/enb.c b/common/utils/T/tracer/enb.c
index a30366faf1eb8e645d5efba1cf664985cc60c255..ea499a68f831b5e7d7bbecb144815e2d9ddc81d6 100644
--- a/common/utils/T/tracer/enb.c
+++ b/common/utils/T/tracer/enb.c
@@ -878,6 +878,7 @@ int main(int n, char **v)
 
 restart:
   clear_remote_config();
+  if (enb_data.socket != -1) close(enb_data.socket);
   enb_data.socket = connect_to(ip, port);
 
   /* send the first message - activate selected traces */
diff --git a/common/utils/T/tracer/multi.c b/common/utils/T/tracer/multi.c
new file mode 100644
index 0000000000000000000000000000000000000000..6a9de838c674b1473e54d99a147d91c9d431311e
--- /dev/null
+++ b/common/utils/T/tracer/multi.c
@@ -0,0 +1,385 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#include <poll.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include "database.h"
+#include "utils.h"
+#include "../T.h"
+#include "config.h"
+
+#define DEFAULT_LOCAL_PORT 2022
+
+typedef struct {
+  int id;         /* increases at each new tracer's connection */
+  int s;          /* socket */
+  int *is_on;     /* local vision of is_on for this tracer */
+  int poll_id;    /* -1: invalid, otherwise index in fds array */
+} ti_t;
+
+typedef struct {
+  ti_t *ti;         /* data for tracers */
+  int  ti_size;
+  int  ti_maxsize;
+} multi_t;
+
+void set_is_on(int *is_on, int pos, int val)
+{
+  if (val) is_on[pos]++; else is_on[pos]--;
+  /* TODO: remove check? */
+  if (is_on[pos] < 0) { printf("%s:%d:nonono\n",__FILE__,__LINE__); abort(); }
+}
+
+int send_messages_txt(int s, char *T_messages_txt, int T_messages_txt_len)
+{
+  char buf[T_BUFFER_MAX];
+  char *T_LOCAL_buf = buf;
+  int32_t T_LOCAL_size;
+  unsigned char *src;
+  int src_len;
+
+  /* trace T_message.txt
+   * Send several messages -1 with content followed by message -2.
+   */
+  src = (unsigned char *)T_messages_txt;
+  src_len = T_messages_txt_len;
+  while (src_len) {
+    int send_size = src_len;
+    if (send_size > T_PAYLOAD_MAXSIZE - sizeof(int))
+      send_size = T_PAYLOAD_MAXSIZE - sizeof(int);
+    /* TODO: be careful, we use internal T stuff, to rewrite? */
+    T_LOCAL_size = 0;
+    T_HEADER(T_ID(-1));
+    T_PUT_buffer(1, ((T_buffer){addr:(src), length:(send_size)}));
+    if (socket_send(s, &T_LOCAL_size, 4) == -1) return -1;
+    if (socket_send(s, buf, T_LOCAL_size) == -1) return -1;
+    src += send_size;
+    src_len -= send_size;
+  }
+  T_LOCAL_size = 0;
+  T_HEADER(T_ID(-2));
+  if (socket_send(s, &T_LOCAL_size, 4) == -1) return -1;
+  return socket_send(s, buf, T_LOCAL_size);
+}
+
+void new_tracer(multi_t *m, int s, int is_on_size, char *t, int t_size, int id)
+{
+  if (send_messages_txt(s, t, t_size) == -1) {
+    printf("error sending T_messages.txt to new tracer %d => remove tracer\n",
+           id);
+    return;
+  }
+  if (m->ti_size == m->ti_maxsize) {
+    m->ti_maxsize += 64;
+    m->ti = realloc(m->ti, m->ti_maxsize * sizeof(ti_t));
+    if (m->ti == NULL) abort();
+  }
+  m->ti[m->ti_size].id = id;
+  m->ti[m->ti_size].s = s;
+  m->ti[m->ti_size].is_on = calloc(is_on_size, sizeof(int));
+  if (m->ti[m->ti_size].is_on == NULL) abort();
+  m->ti[m->ti_size].poll_id = -1;
+  m->ti_size++;
+}
+
+void remove_tracer(multi_t *m, int t)
+{
+  free(m->ti[t].is_on);
+  shutdown(m->ti[t].s, SHUT_RDWR);
+  close(m->ti[t].s);
+  m->ti_size--;
+  memmove(&m->ti[t], &m->ti[t+1], (m->ti_size - t) * sizeof(ti_t));
+}
+
+int send_is_on(int socket, int number_of_events, int *is_on)
+{
+  int i;
+  char mt = 1;
+  if (socket_send(socket, &mt, 1) == -1 ||
+      socket_send(socket, &number_of_events, sizeof(int)) == -1) return -1;
+  for (i = 0; i < number_of_events; i++) {
+    int v = is_on[i] ? 1 : 0;
+    if (socket_send(socket, &v, sizeof(int)) == -1) return -1;
+  }
+  return 0;
+}
+
+int read_tracee(int s, OBUF *ebuf, int *_type, int32_t *_length)
+{
+  int type;
+  int32_t length;
+  char *v;
+  int vpos = 0;
+
+  if (fullread(s, &length, 4) == -1) return -1;
+  if (ebuf->omaxsize < length) {
+    ebuf->omaxsize = (length + 65535) & ~65535;
+    ebuf->obuf = realloc(ebuf->obuf, ebuf->omaxsize);
+    if (ebuf->obuf == NULL) { printf("out of memory\n"); exit(1); }
+  }
+  v = ebuf->obuf;
+  memcpy(v+vpos, &length, 4);
+  vpos += 4;
+#ifdef T_SEND_TIME
+  if (fullread(s,v+vpos,sizeof(struct timespec))==-1) return -1;
+  vpos += sizeof(struct timespec);
+  length -= sizeof(struct timespec);
+#endif
+  if (fullread(s, &type, sizeof(int)) == -1) return -1;
+  memcpy(v+vpos, &type, sizeof(int));
+  vpos += sizeof(int);
+  length -= sizeof(int);
+  if (fullread(s, v+vpos, length) == -1) return -1;
+  vpos += length;
+
+  ebuf->osize = vpos;
+
+  *_type = type;
+  *_length = length;
+  return 0;
+}
+
+void forward_event(multi_t *m, int number_of_events, OBUF *ebuf, int type)
+{
+  int i;
+
+  if (type < 0 || type >= number_of_events)
+    { printf("error: bad type of event to forward %d\n", type); abort(); }
+
+  for (i = 0; i < m->ti_size; i++) {
+    if (!m->ti[i].is_on[type]) continue;
+    if (socket_send(m->ti[i].s, ebuf->obuf, ebuf->osize) == -1)
+      printf("warning: error forwarding event to tracer %d\n", m->ti[i].id);
+  }
+}
+
+int connect_to_tracee(char *ip, int port, int number_of_events, int *is_on)
+{
+  int s;
+
+  printf("connecting to %s:%d\n", ip, port);
+
+  s = try_connect_to(ip, port);
+  if (s == -1) return -1;
+
+  if (send_is_on(s, number_of_events, is_on) == -1) {
+    shutdown(s, SHUT_RDWR);
+    close(s);
+    return -1;
+  }
+
+  return s;
+}
+
+void usage(void)
+{
+  printf(
+"options:\n"
+"    -d <database file>        this option is mandatory\n"
+"    -ip <host>                connect to given IP address (default %s)\n"
+"    -p <port>                 connect to given port (default %d)\n"
+"    -lp <port>                listen on local port (default %d)\n",
+  DEFAULT_REMOTE_IP,
+  DEFAULT_REMOTE_PORT,
+  DEFAULT_LOCAL_PORT
+  );
+  exit(1);
+}
+
+int main(int n, char **v)
+{
+  char *database_filename = NULL;
+  void *database;
+  char *ip = DEFAULT_REMOTE_IP;
+  int  port = DEFAULT_REMOTE_PORT;
+  int  local_port = DEFAULT_LOCAL_PORT;
+  int  *is_on;
+  int  number_of_events;
+  int  i, j;
+  char *T_messages_txt;
+  int  T_messages_txt_len;
+  int  l;           /* listen socket for tracers' connections */
+  int  s = -1;      /* socket connected to tracee. -1 if not connected */
+  multi_t m;
+  int is_on_changed;
+  int current_nfd;
+  struct pollfd *fds = NULL;
+  int next_id = 0;
+
+  memset(&m, 0, sizeof(m));
+
+  /* write on a socket fails if the other end is closed and we get SIGPIPE */
+  if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort();
+
+  for (i = 1; i < n; i++) {
+    if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
+    if (!strcmp(v[i], "-d"))
+      { if (i > n-2) usage(); database_filename = v[++i]; continue; }
+    if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
+    if (!strcmp(v[i], "-p"))
+      { if (i > n-2) usage(); port = atoi(v[++i]); continue; }
+    if (!strcmp(v[i], "-lp"))
+      { if (i > n-2) usage(); local_port = atoi(v[++i]); continue; }
+    usage();
+  }
+
+  if (database_filename == NULL) {
+    printf("ERROR: provide a database file (-d)\n");
+    exit(1);
+  }
+
+  database = parse_database(database_filename);
+
+  load_config_file(database_filename);
+  get_local_config(&T_messages_txt, &T_messages_txt_len);
+
+  number_of_events = number_of_ids(database);
+  is_on = calloc(number_of_events, sizeof(int));
+  if (is_on == NULL) abort();
+
+  /* create listener socket */
+  l = create_listen_socket("0.0.0.0", local_port);
+
+  OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
+
+  current_nfd = 0;
+
+  while (1) {
+    int nfd;
+    int timeout;
+
+    if (s == -1) s = connect_to_tracee(ip, port, number_of_events, is_on);
+
+    /* poll on s (if there), l, and all tracers' sockets */
+    nfd = 1 + (s != -1) + m.ti_size;
+    if (nfd != current_nfd) {
+      current_nfd = nfd;
+      free(fds);
+      fds = calloc(nfd, sizeof(struct pollfd));
+      if (fds == NULL) { perror("calloc"); exit(1); }
+    }
+    i = 0;
+    fds[i].fd = l;
+    fds[i].events = POLLIN;
+    i++;
+    if (s != -1) {
+      fds[i].fd = s;
+      fds[i].events = POLLIN;
+      i++;
+    }
+    for (j = 0; j < m.ti_size; j++) {
+      m.ti[j].poll_id = i;
+      fds[i].fd = m.ti[j].s;
+      fds[i].events = POLLIN;
+      i++;
+    }
+    if (s == -1) timeout = 1000; else timeout = -1;
+    if (poll(fds, nfd, timeout) == -1) { perror("poll"); exit(1); }
+
+    if (fds[0].revents & ~POLLIN) {
+      printf("TODO: error on listen socket?\n");
+      exit(1);
+    }
+
+    /* new tracer connecting? */
+    if (fds[0].revents & POLLIN) {
+      int t;
+      printf("tracer %d connecting\n", next_id);
+      t = socket_accept(l);
+      if (t == -1) perror("accept");
+      else new_tracer(&m, t, number_of_events,
+                      T_messages_txt, T_messages_txt_len, next_id);
+      next_id++;
+    }
+
+    if (s != -1 && fds[1].revents & ~POLLIN) {
+      printf("TODO: error on tracee socket?\n");
+      exit(1);
+    }
+
+    /* data from tracee */
+    if (s != -1 && fds[1].revents & POLLIN) {
+      int type;
+      int32_t length;
+      if (read_tracee(s, &ebuf, &type, &length) == -1) {
+        clear_remote_config();
+        shutdown(s, SHUT_RDWR);
+        close(s);
+        s = -1;
+      } else {
+        if (type == -1)
+          append_received_config_chunk(ebuf.obuf+ebuf.osize-length, length);
+        else if (type == -2) verify_config();
+        else forward_event(&m, number_of_events, &ebuf, type);
+      }
+    }
+
+    /* status of each tracer */
+    is_on_changed = 0;
+    for (j = 0; j < m.ti_size; j++) {
+      int l;
+      int s;
+      int *t_is_on;
+      if (m.ti[j].poll_id == -1) continue;
+      i = m.ti[j].poll_id;
+      s = m.ti[j].s;
+      t_is_on = m.ti[j].is_on;
+      if (fds[i].revents & (POLLHUP | POLLERR)) goto tracer_error;
+      /* error? */
+      if (fds[i].revents & ~POLLIN) {
+        printf("TODO: error with tracer?\n");
+        exit(1);
+      }
+      /* data in */
+      if (fds[i].revents & POLLIN) {
+        char t;
+        int len;
+        int v;
+        if (fullread(s, &t, 1) != 1) goto tracer_error;
+        switch (t) {
+        case 0:
+          is_on_changed = 1;
+          if (fullread(s, &len, sizeof(int)) == -1) goto tracer_error;
+          for (l = 0; l < len; l++) {
+            if (fullread(s, &v, sizeof(int)) == -1) goto tracer_error;
+            if (v < 0 || v >= number_of_events) goto tracer_error;
+            t_is_on[v] = 1 - t_is_on[v];
+            set_is_on(is_on, v, t_is_on[v]);
+          }
+          break;
+        case 1:
+          is_on_changed = 1;
+          if (fullread(s, &len, sizeof(int)) == -1) goto tracer_error;
+          if (len < 0 || len > number_of_events) goto tracer_error;
+          for (l = 0; l < len; l++) {
+            if (fullread(s, &v, sizeof(int)) == -1) goto tracer_error;
+            if (v < 0 || v > 1) goto tracer_error;
+            if (t_is_on[l] != v) set_is_on(is_on, l, v);
+            t_is_on[l] = v;
+          }
+          break;
+        case 2: break;
+        default: printf("error: unhandled message type %d\n", t); //abort();
+        }
+      }
+      continue;
+tracer_error:
+      printf("remove tracer %d\n", m.ti[j].id);
+      for (l = 0; l < number_of_events; l++)
+        if (m.ti[j].is_on[l]) { is_on_changed = 1; set_is_on(is_on, l, 0); }
+      remove_tracer(&m, j);
+      j--;
+    }
+    if (is_on_changed && s != -1)
+      if (send_is_on(s, number_of_events, is_on) == -1) {
+        clear_remote_config();
+        shutdown(s, SHUT_RDWR);
+        close(s);
+        s = -1;
+      }
+  }
+
+  return 0;
+}
diff --git a/common/utils/T/tracer/to_vcd.c b/common/utils/T/tracer/to_vcd.c
index 1a67a9d4ffa6b631c59f9246516d61fe8e0efb12..998649af01543a531193640112832731657082d9 100644
--- a/common/utils/T/tracer/to_vcd.c
+++ b/common/utils/T/tracer/to_vcd.c
@@ -12,7 +12,14 @@
 #include "logger/logger.h"
 #include "view/view.h"
 
+enum var_type {
+  DEFAULT,
+  VCD_FUNCTION,
+  VCD_VARIABLE
+};
+
 typedef struct {
+  enum var_type type;
   char *event;
   char *arg;
   char *vcd_name;
@@ -44,16 +51,39 @@ void vcd_write_header(vcd_vars *v, int n)
 "$version\n"
 "  to_vcd\n"
 "$end\n"
-"$timescale 1ns $end\n"
+"$timescale 1ns $end\n") <= 0) abort();
+
+  if (fprintf(out,
 "$scope module logic $end\n") <= 0) abort();
+  for (i = 0; i < n; i++)
+    if (v[i].type == DEFAULT)
+      if (fprintf(out, "$var wire %d %s %s $end\n",
+             v[i].boolean ? 1 : 64,
+             v[i].vcd_name, v[i].vcd_name) <= 0) abort();
+  if (fprintf(out,
+"$upscope $end\n") <= 0) abort();
 
+  if (fprintf(out,
+"$scope module functions $end\n") <= 0) abort();
+  for (i = 0; i < n; i++)
+    if (v[i].type == VCD_FUNCTION)
+      if (fprintf(out, "$var wire %d %s %s $end\n",
+             v[i].boolean ? 1 : 64,
+             v[i].vcd_name, v[i].vcd_name) <= 0) abort();
+  if (fprintf(out,
+"$upscope $end\n") <= 0) abort();
+
+  if (fprintf(out,
+"$scope module variables $end\n") <= 0) abort();
   for (i = 0; i < n; i++)
-    if (fprintf(out, "$var wire %d %s %s $end\n",
-           v[i].boolean ? 1 : 64,
-           v[i].vcd_name, v[i].vcd_name) <= 0) abort();
+    if (v[i].type == VCD_VARIABLE)
+      if (fprintf(out, "$var wire %d %s %s $end\n",
+             v[i].boolean ? 1 : 64,
+             v[i].vcd_name, v[i].vcd_name) <= 0) abort();
+  if (fprintf(out,
+"$upscope $end\n") <= 0) abort();
 
   if (fprintf(out,
-"$upscope $end\n"
 "$enddefinitions $end\n"
 "$dumpvars\n") <= 0) abort();
 
@@ -194,12 +224,13 @@ void force_stop(int x)
 }
 
 vcd_vars *add_var(vcd_vars *vars, int nvars,
-    char *event, char *arg, char *vcd_name, int is_boolean)
+    char *event, char *arg, char *vcd_name, int is_boolean, enum var_type t)
 {
   if (nvars % 64 == 0) {
     vars = realloc(vars, (nvars+64) * sizeof(vcd_vars));
     if (vars == NULL) abort();
   }
+  vars[nvars].type = t;
   vars[nvars].event = event;
   vars[nvars].arg = arg;
   vars[nvars].vcd_name = vcd_name;
@@ -240,7 +271,7 @@ int main(int n, char **v)
       char *event    = v[++i];
       char *arg      = v[++i];
       char *vcd_name = v[++i];
-      vars = add_var(vars, nvars, event, arg, vcd_name, 1);
+      vars = add_var(vars, nvars, event, arg, vcd_name, 1, DEFAULT);
       nvars++;
       continue;
     }
@@ -248,7 +279,7 @@ int main(int n, char **v)
       char *event    = v[++i];
       char *arg      = v[++i];
       char *vcd_name = v[++i];
-      vars = add_var(vars, nvars, event, arg, vcd_name, 0);
+      vars = add_var(vars, nvars, event, arg, vcd_name, 0, DEFAULT);
       nvars++;
       continue;
     }
@@ -283,20 +314,30 @@ int main(int n, char **v)
     /* activate all VCD traces */
     for (i = 0; i < number_of_events; i++) {
       int is_boolean;
+      enum var_type type;
       int prefix_length;
       char *name = event_name_from_id(database, i);
+      char *vcd_name;
       char *var_prefix = "VCD_VARIABLE_";
       char *fun_prefix = "VCD_FUNCTION_";
       if (!strncmp(name, var_prefix, strlen(var_prefix))) {
         prefix_length = strlen(var_prefix);
         is_boolean = 0;
+        type = VCD_VARIABLE;
       } else if (!strncmp(name, fun_prefix, strlen(fun_prefix))) {
         prefix_length = strlen(fun_prefix);
         is_boolean = 1;
+        type = VCD_FUNCTION;
       } else
         continue;
+      vcd_name = event_vcd_name_from_id(database, i);
+      if (vcd_name == NULL) {
+        vcd_name = name+prefix_length;
+        printf("WARNING: ID %s does not define VCD_NAME in the file %s, using %s\n",
+              name, database_filename, vcd_name);
+      }
       vars = add_var(vars, nvars,
-          name, "value", name+prefix_length, is_boolean);
+          name, "value", vcd_name, is_boolean, type);
       nvars++;
     }
   }
diff --git a/common/utils/T/tracer/ue.c b/common/utils/T/tracer/ue.c
index 6a7d03c897357c5e0d2cbbe07239fcb2bf2ebcfc..7b03210cd2cb3d7884fa57c6531e08d58a3aa141 100644
--- a/common/utils/T/tracer/ue.c
+++ b/common/utils/T/tracer/ue.c
@@ -857,6 +857,7 @@ int main(int n, char **v)
 
 restart:
   clear_remote_config();
+  if (ue_data.socket != -1) close(ue_data.socket);
   ue_data.socket = connect_to(ip, port);
 
   /* send the first message - activate selected traces */
diff --git a/common/utils/T/tracer/utils.c b/common/utils/T/tracer/utils.c
index 507154673538a4570c058f1af5ecf4db8771871d..7f58b6f5aa0061189d01a5107d8e6dcea035138a 100644
--- a/common/utils/T/tracer/utils.c
+++ b/common/utils/T/tracer/utils.c
@@ -79,6 +79,36 @@ list *list_append(list *l, void *data)
 /* socket                                                                   */
 /****************************************************************************/
 
+int create_listen_socket(char *addr, int port)
+{
+  struct sockaddr_in a;
+  int s;
+  int v;
+
+  s = socket(AF_INET, SOCK_STREAM, 0);
+  if (s == -1) { perror("socket"); exit(1); }
+  v = 1;
+  if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(int)))
+    { perror("setsockopt"); exit(1); }
+
+  a.sin_family = AF_INET;
+  a.sin_port = htons(port);
+  a.sin_addr.s_addr = inet_addr(addr);
+
+  if (bind(s, (struct sockaddr *)&a, sizeof(a))) { perror("bind"); exit(1); }
+  if (listen(s, 5)) { perror("listen"); exit(1); }
+
+  return s;
+}
+
+int socket_accept(int s)
+{
+  struct sockaddr_in a;
+  socklen_t alen;
+  alen = sizeof(a);
+  return accept(s, (struct sockaddr *)&a, &alen);
+}
+
 int socket_send(int socket, void *buffer, int size)
 {
   char *x = buffer;
@@ -94,26 +124,13 @@ int socket_send(int socket, void *buffer, int size)
 
 int get_connection(char *addr, int port)
 {
-  struct sockaddr_in a;
-  socklen_t alen;
   int s, t;
 
   printf("waiting for connection on %s:%d\n", addr, port);
 
-  s = socket(AF_INET, SOCK_STREAM, 0);
-  if (s == -1) { perror("socket"); exit(1); }
-  t = 1;
-  if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &t, sizeof(int)))
-    { perror("setsockopt"); exit(1); }
-
-  a.sin_family = AF_INET;
-  a.sin_port = htons(port);
-  a.sin_addr.s_addr = inet_addr(addr);
+  s = create_listen_socket(addr, port);
 
-  if (bind(s, (struct sockaddr *)&a, sizeof(a))) { perror("bind"); exit(1); }
-  if (listen(s, 5)) { perror("bind"); exit(1); }
-  alen = sizeof(a);
-  t = accept(s, (struct sockaddr *)&a, &alen);
+  t = socket_accept(s);
   if (t == -1) { perror("accept"); exit(1); }
   close(s);
 
@@ -137,14 +154,11 @@ int fullread(int fd, void *_buf, int count)
   return ret;
 }
 
-int connect_to(char *addr, int port)
+int try_connect_to(char *addr, int port)
 {
   int s;
   struct sockaddr_in a;
 
-  printf("connecting to %s:%d\n", addr, port);
-
-again:
   s = socket(AF_INET, SOCK_STREAM, 0);
   if (s == -1) { perror("socket"); exit(1); }
 
@@ -155,6 +169,21 @@ again:
   if (connect(s, (struct sockaddr *)&a, sizeof(a)) == -1) {
     perror("connect");
     close(s);
+    return -1;
+  }
+
+  return s;
+}
+
+int connect_to(char *addr, int port)
+{
+  int s;
+
+  printf("connecting to %s:%d\n", addr, port);
+
+again:
+  s = try_connect_to(addr, port);
+  if (s == -1) {
     printf("trying again in 1s\n");
     sleep(1);
     goto again;
diff --git a/common/utils/T/tracer/utils.h b/common/utils/T/tracer/utils.h
index 3be6cfe1a7f67af65282d7494c7d1a172fc163d7..6784117fa6cf66d3ffc33e191924f385dacc888d 100644
--- a/common/utils/T/tracer/utils.h
+++ b/common/utils/T/tracer/utils.h
@@ -24,11 +24,14 @@ list *list_append(list *l, void *data);
 #define DEFAULT_REMOTE_IP "127.0.0.1"
 #define DEFAULT_REMOTE_PORT 2021
 
+int create_listen_socket(char *addr, int port);
+int socket_accept(int s);
 /* socket_send: return 0 if okay, -1 on error */
 int socket_send(int socket, void *buffer, int size);
 int get_connection(char *addr, int port);
 /* fullread: return length read if okay (that is: 'count'), -1 on error */
 int fullread(int fd, void *_buf, int count);
+int try_connect_to(char *addr, int port);
 int connect_to(char *addr, int port);
 
 /****************************************************************************/
diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c
index 2e38b660d7e9256d4de3c88ab6acffe9186b7561..d088b59c041b8abeaf2408f0369a98588574537a 100644
--- a/common/utils/itti/intertask_interface.c
+++ b/common/utils/itti/intertask_interface.c
@@ -745,7 +745,7 @@ void itti_exit_task(void)
 
 #if defined(OAI_EMU) || defined(RTAI)
   if (task_id > TASK_UNKNOWN) {
-    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG,
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_ITTI_RECV_MSG,
                                             __sync_and_and_fetch (&itti_desc.vcd_receive_msg, ~(1L << task_id)));
   }
 #endif
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
index a693cb55e4ce0a0922520b28b7540963458061cf..50b09102d88857b2b1a2cabf439e2e81a28f2d70 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
@@ -40,8 +40,14 @@
 #include<math.h>
 #include <stdlib.h>
 #include <string.h>
+#include <linux/version.h>
+#if RHEL_RELEASE_CODE >= 1796
+#include <lapacke/lapacke_utils.h>
+#include <lapacke/lapacke.h>
+#else
 #include <lapacke_utils.h>
 #include <lapacke.h>
+#endif
 #include <cblas.h>
 #include "linear_preprocessing_rec.h"
 
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
index d85d440193757044eedadaf820ef4d46b47eddb6..7d063e326effc919180e5ebe12c02fa19d85b6a2 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
@@ -13,9 +13,14 @@ data storage. */
 #include <stdlib.h>
 #include <cblas.h>
 #include <string.h>
+#include <linux/version.h>
+#if RHEL_RELEASE_CODE >= 1796
+#include <lapacke/lapacke_utils.h>
+#include <lapacke/lapacke.h>
+#else
 #include <lapacke_utils.h>
 #include <lapacke.h>
-
+#endif
 //#define DEBUG_PREPROC
 
 
@@ -366,4 +371,4 @@ float sqrt_float(float x, float sqrt_x)
 {
   sqrt_x = (float)(sqrt((double)(x)));
   return sqrt_x;
-}
\ No newline at end of file
+}
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index 2b6931effa66453a2df29a73b0342053d4fccf4e..737397d8d497f1b99252427ccb84c6a42d1a02f1 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -2355,12 +2355,12 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) {
 #endif
 	      } 
 	      if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) {
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1;
+		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
 	      } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) {
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1;
+		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
 	      } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) {
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1;
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1;
+		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
+		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
 	      }
 	    }
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
index 05498e4377b0abb24a883da61da4a027cebed93c..df52b83d729b4087ba4d137da71bfcb339440252 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
@@ -386,6 +386,7 @@ set_ul_DAI(int module_idP, int UE_idP, int CC_idP, int frameP,
         UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI;
         break;
       }
+      break;
 
     case 2:
       //      if ((subframeP==3)||(subframeP==8))
diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c
index f8a420697a95d043d2f5870d2c55ca8279567ed5..f5d31742bc400c4cc055d8950ae633c65b9beec0 100644
--- a/openair2/NETWORK_DRIVER/MESH/device.c
+++ b/openair2/NETWORK_DRIVER/MESH/device.c
@@ -324,7 +324,11 @@ static const struct net_device_ops nasmesh_netdev_ops = {
   .ndo_set_mac_address  = NULL,
   .ndo_set_config     = nas_set_config,
   .ndo_do_ioctl       = nas_CTL_ioctl,
+#if RHEL_RELEASE_CODE>=1797
+  .extended.ndo_change_mtu   = nas_change_mtu,
+#else
   .ndo_change_mtu   = nas_change_mtu,
+#endif
   .ndo_tx_timeout   = nas_tx_timeout,
 };
 
diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c
index d9a91496859a70cb62c4d699206ce5178f259dfe..47c820fe775330dd0aa9de35052667f31e4b0266 100644
--- a/openair2/NETWORK_DRIVER/UE_IP/device.c
+++ b/openair2/NETWORK_DRIVER/UE_IP/device.c
@@ -349,7 +349,11 @@ static const struct net_device_ops ue_ip_netdev_ops = {
   .ndo_set_mac_address    = ue_ip_set_mac_address,
   .ndo_set_config         = ue_ip_set_config,
   .ndo_do_ioctl           = NULL,
-  .ndo_change_mtu         = ue_ip_change_mtu,
+#if RHEL_RELEASE_CODE>=1797
+  .extended.ndo_change_mtu         = ue_ip_change_mtu,
+#else
+  .ndo_change_mtu   = ue_ip_change_mtu,
+#endif
   .ndo_tx_timeout         = ue_ip_tx_timeout,
   .ndo_change_rx_flags    = ue_ip_change_rx_flags,
 };
diff --git a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1
index db1f1b59150a5d17de2764d473ddd2627dc91d23..97d0a6de871ff1b8c4dd48a45df457f7d423223a 100755
--- a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1
+++ b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1
@@ -6881,3 +6881,201 @@ id-EDT-Session										ProtocolIE-ID ::= 281
 id-CNTypeRestrictions								ProtocolIE-ID ::= 282
 
 END
+
+-- **************************************************************
+--
+-- Container definitions
+--
+-- **************************************************************
+
+S1AP-Containers {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) s1ap (1) version1 (1) s1ap-Containers (5) }
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+	Criticality,
+	Presence,
+	PrivateIE-ID,
+	ProtocolExtensionID,
+	ProtocolIE-ID
+FROM S1AP-CommonDataTypes
+
+	maxPrivateIEs,
+	maxProtocolExtensions,
+	maxProtocolIEs
+FROM S1AP-Constants;
+
+-- **************************************************************
+--
+-- Class Definition for Protocol IEs
+--
+-- **************************************************************
+
+S1AP-PROTOCOL-IES ::= CLASS {
+	&id				ProtocolIE-ID 					UNIQUE,
+	&criticality	Criticality,
+	&Value,
+	&presence		Presence
+}
+WITH SYNTAX {
+	ID				&id
+	CRITICALITY		&criticality
+	TYPE			&Value
+	PRESENCE		&presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Protocol IEs
+--
+-- **************************************************************
+
+S1AP-PROTOCOL-IES-PAIR ::= CLASS {
+	&id					ProtocolIE-ID 				UNIQUE,
+	&firstCriticality	Criticality,
+	&FirstValue,
+	&secondCriticality	Criticality,
+	&SecondValue,
+	&presence			Presence
+}
+WITH SYNTAX {
+	ID				&id
+	FIRST CRITICALITY		&firstCriticality
+	FIRST TYPE				&FirstValue
+	SECOND CRITICALITY		&secondCriticality
+	SECOND TYPE				&SecondValue
+	PRESENCE				&presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Protocol Extensions
+--
+-- **************************************************************
+
+S1AP-PROTOCOL-EXTENSION ::= CLASS {
+	&id				ProtocolExtensionID			UNIQUE,
+	&criticality	Criticality,
+	&Extension,
+	&presence		Presence
+}
+WITH SYNTAX {
+	ID				&id
+	CRITICALITY		&criticality
+	EXTENSION		&Extension
+	PRESENCE		&presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Private IEs
+--
+-- **************************************************************
+
+S1AP-PRIVATE-IES ::= CLASS {
+	&id				PrivateIE-ID,
+	&criticality	Criticality,
+	&Value,
+	&presence		Presence
+}
+WITH SYNTAX {
+	ID				&id
+	CRITICALITY		&criticality
+	TYPE			&Value
+	PRESENCE		&presence
+}
+
+-- **************************************************************
+--
+-- Container for Protocol IEs
+--
+-- **************************************************************
+
+ProtocolIE-Container {S1AP-PROTOCOL-IES : IEsSetParam} ::= 
+	SEQUENCE (SIZE (0..maxProtocolIEs)) OF
+	ProtocolIE-Field {{IEsSetParam}}
+
+ProtocolIE-SingleContainer {S1AP-PROTOCOL-IES : IEsSetParam} ::= 
+	ProtocolIE-Field {{IEsSetParam}}
+
+ProtocolIE-Field {S1AP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE {
+	id				S1AP-PROTOCOL-IES.&id				({IEsSetParam}),
+	criticality		S1AP-PROTOCOL-IES.&criticality		({IEsSetParam}{@id}),
+	value			S1AP-PROTOCOL-IES.&Value			({IEsSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container for Protocol IE Pairs
+--
+-- **************************************************************
+
+ProtocolIE-ContainerPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= 
+	SEQUENCE (SIZE (0..maxProtocolIEs)) OF
+	ProtocolIE-FieldPair {{IEsSetParam}}
+
+ProtocolIE-FieldPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= SEQUENCE {
+	id					S1AP-PROTOCOL-IES-PAIR.&id					({IEsSetParam}),
+	firstCriticality	S1AP-PROTOCOL-IES-PAIR.&firstCriticality	({IEsSetParam}{@id}),
+	firstValue			S1AP-PROTOCOL-IES-PAIR.&FirstValue			({IEsSetParam}{@id}),
+	secondCriticality	S1AP-PROTOCOL-IES-PAIR.&secondCriticality	({IEsSetParam}{@id}),
+	secondValue			S1AP-PROTOCOL-IES-PAIR.&SecondValue		({IEsSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container Lists for Protocol IE Containers
+--
+-- **************************************************************
+
+ProtocolIE-ContainerList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES : IEsSetParam} ::=
+	SEQUENCE (SIZE (lowerBound..upperBound)) OF
+	ProtocolIE-SingleContainer {{IEsSetParam}}
+
+ProtocolIE-ContainerPairList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::=
+	SEQUENCE (SIZE (lowerBound..upperBound)) OF
+	ProtocolIE-ContainerPair {{IEsSetParam}}
+
+-- **************************************************************
+--
+-- Container for Protocol Extensions
+--
+-- **************************************************************
+
+ProtocolExtensionContainer {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= 
+	SEQUENCE (SIZE (1..maxProtocolExtensions)) OF
+	ProtocolExtensionField {{ExtensionSetParam}}
+
+ProtocolExtensionField {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= SEQUENCE {
+	id					S1AP-PROTOCOL-EXTENSION.&id				({ExtensionSetParam}),
+	criticality			S1AP-PROTOCOL-EXTENSION.&criticality	({ExtensionSetParam}{@id}),
+	extensionValue		S1AP-PROTOCOL-EXTENSION.&Extension		({ExtensionSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container for Private IEs
+--
+-- **************************************************************
+
+PrivateIE-Container {S1AP-PRIVATE-IES : IEsSetParam } ::= 
+	SEQUENCE (SIZE (1.. maxPrivateIEs)) OF
+	PrivateIE-Field {{IEsSetParam}}
+
+PrivateIE-Field {S1AP-PRIVATE-IES : IEsSetParam} ::= SEQUENCE {
+	id					S1AP-PRIVATE-IES.&id				({IEsSetParam}),
+	criticality			S1AP-PRIVATE-IES.&criticality		({IEsSetParam}{@id}),
+	value				S1AP-PRIVATE-IES.&Value				({IEsSetParam}{@id})
+}
+
+END
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index 891dd9e272ff29cbe523236a3eff4b1cc206df4f..a0339e8f0f738ce18ab909710d7c01d73e8ca9fb 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -121,7 +121,7 @@ extern int emulate_rf;
 extern int numerology;
 extern int fepw;
 extern int single_thread_flag;
-
+extern clock_source_t clock_source;
 
 extern void  phy_init_RU(RU_t*);
 extern void  phy_free_RU(RU_t*);
@@ -1411,7 +1411,8 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
   cfg->num_rb_dl=fp->N_RB_DL;
   cfg->tx_num_channels=ru->nb_tx;
   cfg->rx_num_channels=ru->nb_rx;
-  
+  cfg->clock_source=clock_source;
+
   for (i=0; i<ru->nb_tx; i++) {
     
     cfg->tx_freq[i] = (double)fp->dl_CarrierFreq;
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 7ff57fee3e4572ecf899aa1596f658760ad2b43f..e84f99e67f4126d2a6ee8b0efe49099a12022a34 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -130,7 +130,7 @@ volatile int             start_UE = 0;
 #endif
 volatile int             oai_exit = 0;
 
-static clock_source_t clock_source = internal;
+clock_source_t clock_source = internal;
 static int wait_for_sync = 0;
 
 unsigned int                    mmapped_dma=0;
@@ -942,7 +942,7 @@ int main( int argc, char **argv )
 
   printf("Reading in command-line options\n");
 
-  get_options (); 
+  get_options ();
   if (CONFIG_ISFLAGSET(CONFIG_ABORT) ) {
       fprintf(stderr,"Getting configuration failed\n");
       exit(-1);
@@ -1131,13 +1131,6 @@ int main( int argc, char **argv )
   
   rt_sleep_ns(10*100000000ULL);
 
-  if (nfapi_mode) {
-
-    printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n");
-    pthread_cond_init(&sync_cond,NULL);
-    pthread_mutex_init(&sync_mutex, NULL);
-  }
-  
   if (nfapi_mode)
   {
     printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n");
diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h
index 5590e3a93196c273014e630004a66e4798e8ab12..2f8209f2d311ab5214952e670f4d6c4c19335b51 100644
--- a/targets/RT/USER/lte-softmodem.h
+++ b/targets/RT/USER/lte-softmodem.h
@@ -65,7 +65,7 @@
 #define CONFIG_HLP_UELOOP        "get softmodem (UE) to loop through memory instead of acquiring from HW\n"
 #define CONFIG_HLP_PHYTST        "test UE phy layer, mac disabled\n"
 #define CONFIG_HLP_DMAMAP        "sets flag for improved EXMIMO UE performance\n"  
-#define CONFIG_HLP_EXCCLK        "tells hardware to use an external clock reference\n"
+#define CONFIG_HLP_CLK           "tells hardware to use a clock reference (0:internal, 1:external, 2:gpsdo)\n"
 #define CONFIG_HLP_USIM          "use XOR autentication algo in case of test usim mode\n" 
 #define CONFIG_HLP_NOSNGLT       "Disables single-thread mode in lte-softmodem\n" 
 #define CONFIG_HLP_TADV          "Set timing_advance\n"
@@ -161,7 +161,7 @@
 {"phy-test",                CONFIG_HLP_PHYTST,      PARAMFLAG_BOOL,         iptr:&phy_test,                     defintval:0,                    TYPE_INT,       0},                     \
 {"usim-test",               CONFIG_HLP_USIM,        PARAMFLAG_BOOL,         u8ptr:&usim_test,                   defintval:0,                    TYPE_UINT8,     0},                     \
 {"mmapped-dma",             CONFIG_HLP_DMAMAP,      PARAMFLAG_BOOL,         uptr:&mmapped_dma,                  defintval:0,                    TYPE_INT,       0},                     \
-{"external-clock",          CONFIG_HLP_EXCCLK,      PARAMFLAG_BOOL,         uptr:&clock_source,                 defintval:0,                    TYPE_INT,       0},                     \
+{"clock",                   CONFIG_HLP_CLK,         0,                      uptr:&clock_source,                 defintval:0,                    TYPE_UINT,      0},                     \
 {"wait-for-sync",           NULL,                   PARAMFLAG_BOOL,         iptr:&wait_for_sync,                defintval:0,                    TYPE_INT,       0},                     \
 {"single-thread-enable",    CONFIG_HLP_NOSNGLT,     PARAMFLAG_BOOL,         iptr:&single_thread_flag,           defintval:0,                    TYPE_INT,       0},                     \
 {"threadIQ",                NULL,                   0,                      iptr:&(threads.iq),                 defintval:1,                    TYPE_INT,       0},                     \
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index 03283beb985f1afe7111c99822a843f537c51ce3..a2a12f9dd9f301a43c0f6a9767db995bc5d2f8a6 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -136,7 +136,7 @@ volatile int             start_UE = 0;
 #endif
 volatile int             oai_exit = 0;
 
-static clock_source_t clock_source = internal;
+clock_source_t clock_source = internal;
 static int wait_for_sync = 0;
 
 unsigned int                    mmapped_dma=0;