diff --git a/common/utils/itti_analyzer/itti_analyzer.c b/common/utils/itti_analyzer/itti_analyzer.c
index 9f2d7f20bb27141995ff26a5d45ab9e042132612..94f5c1c191e314c3e90790f5e5d2040cce6a7c7b 100644
--- a/common/utils/itti_analyzer/itti_analyzer.c
+++ b/common/utils/itti_analyzer/itti_analyzer.c
@@ -82,7 +82,8 @@ int main(int argc, char *argv[])
      * between the version it was compiled for and the actual shared
      * library used.
      */
-    LIBXML_TEST_VERSION
+    LIBXML_TEST_VERSION;
+    xmlInitParser();
 
     /* Initialize the widget set */
     gtk_init(&argc, &argv);
@@ -94,5 +95,10 @@ int main(int argc, char *argv[])
     /* Enter the main event loop, and wait for user interaction */
     gtk_main ();
 
+    /* Free the global variables that may
+     * have been allocated by the parser.
+     */
+    xmlCleanupParser ();
+
     return ret;
 }
diff --git a/common/utils/itti_analyzer/libparser/xml_parse.c b/common/utils/itti_analyzer/libparser/xml_parse.c
index a810c1f1aa47adabcad64d3d2389e69ff5ad5905..20bc0dd9129292fc9ddbd38dca7df3740d1f391d 100644
--- a/common/utils/itti_analyzer/libparser/xml_parse.c
+++ b/common/utils/itti_analyzer/libparser/xml_parse.c
@@ -752,11 +752,6 @@ static int xml_parse_doc(xmlDocPtr doc) {
     /* Free the document */
     xmlFreeDoc(doc);
 
-    /* Free the global variables that may
-     * have been allocated by the parser.
-     */
-    xmlCleanupParser();
-
     if (ret == RC_OK) {
         resolve_typedefs (&head);
         resolve_pointer_type (&head);
diff --git a/common/utils/itti_analyzer/libui/ui_filters.c b/common/utils/itti_analyzer/libui/ui_filters.c
index 649631a8a35be7de2765667c47f8c6be491b90ac..5fe994b83a9eaacda76e8c61cb78ece0c24daf2d 100644
--- a/common/utils/itti_analyzer/libui/ui_filters.c
+++ b/common/utils/itti_analyzer/libui/ui_filters.c
@@ -214,7 +214,7 @@ static int xml_parse_filters(xmlDocPtr doc)
     xmlNode *filter_node = NULL;
     xmlNode *cur_node = NULL;
     ui_filter_e filter;
-    int ret = RC_OK;
+    int ret = RC_FAIL;
 
     /* Get the root element node */
     root_element = xmlDocGetRootElement (doc);
@@ -222,7 +222,7 @@ static int xml_parse_filters(xmlDocPtr doc)
     if (root_element != NULL)
     {
         /* Search for the start of filters definition */
-        for (cur_node = root_element; (strcmp ((char *) cur_node->name, "filters") != 0) && (cur_node != NULL);
+        for (cur_node = root_element; (cur_node != NULL) && (strcmp ((char *) cur_node->name, "filters") != 0);
                 cur_node = cur_node->next)
             ;
 
@@ -265,6 +265,7 @@ static int xml_parse_filters(xmlDocPtr doc)
                                         cur_node->properties->children->content[0] == '0' ?
                                                 ENTRY_ENABLED_FALSE : ENTRY_ENABLED_TRUE);
 
+                                ret = RC_OK;
                                 cur_node = cur_node->next;
                             }
                         }
@@ -281,12 +282,7 @@ static int xml_parse_filters(xmlDocPtr doc)
     /* Free the document */
     xmlFreeDoc (doc);
 
-    /* Free the global variables that may
-     * have been allocated by the parser.
-     */
-    xmlCleanupParser ();
-
-    g_message("Parsed filters definition");
+    g_message("Parsed XML filters definition");
 
     return ret;
 }
@@ -294,6 +290,7 @@ static int xml_parse_filters(xmlDocPtr doc)
 int ui_filters_read(const char *file_name)
 {
     xmlDocPtr doc; /* the resulting document tree */
+    int ret;
 
     if (file_name == NULL)
     {
@@ -310,7 +307,16 @@ int ui_filters_read(const char *file_name)
         return RC_FAIL;
     }
 
-    return xml_parse_filters (doc);
+    ret = xml_parse_filters (doc);
+
+    if (ret != RC_OK)
+    {
+        g_warning("Found no filter definition in \"%s\"", file_name);
+        ui_notification_dialog (DIALOG_WARNING, "Found no filter definition in \"%s\"", file_name);
+        return RC_FAIL;
+    }
+
+    return ret;
 }
 
 static void write_filter(FILE *filter_file, ui_filter_t *filter)
@@ -343,7 +349,8 @@ int ui_filters_file_write(const char *file_name)
         return RC_FAIL;
     }
 
-    fprintf (filter_file, "<filters>\n");
+    fprintf (filter_file, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+             "<filters>\n");
 
     write_filter (filter_file, &ui_filters.messages);
     write_filter (filter_file, &ui_filters.origin_tasks);
diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.c b/common/utils/itti_analyzer/libui/ui_main_screen.c
index 63e3498e9cc1d89a3abfca80d6fef32c50b1b113..46721db1e3c52ee26d646fad81abb325f1d21be5 100644
--- a/common/utils/itti_analyzer/libui/ui_main_screen.c
+++ b/common/utils/itti_analyzer/libui/ui_main_screen.c
@@ -42,7 +42,11 @@ static void ui_gtk_parse_arg(int argc, char *argv[])
         switch (c)
         {
             case 'f':
-                ui_main_data.filters_file_name = optarg;
+                ui_main_data.filters_file_name = malloc (strlen (optarg) + 1);
+                if (ui_main_data.filters_file_name != NULL)
+                {
+                    strcpy (ui_main_data.filters_file_name, optarg);
+                }
                 break;
 
             case 'h':
@@ -55,7 +59,11 @@ static void ui_gtk_parse_arg(int argc, char *argv[])
                 break;
 
             case 'm':
-                ui_main_data.messages_file_name = optarg;
+                ui_main_data.messages_file_name = malloc (strlen (optarg) + 1);
+                if (ui_main_data.messages_file_name != NULL)
+                {
+                    strcpy (ui_main_data.messages_file_name, optarg);
+                }
                 break;
 
             case 'p':
diff --git a/common/utils/itti_analyzer/libui/ui_notifications.c b/common/utils/itti_analyzer/libui/ui_notifications.c
index 85b052868ba4cb02da0b567a4ce6a4723e6839a2..1e9006184400e269de714007b5c6b936a8870d2e 100644
--- a/common/utils/itti_analyzer/libui/ui_notifications.c
+++ b/common/utils/itti_analyzer/libui/ui_notifications.c
@@ -191,7 +191,19 @@ int ui_messages_open_file_chooser(void)
     if (accept)
     {
         result = ui_messages_read (filename);
-        g_free (filename);
+        if (result == RC_OK)
+        {
+            /* Update messages file name for future use */
+            if (ui_main_data.messages_file_name != NULL)
+            {
+                g_free (ui_main_data.messages_file_name);
+            }
+            ui_main_data.messages_file_name = filename;
+        }
+        else
+        {
+            g_free (filename);
+        }
     }
 
     return result;
@@ -219,7 +231,19 @@ int ui_filters_open_file_chooser(void)
     if (accept)
     {
         result = ui_filters_read(filename);
-        g_free (filename);
+        if (result == RC_OK)
+        {
+            /* Update filters file name for future use */
+            if (ui_main_data.filters_file_name != NULL)
+            {
+                g_free (ui_main_data.filters_file_name);
+            }
+            ui_main_data.filters_file_name = filename;
+        }
+        else
+        {
+            g_free (filename);
+        }
     }
 
     return result;
@@ -231,15 +255,19 @@ int ui_filters_save_file_chooser(void)
     int result = RC_OK;
 
     filechooser = gtk_file_chooser_dialog_new ("Save file", GTK_WINDOW (ui_main_data.window),
-                                               GTK_FILE_CHOOSER_ACTION_SAVE,
-                                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                               GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
-                                               NULL);
+                                               GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                               GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
 
     gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (filechooser), TRUE);
 
-    //gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filechooser), "filters.xml");
-    gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filechooser), "./filters.xml");
+    if (ui_main_data.filters_file_name != NULL)
+    {
+        gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filechooser), ui_main_data.filters_file_name);
+    }
+    else
+    {
+        gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filechooser), "filters.xml");
+    }
 
     /* Process the response */
     if (gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT)
@@ -247,8 +275,20 @@ int ui_filters_save_file_chooser(void)
         char *filename;
 
         filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
-        result = ui_filters_file_write(filename);
-        g_free (filename);
+        result = ui_filters_file_write (filename);
+        if (result == RC_OK)
+        {
+            /* Update filters file name for future use */
+            if (ui_main_data.filters_file_name != NULL)
+            {
+                g_free (ui_main_data.filters_file_name);
+            }
+            ui_main_data.filters_file_name = filename;
+        }
+        else
+        {
+            g_free (filename);
+        }
     }
     gtk_widget_destroy (filechooser);