diff --git a/common/utils/itti_analyzer/libbuffers/socket.c b/common/utils/itti_analyzer/libbuffers/socket.c
index 27d9316d6f5ab54c3b9a222d4ff24a5595d64c24..ff5e28fd3c0e1cb450c073563817f58c7bf10018 100644
--- a/common/utils/itti_analyzer/libbuffers/socket.c
+++ b/common/utils/itti_analyzer/libbuffers/socket.c
@@ -84,7 +84,7 @@ static int socket_read_itti_message(socket_data_t        *socket_data,
 
     g_assert(message_header != NULL);
 
-    // g_debug("Attempting to read signal header from socket");
+    g_debug("Attempting to read signal header from socket");
 
     /* Read the sub-header of signal */
     while (data_read != sizeof(itti_signal_header_t)) {
@@ -124,7 +124,7 @@ static int socket_read_itti_message(socket_data_t        *socket_data,
         socket_notify_gui_update(socket_data);
     }
 
-    // g_debug("Successfully read new signal %u from socket", itti_signal_header.message_number);
+    g_debug("Successfully read new signal %u from socket", itti_signal_header.message_number);
 
     return total_data_read + sizeof(itti_signal_header);
 }
diff --git a/common/utils/itti_analyzer/libparser/array_type.c b/common/utils/itti_analyzer/libparser/array_type.c
index 2537839c559b5fcb0fcdb2e7b26a2f884c9241c7..0a2fe60b57db6f7ada5b9b474a14c2e426a0a491 100644
--- a/common/utils/itti_analyzer/libparser/array_type.c
+++ b/common/utils/itti_analyzer/libparser/array_type.c
@@ -8,10 +8,12 @@
 #include "ui_interface.h"
 
 int array_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
 {
-    struct types_s *type_child;
+    types_t *type_child;
+    int  length = 0;
+    char cbuf[50];
 
     DISPLAY_PARSE_INFO("array", type->name, offset, parent_offset);
 
@@ -49,22 +51,23 @@ int array_dissect_from_buffer(
             }
         }
         for (i = 0; i < (items - zero_counter); i++)
+        {
+            INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "[%d] ", i));
+            ui_set_signal_text_cb(user_data, cbuf, length);
+
             type->child->type_dissect_from_buffer (
                 type->child, ui_set_signal_text_cb, user_data, buffer, parent_offset,
-                offset + i * type_child->size, type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE);
+                offset + i * type_child->size, indent,
+                FALSE);
+        }
         if (zero_counter > 0)
         {
-            int  length = 0;
-            char cbuf[50];
-
-            INDENTED_STRING(cbuf, type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE,);
-
-            length = sprintf(cbuf, "[%d .. %d]  ", i, items -1);
-
+            INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "[%d .. %d] ", i, items -1));
             ui_set_signal_text_cb(user_data, cbuf, length);
+
             type->child->type_dissect_from_buffer (
                 type->child, ui_set_signal_text_cb, user_data,
-                buffer, parent_offset, offset + i * type_child->size, 0);
+                buffer, parent_offset, offset + i * type_child->size, indent, FALSE);
         }
     }
     if (type->name) {
@@ -74,7 +77,7 @@ int array_dissect_from_buffer(
     return 0;
 }
 
-int array_type_file_print(struct types_s *type, int indent, FILE *file) {
+int array_type_file_print(types_t *type, int indent, FILE *file) {
     if (type == NULL)
         return -1;
     INDENTED(file, indent, fprintf(file, "<Array>\n"));
@@ -93,7 +96,7 @@ int array_type_file_print(struct types_s *type, int indent, FILE *file) {
     return 0;
 }
 
-int array_type_hr_display(struct types_s *type, int indent) {
+int array_type_hr_display(types_t *type, int indent) {
     if (type == NULL)
         return -1;
     INDENTED(stdout, indent, printf("<Array>\n"));
diff --git a/common/utils/itti_analyzer/libparser/array_type.h b/common/utils/itti_analyzer/libparser/array_type.h
index 3dd9571af600bd19c81228c0faad8ab8a21b0b13..3d7273c1e227b6a37e6afa1bb1f2c6984ee7f790 100644
--- a/common/utils/itti_analyzer/libparser/array_type.h
+++ b/common/utils/itti_analyzer/libparser/array_type.h
@@ -4,11 +4,11 @@
 #define ARRAY_TYPE_H_
 
 int array_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
-int array_type_hr_display(struct types_s *type, int indent);
+int array_type_hr_display(types_t *type, int indent);
 
-int array_type_file_print(struct types_s *type, int indent, FILE *file);
+int array_type_file_print(types_t *type, int indent, FILE *file);
 
 #endif /* ARRAY_TYPE_H_ */
diff --git a/common/utils/itti_analyzer/libparser/enum_type.c b/common/utils/itti_analyzer/libparser/enum_type.c
index 889d40a72865f67ad8e9a2502da0cd38ec76d615..734cbac7a0ef86b8d65bedb0f425cd1ecd5b6747 100644
--- a/common/utils/itti_analyzer/libparser/enum_type.c
+++ b/common/utils/itti_analyzer/libparser/enum_type.c
@@ -6,7 +6,7 @@
 #include "enum_type.h"
 #include "ui_interface.h"
 
-char *enum_type_get_name_from_value(struct types_s *type, uint32_t value)
+char *enum_type_get_name_from_value(types_t *type, uint32_t value)
 {
     char    *enum_name = "UNKNOWN";
     types_t *enum_value;
@@ -22,8 +22,8 @@ char *enum_type_get_name_from_value(struct types_s *type, uint32_t value)
 }
 
 int enum_type_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
 {
     uint32_t value = 0;
     types_t *values;
@@ -37,7 +37,7 @@ int enum_type_dissect_from_buffer(
             values->parent = type;
             values->type_dissect_from_buffer(
                 values, ui_set_signal_text_cb, user_data, buffer, offset, parent_offset,
-                type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE);
+                type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE, FALSE);
             break;
         }
     }
@@ -46,14 +46,13 @@ int enum_type_dissect_from_buffer(
         char cbuf[50];
 
         length = sprintf(cbuf, "(0x%08x) UNKNOWN;\n", value);
-
         ui_set_signal_text_cb(user_data, cbuf, length);
     }
 
     return 0;
 }
 
-int enum_type_file_print(struct types_s *type, int indent, FILE *file)
+int enum_type_file_print(types_t *type, int indent, FILE *file)
 {
     types_t *values;
 
@@ -77,7 +76,7 @@ int enum_type_file_print(struct types_s *type, int indent, FILE *file)
     return 0;
 }
 
-int enum_type_hr_display(struct types_s *type, int indent)
+int enum_type_hr_display(types_t *type, int indent)
 {
     types_t *values;
 
diff --git a/common/utils/itti_analyzer/libparser/enum_type.h b/common/utils/itti_analyzer/libparser/enum_type.h
index 27501ffa45c75306baf9170404c18827386bac80..3c3d918b1c23ee0e0090d6e854d3c4f6bb16b1e3 100644
--- a/common/utils/itti_analyzer/libparser/enum_type.h
+++ b/common/utils/itti_analyzer/libparser/enum_type.h
@@ -3,14 +3,14 @@
 #ifndef ENUM_TYPE_H_
 #define ENUM_TYPE_H_
 
-char *enum_type_get_name_from_value(struct types_s *type, uint32_t value);
+char *enum_type_get_name_from_value(types_t *type, uint32_t value);
 
 int enum_type_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
-int enum_type_file_print(struct types_s *type, int indent, FILE *file);
+int enum_type_file_print(types_t *type, int indent, FILE *file);
 
-int enum_type_hr_display(struct types_s *type, int indent);
+int enum_type_hr_display(types_t *type, int indent);
 
 #endif /* ENUM_TYPE_H_ */
diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.c b/common/utils/itti_analyzer/libparser/enum_value_type.c
index bb560ae98337fb4804b4db48b62a3c68f53af483..472fcb8064788313219a8faa379097eef2c40e7a 100644
--- a/common/utils/itti_analyzer/libparser/enum_value_type.c
+++ b/common/utils/itti_analyzer/libparser/enum_value_type.c
@@ -9,10 +9,10 @@
 uint32_t last_enum_value;
 
 int enum_value_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
 {
-    struct types_s *type_parent = NULL;
+    types_t *type_parent = NULL;
     uint32_t value = 0;
 
     DISPLAY_PARSE_INFO("enum_value", type->name, offset, parent_offset);
@@ -40,16 +40,14 @@ int enum_value_dissect_from_buffer(
                 last_enum_value = 0;
             }
         }
-        sprintf(cbuf, "(0x%08x)  %s;\n", value, type->name);
-        length = strlen(cbuf);
-
+        length = sprintf(cbuf, "(0x%08x) %s;\n", value, type->name);
         ui_set_signal_text_cb(user_data, cbuf, length);
     }
 
     return 0;
 }
 
-int enum_value_file_print(struct types_s *type, int indent, FILE *file)
+int enum_value_file_print(types_t *type, int indent, FILE *file)
 {
     if (type == NULL)
         return -1;
@@ -63,7 +61,7 @@ int enum_value_file_print(struct types_s *type, int indent, FILE *file)
     return 0;
 }
 
-int enum_value_type_hr_display(struct types_s *type, int indent)
+int enum_value_type_hr_display(types_t *type, int indent)
 {
     if (type == NULL)
         return -1;
diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.h b/common/utils/itti_analyzer/libparser/enum_value_type.h
index 6db11524828b0e7921aa98b478d154af00970d3c..8f6249733a6093998d35235362a35bc8d1fe62e0 100644
--- a/common/utils/itti_analyzer/libparser/enum_value_type.h
+++ b/common/utils/itti_analyzer/libparser/enum_value_type.h
@@ -6,11 +6,11 @@
 extern uint32_t last_enum_value;
 
 int enum_value_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
-int enum_value_file_print(struct types_s *type, int indent, FILE *file);
+int enum_value_file_print(types_t *type, int indent, FILE *file);
 
-int enum_value_type_hr_display(struct types_s *type, int indent);
+int enum_value_type_hr_display(types_t *type, int indent);
 
 #endif /* ENUM_VALUE_TYPE_H_ */
diff --git a/common/utils/itti_analyzer/libparser/field_type.c b/common/utils/itti_analyzer/libparser/field_type.c
index 44c7ae3d4113b1f59ca5952ca7fbe78f5ca1cc1e..c681e27af35eb6840d80786b44a6cd1ba23f0b6a 100644
--- a/common/utils/itti_analyzer/libparser/field_type.c
+++ b/common/utils/itti_analyzer/libparser/field_type.c
@@ -10,14 +10,14 @@
 #include "ui_interface.h"
 
 int field_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
 {
     int length = 0;
     char cbuf[50];
-    struct types_s *type_child;
+    types_t *type_child;
     char array_info[50];
-    int indent_child;
+    new_line = FALSE;
 
     DISPLAY_PARSE_INFO("field", type->name, offset, parent_offset);
 
@@ -41,7 +41,7 @@ int field_dissect_from_buffer(
                 }
 
                 if (type_child->type == TYPE_ARRAY) {
-                    struct types_s *type_array_child;
+                    types_t *type_array_child;
 
                     /* Ignore TYPEDEF children */
                     for (type_array_child = type_child->child;
@@ -56,34 +56,45 @@ int field_dissect_from_buffer(
                 }
 
                 DISPLAY_TYPE("Fld");
-                INDENTED_STRING(cbuf, indent, sprintf(cbuf, ".%s%s = ", type->name ? type->name : "Field", array_info));
-                length = strlen (cbuf);
 
+                INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, ".%s%s = ", type->name ? type->name : "Field", array_info));
                 ui_set_signal_text_cb(user_data, cbuf, length);
 
-                indent_child = indent;
-                if (type_child->type == TYPE_ARRAY || type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) {
+                if (type_child->type == TYPE_ARRAY) {
                     DISPLAY_BRACE(ui_set_signal_text_cb(user_data, "{", 1);)
                     ui_set_signal_text_cb(user_data, "\n", 1);
-                    indent_child += DISPLAY_TAB_SIZE;
+                    new_line = TRUE;
                 }
-                if (type_child->type == TYPE_FUNDAMENTAL || type_child->type == TYPE_POINTER) {
-                    indent_child = 0;
+                /*
+                if (type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) {
+                    DISPLAY_BRACE(ui_set_signal_text_cb(user_data, "{", 1);)
+                    ui_set_signal_text_cb(user_data, "\n", 1);
+                    new_line = TRUE;
                 }
+                */
 
                 type->child->parent = type;
-                CHECK_FCT(type->child->type_dissect_from_buffer(
-                        type->child, ui_set_signal_text_cb, user_data, buffer,
-                        parent_offset, offset + type->offset, indent_child));
+                type->child->type_dissect_from_buffer(
+                    type->child, ui_set_signal_text_cb, user_data, buffer,
+                    parent_offset, offset + type->offset, new_line ? indent + DISPLAY_TAB_SIZE : indent, new_line);
+
+                DISPLAY_BRACE(
+                        if (type_child->type == TYPE_ARRAY) {
+                            DISPLAY_TYPE("Fld");
 
+                            INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n"));
+                            ui_set_signal_text_cb(user_data, cbuf, length);
+                        });
+                /*
                 DISPLAY_BRACE(
-                        if (type_child->type == TYPE_ARRAY || type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) {
+                        if (type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) {
                             DISPLAY_TYPE("Fld");
                             INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n"));
                             length = strlen (cbuf);
 
                             ui_set_signal_text_cb(user_data, cbuf, length);
                         });
+                        */
             }
         }
     }
@@ -94,19 +105,16 @@ int field_dissect_from_buffer(
         CHECK_FCT(buffer_fetch_bits(buffer, offset + type->offset + parent_offset, type->bits, &value));
 
         DISPLAY_TYPE("Fld");
-        INDENTED_STRING(
-                cbuf,
-                indent,
-                sprintf(cbuf, ".%s:%d = (0x%0*x)  %d;\n", type->name ? type->name : "Field", type->bits, (type->bits + 3) / 4, value, value));
-        length = strlen (cbuf);
 
+        INDENTED_STRING(cbuf, indent,
+                length = sprintf(cbuf, ".%s:%d = (0x%0*x) %d;\n", type->name ? type->name : "Field", type->bits, (type->bits + 3) / 4, value, value));
         ui_set_signal_text_cb(user_data, cbuf, length);
     }
 
     return 0;
 }
 
-int field_type_file_print(struct types_s *type, int indent, FILE *file) {
+int field_type_file_print(types_t *type, int indent, FILE *file) {
     if (type == NULL)
         return -1;
     INDENTED(file, indent, fprintf(file, "<Field>\n"));
@@ -127,7 +135,7 @@ int field_type_file_print(struct types_s *type, int indent, FILE *file) {
     return 0;
 }
 
-int field_type_hr_display(struct types_s *type, int indent) {
+int field_type_hr_display(types_t *type, int indent) {
     if (type == NULL)
         return -1;
     INDENTED(stdout, indent, printf("<Field>\n"));
diff --git a/common/utils/itti_analyzer/libparser/field_type.h b/common/utils/itti_analyzer/libparser/field_type.h
index bf23cb8dc257bc12ea5f7372a3c1db8c557e1b55..9e2b5d56ad41b33b5cfa255fb870a1d706e86141 100644
--- a/common/utils/itti_analyzer/libparser/field_type.h
+++ b/common/utils/itti_analyzer/libparser/field_type.h
@@ -4,11 +4,11 @@
 #define FIELD_TYPE_H_
 
 int field_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
-int field_type_file_print(struct types_s *type, int indent, FILE *file);
+int field_type_file_print(types_t *type, int indent, FILE *file);
 
-int field_type_hr_display(struct types_s *type, int indent);
+int field_type_hr_display(types_t *type, int indent);
 
 #endif /* FIELD_TYPE_H_ */
diff --git a/common/utils/itti_analyzer/libparser/file_type.c b/common/utils/itti_analyzer/libparser/file_type.c
index 36db678f204099de40bcc8297fd3e0de2145630d..0ca1bc3a655d6ed5079057e476ac2a744e0c5414 100644
--- a/common/utils/itti_analyzer/libparser/file_type.c
+++ b/common/utils/itti_analyzer/libparser/file_type.c
@@ -5,7 +5,7 @@
 
 #include "file_type.h"
 
-int file_type_file_print(struct types_s *type, int indent, FILE *file)
+int file_type_file_print(types_t *type, int indent, FILE *file)
 {
     if (type == NULL)
         return -1;
@@ -17,7 +17,7 @@ int file_type_file_print(struct types_s *type, int indent, FILE *file)
     return 0;
 }
 
-int file_type_hr_display(struct types_s *type, int indent)
+int file_type_hr_display(types_t *type, int indent)
 {
     if (type == NULL)
         return -1;
diff --git a/common/utils/itti_analyzer/libparser/file_type.h b/common/utils/itti_analyzer/libparser/file_type.h
index a2ad0cc4602e67211b8c5270f0f9d2f7fb674a10..5f9a8640547455ec1c217281dc17f344272e808b 100644
--- a/common/utils/itti_analyzer/libparser/file_type.h
+++ b/common/utils/itti_analyzer/libparser/file_type.h
@@ -3,8 +3,8 @@
 #ifndef FILE_TYPE_H_
 #define FILE_TYPE_H_
 
-int file_type_file_print(struct types_s *type, int indent, FILE *file);
+int file_type_file_print(types_t *type, int indent, FILE *file);
 
-int file_type_hr_display(struct types_s *type, int indent);
+int file_type_hr_display(types_t *type, int indent);
 
 #endif /* FILE_TYPE_H_ */
diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.c b/common/utils/itti_analyzer/libparser/fundamental_type.c
index b3291adc6d42671b8a590b9aecdd88320c708dc7..51045b56ee66c7c1fac9e5a44a0e9d90c7d28b80 100644
--- a/common/utils/itti_analyzer/libparser/fundamental_type.c
+++ b/common/utils/itti_analyzer/libparser/fundamental_type.c
@@ -7,7 +7,7 @@
 #include "fundamental_type.h"
 #include "ui_interface.h"
 
-uint64_t fundamental_read_from_buffer(struct types_s *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset) {
+uint64_t fundamental_read_from_buffer(types_t *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset) {
     uint64_t value;
 
     switch (type->size) {
@@ -36,8 +36,8 @@ uint64_t fundamental_read_from_buffer(struct types_s *type, buffer_t *buffer, ui
 }
 
 int fundamental_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
 {
     int         length = 0;
     char        cbuf[200];
@@ -55,6 +55,7 @@ int fundamental_dissect_from_buffer(
 
     value64 = fundamental_read_from_buffer(type, buffer, offset, parent_offset);
 
+    indent = new_line ? indent : 0;
     if (indent > 0)
     {
         DISPLAY_TYPE("Fun");
@@ -63,39 +64,36 @@ int fundamental_dissect_from_buffer(
         case 8:
             value8 = (uint8_t) value64;
             INDENTED_STRING(cbuf, indent,
-                            sprintf(cbuf, type_unsigned ? "(0x%02" PRIx8 ")  %3" PRIu8 "  '%c';\n" : "(0x%02" PRIx8 ") %4" PRId8 "  '%c';\n", value8, value8, isprint(value8) ? value8 : '.'));
+                            length = sprintf(cbuf, type_unsigned ? "(0x%02" PRIx8 ") %3" PRIu8 " '%c';\n" : "(0x%02" PRIx8 ") %4" PRId8 " '%c';\n", value8, value8, isprint(value8) ? value8 : '.'));
             break;
 
         case 16:
             value16 = (uint16_t) value64;
             INDENTED_STRING(cbuf, indent,
-                            sprintf(cbuf, type_unsigned ? "(0x%04" PRIx16 ")  %5" PRIu16 ";\n" : "(0x%04" PRIx16 ")  %6" PRId16 ";\n", value16, value16));
+                            length = sprintf(cbuf, type_unsigned ? "(0x%04" PRIx16 ") %5" PRIu16 ";\n" : "(0x%04" PRIx16 ") %6" PRId16 ";\n", value16, value16));
             break;
 
         case 32:
             value32 = (uint32_t) value64;
             INDENTED_STRING(cbuf, indent,
-                            sprintf(cbuf, type_unsigned ? "(0x%08" PRIx32 ")  %9" PRIu32 ";\n" : "(0x%08" PRIx32 ")  %10" PRId32 ";\n", value32, value32));
+                            length = sprintf(cbuf, type_unsigned ? "(0x%08" PRIx32 ") %9" PRIu32 ";\n" : "(0x%08" PRIx32 ") %10" PRId32 ";\n", value32, value32));
             break;
 
         case 64:
             INDENTED_STRING(cbuf, indent,
-                            sprintf(cbuf, type_unsigned ? "(0x%016" PRIx64 ")  %20" PRIu64 ";\n" : "(0x%016" PRIx64 ")  %20" PRId64 ";\n", value64, value64));
+                            length = sprintf(cbuf, type_unsigned ? "(0x%016" PRIx64 ") %20" PRIu64 ";\n" : "(0x%016" PRIx64 ") %20" PRId64 ";\n", value64, value64));
             break;
 
         default:
             /* ??? */
             break;
     }
-
-    length = strlen (cbuf);
-
     ui_set_signal_text_cb(user_data, cbuf, length);
 
     return 0;
 }
 
-int fundamental_type_file_print(struct types_s *type, int indent, FILE *file) {
+int fundamental_type_file_print(types_t *type, int indent, FILE *file) {
     if (type == NULL)
         return -1;
     INDENTED(file, indent, fprintf(file, "<Fundamental>\n"));
@@ -109,7 +107,7 @@ int fundamental_type_file_print(struct types_s *type, int indent, FILE *file) {
     return 0;
 }
 
-int fundamental_type_hr_display(struct types_s *type, int indent) {
+int fundamental_type_hr_display(types_t *type, int indent) {
     if (type == NULL)
         return -1;
     INDENTED(stdout, indent, printf("<Fundamental>\n"));
diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.h b/common/utils/itti_analyzer/libparser/fundamental_type.h
index 0b58a426fedb7d70e8068ce5adea7ce764bdfec7..3d0870321b73bf425f56dbba19dd06abe62afec5 100644
--- a/common/utils/itti_analyzer/libparser/fundamental_type.h
+++ b/common/utils/itti_analyzer/libparser/fundamental_type.h
@@ -3,14 +3,14 @@
 #ifndef FUNDAMENTAL_TYPE_H_
 #define FUNDAMENTAL_TYPE_H_
 
-uint64_t fundamental_read_from_buffer(struct types_s *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset);
+uint64_t fundamental_read_from_buffer(types_t *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset);
 
 int fundamental_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
-int fundamental_type_file_print(struct types_s *type, int indent, FILE *file);
+int fundamental_type_file_print(types_t *type, int indent, FILE *file);
 
-int fundamental_type_hr_display(struct types_s *type, int indent);
+int fundamental_type_hr_display(types_t *type, int indent);
 
 #endif /* FUNDAMENTAL_TYPE_H_ */
diff --git a/common/utils/itti_analyzer/libparser/pointer_type.c b/common/utils/itti_analyzer/libparser/pointer_type.c
index d866546aa122b33cb6f64c00989a89bb8c07283f..39719c94949309d7f9e8ff90550c95b063464665 100644
--- a/common/utils/itti_analyzer/libparser/pointer_type.c
+++ b/common/utils/itti_analyzer/libparser/pointer_type.c
@@ -7,8 +7,8 @@
 #include "ui_interface.h"
 
 int pointer_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
 {
     int          length = 0, i;
     char         cbuf[200];
@@ -21,37 +21,37 @@ int pointer_dissect_from_buffer(
 
     buffer_fetch_nbytes(buffer, parent_offset + offset, type->size / 8, value);
 
-    DISPLAY_TYPE("Ptr");
+    indent = new_line ? indent : 0;
+    if (indent > 0)
+    {
+        DISPLAY_TYPE("Ptr");
+    }
     if (type->child->name && type->child) {
         /*
          INDENTED(stdout, indent, fprintf(stdout, "<%s>0x%08x</%s>\n",
          type->child->name, value, type->child->name));
          */
-         INDENTED_STRING(cbuf, indent, sprintf(cbuf, "(%s *) 0x", type->child->name));
+         INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "(%s *) 0x", type->child->name));
     }
     else {
         /*
          INDENTED(stdout, indent, fprintf(stdout, "<Pointer>0x%08x</Pointer>\n",
          value));
          */
-        INDENTED_STRING(cbuf, indent, sprintf(cbuf, "(void *) 0x"));
+        INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "(void *) 0x"));
     }
 
-    length = strlen (cbuf);
-
     /* Append the value */
     for (i = type->size / 8 - 1; i >= 0; i--) {
         length += sprintf(&cbuf[length], "%02x", value[i]);
     }
-
     length += sprintf(&cbuf[length], ";\n");
-
     ui_set_signal_text_cb(user_data, cbuf, length);
 
     return 0;
 }
 
-int pointer_type_file_print(struct types_s *type, int indent, FILE *file) {
+int pointer_type_file_print(types_t *type, int indent, FILE *file) {
     if (type == NULL)
         return -1;
     INDENTED(file, indent, fprintf(file, "<Pointer>\n"));
@@ -75,6 +75,6 @@ int pointer_type_file_print(struct types_s *type, int indent, FILE *file) {
     return 0;
 }
 
-int pointer_type_hr_display(struct types_s *type, int indent) {
+int pointer_type_hr_display(types_t *type, int indent) {
     return pointer_type_file_print(type, indent, stdout);
 }
diff --git a/common/utils/itti_analyzer/libparser/pointer_type.h b/common/utils/itti_analyzer/libparser/pointer_type.h
index 6f82f42c6b9e03df2d507ea1c789e5195f8a4f8a..6560f4f45dc234948a3ae2696ec461c15dbbef49 100644
--- a/common/utils/itti_analyzer/libparser/pointer_type.h
+++ b/common/utils/itti_analyzer/libparser/pointer_type.h
@@ -4,11 +4,11 @@
 #define POINTER_TYPE_H_
 
 int pointer_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
-int pointer_type_file_print(struct types_s *type, int indent, FILE *file);
+int pointer_type_file_print(types_t *type, int indent, FILE *file);
 
-int pointer_type_hr_display(struct types_s *type, int indent);
+int pointer_type_hr_display(types_t *type, int indent);
 
 #endif /* POINTER_TYPE_H_ */
diff --git a/common/utils/itti_analyzer/libparser/reference_type.c b/common/utils/itti_analyzer/libparser/reference_type.c
index 32e2f75c3e29d1223796f4d532453924b2981bc0..409428d624c8cd5f248948f17dda98b8ca216cee 100644
--- a/common/utils/itti_analyzer/libparser/reference_type.c
+++ b/common/utils/itti_analyzer/libparser/reference_type.c
@@ -7,8 +7,8 @@
 #include "ui_interface.h"
 
 int reference_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
 {
     DISPLAY_PARSE_INFO("reference", type->name, offset, parent_offset);
 
@@ -18,7 +18,7 @@ int reference_dissect_from_buffer(
     if (type->child != NULL)
         type->child->type_dissect_from_buffer(type->child, ui_set_signal_text_cb,
                                               user_data, buffer, offset, parent_offset,
-                                              type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE);
+                                              type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE, TRUE);
     if (type->name) {
         INDENTED(stdout, indent,   fprintf(stdout, "</%s>\n", type->name));
     }
@@ -26,7 +26,7 @@ int reference_dissect_from_buffer(
     return 0;
 }
 
-int reference_type_file_print(struct types_s *type, int indent, FILE *file)
+int reference_type_file_print(types_t *type, int indent, FILE *file)
 {
     if (type == NULL)
         return -1;
@@ -49,7 +49,7 @@ int reference_type_file_print(struct types_s *type, int indent, FILE *file)
     return 0;
 }
 
-int reference_type_hr_display(struct types_s *type, int indent)
+int reference_type_hr_display(types_t *type, int indent)
 {
     if (type == NULL)
         return -1;
diff --git a/common/utils/itti_analyzer/libparser/reference_type.h b/common/utils/itti_analyzer/libparser/reference_type.h
index 3c52088d8f798b6ee7d81f10ecbc45eaff03bdc3..fe0c84f9d85b8f6076394f2ea8aae42eee29bcd3 100644
--- a/common/utils/itti_analyzer/libparser/reference_type.h
+++ b/common/utils/itti_analyzer/libparser/reference_type.h
@@ -4,11 +4,11 @@
 #define REFERENCE_TYPE_H_
 
 int reference_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
-int reference_type_file_print(struct types_s *type, int indent, FILE *file);
+int reference_type_file_print(types_t *type, int indent, FILE *file);
 
-int reference_type_hr_display(struct types_s *type, int indent);
+int reference_type_hr_display(types_t *type, int indent);
 
 #endif /* REFERENCE_TYPE_H_ */
diff --git a/common/utils/itti_analyzer/libparser/struct_type.c b/common/utils/itti_analyzer/libparser/struct_type.c
index c4d66918280e306c0720ab5459e65c31c95f42a5..a4189dc1c41f84d36b410920a09c5cc359b72bfb 100644
--- a/common/utils/itti_analyzer/libparser/struct_type.c
+++ b/common/utils/itti_analyzer/libparser/struct_type.c
@@ -10,47 +10,50 @@
 #include "ui_interface.h"
 
 int struct_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
 {
     int i;
     int length = 0;
     char cbuf[200];
+    char *name;
 
     DISPLAY_PARSE_INFO("structure", type->name, offset, parent_offset);
 
     memset (cbuf, 0, 200);
 
-    if (type->name) {
+    if (new_line) {
         DISPLAY_TYPE("Str");
-        INDENTED_STRING(cbuf, indent, sprintf (cbuf, "%s =%s\n", type->name, "" DISPLAY_BRACE(" {")));
     }
 
-    length = strlen (cbuf);
-
+    if (type->name) {
+        name = type->name;
+    }
+    else {
+        name = "_anonymous_";
+    }
+    INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf (cbuf, "%s :", name));
+    DISPLAY_BRACE(length += sprintf(&cbuf[length], " {"););
+    length += sprintf(&cbuf[length], "\n");
     ui_set_signal_text_cb(user_data, cbuf, length);
 
     for (i = 0; i < type->nb_members; i++) {
         if (type->members_child[i] != NULL)
             type->members_child[i]->type_dissect_from_buffer (
                 type->members_child[i], ui_set_signal_text_cb, user_data,
-                buffer, offset, parent_offset,
-                type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE);
+                buffer, offset, parent_offset, indent + DISPLAY_TAB_SIZE, TRUE);
     }
 
     DISPLAY_BRACE(
-            if (type->name) {
-                DISPLAY_TYPE("Str");
-                INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n"));
-            }
-            length = strlen (cbuf);
+            DISPLAY_TYPE("Str");
 
+            INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n"));
             ui_set_signal_text_cb(user_data, cbuf, length);)
 
     return 0;
 }
 
-int struct_type_file_print(struct types_s *type, int indent, FILE *file) {
+int struct_type_file_print(types_t *type, int indent, FILE *file) {
     int i;
     if (type == NULL)
         return -1;
@@ -78,7 +81,7 @@ int struct_type_file_print(struct types_s *type, int indent, FILE *file) {
     return 0;
 }
 
-int struct_type_hr_display(struct types_s *type, int indent) {
+int struct_type_hr_display(types_t *type, int indent) {
     int i;
     if (type == NULL)
         return -1;
diff --git a/common/utils/itti_analyzer/libparser/struct_type.h b/common/utils/itti_analyzer/libparser/struct_type.h
index d785141e903da3b77123989d18b4016bef9c5d1f..a3e1fcf12fda829489d97c26682253a5810d7123 100644
--- a/common/utils/itti_analyzer/libparser/struct_type.h
+++ b/common/utils/itti_analyzer/libparser/struct_type.h
@@ -4,11 +4,11 @@
 #define STRUCT_TYPE_H_
 
 int struct_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
-int struct_type_hr_display(struct types_s *type, int indent);
+int struct_type_hr_display(types_t *type, int indent);
 
-int struct_type_file_print(struct types_s *type, int indent, FILE *file);
+int struct_type_file_print(types_t *type, int indent, FILE *file);
 
 #endif /* STRUCT_TYPE_H_ */
diff --git a/common/utils/itti_analyzer/libparser/typedef_type.c b/common/utils/itti_analyzer/libparser/typedef_type.c
index 193e7449fb11485b9be6811d46c073ce57b31cd1..18239fc87bd89c95e9b2a477ee99d3e0af9eae85 100644
--- a/common/utils/itti_analyzer/libparser/typedef_type.c
+++ b/common/utils/itti_analyzer/libparser/typedef_type.c
@@ -7,22 +7,41 @@
 #include "ui_interface.h"
 
 int typedef_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
 {
+    int length = 0;
+    char cbuf[200];
+    types_t *type_child = NULL;
+
     DISPLAY_PARSE_INFO("typedef", type->name, offset, parent_offset);
 
+    if (type->child != NULL) {
+        /* Ignore TYPEDEF children */
+        for (type_child = type->child; type_child != NULL && type_child->type == TYPE_TYPEDEF; type_child =
+                type_child->child) {
+        }
+    }
+
+    if ((type_child == NULL) || (type_child->type != TYPE_FUNDAMENTAL))
+    {
+        INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf (cbuf, "%s, ", type->name));
+        ui_set_signal_text_cb(user_data, cbuf, length);
+
+        new_line = FALSE;
+    }
+
     /* Simply call next_type */
     if (type->child != NULL) {
         type->child->parent = type;
         type->child->type_dissect_from_buffer(
-            type->child, ui_set_signal_text_cb, user_data, buffer, offset, parent_offset, indent);
+            type->child, ui_set_signal_text_cb, user_data, buffer, offset, parent_offset, indent, new_line);
     }
 
     return 0;
 }
 
-int typedef_type_file_print(struct types_s *type, int indent, FILE *file)
+int typedef_type_file_print(types_t *type, int indent, FILE *file)
 {
     if (type == NULL)
         return -1;
@@ -46,7 +65,7 @@ int typedef_type_file_print(struct types_s *type, int indent, FILE *file)
     return 0;
 }
 
-int typedef_type_hr_display(struct types_s *type, int indent)
+int typedef_type_hr_display(types_t *type, int indent)
 {
     if (type == NULL)
         return -1;
diff --git a/common/utils/itti_analyzer/libparser/typedef_type.h b/common/utils/itti_analyzer/libparser/typedef_type.h
index e0f96f501b246777a7dfe8bbc354614fb3315192..878176005fce59fcdc9c581237a55ac14c6b8e3e 100644
--- a/common/utils/itti_analyzer/libparser/typedef_type.h
+++ b/common/utils/itti_analyzer/libparser/typedef_type.h
@@ -3,12 +3,12 @@
 #ifndef TYPEDEF_TYPE_H_
 #define TYPEDEF_TYPE_H_
 
-int typedef_type_file_print(struct types_s *type, int indent, FILE *file);
+int typedef_type_file_print(types_t *type, int indent, FILE *file);
 
-int typedef_type_hr_display(struct types_s *type, int indent);
+int typedef_type_hr_display(types_t *type, int indent);
 
 int typedef_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
 #endif /* TYPEDEF_TYPE_H_ */
diff --git a/common/utils/itti_analyzer/libparser/types.h b/common/utils/itti_analyzer/libparser/types.h
index bfd057b8e3f113873869f134ce177779d8809c3b..2a8e55951a2d08dc9bdf744edddf17758ceb3deb 100644
--- a/common/utils/itti_analyzer/libparser/types.h
+++ b/common/utils/itti_analyzer/libparser/types.h
@@ -1,6 +1,7 @@
 #include <stdio.h>
 
 #include "buffers.h"
+#include "ui_main_screen.h"
 #include "ui_interface.h"
 
 #ifndef TYPES_H_
@@ -13,10 +14,10 @@
 #define ENABLE_DISPLAY_PARSE_INFO   0
 
 /* Activate to show braces, in increase the number of displayed lines (formating option)*/
-#define ENABLE_DISPLAY_BRACE        0
+#define ENABLE_DISPLAY_BRACE        1
 
 #if (ENABLE_DISPLAY_TYPE != 0)
-# define DISPLAY_TYPE(tYPE) ui_set_signal_text_cb(user_data, tYPE, strlen(tYPE));
+# define DISPLAY_TYPE(tYPE) ui_set_signal_text_cb(user_data, tYPE" ", strlen(tYPE) + 1);
 #else
 # define DISPLAY_TYPE(tYPE)
 #endif
@@ -35,7 +36,7 @@
 #endif
 
 #if (ENABLE_DISPLAY_BRACE != 0)
-# define DISPLAY_BRACE(cODE) cODE
+# define DISPLAY_BRACE(cODE) if (ui_main_data.display_brace) {cODE}
 #else
 # define DISPLAY_BRACE(cODE)
 #endif
@@ -74,7 +75,7 @@ typedef int (*type_file_print_t)(struct types_s *type, int indent, FILE *file);
  **/
 typedef int (*type_dissect_from_buffer_t)(
     struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
 typedef struct types_s {
     /* The type of the current description */
diff --git a/common/utils/itti_analyzer/libparser/union_type.c b/common/utils/itti_analyzer/libparser/union_type.c
index 9de5cd4c3e456571c78a2aaa8cb467c0975c1588..df69290c0604895cb0911a715602bf84acb8e5ce 100644
--- a/common/utils/itti_analyzer/libparser/union_type.c
+++ b/common/utils/itti_analyzer/libparser/union_type.c
@@ -12,29 +12,49 @@
 
 /* There is only one special case of union which is associated to an index: the message id */
 int union_msg_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
 {
     uint32_t message_id;
+    int length = 0;
+    char cbuf[200];
 
     DISPLAY_PARSE_INFO("union_msg", type->name, offset, parent_offset);
 
     CHECK_FCT(get_message_id(type->head, buffer, &message_id));
 
+    if (type->name) {
+        DISPLAY_TYPE("Uni");
+
+        length = sprintf(cbuf, "%s |", type->name);
+        DISPLAY_BRACE(length += sprintf(&cbuf[length], " {"););
+        length += sprintf(&cbuf[length], "\n");
+        ui_set_signal_text_cb(user_data, cbuf, length);
+    }
+
     if (type->members_child[message_id] != NULL)
         type->members_child[message_id]->type_dissect_from_buffer(
             type->members_child[message_id], ui_set_signal_text_cb, user_data,
-            buffer, offset, parent_offset, indent);
+            buffer, offset, parent_offset, type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE, TRUE);
+
+    DISPLAY_BRACE(
+            if (type->name) {
+                DISPLAY_TYPE("Uni");
+
+                INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n"));
+                ui_set_signal_text_cb(user_data, cbuf, length);
+            });
 
     return RC_OK;
 }
 
 int union_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
 {
     int length = 0;
     char cbuf[200];
+    char *name;
     int union_child = 0;
 
     DISPLAY_PARSE_INFO("union", type->name, offset, parent_offset);
@@ -44,10 +64,20 @@ int union_dissect_from_buffer(
 //    CHECK_FCT(buffer_has_enouch_data(buffer, offset + parent_offset, type->size / 8));
 
     if (type->name) {
-//         INDENTED(stdout, indent,   fprintf(stdout, "<%s>\n", type->name));
+        name = type->name;
+    }
+    else {
+        name = "_anonymous_";
+    }
+    if (new_line) {
         DISPLAY_TYPE("Uni");
-        INDENTED_STRING(cbuf, indent, sprintf(cbuf, "%s {\n", type->name));
+    }
+    INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf(cbuf, "%s |", name));
+    DISPLAY_BRACE(length += sprintf(&cbuf[length], " {"););
+    length += sprintf(&cbuf[length], "\n");
+    ui_set_signal_text_cb(user_data, cbuf, length);
 
+    if (type->name) {
         if (type->parent != NULL)
         {
             if ((type->parent->name != NULL) && (strcmp(type->parent->name, "choice") == 0))
@@ -64,29 +94,25 @@ int union_dissect_from_buffer(
         }
     }
 
-    length = strlen (cbuf);
-
-    ui_set_signal_text_cb(user_data, cbuf, length);
 
     /* Only dissect the first field present in unions */
     if (type->members_child[union_child] != NULL)
         type->members_child[union_child]->type_dissect_from_buffer(
             type->members_child[union_child], ui_set_signal_text_cb, user_data, buffer,
-            offset, parent_offset, type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE);
+            offset, parent_offset, indent + DISPLAY_TAB_SIZE, TRUE);
 
-    if (type->name) {
-        DISPLAY_TYPE("Uni");
-        INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n"));
-    }
+    DISPLAY_BRACE(
+            DISPLAY_TYPE("Uni");
+            INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n"));
 
-    length = strlen (cbuf);
+            length = strlen (cbuf);
 
-    ui_set_signal_text_cb(user_data, cbuf, length);
+            ui_set_signal_text_cb(user_data, cbuf, length););
 
     return 0;
 }
 
-int union_type_file_print(struct types_s *type, int indent, FILE *file) {
+int union_type_file_print(types_t *type, int indent, FILE *file) {
     int i;
     if (type == NULL)
         return -1;
@@ -112,7 +138,7 @@ int union_type_file_print(struct types_s *type, int indent, FILE *file) {
     return 0;
 }
 
-int union_type_hr_display(struct types_s *type, int indent) {
+int union_type_hr_display(types_t *type, int indent) {
     int i;
     if (type == NULL)
         return -1;
diff --git a/common/utils/itti_analyzer/libparser/union_type.h b/common/utils/itti_analyzer/libparser/union_type.h
index 0df3fba3c0d128aab54fb431876671dc51c514fc..2df5be43c0256e24443672fd06786968da457dd2 100644
--- a/common/utils/itti_analyzer/libparser/union_type.h
+++ b/common/utils/itti_analyzer/libparser/union_type.h
@@ -4,15 +4,15 @@
 #define UNION_TYPE_H_
 
 int union_msg_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
 int union_dissect_from_buffer(
-    struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
-    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent);
+    types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
+    buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
 
-int union_type_file_print(struct types_s *type, int indent, FILE *file);
+int union_type_file_print(types_t *type, int indent, FILE *file);
 
-int union_type_hr_display(struct types_s *type, int indent);
+int union_type_hr_display(types_t *type, int indent);
 
 #endif /* UNION_TYPE_H_ */
diff --git a/common/utils/itti_analyzer/libparser/xml_parse.c b/common/utils/itti_analyzer/libparser/xml_parse.c
index bd85d172b01e4ceb2c34a2c02223f62ba2ef3664..f6c81b9469f7d2644007f8db52e63c717bbe5653 100644
--- a/common/utils/itti_analyzer/libparser/xml_parse.c
+++ b/common/utils/itti_analyzer/libparser/xml_parse.c
@@ -788,6 +788,9 @@ static int xml_parse_doc(xmlDocPtr doc) {
 
         /* Locate the header part of a message */
         CHECK_FCT(locate_type("ittiMsgHeader", head, &message_header_type));
+        /* Locate the main message part */
+        CHECK_FCT(locate_type("msg", head, &message_type));
+
         /* Locate the origin task id field */
         CHECK_FCT(locate_type("originTaskId", message_header_type, &origin_task_id_type));
         /* Locate the destination task id field */
@@ -830,7 +833,7 @@ int dissect_signal_header(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signa
 
     message_header_type->type_dissect_from_buffer(
         message_header_type, ui_set_signal_text_cb, cb_user_data,
-        buffer, 0, 0, INDENT_START);
+        buffer, 0, 0, INDENT_START, TRUE);
 
     return RC_OK;
 }
@@ -838,7 +841,7 @@ int dissect_signal_header(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signa
 int dissect_signal(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_cb,
                    gpointer cb_user_data)
 {
-    if (root == NULL) {
+    if (message_type == NULL) {
         g_error("No messages format definition provided");
         return RC_FAIL;
     }
@@ -848,8 +851,8 @@ int dissect_signal(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_
         return RC_FAIL;
     }
 
-    root->type_dissect_from_buffer(root, ui_set_signal_text_cb, cb_user_data,
-                                   buffer, 0, 0, INDENT_START);
+    message_type->type_dissect_from_buffer(message_type, ui_set_signal_text_cb, cb_user_data,
+                                           buffer, 0, 0, INDENT_START, TRUE);
 
     return RC_OK;
 }
diff --git a/common/utils/itti_analyzer/libresolver/locate_root.c b/common/utils/itti_analyzer/libresolver/locate_root.c
index 9013950c62493e8aacbad10624a88598c0416316..25566db88656a34aa27474a56a03afdae4afb9ee 100644
--- a/common/utils/itti_analyzer/libresolver/locate_root.c
+++ b/common/utils/itti_analyzer/libresolver/locate_root.c
@@ -18,6 +18,7 @@ types_t *origin_task_id_type = NULL;
 types_t *destination_task_id_type = NULL;
 types_t *instance_type = NULL;
 types_t *message_header_type = NULL;
+types_t *message_type = NULL;
 types_t *message_size_type = NULL;
 
 int locate_root(const char *root_name, types_t *head, types_t **root_elm) {
diff --git a/common/utils/itti_analyzer/libresolver/locate_root.h b/common/utils/itti_analyzer/libresolver/locate_root.h
index 28d5662e7d0d3bb47cdf59ae8843b2e5522c974c..a5f81d5319c0a97d5b7bd51fba8ee89c38db72bf 100644
--- a/common/utils/itti_analyzer/libresolver/locate_root.h
+++ b/common/utils/itti_analyzer/libresolver/locate_root.h
@@ -9,6 +9,7 @@ extern types_t *origin_task_id_type;
 extern types_t *destination_task_id_type;
 extern types_t *instance_type;
 extern types_t *message_header_type;
+extern types_t *message_type;
 extern types_t *message_size_type;
 
 int locate_root(const char *root_name, types_t *head, types_t **root);
diff --git a/common/utils/itti_analyzer/libresolver/resolvers.c b/common/utils/itti_analyzer/libresolver/resolvers.c
index a0e0104deb632cc55768acc14f051a0f1a2899b4..2925e5dd3cea4985bebcf019e1392235d3aac2ad 100644
--- a/common/utils/itti_analyzer/libresolver/resolvers.c
+++ b/common/utils/itti_analyzer/libresolver/resolvers.c
@@ -14,7 +14,7 @@ typedef enum {
     RESOLV_NOT_FOUND = -3,
 } resolv_rc_e;
 
-int search_id(types_t *head, types_t **found, int id)
+static int search_id(types_t *head, types_t **found, int id)
 {
     types_t *next_type;
 
@@ -101,7 +101,7 @@ int resolve_struct(types_t **head)
         if (next_type->type != TYPE_STRUCT)
             continue;
 
-//         g_debug("Trying to resolve struct members %s with type %d", next_type->name, next_type->id);
+        g_debug("Trying to resolve struct members %s with type %d", next_type->name, next_type->id);
 
         /* Struct may have no member */
         if (next_type->members == NULL)
@@ -115,10 +115,10 @@ int resolve_struct(types_t **head)
         while(member != NULL)
         {
             if (next_type->nb_members == 0) {
-                next_type->members_child = malloc(sizeof(struct types_s *));
+                next_type->members_child = malloc(sizeof(types_t *));
             } else {
                 next_type->members_child = realloc(next_type->members_child,
-                                                (next_type->nb_members + 1) * sizeof(struct types_s *));
+                                                (next_type->nb_members + 1) * sizeof(types_t *));
             }
             if (search_id(*head, &next_type->members_child[next_type->nb_members], atoi(member)) != RESOLV_OK) {
                 /* We have to remove this reference */
@@ -160,7 +160,7 @@ int resolve_union(types_t **head)
         if (next_type->type != TYPE_UNION)
             continue;
 
-//         printf("Trying to resolve struct members %s with type %d\n", next_type->name, next_type->id);
+        g_debug("Trying to resolve union members %s with type %d\n", next_type->name, next_type->id);
 
         /* Struct may have no member */
         if (next_type->members == NULL)
@@ -174,10 +174,10 @@ int resolve_union(types_t **head)
         while(member != NULL)
         {
             if (next_type->nb_members == 0) {
-                next_type->members_child = malloc(sizeof(struct types_s *));
+                next_type->members_child = malloc(sizeof(types_t *));
             } else {
                 next_type->members_child = realloc(next_type->members_child,
-                                                (next_type->nb_members + 1) * sizeof(struct types_s *));
+                                                (next_type->nb_members + 1) * sizeof(types_t *));
             }
             if (search_id(*head, &next_type->members_child[next_type->nb_members], atoi(member)) != RESOLV_OK) {
                 /* We have to remove this reference */
@@ -208,8 +208,8 @@ int resolve_pointer_type(types_t **head)
         if (next_type->type != TYPE_POINTER)
             continue;
 
-        // g_debug("Trying to resolve pointer id %d with type %d",
-        //        next_type->id, next_type->type_xml);
+        g_debug("Trying to resolve pointer id %d with type %d",
+                next_type->id, next_type->type_xml);
 
         if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
             /* We have to remove this reference */
@@ -235,8 +235,8 @@ int resolve_reference(types_t **head)
         if (next_type->type != TYPE_REFERENCE)
             continue;
 
-//         printf("Trying to resolve reference id %d with type %d\n",
-//                next_type->id, next_type->type_xml);
+        g_debug("Trying to resolve reference id %d with type %d\n",
+                next_type->id, next_type->type_xml);
 
         if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
             /* We have to remove this reference */
@@ -262,8 +262,8 @@ int resolve_field(types_t **head)
         if (next_type->type != TYPE_FIELD)
             continue;
 
-//         printf("Trying to resolve pointer id %d with type %d\n",
-//                next_type->id, next_type->type_xml);
+        g_debug("Trying to resolve pointer id %d with type %d\n",
+                next_type->id, next_type->type_xml);
 
         if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
             /* We have to remove this reference */
@@ -289,8 +289,8 @@ int resolve_array(types_t **head)
         if (next_type->type != TYPE_ARRAY)
             continue;
 
-//         printf("Trying to resolve array id %d with type %d\n",
-//                next_type->id, next_type->type_xml);
+        g_debug("Trying to resolve array id %d with type %d\n",
+                next_type->id, next_type->type_xml);
 
         if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
             /* We have to remove this reference */
@@ -316,8 +316,8 @@ int resolve_function(types_t **head)
         if (next_type->type != TYPE_FUNCTION)
             continue;
 
-        // g_debug("Trying to resolve function id %d with type %d",
-        //        next_type->id, next_type->type_xml);
+        g_debug("Trying to resolve function id %d with type %d",
+                next_type->id, next_type->type_xml);
 
         if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
             /* We have to remove this reference */
@@ -348,7 +348,7 @@ int resolve_file(types_t **head)
             continue;
         }
 
-//         printf("Trying to resolve file %s\n", next_type->file);
+        g_debug("Trying to resolve file %s\n", next_type->file);
 
         if (search_file(*head, &next_type->file_ref, atoi(&next_type->file[1])) != RESOLV_OK) {
             /* We have to remove this reference */
diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.c b/common/utils/itti_analyzer/libui/ui_callbacks.c
index 9e389e61a1f49eaa1b367ef613bea7c9839d1f50..9131da9754a7fa917470f94eec53cac1c038dc10 100644
--- a/common/utils/itti_analyzer/libui/ui_callbacks.c
+++ b/common/utils/itti_analyzer/libui/ui_callbacks.c
@@ -101,6 +101,16 @@ gboolean ui_callback_on_save_filters(GtkWidget *widget, gpointer data)
     return TRUE;
 }
 
+gboolean ui_callback_on_enable_filters(GtkWidget *widget, gpointer data)
+{
+    gboolean enabled;
+
+    enabled = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled));
+    gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled), !enabled);
+
+    return TRUE;
+}
+
 gboolean ui_callback_on_about(GtkWidget *widget, gpointer data)
 {
 #if defined(PACKAGE_STRING)
@@ -115,55 +125,92 @@ gboolean ui_callback_on_about(GtkWidget *widget, gpointer data)
 gboolean ui_callback_on_select_signal(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path,
                                       gboolean path_currently_selected, gpointer user_data)
 {
+    static gpointer buffer_current;
     ui_text_view_t *text_view;
     GtkTreeIter iter;
 
-    text_view = (ui_text_view_t *) user_data;
+    if (ui_tree_view_last_event)
+    {
+        g_debug("last_event %p %d %d", ui_tree_view_last_event, ui_tree_view_last_event->type, ui_tree_view_last_event->button);
 
-    g_assert(text_view != NULL);
+        if (ui_tree_view_last_event->type == GDK_BUTTON_PRESS)
+        {
+            /* Callback is due to a button click */
+            ui_main_data.follow_last = FALSE;
 
-    if (gtk_tree_model_get_iter (model, &iter, path))
-    {
-        GValue buffer_store = G_VALUE_INIT;
-        gpointer buffer;
+            if (ui_tree_view_last_event->button == 3)
+            {
+                /* It was a right mouse click */
+            }
+        }
 
-        GValue message_id_store = G_VALUE_INIT;
-        guint message_id;
+        ui_tree_view_last_event = NULL;
+    }
 
-        gtk_tree_model_get_value (model, &iter, COL_BUFFER, &buffer_store);
-        buffer = g_value_get_pointer (&buffer_store);
+    g_debug("Message selected %d %p %p %s", path_currently_selected, buffer_current, path, gtk_tree_path_to_string(path));
 
-        gtk_tree_model_get_value (model, &iter, COL_MESSAGE_ID, &message_id_store);
-        message_id = g_value_get_uint(&message_id_store);
+    if (!path_currently_selected)
+    {
+        text_view = (ui_text_view_t *) user_data;
 
-        if (!path_currently_selected)
-        {
-            /* Clear the view */
-            CHECK_FCT_DO(ui_signal_dissect_clear_view(text_view), return FALSE);
+        g_assert(text_view != NULL);
 
-            if ((strcmp (message_id_to_string (message_id), "ERROR") == 0)
-                    || (strcmp (message_id_to_string (message_id), "WARNING") == 0)
-                    || (strcmp (message_id_to_string (message_id), "GENERIC_LOG") == 0))
-            {
-                gchar *data;
-                gint data_size;
-                uint32_t message_header_type_size;
+        if (gtk_tree_model_get_iter(model, &iter, path))
+        {
+            GValue buffer_store = G_VALUE_INIT;
+            gpointer buffer;
 
-                CHECK_FCT_DO(dissect_signal_header((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
+            GValue message_id_store = G_VALUE_INIT;
+            guint message_id;
 
-                message_header_type_size = get_message_header_type_size ();
-                data = (gchar *) buffer_at_offset ((buffer_t*) buffer, message_header_type_size);
-                data_size = get_message_size ((buffer_t*) buffer);
+            gtk_tree_model_get_value(model, &iter, COL_BUFFER, &buffer_store);
+            buffer = g_value_get_pointer(&buffer_store);
 
-                g_debug("message header type size: %u, data size: %u", message_header_type_size, data_size);
+            g_debug("  Get iter %p %p", buffer_current, buffer);
 
-                ui_signal_set_text (text_view, "\n", 1);
-                ui_signal_set_text (text_view, data, data_size);
-            }
-            else
+            if (buffer_current != buffer)
             {
-                /* Dissect the signal */
-                CHECK_FCT_DO(dissect_signal((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
+                buffer_current = buffer;
+
+                gtk_tree_model_get_value(model, &iter, COL_MESSAGE_ID, &message_id_store);
+                message_id = g_value_get_uint(&message_id_store);
+
+                /* Clear the view */
+                CHECK_FCT_DO(ui_signal_dissect_clear_view(text_view), return FALSE);
+
+                if (ui_main_data.display_message_header)
+                {
+                    CHECK_FCT_DO(dissect_signal_header((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
+                }
+
+                if ((strcmp(message_id_to_string(message_id), "ERROR_LOG") == 0)
+                        || (strcmp(message_id_to_string(message_id), "WARNING_LOG") == 0)
+                        || (strcmp(message_id_to_string(message_id), "GENERIC_LOG") == 0))
+                {
+                    gchar *data;
+                    gint data_size;
+                    uint32_t message_header_type_size;
+
+                    if (ui_main_data.display_message_header)
+                    {
+                        ui_signal_set_text(text_view, "\n", 1);
+                    }
+
+                    message_header_type_size = get_message_header_type_size();
+                    data = (gchar *) buffer_at_offset((buffer_t*) buffer, message_header_type_size);
+                    data_size = get_message_size((buffer_t*) buffer);
+
+                    g_debug("    message header type size: %u, data size: %u %p %d", message_header_type_size, data_size,
+                            buffer, ui_main_data.follow_last);
+
+                    ui_signal_set_text(text_view, data, data_size);
+                } else
+                {
+                    g_debug("    dissect message %d %p %d", message_id, buffer, ui_main_data.follow_last);
+
+                    /* Dissect the signal */
+                    CHECK_FCT_DO(dissect_signal((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
+                }
             }
         }
     }
@@ -172,6 +219,7 @@ gboolean ui_callback_on_select_signal(GtkTreeSelection *selection, GtkTreeModel
 
 void ui_signal_add_to_list(gpointer data, gpointer user_data)
 {
+    gboolean goto_last = user_data ? TRUE : FALSE;
     buffer_t *signal_buffer;
     GtkTreePath *path;
     GtkTreeViewColumn *focus_column;
@@ -205,11 +253,10 @@ void ui_signal_add_to_list(gpointer data, gpointer user_data)
     /* Increment number of messages */
     ui_main_data.nb_message_received++;
 
-    /* Check if no signal was selected in the list or if it was the last signal */
-    if ((ui_main_data.path_last == NULL) || (path == NULL) || (gtk_tree_path_compare(ui_main_data.path_last, path) == 0))
+    if ((ui_main_data.follow_last) && (goto_last))
     {
         /* Advance to the new last signal */
-        ui_callback_signal_go_to_last (NULL, NULL);
+        ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1);
     }
 }
 
@@ -225,7 +272,7 @@ static gboolean ui_handle_update_signal_list(gint fd, void *data, size_t data_le
     g_assert(signal_list_message != NULL);
     g_assert(signal_list_message->signal_list != NULL);
 
-    g_list_foreach (signal_list_message->signal_list, ui_signal_add_to_list, NULL);
+    g_list_foreach (signal_list_message->signal_list, ui_signal_add_to_list, (gpointer) TRUE);
 
     /* Free the list but not user data associated with each element */
     g_list_free (signal_list_message->signal_list);
@@ -378,25 +425,46 @@ gboolean ui_callback_on_disconnect(GtkWidget *widget, gpointer data)
     return TRUE;
 }
 
+gboolean ui_callback_signal_go_to_first(GtkWidget *widget, gpointer data)
+{
+    ui_tree_view_select_row (0);
+    ui_main_data.follow_last = FALSE;
+
+    return TRUE;
+}
+
 gboolean ui_callback_signal_go_to(GtkWidget *widget, gpointer data)
 {
-    ui_tree_view_select_row (ui_main_data.nb_message_received / 2, NULL);
+    gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.signals_go_to_entry);
     return TRUE;
 }
 
-gboolean ui_callback_signal_go_to_first(GtkWidget *widget, gpointer data)
+gboolean ui_callback_signal_go_to_entry(GtkWidget *widget, gpointer data)
 {
-    ui_tree_view_select_row (0, NULL);
+    // gtk_entry_buffer_set_text(GTK_ENTRY(ui_main_data.signals_go_to_entry), "");
+    gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.signalslist);
     return TRUE;
 }
 
 gboolean ui_callback_signal_go_to_last(GtkWidget *widget, gpointer data)
 {
-    GtkTreePath *path;
+    ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1);
+    ui_main_data.follow_last = TRUE;
+
+    return TRUE;
+}
 
-    ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1, &path);
-    ui_main_data.path_last = path;
+gboolean ui_callback_display_message_header(GtkWidget *widget, gpointer data)
+{
+    ui_main_data.display_message_header = !ui_main_data.display_message_header;
+    // TODO refresh textview.
+    return TRUE;
+}
 
+gboolean ui_callback_display_brace(GtkWidget *widget, gpointer data)
+{
+    ui_main_data.display_brace = !ui_main_data.display_brace;
+    // TODO refresh textview.
     return TRUE;
 }
 
@@ -411,7 +479,7 @@ gboolean ui_callback_signal_clear_list(GtkWidget *widget, gpointer data)
 
     if (ui_main_data.text_view != NULL)
     {
-        // ui_signal_dissect_clear_view(ui_main_data.text_view);
+        ui_signal_dissect_clear_view(ui_main_data.text_view);
     }
 
     return TRUE;
diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.h b/common/utils/itti_analyzer/libui/ui_callbacks.h
index 6f111c3861ba37d70029e297cbb2160972bdaf1d..66db3504d009dc9675f3f493144d1bd27637465f 100644
--- a/common/utils/itti_analyzer/libui/ui_callbacks.h
+++ b/common/utils/itti_analyzer/libui/ui_callbacks.h
@@ -18,6 +18,9 @@ gboolean ui_callback_on_open_filters(GtkWidget *widget,
 gboolean ui_callback_on_save_filters(GtkWidget *widget,
                                      gpointer data);
 
+gboolean ui_callback_on_enable_filters(GtkWidget *widget,
+                                       gpointer data);
+
 gboolean ui_callback_on_about(GtkWidget *widget,
                               gpointer   data);
 
@@ -41,15 +44,24 @@ ui_callback_on_select_signal(GtkTreeSelection *selection,
                              gboolean          path_currently_selected,
                              gpointer          userdata);
 
+gboolean ui_callback_signal_go_to_first(GtkWidget *widget,
+                                        gpointer   data);
+
 gboolean ui_callback_signal_go_to(GtkWidget *widget,
-                                  gpointer   data);
+                                  gpointer data);
 
-gboolean ui_callback_signal_go_to_first(GtkWidget *widget,
+gboolean ui_callback_signal_go_to_entry(GtkWidget *widget,
                                         gpointer   data);
 
 gboolean ui_callback_signal_go_to_last(GtkWidget *widget,
                                        gpointer   data);
 
+gboolean ui_callback_display_message_header(GtkWidget *widget,
+                                            gpointer data);
+
+gboolean ui_callback_display_brace(GtkWidget *widget,
+                                   gpointer data);
+
 gboolean ui_callback_signal_clear_list(GtkWidget *widget,
                                        gpointer   data);
 
diff --git a/common/utils/itti_analyzer/libui/ui_interface.c b/common/utils/itti_analyzer/libui/ui_interface.c
index 3dd58b275670a87b3a1dbb228b77bb4f3b9c110a..5010a07658e3ab7f60a80a74ab0896a747167cfe 100644
--- a/common/utils/itti_analyzer/libui/ui_interface.c
+++ b/common/utils/itti_analyzer/libui/ui_interface.c
@@ -22,7 +22,7 @@ gboolean ui_callback_on_pipe_notification(
     /* avoid reentrancy problems and stack overflow */
     g_source_remove(pipe_input->pipe_input_id);
 
-    // g_debug("Received new data on pipe %d", pipe_input->pipe_input_id);
+    g_debug("Received new data on pipe %d", pipe_input->pipe_input_id);
 
     if (pipe_input->input_cb(pipe_input->source_fd, pipe_input->user_data)) {
         /* restore pipe handler */
diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.c b/common/utils/itti_analyzer/libui/ui_main_screen.c
index 7512c4872ddaaf4cf35ccab7be3c59c756067aea..b0bccef9b25cdc1266719dd3ad9fa224f216aa59 100644
--- a/common/utils/itti_analyzer/libui/ui_main_screen.c
+++ b/common/utils/itti_analyzer/libui/ui_main_screen.c
@@ -22,6 +22,11 @@
 
 ui_main_data_t ui_main_data;
 
+gchar *LOG_DOMAIN_PARSE =    "Parse";
+gchar *LOG_DOMAIN_PIPE =     "Pipe";
+gchar *LOG_DOMAIN_SOCKET =   "Socket";
+gchar *LOG_DOMAIN_UI =       "UI";
+
 static void ui_help(void)
 {
     printf ("Usage: itti_analyser [options]\n\n"
@@ -112,6 +117,8 @@ static int ui_idle_callback(gpointer data)
 {
     g_debug("Entering idle state");
 
+    gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.signalslist);
+
     /* Read filters file */
     if (ui_main_data.filters_file_name != NULL)
     {
@@ -168,6 +175,7 @@ int ui_gtk_initialize(int argc, char *argv[])
     ui_main_data.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
     ui_init_filters (TRUE, FALSE);
 
+    // gtk_window_set_default_icon_from_file ("../analyzer.png", NULL);
     gtk_window_set_default_icon_name (GTK_STOCK_FIND);
 
     gtk_window_set_position (GTK_WINDOW(ui_main_data.window), GTK_WIN_POS_CENTER);
diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.h b/common/utils/itti_analyzer/libui/ui_main_screen.h
index b044df07909c42c55e7dd31ff1a3b7129211b6f7..5420d20296411626ead591d071da7dde1e28ff4e 100644
--- a/common/utils/itti_analyzer/libui/ui_main_screen.h
+++ b/common/utils/itti_analyzer/libui/ui_main_screen.h
@@ -1,8 +1,10 @@
-#include "ui_signal_dissect_view.h"
-
 #ifndef UI_MAIN_SCREEN_H_
 #define UI_MAIN_SCREEN_H_
 
+#include <gtk/gtk.h>
+
+#include "ui_signal_dissect_view.h"
+
 typedef struct {
     GtkWidget *window;
     GtkWidget *ip_entry;
@@ -29,12 +31,14 @@ typedef struct {
 
     /* Signal list buttons */
     /* Clear signals button */
-    GtkToolItem *signals_go_to_button;
+    GtkWidget *signals_go_to_entry;
     GtkToolItem *signals_go_to_last_button;
     GtkToolItem *signals_go_to_first_button;
+    gboolean display_message_header;
+    gboolean display_brace;
 
     GtkTreeSelection *selection;
-    GtkTreePath *path_last;
+    gboolean follow_last;
 
     /* Nb of messages received */
     guint nb_message_received;
diff --git a/common/utils/itti_analyzer/libui/ui_menu_bar.c b/common/utils/itti_analyzer/libui/ui_menu_bar.c
index 3a8867adb734bbe93491cc9244ddd4662468301d..f291b9cc18f16cbbd2ecd10db6f8f2b7ef981389 100644
--- a/common/utils/itti_analyzer/libui/ui_menu_bar.c
+++ b/common/utils/itti_analyzer/libui/ui_menu_bar.c
@@ -1,4 +1,5 @@
 #include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
 
 #include "rc.h"
 #include "ui_main_screen.h"
@@ -19,78 +20,162 @@ void ui_set_sensitive_move_buttons(gboolean enable)
 
 int ui_menu_bar_create(GtkWidget *vbox)
 {
-    GtkWidget *menubar;
-    GtkWidget *filemenu, *helpmenu;
-    GtkWidget *file;
+    GtkAccelGroup *accel_group;
+    GtkWidget *menu_bar;
+    GtkWidget *filters_menu;
+    GtkWidget *messages_menu;
+    GtkWidget *help_menu;
+    GtkWidget *filters;
+    GtkWidget *messages;
     GtkWidget *help;
-    GtkWidget *open_messages;
-    GtkWidget *save_messages;
     GtkWidget *open_filters;
     GtkWidget *save_filters;
+    GtkWidget *enable_filters;
+    GtkWidget *open_messages;
+    GtkWidget *reload_messages;
+    GtkWidget *save_messages;
+    GtkWidget *goto_first_messages;
+    GtkWidget *goto_messages;
+    GtkWidget *goto_last_messages;
+    GtkWidget *display_message_header;
+    GtkWidget *display_brace;
     GtkWidget *quit;
     GtkWidget *about;
-    GtkWidget *separator1;
-    GtkWidget *separator2;
 
     if (!vbox)
         return RC_BAD_PARAM;
 
-    menubar = gtk_menu_bar_new();
-
-    /* Create the File submenu */
-    filemenu = gtk_menu_new();
-
-    file = gtk_menu_item_new_with_label("File");
-    open_messages  = gtk_menu_item_new_with_label("Open messages file");
-    save_messages  = gtk_menu_item_new_with_label("Save messages file");
-    open_filters  = gtk_menu_item_new_with_label("Open filters file");
-    save_filters  = gtk_menu_item_new_with_label("Save filters file");
-    quit  = gtk_menu_item_new_with_label("Quit");
-    separator1 = gtk_menu_item_new();
-    separator2 = gtk_menu_item_new();
-
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);
-
-    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);
-    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), open_messages);
-    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), save_messages);
-    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), separator1);
-    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), open_filters);
-    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), save_filters);
-    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), separator2);
-    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);
+    accel_group = gtk_accel_group_new();
+    gtk_window_add_accel_group(GTK_WINDOW(ui_main_data.window), accel_group);
 
-    /* Create the Help submenu */
-    helpmenu = gtk_menu_new();
+    menu_bar = gtk_menu_bar_new();
 
-    help = gtk_menu_item_new_with_label("Help");
-    about = gtk_menu_item_new_with_label("About");
+    /* Create the Filters sub-menu */
+    {
+        filters = gtk_menu_item_new_with_mnemonic ("_Filters");
+        gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), filters);
+
+        filters_menu = gtk_menu_new ();
+        gtk_menu_item_set_submenu (GTK_MENU_ITEM(filters), filters_menu);
+
+        /* Create the Filters menu items */
+        {
+            open_filters = gtk_menu_item_new_with_mnemonic ("_Open filters file");
+            gtk_widget_add_accelerator (open_filters, "activate", accel_group, GDK_KEY_p, GDK_CONTROL_MASK,
+                                        GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), open_filters);
+            g_signal_connect(G_OBJECT(open_filters), "activate", G_CALLBACK(ui_callback_on_open_filters), NULL);
+
+            save_filters = gtk_menu_item_new_with_mnemonic ("_Save filters file");
+            gtk_widget_add_accelerator (save_filters, "activate", accel_group, GDK_KEY_a, GDK_CONTROL_MASK,
+                                        GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), save_filters);
+            g_signal_connect(G_OBJECT(save_filters), "activate", G_CALLBACK(ui_callback_on_save_filters), NULL);
+
+            gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), gtk_menu_item_new ()); // Separator
+
+            enable_filters = gtk_menu_item_new_with_mnemonic ("_Enable filtering");
+            gtk_widget_add_accelerator (enable_filters, "activate", accel_group, GDK_KEY_e, GDK_CONTROL_MASK,
+                                        GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), enable_filters);
+            g_signal_connect(G_OBJECT(enable_filters), "activate", G_CALLBACK(ui_callback_on_enable_filters), NULL);
+
+            gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), gtk_menu_item_new ()); // Separator
+
+            quit = gtk_menu_item_new_with_mnemonic ("_Quit");
+            gtk_widget_add_accelerator (quit, "activate", accel_group, GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), quit);
+            g_signal_connect(G_OBJECT(quit), "activate", G_CALLBACK(gtk_main_quit), NULL);
+        }
+    }
 
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(help), helpmenu);
+    /* Create the Messages sub-menu */
+    {
+        messages = gtk_menu_item_new_with_mnemonic ("_Messages");
+        gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), messages);
+
+        messages_menu = gtk_menu_new ();
+        gtk_menu_item_set_submenu (GTK_MENU_ITEM(messages), messages_menu);
+
+        /* Crate the Messages menu items */
+        {
+            open_messages = gtk_menu_item_new_with_mnemonic ("_Open messages file");
+            gtk_widget_add_accelerator (open_messages, "activate", accel_group, GDK_KEY_o, GDK_CONTROL_MASK,
+                                        GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), open_messages);
+            g_signal_connect(G_OBJECT(open_messages), "activate", G_CALLBACK(ui_callback_on_open_messages),
+                             (gpointer) FALSE);
+
+            reload_messages = gtk_menu_item_new_with_mnemonic ("_Reload messages file");
+            gtk_widget_add_accelerator (reload_messages, "activate", accel_group, GDK_KEY_r, GDK_CONTROL_MASK,
+                                        GTK_ACCEL_VISIBLE);
+            gtk_widget_add_accelerator (reload_messages, "activate", accel_group, GDK_KEY_F5, 0, GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), reload_messages);
+            g_signal_connect(G_OBJECT(reload_messages), "activate", G_CALLBACK(ui_callback_on_open_messages),
+                             (gpointer) TRUE);
+
+            save_messages = gtk_menu_item_new_with_mnemonic ("_Save messages file");
+            gtk_widget_add_accelerator (save_messages, "activate", accel_group, GDK_KEY_s, GDK_CONTROL_MASK,
+                                        GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), save_messages);
+            g_signal_connect(G_OBJECT(save_messages), "activate", G_CALLBACK(ui_callback_on_save_messages), NULL);
+
+            gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), gtk_menu_item_new ()); // Separator
+
+            goto_first_messages = gtk_menu_item_new_with_mnemonic ("Go to _first message");
+            gtk_widget_add_accelerator (goto_first_messages, "activate", accel_group, GDK_KEY_f, GDK_CONTROL_MASK,
+                                        GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_first_messages);
+            g_signal_connect(G_OBJECT(goto_first_messages), "activate", G_CALLBACK(ui_callback_signal_go_to_first),
+                             NULL);
+
+            goto_messages = gtk_menu_item_new_with_mnemonic ("_Go to message ...");
+            gtk_widget_add_accelerator (goto_messages, "activate", accel_group, GDK_KEY_g, GDK_CONTROL_MASK,
+                                        GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_messages);
+            g_signal_connect(G_OBJECT(goto_messages), "activate", G_CALLBACK(ui_callback_signal_go_to), NULL);
+
+            goto_last_messages = gtk_menu_item_new_with_mnemonic ("Go to _last message");
+            gtk_widget_add_accelerator (goto_last_messages, "activate", accel_group, GDK_KEY_l, GDK_CONTROL_MASK,
+                                        GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_last_messages);
+            g_signal_connect(G_OBJECT(goto_last_messages), "activate", G_CALLBACK(ui_callback_signal_go_to_last), NULL);
+
+            gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), gtk_menu_item_new ()); // Separator
+
+            display_message_header = gtk_menu_item_new_with_mnemonic ("Display message _header");
+            gtk_widget_add_accelerator (display_message_header, "activate", accel_group, GDK_KEY_h, GDK_CONTROL_MASK,
+                                        GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), display_message_header);
+            g_signal_connect(G_OBJECT(display_message_header), "activate",
+                             G_CALLBACK(ui_callback_display_message_header), NULL);
+
+            display_brace = gtk_menu_item_new_with_mnemonic ("Display _brace");
+            gtk_widget_add_accelerator (display_brace, "activate", accel_group, GDK_KEY_b, GDK_CONTROL_MASK,
+                                        GTK_ACCEL_VISIBLE);
+            gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), display_brace);
+            g_signal_connect(G_OBJECT(display_brace), "activate", G_CALLBACK(ui_callback_display_brace), NULL);
+        }
+    }
 
-    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), help);
-    gtk_menu_shell_append(GTK_MENU_SHELL(helpmenu), about);
+    /* Create the Help sub-menu */
+    {
+        help = gtk_menu_item_new_with_mnemonic ("_Help");
+        gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), help);
+
+        help_menu = gtk_menu_new ();
+        gtk_menu_item_set_submenu (GTK_MENU_ITEM(help), help_menu);
+
+        /* Create the Help menu item */
+        {
+            about = gtk_menu_item_new_with_mnemonic ("_About");
+            gtk_menu_shell_append (GTK_MENU_SHELL(help_menu), about);
+            g_signal_connect(G_OBJECT(about), "activate", G_CALLBACK(ui_callback_on_about), NULL);
+        }
+    }
 
     /* Add the menubar to the vbox */
-    gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3);
-
-    g_signal_connect(G_OBJECT(open_messages), "activate",
-                     G_CALLBACK(ui_callback_on_open_messages), NULL);
-
-    g_signal_connect(G_OBJECT(save_messages), "activate",
-                     G_CALLBACK(ui_callback_on_save_messages), NULL);
-
-    g_signal_connect(G_OBJECT(open_filters), "activate",
-                     G_CALLBACK(ui_callback_on_open_filters), NULL);
-
-    g_signal_connect(G_OBJECT(save_filters), "activate",
-                     G_CALLBACK(ui_callback_on_save_filters), NULL);
-
-    g_signal_connect(G_OBJECT(quit), "activate",
-                     G_CALLBACK(gtk_main_quit), NULL);
-
-    g_signal_connect(G_OBJECT(about), "activate",
-                     G_CALLBACK(ui_callback_on_about), NULL);
+    gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 3);
 
     return RC_OK;
 }
@@ -163,20 +248,6 @@ int ui_toolbar_create(GtkWidget *vbox)
                         G_CALLBACK(ui_callback_on_save_messages), NULL);
     }
 
-#if 0 /* This function is already handled by GTK */
-    /* Button to go given signal number */
-    {
-        ui_main_data.signals_go_to_button = gtk_tool_button_new_from_stock(GTK_STOCK_INDEX);
-        /* Set the tooltip text */
-        gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.signals_go_to_button), "Goto signal");
-
-        gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_button), FALSE);
-
-        g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_button), "clicked",
-                        G_CALLBACK(ui_callback_signal_go_to), NULL);
-    }
-#endif
-
     /* Button to go to first signal in list */
     {
         ui_main_data.signals_go_to_first_button = gtk_tool_button_new_from_stock(GTK_STOCK_GOTO_FIRST);
@@ -189,6 +260,16 @@ int ui_toolbar_create(GtkWidget *vbox)
                         G_CALLBACK(ui_callback_signal_go_to_first), NULL);
     }
 
+    /* Entry to go to given signal number */
+    {
+        ui_main_data.signals_go_to_entry = gtk_entry_new ();
+        gtk_entry_set_width_chars (GTK_ENTRY(ui_main_data.signals_go_to_entry), 10);
+        // gtk_entry_set_input_purpose (GTK_ENTRY(ui_main_data.signals_go_to_entry), GTK_INPUT_PURPOSE_DIGITS);
+
+        g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_entry), "activate",
+                        G_CALLBACK(ui_callback_signal_go_to_entry), NULL);
+    }
+
     /* Button to go to last signal in list */
     {
         ui_main_data.signals_go_to_last_button = gtk_tool_button_new_from_stock(GTK_STOCK_GOTO_LAST);
@@ -251,6 +332,7 @@ int ui_toolbar_create(GtkWidget *vbox)
     gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE);
 
     gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_first_button), FALSE, FALSE, BUTTON_SPACE);
+    gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_entry), FALSE, FALSE, BUTTON_SPACE);
     gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_last_button), FALSE, FALSE, BUTTON_SPACE);
 
     gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE);
diff --git a/common/utils/itti_analyzer/libui/ui_notebook.c b/common/utils/itti_analyzer/libui/ui_notebook.c
index 313aa438bf4a46ca62b6dd7c1ea3aca1ec57d4f8..a35024ade8ea8cacfde4de92096cd45d338f06ac 100644
--- a/common/utils/itti_analyzer/libui/ui_notebook.c
+++ b/common/utils/itti_analyzer/libui/ui_notebook.c
@@ -27,6 +27,11 @@ int ui_notebook_create(GtkWidget *vbox)
     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL);
     gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Messages list");
 
+    vbox_notebook = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL);
+    gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Filters");
+
     /* Add the notebook to the vbox of the main window */
     gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
 
diff --git a/common/utils/itti_analyzer/libui/ui_notifications.c b/common/utils/itti_analyzer/libui/ui_notifications.c
index 03466b46f1410847dba9021d1a916daba886eb71..2e04360d6f81b1b2397ddd3a002c4c81179e18ef 100644
--- a/common/utils/itti_analyzer/libui/ui_notifications.c
+++ b/common/utils/itti_analyzer/libui/ui_notifications.c
@@ -104,6 +104,7 @@ int ui_messages_read(char *filename)
         size = st.st_size;
 
         ui_callback_signal_clear_list (NULL, NULL);
