diff --git a/common/utils/itti_analyzer/itti_analyzer.c b/common/utils/itti_analyzer/itti_analyzer.c
index 8e90cf0e0a5ba6f1624fe2ab9f5a9112b22321bc..b133a92ddac4247ed2e44347b674924e681baadf 100644
--- a/common/utils/itti_analyzer/itti_analyzer.c
+++ b/common/utils/itti_analyzer/itti_analyzer.c
@@ -47,6 +47,7 @@ console_log_handler(const char *log_domain, GLogLevelFlags log_level,
             fprintf(stderr, "unknown log_level %u\n", log_level);
             level = NULL;
             g_assert_not_reached();
+            break;
     }
 
     /* create a "timestamp" */
diff --git a/common/utils/itti_analyzer/libparser/xml_parse.c b/common/utils/itti_analyzer/libparser/xml_parse.c
index 4e8ea4ba03a99108ce99bae302a29c79333e8175..108f2a7bc5525347fc069988bce9d70ca5cb93b7 100644
--- a/common/utils/itti_analyzer/libparser/xml_parse.c
+++ b/common/utils/itti_analyzer/libparser/xml_parse.c
@@ -10,6 +10,7 @@
 
 #include "ui_interface.h"
 #include "ui_notif_dlg.h"
+#include "ui_filters.h"
 
 #include "../libresolver/locate_root.h"
 #include "../libresolver/resolvers.h"
@@ -702,6 +703,47 @@ int xml_parse_file(const char *filename) {
     return xml_parse_doc(doc);
 }
 