+        ui_main_data.follow_last = TRUE;
 
         /* Initialize the progress bar */
         ui_progress_bar_set_fraction(0);
@@ -162,18 +163,20 @@ int ui_messages_read(char *filename)
 
                         buffer->message_number = itti_signal_header->message_number;
 
-                        ui_signal_add_to_list (buffer, NULL);
-                        read_messages++;
+                        ui_signal_add_to_list (buffer, ((read_messages % 100) == 0) ? (gpointer) 1: NULL);
 
-                        if (read_messages % 100 == 0)
+                        if ((read_messages % 100) == 0)
                         {
                             ui_progress_bar_set_fraction(read_fraction);
                             ui_gtk_flush_events ();
                         }
+
+                        read_messages++;
                         break;
                     }
 
                     case ITTI_DUMP_XML_DEFINITION:
+                        ui_gtk_flush_events ();
                         xml_parse_buffer (input_data, input_data_length);
                         ui_gtk_flush_events ();
                         break;
@@ -197,6 +200,12 @@ int ui_messages_read(char *filename)
             /* Enable buttons to move in the list of signals */
             ui_set_sensitive_move_buttons (TRUE);
 
+            if (ui_main_data.follow_last)
+            {
+                /* Advance to the last signal */
+                ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1);
+            }
+
             basename = g_path_get_basename(filename);
             ui_set_title ("\"%s\"", basename);
         }
diff --git a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c
index 112ca206fe17deaab218d3d1cbcdb8c02542f124..0dd5b86b73fb3b2ff854e21cb8061db148c05f07 100644
--- a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c
+++ b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c
@@ -51,12 +51,11 @@ int ui_signal_dissect_clear_view(ui_text_view_t *text_view)
 
     if (text_view->text_view != NULL)
     {
-        text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view->text_view));
+        /* Create an empty text buffer */
+        text_buffer = gtk_text_buffer_new(NULL);
+        gtk_text_buffer_set_text(text_buffer, "", 0);
 
-        /* If a text buffer is present for the textview remove it */
-        if (text_buffer != NULL) {
-            gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view->text_view), NULL);
-        }
+        gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view->text_view), text_buffer);
     }
 
     return RC_OK;
diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.c b/common/utils/itti_analyzer/libui/ui_tree_view.c
index 4c810fd998625ddb099b1a4490c009ff04cda215..b67870fa16e0a2b0f7c64108bab128cdf8d60c72 100644
--- a/common/utils/itti_analyzer/libui/ui_tree_view.c
+++ b/common/utils/itti_analyzer/libui/ui_tree_view.c
@@ -25,6 +25,8 @@ typedef struct
 
 static ui_store_t ui_store;
 
+GdkEventButton *ui_tree_view_last_event;
+
 static gboolean ui_tree_filter_messages(GtkTreeModel *model, GtkTreeIter *iter, ui_store_t *store)
 {
     uint32_t msg_number;
@@ -52,6 +54,24 @@ static gboolean ui_tree_filter_messages(GtkTreeModel *model, GtkTreeIter *iter,
     return enabled;
 }
 
+static gboolean onButtonPressed(GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
+{
+    g_debug("onButtonPressed %p %p %p %d %d", treeview, event, userdata, event->type, event->button);
+    ui_tree_view_last_event = event;
+
+    return FALSE;
+}
+
+/*
+static gboolean onButtonRelease(GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
+{
+    g_debug("onButtonRelease %p %p %p %d %d", treeview, event, userdata, event->type, event->button);
+    // last_event = event;
+
+    return FALSE;
+}
+*/
+
 static void
 ui_tree_view_init_list(GtkWidget *list)
 {
@@ -176,7 +196,45 @@ void ui_tree_view_destroy_list(GtkWidget *list)
 
     /* Reset number of messages */
     ui_main_data.nb_message_received = 0;
-    ui_main_data.path_last = NULL;
+}
+
+/* Search for the message with its message number equal to the given value or the previous one */
+static gboolean ui_tree_view_search (GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter,
+        gpointer search_data)
+{
+    uint32_t msg_number;
+    uint32_t key_value = atoi(key);
+
+    gtk_tree_model_get (model, iter, column, &msg_number, -1);
+
+    g_debug ("ui_tree_view_search %d %d", key_value, msg_number);
+
+    if (key_value == msg_number)
+    {
+        /* Value found, use this message */
+        return 0;
+    }
+
+    {
+        GtkTreeIter iter_next = *iter;
+
+        if (gtk_tree_model_iter_next(model, &iter_next))
+        {
+            gtk_tree_model_get (model, &iter_next, column, &msg_number, -1);
+
+            if (key_value < msg_number)
+            {
+                /* Next value will be greater, use this message */
+                return 0;
+            }
+        }
+        else
+        {
+            /* Last value, use this message */
+            return 0;
+        }
+    }
+    return 1;
 }
 
 int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox)
@@ -192,6 +250,8 @@ int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox)
 
     ui_main_data.signalslist = gtk_tree_view_new();
     gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(ui_main_data.signalslist), TRUE);
+    gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW(ui_main_data.signalslist), ui_tree_view_search, NULL, NULL);
+    gtk_tree_view_set_search_entry (GTK_TREE_VIEW(ui_main_data.signalslist), GTK_ENTRY(ui_main_data.signals_go_to_entry));
 
     /* Disable multiple selection */
     selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(ui_main_data.signalslist));
@@ -210,6 +270,9 @@ int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox)
 
     gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 5);
 
+    g_signal_connect(G_OBJECT(ui_main_data.signalslist), "button-press-event", G_CALLBACK (onButtonPressed), NULL);
+    // g_signal_connect(G_OBJECT(ui_main_data.signalslist), "button-release-event", G_CALLBACK (onButtonRelease), NULL);
+
     /* Connect callback on row selection */
     gtk_tree_selection_set_select_function(selection, ui_callback_on_select_signal,
                                            ui_main_data.text_view, NULL);
@@ -249,20 +312,16 @@ int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_
     return RC_OK;
 }
 
-void ui_tree_view_select_row(gint row, GtkTreePath **path)
+void ui_tree_view_select_row(gint row)
 {
     GtkTreePath *path_row;
 
     path_row = gtk_tree_path_new_from_indices(row, -1);
+
     /* Select the message in requested row */
     gtk_tree_view_set_cursor(GTK_TREE_VIEW(ui_main_data.signalslist), path_row, NULL, FALSE);
     /* Center the message in the middle of the list if possible */
     gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(ui_main_data.signalslist), path_row, NULL, TRUE, 0.5, 0.0);
-
-    if (path != NULL)
-    {
-        *path = path_row;
-    }
 }
 
 void ui_tree_view_refilter(void)
diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.h b/common/utils/itti_analyzer/libui/ui_tree_view.h
index f03bb2bb8f708c4a934d8cfa4b102c3f80eb75ae..a9aba1edfa5aec63a33851fe0cfdfc3a2aeed054 100644
--- a/common/utils/itti_analyzer/libui/ui_tree_view.h
+++ b/common/utils/itti_analyzer/libui/ui_tree_view.h
@@ -18,6 +18,8 @@ typedef enum
     NUM_COLS
 } col_type_e;
 
+extern GdkEventButton *ui_tree_view_last_event;
+
 int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox);
 
 int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_time,
@@ -28,7 +30,7 @@ int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_
 
 void ui_tree_view_destroy_list(GtkWidget *list);
 
-void ui_tree_view_select_row(gint row, GtkTreePath **path);
+void ui_tree_view_select_row(gint row);
 
 void ui_tree_view_refilter(void);