+static int update_filters() {
+    types_t *types;
+
+    ui_init_filters(FALSE, TRUE);
+
+    types = messages_id_enum;
+    if (types != NULL)
+    {
+        types = types->child;
+
+        while (types != NULL) {
+            ui_filters_add(FILTER_MESSAGES, types->init_value, types->name);
+            types = types->next;
+        }
+    }
+
+    types = origin_task_id_type;
+    if (types != NULL)
+    {
+        types = types->child->child;
+
+        while (types != NULL) {
+            ui_filters_add(FILTER_ORIGIN_TASKS, types->init_value, types->name);
+            types = types->next;
+        }
+    }
+
+    types = destination_task_id_type;
+    if (types != NULL)
+    {
+        types = types->child->child;
+
+        while (types != NULL) {
+            ui_filters_add(FILTER_DESTINATION_TASKS, types->init_value, types->name);
+            types = types->next;
+        }
+    }
+
+    return RC_OK;
+}
+
 static int xml_parse_doc(xmlDocPtr doc) {
     xmlNode *root_element = NULL;
     types_t *head = NULL;
@@ -740,6 +782,7 @@ static int xml_parse_doc(xmlDocPtr doc) {
         CHECK_FCT(locate_type("originTaskId", head, &origin_task_id_type));
         CHECK_FCT(locate_type("destinationTaskId", head, &destination_task_id_type));
         // root->type_hr_display(root, 0);
+        update_filters();
         if (dissect_file != NULL) {
             root->type_file_print (root, 0, dissect_file);
         }
diff --git a/common/utils/itti_analyzer/libui/Makefile.am b/common/utils/itti_analyzer/libui/Makefile.am
index 8a74c0b2cfca423cb6f0b6c4e405cc0517b4e107..4a0d88cb95c23cb075e0a275811e72e5d6b43015 100644
--- a/common/utils/itti_analyzer/libui/Makefile.am
+++ b/common/utils/itti_analyzer/libui/Makefile.am
@@ -17,4 +17,5 @@ libui_la_SOURCES = \
 	ui_notifications.c		ui_notifications.h	\
 	ui_notif_dlg.c			ui_notif_dlg.h	\
 	ui_interface.c			ui_interface.h	\
-	ui_notebook.c			ui_notebook.h
+	ui_notebook.c			ui_notebook.h	\
+	ui_filters.c			ui_filters.h
\ No newline at end of file
diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.c b/common/utils/itti_analyzer/libui/ui_callbacks.c
index 1ae52ee580fd992448f98cc7998787d279927e86..dfbd59648ea1600f035d791d02fa772346370786 100644
--- a/common/utils/itti_analyzer/libui/ui_callbacks.c
+++ b/common/utils/itti_analyzer/libui/ui_callbacks.c
@@ -15,6 +15,7 @@
 #include "ui_notifications.h"
 #include "ui_tree_view.h"
 #include "ui_signal_dissect_view.h"
+#include "ui_filters.h"
 
 #include "types.h"
 #include "locate_root.h"
@@ -236,8 +237,8 @@ gboolean ui_callback_on_connect(GtkWidget *widget, GdkEvent *event, gpointer dat
 
     g_debug("Connect event occurred");
 
-    port = atoi (gtk_entry_get_text (GTK_ENTRY(ui_main_data.portentry)));
-    ip = gtk_entry_get_text (GTK_ENTRY(ui_main_data.ipentry));
+    port = atoi (gtk_entry_get_text (GTK_ENTRY(ui_main_data.port_entry)));
+    ip = gtk_entry_get_text (GTK_ENTRY(ui_main_data.ip_entry));
 
     if ((ip == NULL) || (port == 0))
     {
@@ -315,20 +316,92 @@ gboolean ui_callback_on_tree_view_select(GtkWidget *widget, GdkEvent *event, gpo
     return TRUE;
 }
 
-gboolean ui_callback_on_tree_column_header_click_signal(GtkWidget *widget, GdkEvent *event, gpointer data)
+static gboolean ui_callback_on_menu_item_selected(GtkWidget *widget, gpointer data)
 {
-    g_debug("ui_callback_on_tree_column_header_click_signal\n");
+    ui_filter_item_t *filter_entry = data;
+
+    // g_debug("ui_callback_on_menu_item_selected occurred %x %x %s", widget, data, filter_entry->name);
+    filter_entry->enabled = ~filter_entry->enabled;
+
     return TRUE;
 }
 
-gboolean ui_callback_on_tree_column_header_click_from(GtkWidget *widget, GdkEvent *event, gpointer data)
+static void ui_create_filter_menu(GtkWidget **menu, ui_filter_t *filter)
 {
-    g_debug("ui_callback_on_tree_column_header_click_from\n");
-    return TRUE;
+    GtkWidget *menu_items;
+    int item;
+    gpointer data;
+
+    *menu = gtk_menu_new ();
+
+    for (item = 0; item < filter->used; item++)
+    {
+        /* Create a new menu-item with a name */
+        menu_items = gtk_check_menu_item_new_with_label (filter->items[item].name);
+
+        /* Add it to the menu. */
+        gtk_menu_shell_append (GTK_MENU_SHELL (*menu), menu_items);
+
+        gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menu_items), filter->items[item].enabled);
+
+        /* Connect function to be called when the menu item is selected */
+        data = &filter->items[item];
+        //g_debug("ui_create_filter_menu %x %x", menu_items, data);
+        g_signal_connect(G_OBJECT (menu_items), "activate", G_CALLBACK(ui_callback_on_menu_item_selected), data);
+
+        /* Show the widget */
+        gtk_widget_show (menu_items);
+    }
+}
+
+static void ui_destroy_filter_menu(GtkWidget **menu, ui_filter_t *filter)
+{
+    /* TODO destroy menu items ? */
+
+    gtk_widget_destroy (*menu);
+    *menu = NULL;
 }
 
-gboolean ui_callback_on_tree_column_header_click_to(GtkWidget *widget, GdkEvent *event, gpointer data)
+void ui_destroy_filter_menus()
 {
-    g_debug("ui_callback_on_tree_column_header_click_to\n");
+    ui_destroy_filter_menu (&ui_main_data.menu_filter_messages, &ui_filters.messages);
+    ui_destroy_filter_menu (&ui_main_data.menu_filter_origin_tasks, &ui_filters.origin_tasks);
+    ui_destroy_filter_menu (&ui_main_data.menu_filter_destination_tasks, &ui_filters.destination_tasks);
+}
+
+static void ui_show_filter_menu(GtkWidget **menu, ui_filter_t *filter)
+{
+    if (*menu == NULL)
+    {
+        ui_create_filter_menu (menu, filter);
+    }
+
+    gtk_menu_popup (GTK_MENU (*menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ());
+}
+
+gboolean ui_callback_on_tree_column_header_click(GtkWidget *widget, gpointer data)
+{
+    col_type_e col = (col_type_e) data;
+
+    g_debug("ui_callback_on_tree_column_header_click %x", col);
+    switch (col)
+    {
+        case COL_SIGNAL:
+            ui_show_filter_menu (&ui_main_data.menu_filter_messages, &ui_filters.messages);
+            break;
+
+        case COL_FROM_TASK:
+            ui_show_filter_menu (&ui_main_data.menu_filter_origin_tasks, &ui_filters.origin_tasks);
+            break;
+
+        case COL_TO_TASK:
+            ui_show_filter_menu (&ui_main_data.menu_filter_destination_tasks, &ui_filters.destination_tasks);
+            break;
+
+        default:
+            g_warning("Unknown column filter %d in call to ui_callback_on_tree_column_header_click", col);
+            return FALSE;
+    }
+
     return TRUE;
 }
diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.h b/common/utils/itti_analyzer/libui/ui_callbacks.h
index 9524b7c8d383166e390d1a6ab7c74e835c9ef8df..4d4217c89ed44e6b4c20e4aef4bd5ddf78e06ca2 100644
--- a/common/utils/itti_analyzer/libui/ui_callbacks.h
+++ b/common/utils/itti_analyzer/libui/ui_callbacks.h
@@ -61,16 +61,6 @@ gboolean ui_callback_signal_clear_list(GtkWidget *widget,
 
 gboolean ui_pipe_callback(gint source, gpointer user_data);
 
-gboolean ui_callback_on_tree_column_header_click_signal(GtkWidget *widget,
-                                                        GdkEvent  *event,
-                                                        gpointer   data);
-
-gboolean ui_callback_on_tree_column_header_click_from(GtkWidget *widget,
-                                                      GdkEvent  *event,
-                                                      gpointer   data);
-
-gboolean ui_callback_on_tree_column_header_click_to(GtkWidget *widget,
-                                                    GdkEvent  *event,
-                                                    gpointer   data);
-
+gboolean ui_callback_on_tree_column_header_click(GtkWidget *widget,
+                                                 gpointer   data);
 #endif /* UI_CALLBACKS_H_ */
diff --git a/common/utils/itti_analyzer/libui/ui_filters.c b/common/utils/itti_analyzer/libui/ui_filters.c
new file mode 100644
index 0000000000000000000000000000000000000000..7cde51faf1d15b50f365f08905cf11d359366702
--- /dev/null
+++ b/common/utils/itti_analyzer/libui/ui_filters.c
@@ -0,0 +1,172 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <glib.h>
+
+#include "ui_filters.h"
+#include "rc.h"
+
+const uint32_t FILTER_ALLOC_NUMBER = 100;
+
+ui_filters_t ui_filters;
+
+static int ui_init_filter(ui_filter_t *filter, int reset, int clear_ids)
+{
+    if (filter->items == NULL)
+    {
+        /* Allocate some filter entries */
+        filter->items = malloc (FILTER_ALLOC_NUMBER * sizeof(ui_filter_item_t));
+        filter->allocated = FILTER_ALLOC_NUMBER;
+    }
+    if (reset)
+    {
+        /* Reset number of used filter entries */
+        filter->used = 0;
+    }
+    else
+    {
+        if (clear_ids)
+        {
+            /* Clear entries IDs */
+            int item;
+
+            for (item = 0; item < filter->used; item++)
+            {
+                filter->items[item].id = ~0;
+            }
+        }
+    }
+
+    return (RC_OK);
+}
+
+int ui_init_filters(int reset, int clear_ids)
+{
+    ui_init_filter (&ui_filters.messages, reset, clear_ids);
+    ui_init_filter (&ui_filters.origin_tasks, reset, clear_ids);
+    ui_init_filter (&ui_filters.destination_tasks, reset, clear_ids);
+
+    return (RC_OK);
+}
+
+static int ui_search_name(ui_filter_t *filter, char *name)
+{
+    int item;
+
+    for (item = 0; item < filter->used; item++)
+    {
+        if (strncmp (name, filter->items[item].name, SIGNAL_NAME_LENGTH) == 0)
+        {
+            return (item);
+        }
+    }
+
+    return (item);
+}
+
+static int ui_filter_add(ui_filter_t *filter, uint32_t value, char *name)
+{
+    int item = ui_search_name (filter, name);
+
+    if (item >= filter->allocated)
+    {
+        /* Increase number of filter entries */
+        filter->items = realloc (filter->items, (filter->allocated + FILTER_ALLOC_NUMBER) * sizeof(ui_filter_item_t));
+        filter->allocated += FILTER_ALLOC_NUMBER;
+    }
+
+    filter->items[item].id = value;
+    if (item >= filter->used)
+    {
+        /* New entry */
+        strncpy(filter->items[item].name, name, SIGNAL_NAME_LENGTH);
+        filter->items[item].enabled = TRUE;
+
+        filter->used++;
+    }
+
+    return (item);
+}
+
+void ui_filters_add(ui_filter_e filter, uint32_t value, char *name)
+{
+    switch (filter)
+    {
+        case FILTER_MESSAGES:
+            ui_filter_add (&ui_filters.messages, value, name);
+            break;
+
+        case FILTER_ORIGIN_TASKS:
+            ui_filter_add (&ui_filters.origin_tasks, value, name);
+            break;
+
+        case FILTER_DESTINATION_TASKS:
+            ui_filter_add (&ui_filters.destination_tasks, value, name);
+            break;
+
+        default:
+            g_error("unknown filter type %d", filter);
+            break;
+    }
+}
+
+static void parse_filters(void)
+{
+}
+
+static int write_filters_file(void)
+{
+    char *filter_file_name = "./filters.xml";
+    FILE *filter_file;
+
+    // types_t *types;
+
+    filter_file = fopen (filter_file_name, "w");
+    if (filter_file == NULL)
+    {
+        g_warning("Failed to open file \"%s\": %s", filter_file_name, g_strerror (errno));
+        return RC_FAIL;
+    }
+
+    fprintf (filter_file, "<filters>\n");
+
+    /*    types = messages_id_enum;
+     if (types != NULL)
+     {
+     types = types->child;
+     }
+     fprintf (filter_file, "  <messages>\n");
+     while (types != NULL) {
+     fprintf (filter_file, "    %s=\"1\"\n", types->name);
+     types = types->next;
+     }
+     fprintf (filter_file, "  </messages>\n");
+
+     types = origin_task_id_type;
+     if (types != NULL)
+     {
+     types = types->child->child;
+     }
+     fprintf (filter_file, "  <origin_tasks>\n");
+     while (types != NULL) {
+     fprintf (filter_file, "    %s=\"1\"\n", types->name);
+     types = types->next;
+     }
+     fprintf (filter_file, "  </origin_tasks>\n");
+
+     types = destination_task_id_type;
+     if (types != NULL)
+     {
+     types = types->child->child;
+     }
+     fprintf (filter_file, "  <destination_tasks>\n");
+     while (types != NULL) {
+     fprintf (filter_file, "    %s=\"1\"\n", types->name);
+     types = types->next;
+     }
+     fprintf (filter_file, "  </destination_tasks>\n");
+     */
+    fprintf (filter_file, "</filters>\n");
+
+    fclose (filter_file);
+    return RC_OK;
+}
diff --git a/common/utils/itti_analyzer/libui/ui_filters.h b/common/utils/itti_analyzer/libui/ui_filters.h
new file mode 100644
index 0000000000000000000000000000000000000000..a27d96847db315c17a4fb8b1fba8dc5baf8087d7
--- /dev/null
+++ b/common/utils/itti_analyzer/libui/ui_filters.h
@@ -0,0 +1,40 @@
+#ifndef UI_FILTERS_H_
+#define UI_FILTERS_H_
+
+#include <stdint.h>
+
+#include "itti_types.h"
+
+typedef enum
+{
+    FILTER_MESSAGES, FILTER_ORIGIN_TASKS, FILTER_DESTINATION_TASKS,
+} ui_filter_e;
+
+typedef struct
+{
+    uint32_t id;
+    char name[SIGNAL_NAME_LENGTH];
+    uint8_t enabled;
+} ui_filter_item_t;
+
+typedef struct
+{
+    uint32_t allocated;
+    uint32_t used;
+    ui_filter_item_t *items;
+} ui_filter_t;
+
+typedef struct
+{
+    ui_filter_t messages;
+    ui_filter_t origin_tasks;
+    ui_filter_t destination_tasks;
+} ui_filters_t;
+
+extern ui_filters_t ui_filters;
+
+int ui_init_filters(int reset, int clear_ids);
+
+void ui_filters_add(ui_filter_e filter, uint32_t value, char *name);
+
+#endif /* UI_FILTERS_H_ */
diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.c b/common/utils/itti_analyzer/libui/ui_main_screen.c
index b1ce58c1a677432dec87cc646f2618aa04614f71..6671de389b91371189136fc88d9ace20cfc2671c 100644
--- a/common/utils/itti_analyzer/libui/ui_main_screen.c
+++ b/common/utils/itti_analyzer/libui/ui_main_screen.c
@@ -5,7 +5,9 @@
 
 #include <stdio.h>
 #include <stdint.h>
+#include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 #include <gtk/gtk.h>
 
@@ -17,17 +19,73 @@
 #include "ui_tree_view.h"
 #include "ui_notebook.h"
 #include "ui_notifications.h"
+#include "ui_filters.h"
 
 ui_main_data_t ui_main_data;
 
+static void ui_help(void)
+{
+    printf ("Usage: itti_analyser [options]\n\n"
+            "Options:\n"
+            "  -f FILTERS   read filters from FILTERS file\n"
+            "  -h           display this help and exit\n"
+            "  -i IP        set ip address to IP\n"
+            "  -m MESSAGES  read messages from MESSAGES file\n"
+            "  -p PORT      set port to PORT\n");
+}
+
+static void ui_gtk_parse_arg(int argc, char *argv[])
+{
+    char c;
+
+    while ((c = getopt (argc, argv, "f:hi:m:p:")) != -1)
+    {
+        switch (c)
+        {
+            case 'f':
+                ui_main_data.filters_file_name = optarg;
+                break;
+
+            case 'h':
+                ui_help();
+                exit(0);
+                break;
+
+            case 'i':
+                ui_main_data.ip_entry_init = optarg;
+                break;
+
+            case 'm':
+                ui_main_data.messages_file_name = optarg;
+                break;
+
+            case 'p':
+                 ui_main_data.port_entry_init = optarg;
+                 break;
+
+             default:
+                ui_help ();
+                exit (-1);
+                break;
+        }
+    }
+}
+
 int ui_gtk_initialize(int argc, char *argv[])
 {
     GtkWidget *vbox;
 
     memset(&ui_main_data, 0, sizeof(ui_main_data_t));
 
+    /* Set some default initialization value */
+    ui_main_data.ip_entry_init = "127.0.0.1";
+    ui_main_data.port_entry_init = "10007";
+
+    ui_gtk_parse_arg(argc, argv);
+
     /* Create the main window */
     ui_main_data.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    ui_init_filters(TRUE, FALSE);
 
     gtk_window_set_position(GTK_WINDOW(ui_main_data.window), GTK_WIN_POS_CENTER);
     gtk_window_set_default_size(GTK_WINDOW(ui_main_data.window), 1024, 800);
@@ -52,5 +110,17 @@ int ui_gtk_initialize(int argc, char *argv[])
     /* Show the application window */
     gtk_widget_show_all (ui_main_data.window);
 
+    /* Read filters file */
+    if (ui_main_data.filters_file_name != NULL)
+    {
+        // ui_filters_read(ui_main_data.filters_file_name);
+    }
+
+    /* Read messages file */
+    if (ui_main_data.messages_file_name != NULL)
+    {
+        ui_messages_read(ui_main_data.messages_file_name);
+    }
+
     return RC_OK;
 }
diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.h b/common/utils/itti_analyzer/libui/ui_main_screen.h
index c30b1843294cdf053bc7f0d8abb03d15dd183c18..14012d4a442ebaa78a19799a3c590c1fb8e93c46 100644
--- a/common/utils/itti_analyzer/libui/ui_main_screen.h
+++ b/common/utils/itti_analyzer/libui/ui_main_screen.h
@@ -5,8 +5,10 @@
 
 typedef struct {
     GtkWidget *window;
-    GtkWidget *ipentry;
-    GtkWidget *portentry;
+    GtkWidget *ip_entry;
+    char *ip_entry_init;
+    GtkWidget *port_entry;
+    char *port_entry_init;
 
     GtkWidget      *progressbar;
     GtkWidget      *signalslist;
@@ -33,6 +35,13 @@ typedef struct {
     /* Nb of messages received */
     guint nb_message_received;
 
+    char *filters_file_name;
+    char *messages_file_name;
+
+    GtkWidget *menu_filter_messages;
+    GtkWidget *menu_filter_origin_tasks;
+    GtkWidget *menu_filter_destination_tasks;
+
     int pipe_fd[2];
 } ui_main_data_t;
 
diff --git a/common/utils/itti_analyzer/libui/ui_menu_bar.c b/common/utils/itti_analyzer/libui/ui_menu_bar.c
index e2f5d2b396e7329f3fd03ea1c242a5264cfb19a0..d03a477521446359eb6e106c800b9e2a981be72d 100644
--- a/common/utils/itti_analyzer/libui/ui_menu_bar.c
+++ b/common/utils/itti_analyzer/libui/ui_menu_bar.c
@@ -25,6 +25,8 @@ int ui_menu_bar_create(GtkWidget *vbox)
     GtkWidget *save_filters;
     GtkWidget *quit;
     GtkWidget *about;
+    GtkWidget *separator1;
+    GtkWidget *separator2;
 
     if (!vbox)
         return RC_BAD_PARAM;
@@ -40,14 +42,18 @@ int ui_menu_bar_create(GtkWidget *vbox)
     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);
 
     /* Create the Help submenu */
@@ -241,21 +247,21 @@ int ui_toolbar_create(GtkWidget *vbox)
     iplabel = gtk_label_new("ip:");
     portlabel = gtk_label_new("port:");
 
-    ui_main_data.ipentry = gtk_entry_new();
+    ui_main_data.ip_entry = gtk_entry_new();
     /* Width of 15 characters for port number (ipv4 address) */
-    gtk_entry_set_width_chars(GTK_ENTRY(ui_main_data.ipentry), 15);
-    gtk_entry_set_text(GTK_ENTRY(ui_main_data.ipentry), "127.0.0.1");
+    gtk_entry_set_width_chars(GTK_ENTRY(ui_main_data.ip_entry), 15);
+    gtk_entry_set_text(GTK_ENTRY(ui_main_data.ip_entry), ui_main_data.ip_entry_init);
 
-    ui_main_data.portentry = gtk_entry_new();
+    ui_main_data.port_entry = gtk_entry_new();
     /* Width of 5 characters for port number (uint16_t) */
-    gtk_entry_set_width_chars(GTK_ENTRY(ui_main_data.portentry), 5);
-    gtk_entry_set_text(GTK_ENTRY(ui_main_data.portentry), "10007");
+    gtk_entry_set_width_chars(GTK_ENTRY(ui_main_data.port_entry), 5);
+    gtk_entry_set_text(GTK_ENTRY(ui_main_data.port_entry), ui_main_data.port_entry_init);
 
     gtk_box_pack_start(GTK_BOX(hbox), toolbar, FALSE, FALSE, 5);
     gtk_box_pack_start(GTK_BOX(hbox), iplabel, FALSE, FALSE, 2);
-    gtk_box_pack_start(GTK_BOX(hbox), ui_main_data.ipentry, FALSE, FALSE, 5);
+    gtk_box_pack_start(GTK_BOX(hbox), ui_main_data.ip_entry, FALSE, FALSE, 5);
     gtk_box_pack_start(GTK_BOX(hbox), portlabel, FALSE, FALSE, 2);
-    gtk_box_pack_start(GTK_BOX(hbox), ui_main_data.portentry, FALSE, FALSE, 5);
+    gtk_box_pack_start(GTK_BOX(hbox), ui_main_data.port_entry, FALSE, FALSE, 5);
     gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
 
     return RC_OK;
diff --git a/common/utils/itti_analyzer/libui/ui_notifications.c b/common/utils/itti_analyzer/libui/ui_notifications.c
index dbafad8511536e4da86ff67fd3a6cfcc7bd42003..5081bf1ba7719fd91ed846c73799f6cc388ea1c1 100644
--- a/common/utils/itti_analyzer/libui/ui_notifications.c
+++ b/common/utils/itti_analyzer/libui/ui_notifications.c
@@ -34,119 +34,126 @@ int ui_enable_connect_button(void)
     return RC_OK;
 }
 
-int ui_messages_open_file_chooser(void)
+int ui_messages_read(char *filename)
 {
-    GtkWidget *filechooser;
     int result = RC_OK;
-
-    filechooser = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (ui_main_data.window),
-                                               GTK_FILE_CHOOSER_ACTION_OPEN,
-                                               GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
-                                               GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
-                                               NULL);
-
-    /* Process the response */
-    if (gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT)
+    int source;
+    int read_data = 0;
+    void *input_data = NULL;
+    size_t input_data_length = 0;
+    int read_messages = 0;
+
+    source = open (filename, O_RDONLY);
+    if (source < 0)
     {
-        char *filename;
-        int source;
-        int read_data = 0;
-        void *input_data = NULL;
-        size_t input_data_length = 0;
-        int read_messages = 0;
+        g_warning( "Failed to open file \"%s\": %s", filename, g_strerror (errno));
+        result = RC_FAIL;
+    }
+    else
+    {
+        itti_socket_header_t message_header;
 
-        filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
+        ui_callback_signal_clear_list (NULL, NULL, NULL);
 
-        source = open (filename, O_RDONLY);
-        if (source < 0)
-        {
-            g_warning ("Failed to open file \"%s\": %s", filename, g_strerror (errno));
-            result = RC_FAIL;
-        }
-        else
+        do
         {
-            itti_socket_header_t message_header;
+            read_data = read (source, &message_header, sizeof(itti_socket_header_t));
 
-            ui_callback_signal_clear_list(NULL, NULL, NULL);
+            if (read_data == -1)
+            {
+                g_warning("Failed to read from file \"%s\": %s", filename, g_strerror (errno));
+                result = RC_FAIL;
+                break;
+            }
 
-            do
+            if (read_data > 0)
             {
-                read_data = read (source, &message_header, sizeof(itti_socket_header_t));
+                input_data_length = message_header.message_size - sizeof(itti_socket_header_t);
 
-                if (read_data == -1)
-                {
-                    g_warning ("Failed to read from file \"%s\": %s", filename, g_strerror (errno));
-                    result = RC_FAIL;
-                    break;
-                }
+                // g_debug ("%x, %x ,%x\n", message_header.message_type, message_header.message_size, input_data_length);
 
-                if (read_data > 0)
+                /* Checking for non-header part */
+                if (input_data_length > 0)
                 {
-                    input_data_length = message_header.message_size - sizeof(itti_socket_header_t);
+                    input_data = malloc (input_data_length);
 
-                    // g_debug ("%x, %x ,%x\n", message_header.message_type, message_header.message_size, input_data_length);
-
-                    /* Checking for non-header part */
-                    if (input_data_length > 0)
+                    if (read (source, input_data, input_data_length) < 0)
                     {
-                        input_data = malloc (input_data_length);
-
-                        if (read (source, input_data, input_data_length) < 0)
-                        {
-                            g_warning ("Failed to read from file \"%s\": %s", filename, g_strerror (errno));
-                            result = RC_FAIL;
-                            break;
-                        }
+                        g_warning("Failed to read from file \"%s\": %s", filename, g_strerror (errno));
+                        result = RC_FAIL;
+                        break;
                     }
+                }
 
-                    switch (message_header.message_type)
+                switch (message_header.message_type)
+                {
+                    case ITTI_DUMP_MESSAGE_TYPE:
                     {
-                        case ITTI_DUMP_MESSAGE_TYPE:
+                        itti_signal_header_t *itti_signal_header = input_data;
+                        buffer_t *buffer;
+
+                        /* Create the new buffer */
+                        if (buffer_new_from_data (&buffer, input_data + sizeof(itti_signal_header_t),
+                                                  input_data_length - sizeof(itti_signal_header_t), 0) != RC_OK)
                         {
-                            itti_signal_header_t *itti_signal_header = input_data;
-                            buffer_t *buffer;
-
-                            /* Create the new buffer */
-                            if (buffer_new_from_data (&buffer, input_data + sizeof(itti_signal_header_t),
-                                                      input_data_length - sizeof(itti_signal_header_t), 0) != RC_OK)
-                            {
-                                g_error ("Failed to create new buffer");
-                                g_assert_not_reached ();
-                            }
-
-                            buffer->message_number = itti_signal_header->message_number;
-
-                            ui_signal_add_to_list (buffer, NULL);
-                            read_messages ++;
-                            break;
+                            g_error("Failed to create new buffer");
+                            g_assert_not_reached ();
                         }
 
-                        case ITTI_DUMP_XML_DEFINITION:
-                            xml_parse_buffer (input_data, input_data_length);
-                            break;
+                        buffer->message_number = itti_signal_header->message_number;
 
-                        case ITTI_STATISTIC_MESSAGE_TYPE:
-                        default:
-                            g_debug ("Received unknow (or not implemented) message from socket type: %d",
-                                     message_header.message_type);
-                            break;
+                        ui_signal_add_to_list (buffer, NULL);
+                        read_messages++;
+                        break;
                     }
 
-                    free (input_data);
+                    case ITTI_DUMP_XML_DEFINITION:
+                        xml_parse_buffer (input_data, input_data_length);
+                        break;
+
+                    case ITTI_STATISTIC_MESSAGE_TYPE:
+                    default:
+                        g_debug("Received unknow (or not implemented) message from socket type: %d", message_header.message_type);
+                        break;
                 }
-            } while (read_data > 0);
 
-            if (read_messages > 0)
-            {
-                /* Enable buttons to move in the list of signals */
-                ui_set_sensitive_move_buttons(TRUE);
+                free (input_data);
             }
+        } while (read_data > 0);
 
-            g_debug ("Read %d messages from file \"%s\"\n", read_messages, filename);
-
-            close (source);
+        if (read_messages > 0)
+        {
+            /* Enable buttons to move in the list of signals */
+            ui_set_sensitive_move_buttons (TRUE);
         }
 
+        g_debug("Read %d messages from file \"%s\"\n", read_messages, filename);
+
+        close (source);
+    }
+
+    return result;
+}
+
+int ui_messages_open_file_chooser(void)
+{
+    GtkWidget *filechooser;
+    int result = RC_OK;
+
+    filechooser = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (ui_main_data.window),
+                                               GTK_FILE_CHOOSER_ACTION_OPEN,
+                                               GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+                                               GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+                                               NULL);
+
+    /* Process the response */
+    if (gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT)
+    {
+        char *filename;
+
+        filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
+        result = ui_messages_read(filename);
+
         g_free (filename);
     }
 
diff --git a/common/utils/itti_analyzer/libui/ui_notifications.h b/common/utils/itti_analyzer/libui/ui_notifications.h
index fcb38540f82328da751a8909e8527e731675c26c..c90da8ac3c4f1672d3ffe93c6e68dd13e9b46f49 100644
--- a/common/utils/itti_analyzer/libui/ui_notifications.h
+++ b/common/utils/itti_analyzer/libui/ui_notifications.h
@@ -5,6 +5,8 @@ int ui_disable_connect_button(void);
 
 int ui_enable_connect_button(void);
 
+int ui_messages_read(char *filename);
+
 int ui_messages_open_file_chooser(void);
 
 int ui_filters_open_file_chooser(void);
diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.c b/common/utils/itti_analyzer/libui/ui_tree_view.c
index dcbadd65593ba05d6d3250a93a19ae3eaed6788c..8d177bbefe1cb3ff947217bf6a64e8ad96460826 100644
--- a/common/utils/itti_analyzer/libui/ui_tree_view.c
+++ b/common/utils/itti_analyzer/libui/ui_tree_view.c
@@ -29,19 +29,19 @@ ui_tree_view_init_list(GtkWidget *list)
         "Signal", renderer, "text", COL_SIGNAL, NULL);
     gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
     g_signal_connect(G_OBJECT(column), "clicked",
-                     G_CALLBACK(ui_callback_on_tree_column_header_click_signal), NULL);
+                     G_CALLBACK(ui_callback_on_tree_column_header_click), (gpointer) COL_SIGNAL);
 
     column = gtk_tree_view_column_new_with_attributes(
         "From", renderer, "text", COL_FROM_TASK, NULL);
     gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
     g_signal_connect(G_OBJECT(column), "clicked",
-                     G_CALLBACK(ui_callback_on_tree_column_header_click_from), NULL);
+                     G_CALLBACK(ui_callback_on_tree_column_header_click), (gpointer) COL_FROM_TASK);
 
     column = gtk_tree_view_column_new_with_attributes(
         "To", renderer, "text", COL_TO_TASK, NULL);
     gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
     g_signal_connect(G_OBJECT(column), "clicked",
-                     G_CALLBACK(ui_callback_on_tree_column_header_click_to), NULL);
+                     G_CALLBACK(ui_callback_on_tree_column_header_click), (gpointer) COL_TO_TASK);
 
     store = gtk_list_store_new(NUM_COLS,
                                G_TYPE_STRING,
@@ -95,6 +95,7 @@ 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;
 }
 
 int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox)