diff --git a/sflphone-gtk/src/accountwindow.c b/sflphone-gtk/src/accountwindow.c
index d45401a7d8e5afec0ff3a611b0a95e2a9d564ec8..a188adcee5c751c72fc1bb38082e29e0c71945e1 100644
--- a/sflphone-gtk/src/accountwindow.c
+++ b/sflphone-gtk/src/accountwindow.c
@@ -34,9 +34,7 @@ account_t * currentAccount;
 GtkDialog * dialog;
 GtkWidget * hbox;
 GtkWidget * frame;
-GtkWidget * frameNat;
 GtkWidget * table;
-GtkWidget * tableNat;
 GtkWidget * label;
 GtkWidget * entryID;
 GtkWidget * entryAlias;
@@ -45,30 +43,13 @@ GtkWidget * entryEnabled;
 GtkWidget * entryUsername;
 GtkWidget * entryHostname;
 GtkWidget * entryPassword;
-GtkWidget * stunServer;
-GtkWidget * stunEnable;
 GtkWidget * entryMailbox;
 
 /* Signal to entryProtocol 'changed' */
     void
 change_protocol (account_t * currentAccount UNUSED)
 {
-    gchar* proto = (gchar *)gtk_combo_box_get_active_text(GTK_COMBO_BOX(entryProtocol));
-    //g_print("Protocol changed\n");
-
-    // toggle sensitivity for: entryUserPart 
-    if (strcmp(proto, "SIP") == 0) {
-        gtk_widget_set_sensitive( GTK_WIDGET(stunEnable), TRUE);
-        gtk_widget_set_sensitive( GTK_WIDGET(stunServer), TRUE);
-    }
-    else if (strcmp(proto, "IAX") == 0) {
-        gtk_widget_set_sensitive( GTK_WIDGET(stunEnable),   FALSE);
-        gtk_widget_set_sensitive( GTK_WIDGET(stunServer),   FALSE);
-    }
-    else {
-        // Should not get here.
-        g_print("Unknown protocol: %s\n", proto);
-    }
+    (gchar *)gtk_combo_box_get_active_text(GTK_COMBO_BOX(entryProtocol));
 }
 
     int 
@@ -81,14 +62,6 @@ is_iax_enabled(void)
         return FALSE;
 }
 
-    void
-stun_state( void )
-{
-    gboolean stunActive = (gboolean)gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( stunEnable ));
-    gtk_widget_set_sensitive( GTK_WIDGET( stunServer ) , stunActive );
-}
-
-
     void
 show_account_window (account_t * a)
 {
@@ -106,8 +79,6 @@ show_account_window (account_t * a)
     gchar * curHostname = "";
     gchar * curPassword = "";
     /* TODO: add curProxy, and add boxes for Proxy support */
-    gchar * stun_enabled = "FALSE";
-    gchar * stun_server= "stun.fwdnet.net:3478";
     gchar * curMailbox = "888";
 
     // Load from SIP/IAX/Unknown ?
@@ -123,8 +94,9 @@ show_account_window (account_t * a)
         curMailbox = g_hash_table_lookup(currentAccount->properties, ACCOUNT_MAILBOX);
 
         if (strcmp(curAccountType, "SIP") == 0) {
-            stun_enabled = g_hash_table_lookup(currentAccount->properties, ACCOUNT_SIP_STUN_ENABLED);
+            /*stun_enabled = g_hash_table_lookup(currentAccount->properties, ACCOUNT_SIP_STUN_ENABLED);
             stun_server = g_hash_table_lookup(currentAccount->properties, ACCOUNT_SIP_STUN_SERVER);
+            */
         }
     }
     else
@@ -250,57 +222,20 @@ show_account_window (account_t * a)
 
     gtk_widget_show_all( table );
     gtk_container_set_border_width (GTK_CONTAINER(table), 10);
-
-    frameNat = gtk_frame_new( _("Network Address Translation") );
-    gtk_box_pack_start(GTK_BOX(dialog->vbox), frameNat, FALSE, FALSE, 0);
-    gtk_widget_show(frameNat);
-
-    tableNat = gtk_table_new ( 2, 2  ,  FALSE/* homogeneous */);
-    gtk_table_set_row_spacings( GTK_TABLE(tableNat), 10);
-    gtk_table_set_col_spacings( GTK_TABLE(tableNat), 10);
-    gtk_widget_show(tableNat);
-    gtk_container_add( GTK_CONTAINER( frameNat) , tableNat );
-
-    // NAT detection code section
-    stunEnable = gtk_check_button_new_with_mnemonic(_("E_nable STUN"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stunEnable), strcmp(stun_enabled,"TRUE") == 0 ? TRUE: FALSE);
-    g_signal_connect( G_OBJECT (GTK_TOGGLE_BUTTON(stunEnable)) , "toggled" , G_CALLBACK( stun_state ), NULL);
-#if GTK_CHECK_VERSION(2,12,0)
-    gtk_widget_set_tooltip_text( GTK_WIDGET( stunEnable ) , _("Enable it if you are behind a firewall, then restart SFLphone"));
-#endif
-    gtk_table_attach ( GTK_TABLE( tableNat ), stunEnable, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
-
-    label = gtk_label_new_with_mnemonic(_("_STUN Server"));
-    gtk_table_attach( GTK_TABLE( tableNat ), label, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
-    gtk_misc_set_alignment(GTK_MISC (label), 0, 0.5);
-    stunServer = gtk_entry_new();
-    gtk_label_set_mnemonic_widget (GTK_LABEL (label), stunServer);
-    gtk_entry_set_text(GTK_ENTRY(stunServer), stun_server);
-#if GTK_CHECK_VERSION(2,12,0)
-    gtk_widget_set_tooltip_text( GTK_WIDGET( stunServer ) , _("Format: name.server:port"));
-#endif
-    gtk_table_attach ( GTK_TABLE( tableNat ), stunServer, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
-    gtk_widget_set_sensitive( GTK_WIDGET( stunServer ), gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stunEnable)));
-
-
+    
     // Toggle enabled/disabled widgets
     if (strcmp(curAccountType, "SIP") == 0) {
         //gtk_widget_set_sesitive( GTK_WIDGET(entryUserPart), TRUE);<    
     }
     else if (strcmp(curAccountType, "IAX") == 0) {
-        gtk_widget_set_sensitive( GTK_WIDGET(stunEnable), FALSE);
-        gtk_widget_set_sensitive( GTK_WIDGET(stunServer), FALSE);
+        //gtk_widget_set_sensitive( GTK_WIDGET(stunEnable), FALSE);
+        //gtk_widget_set_sensitive( GTK_WIDGET(stunServer), FALSE);
     }
     else {
         // Disable everything ! ouch!
         // Shouldn't get there.
     }
 
-
-
-    gtk_widget_show_all( tableNat );
-    gtk_container_set_border_width (GTK_CONTAINER(tableNat), 10);
-
     response = gtk_dialog_run (GTK_DIALOG (dialog));
     if(response == GTK_RESPONSE_ACCEPT)
     {
@@ -329,12 +264,38 @@ show_account_window (account_t * a)
                 g_strdup((gchar *)gtk_entry_get_text(GTK_ENTRY(entryMailbox))));
 
         if (strcmp(proto, "SIP") == 0) { 
-            g_hash_table_replace(currentAccount->properties, 
-                    g_strdup(ACCOUNT_SIP_STUN_SERVER), 
-                    g_strdup((gchar *)gtk_entry_get_text(GTK_ENTRY(stunServer))));
-            g_hash_table_replace(currentAccount->properties, 
-                    g_strdup(ACCOUNT_SIP_STUN_ENABLED), 
-                    g_strdup(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stunEnable)) ? "TRUE": "FALSE"));
+            guint i, size;
+            account_t * account;
+            gchar * stun_srv;            
+            gchar * stun_enable;
+            gboolean flag = FALSE;
+
+            size = account_list_get_size();
+            // If a SIP account already exists, fetch its information about STUN
+            for(i=0; i<size; i++){
+                account = account_list_get_nth(i);
+                if( strcmp(g_hash_table_lookup(account->properties, ACCOUNT_TYPE), "SIP" ) == 0 )
+                {
+                    stun_srv = g_hash_table_lookup(account->properties, ACCOUNT_SIP_STUN_SERVER);
+                    stun_enable = g_hash_table_lookup(account->properties, ACCOUNT_SIP_STUN_ENABLED);
+                    g_hash_table_replace(currentAccount->properties, g_strdup(ACCOUNT_SIP_STUN_SERVER), 
+                                            g_strdup(stun_srv));
+                    g_hash_table_replace(currentAccount->properties, g_strdup(ACCOUNT_SIP_STUN_ENABLED), 
+                                            g_strdup(stun_enable));
+                    flag = TRUE;
+                    break;
+                }
+            }
+            
+            // Otherelse set a default value
+            if(!flag)
+            {
+                g_hash_table_replace(currentAccount->properties, g_strdup(ACCOUNT_SIP_STUN_SERVER), (gchar*)"");
+                g_hash_table_replace(currentAccount->properties, g_strdup(ACCOUNT_SIP_STUN_ENABLED), 
+                                            "FALSE");
+            }
+
+            config_window_set_stun_visible();
         }
        
         /** @todo Verify if it's the best condition to check */
diff --git a/sflphone-gtk/src/configwindow.c b/sflphone-gtk/src/configwindow.c
index 2c2c731bc37e8f1d3453b2cf7662b833e2cca495..f67dd87b750a81dd9323fdd81406801a1cba54f1 100644
--- a/sflphone-gtk/src/configwindow.c
+++ b/sflphone-gtk/src/configwindow.c
@@ -31,6 +31,7 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
 
 
 /**
@@ -41,7 +42,7 @@ gboolean dialogOpen = FALSE;
 gboolean ringtoneEnabled = TRUE;
 
 GtkListStore *accountStore;
-								// instead of keeping selected codec as a variable
+// instead of keeping selected codec as a variable
 GtkWidget *addButton;
 GtkWidget *editButton;
 GtkWidget *deleteButton;
@@ -49,631 +50,771 @@ GtkWidget *restoreButton;
 GtkWidget *accountMoveDownButton;
 GtkWidget *accountMoveUpButton;
 
+/* STUN configuration part */
+GtkWidget * stunEnable;
+GtkWidget * stunFrame;
+GtkWidget * stunServer;
+GtkWidget * applyButton;
+
 GtkWidget* status;
 
 account_t *selectedAccount;
 
 // Account properties
 enum {
-	COLUMN_ACCOUNT_ALIAS,
-	COLUMN_ACCOUNT_TYPE,
-	COLUMN_ACCOUNT_STATUS,
-	COLUMN_ACCOUNT_ACTIVE,
-	COLUMN_ACCOUNT_DATA,
-	COLUMN_ACCOUNT_COUNT
+    COLUMN_ACCOUNT_ALIAS,
+    COLUMN_ACCOUNT_TYPE,
+    COLUMN_ACCOUNT_STATUS,
+    COLUMN_ACCOUNT_ACTIVE,
+    COLUMN_ACCOUNT_DATA,
+    COLUMN_ACCOUNT_COUNT
 };
 
 
 /**
  * Fills the treelist with accounts
  */
-void
+    void
 config_window_fill_account_list()
 {
-	if(accDialogOpen)
-	{
-		GtkTreeIter iter;
-
-		gtk_list_store_clear(accountStore);
-		unsigned int i;
-		for(i = 0; i < account_list_get_size(); i++)
-		{
-			account_t * a = account_list_get_nth (i);
-			if (a)
-			{
-			  g_print("fill account list : %s\n" , (gchar*)g_hash_table_lookup(a->properties, ACCOUNT_ENABLED));
-				gtk_list_store_append (accountStore, &iter);
-				gtk_list_store_set(accountStore, &iter,
-						COLUMN_ACCOUNT_ALIAS, g_hash_table_lookup(a->properties, ACCOUNT_ALIAS),  // Name
-						COLUMN_ACCOUNT_TYPE, g_hash_table_lookup(a->properties, ACCOUNT_TYPE),   // Protocol
-						COLUMN_ACCOUNT_STATUS, account_state_name(a->state),      // Status
-						COLUMN_ACCOUNT_ACTIVE, (g_strcasecmp(g_hash_table_lookup(a->properties, ACCOUNT_ENABLED),"TRUE") == 0)? TRUE:FALSE,  // Enable/Disable
-						COLUMN_ACCOUNT_DATA, a,   // Pointer
-						-1);
-			}
-		}
-
-		gtk_widget_set_sensitive( GTK_WIDGET(editButton),   FALSE);
-		gtk_widget_set_sensitive( GTK_WIDGET(deleteButton), FALSE);
-	}
+    if(accDialogOpen)
+    {
+        GtkTreeIter iter;
+
+        gtk_list_store_clear(accountStore);
+        unsigned int i;
+        for(i = 0; i < account_list_get_size(); i++)
+        {
+            account_t * a = account_list_get_nth (i);
+            if (a)
+            {
+                g_print("fill account list : %s\n" , (gchar*)g_hash_table_lookup(a->properties, ACCOUNT_ENABLED));
+                gtk_list_store_append (accountStore, &iter);
+                gtk_list_store_set(accountStore, &iter,
+                        COLUMN_ACCOUNT_ALIAS, g_hash_table_lookup(a->properties, ACCOUNT_ALIAS),  // Name
+                        COLUMN_ACCOUNT_TYPE, g_hash_table_lookup(a->properties, ACCOUNT_TYPE),   // Protocol
+                        COLUMN_ACCOUNT_STATUS, account_state_name(a->state),      // Status
+                        COLUMN_ACCOUNT_ACTIVE, (g_strcasecmp(g_hash_table_lookup(a->properties, ACCOUNT_ENABLED),"TRUE") == 0)? TRUE:FALSE,  // Enable/Disable
+                        COLUMN_ACCOUNT_DATA, a,   // Pointer
+                        -1);
+            }
+        }
+
+        gtk_widget_set_sensitive( GTK_WIDGET(editButton),   FALSE);
+        gtk_widget_set_sensitive( GTK_WIDGET(deleteButton), FALSE);
+    }
 }
 
 /**
  * Delete an account
  */
-static void
-delete_account(GtkWidget *widget UNUSED, gpointer data UNUSED)
+    static void
+delete_account(GtkWidget *widget, gpointer data UNUSED)
 {
-	if(selectedAccount)
-	{
-		dbus_remove_account(selectedAccount->accountID);
-	}
+    if(selectedAccount)
+    {
+        dbus_remove_account(selectedAccount->accountID);
+        if(account_list_get_sip_account_number() == 1 &&  
+                strcmp(g_hash_table_lookup(selectedAccount->properties, ACCOUNT_TYPE), "SIP")==0 )
+            gtk_widget_set_sensitive(GTK_WIDGET(stunFrame), FALSE);
+    }
 }
 
 /**
  * Edit an account
  */
-static void
+    static void
 edit_account(GtkWidget *widget UNUSED, gpointer data UNUSED)
 {
-	if(selectedAccount)
-	{
-		show_account_window(selectedAccount);
-	}
+    if(selectedAccount)
+    {
+        show_account_window(selectedAccount);
+    }
 }
 
 /**
  * Add an account
  */
-static void
+    static void
 add_account(GtkWidget *widget UNUSED, gpointer data UNUSED)
 {
-	show_account_window(NULL);
+    show_account_window(NULL);
 }
 
-void
+    void
 start_hidden( void )
 {
-  dbus_start_hidden();
+    dbus_start_hidden();
 }
 
-void
+    void
 set_popup_mode( void )
 {
-  dbus_switch_popup_mode();
+    dbus_switch_popup_mode();
 }
 
-void
+    void
 set_notif_level(  )
 {
-  dbus_set_notify();
+    dbus_set_notify();
 }
 
-void
+    void
 set_mail_notif( )
 {
-  dbus_set_mail_notify( );
+    dbus_set_mail_notify( );
 }
 
-void
+    void
 update_max_value( GtkRange* scale )
 {
-  dbus_set_max_calls(gtk_range_get_value( GTK_RANGE( scale )));
+    dbus_set_max_calls(gtk_range_get_value( GTK_RANGE( scale )));
 }
 
-void
+    void
 clean_history( void )
 {
-  call_list_clean_history();
+    call_list_clean_history();
 }
 
 /**
  * Call back when the user click on an account in the list
  */
-static void
+    static void
 select_account(GtkTreeSelection *selection, GtkTreeModel *model)
 {
-	GtkTreeIter iter;
-	GValue val;
-
-	if (!gtk_tree_selection_get_selected(selection, &model, &iter))
-	{
-		selectedAccount = NULL;
-		gtk_widget_set_sensitive(GTK_WIDGET(accountMoveUpButton), FALSE);
-		gtk_widget_set_sensitive(GTK_WIDGET(accountMoveDownButton), FALSE);
-		return;
-	}
-
-	val.g_type = G_TYPE_POINTER;
-	gtk_tree_model_get_value(model, &iter, COLUMN_ACCOUNT_DATA, &val);
-
-	selectedAccount = (account_t*)g_value_get_pointer(&val);
-	g_value_unset(&val);
-
-	if(selectedAccount)
-	{
-		gtk_widget_set_sensitive(GTK_WIDGET(editButton), TRUE);
-		gtk_widget_set_sensitive(GTK_WIDGET(deleteButton), TRUE);
-		gtk_widget_set_sensitive(GTK_WIDGET(accountMoveUpButton), TRUE);
-		gtk_widget_set_sensitive(GTK_WIDGET(accountMoveDownButton), TRUE);
-	}
-	g_print("select");
+    GtkTreeIter iter;
+    GValue val;
+
+    if (!gtk_tree_selection_get_selected(selection, &model, &iter))
+    {
+        selectedAccount = NULL;
+        gtk_widget_set_sensitive(GTK_WIDGET(accountMoveUpButton), FALSE);
+        gtk_widget_set_sensitive(GTK_WIDGET(accountMoveDownButton), FALSE);
+        return;
+    }
+
+    val.g_type = G_TYPE_POINTER;
+    gtk_tree_model_get_value(model, &iter, COLUMN_ACCOUNT_DATA, &val);
+
+    selectedAccount = (account_t*)g_value_get_pointer(&val);
+    g_value_unset(&val);
+
+    if(selectedAccount)
+    {
+        gtk_widget_set_sensitive(GTK_WIDGET(editButton), TRUE);
+        gtk_widget_set_sensitive(GTK_WIDGET(deleteButton), TRUE);
+        gtk_widget_set_sensitive(GTK_WIDGET(accountMoveUpButton), TRUE);
+        gtk_widget_set_sensitive(GTK_WIDGET(accountMoveDownButton), TRUE);
+    }
+    g_print("select");
 }
 
-static void
+    static void
 enable_account(GtkCellRendererToggle *rend UNUSED, gchar* path,  gpointer data )
 {
-  GtkTreeIter iter;
-  GtkTreePath *treePath;
-  GtkTreeModel *model;
-  gboolean enable;
-  account_t* acc ;
-
-  // Get path of clicked codec active toggle box
-  treePath = gtk_tree_path_new_from_string(path);
-  model = gtk_tree_view_get_model(GTK_TREE_VIEW(data));
-  gtk_tree_model_get_iter(model, &iter, treePath);
-
-  // Get pointer on object
-  gtk_tree_model_get(model, &iter,
-                      COLUMN_ACCOUNT_ACTIVE, &enable,
-                      COLUMN_ACCOUNT_DATA, &acc,
-                      -1);
-  enable = !enable;
-
-  // Store value
-  gtk_list_store_set(GTK_LIST_STORE(model), &iter,
-                     COLUMN_ACCOUNT_ACTIVE, enable,
-                    -1);
-
-  gtk_tree_path_free(treePath);
-
-  // Modify account state       
-  g_hash_table_replace( acc->properties , g_strdup(ACCOUNT_ENABLED) , g_strdup((enable == 1)? "TRUE":"FALSE"));
-  dbus_send_register( acc->accountID , enable );
+    GtkTreeIter iter;
+    GtkTreePath *treePath;
+    GtkTreeModel *model;
+    gboolean enable;
+    account_t* acc ;
+
+    // Get path of clicked codec active toggle box
+    treePath = gtk_tree_path_new_from_string(path);
+    model = gtk_tree_view_get_model(GTK_TREE_VIEW(data));
+    gtk_tree_model_get_iter(model, &iter, treePath);
+
+    // Get pointer on object
+    gtk_tree_model_get(model, &iter,
+            COLUMN_ACCOUNT_ACTIVE, &enable,
+            COLUMN_ACCOUNT_DATA, &acc,
+            -1);
+    enable = !enable;
+
+    // Store value
+    gtk_list_store_set(GTK_LIST_STORE(model), &iter,
+            COLUMN_ACCOUNT_ACTIVE, enable,
+            -1);
+
+    gtk_tree_path_free(treePath);
+
+    // Modify account state       
+    g_hash_table_replace( acc->properties , g_strdup(ACCOUNT_ENABLED) , g_strdup((enable == 1)? "TRUE":"FALSE"));
+    dbus_send_register( acc->accountID , enable );
 }
 
 /**
  * Move account in list depending on direction and selected account
  */
-static void
+    static void
 account_move(gboolean moveUp, gpointer data)
 {
-	GtkTreeIter iter;
-	GtkTreeIter *iter2;
-	GtkTreeView *treeView;
-	GtkTreeModel *model;
-	GtkTreeSelection *selection;
-	GtkTreePath *treePath;
-	gchar *path;
-	
-	// Get view, model and selection of codec store
-	treeView = GTK_TREE_VIEW(data);
-	model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView));
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
-	
-	// Find selected iteration and create a copy
-	gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter);
-	iter2 = gtk_tree_iter_copy(&iter);
-	
-	// Find path of iteration
-	path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(model), &iter);
-	treePath = gtk_tree_path_new_from_string(path);
-	gint *indices = gtk_tree_path_get_indices(treePath);
-	gint indice = indices[0];
-	
-	// Depending on button direction get new path
-	if(moveUp)
-		gtk_tree_path_prev(treePath);
-	else
-		gtk_tree_path_next(treePath);
-	gtk_tree_model_get_iter(model, &iter, treePath);
-	
-	// Swap iterations if valid
-	if(gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter))
-		gtk_list_store_swap(GTK_LIST_STORE(model), &iter, iter2);
-	
-	// Scroll to new position
-	gtk_tree_view_scroll_to_cell(treeView, treePath, NULL, FALSE, 0, 0);
-	
-	// Free resources
-	gtk_tree_path_free(treePath);
-	gtk_tree_iter_free(iter2);
-	g_free(path);
-	
-	// Perpetuate changes in account queue
-	if(moveUp)
-		account_list_move_up(indice);
-	else
-		account_list_move_down(indice);
+    GtkTreeIter iter;
+    GtkTreeIter *iter2;
+    GtkTreeView *treeView;
+    GtkTreeModel *model;
+    GtkTreeSelection *selection;
+    GtkTreePath *treePath;
+    gchar *path;
+
+    // Get view, model and selection of codec store
+    treeView = GTK_TREE_VIEW(data);
+    model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView));
+    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
+
+    // Find selected iteration and create a copy
+    gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter);
+    iter2 = gtk_tree_iter_copy(&iter);
+
+    // Find path of iteration
+    path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(model), &iter);
+    treePath = gtk_tree_path_new_from_string(path);
+    gint *indices = gtk_tree_path_get_indices(treePath);
+    gint indice = indices[0];
+
+    // Depending on button direction get new path
+    if(moveUp)
+        gtk_tree_path_prev(treePath);
+    else
+        gtk_tree_path_next(treePath);
+    gtk_tree_model_get_iter(model, &iter, treePath);
+
+    // Swap iterations if valid
+    if(gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter))
+        gtk_list_store_swap(GTK_LIST_STORE(model), &iter, iter2);
+
+    // Scroll to new position
+    gtk_tree_view_scroll_to_cell(treeView, treePath, NULL, FALSE, 0, 0);
+
+    // Free resources
+    gtk_tree_path_free(treePath);
+    gtk_tree_iter_free(iter2);
+    g_free(path);
+
+    // Perpetuate changes in account queue
+    if(moveUp)
+        account_list_move_up(indice);
+    else
+        account_list_move_down(indice);
 }
 
 /**
  * Called from move up account button signal
  */
-static void
+    static void
 account_move_up(GtkButton *button UNUSED, gpointer data)
 {
-  // Change tree view ordering and get indice changed
-  account_move(TRUE, data);
+    // Change tree view ordering and get indice changed
+    account_move(TRUE, data);
 }
 
 /**
  * Called from move down account button signal
  */
-static void
+    static void
 account_move_down(GtkButton *button UNUSED, gpointer data)
 {
-  // Change tree view ordering and get indice changed
-  account_move(FALSE, data);
+    // Change tree view ordering and get indice changed
+    account_move(FALSE, data);
 }
 
-static void
+    static void
 set_pulse_app_volume_control( void )
 {
-  dbus_set_pulse_app_volume_control();
+    dbus_set_pulse_app_volume_control();
 }
 
 static void update_port( GtkSpinButton *button UNUSED, void *ptr )
 {
-  dbus_set_sip_port(gtk_spin_button_get_value_as_int((GtkSpinButton *)(ptr)));
+    dbus_set_sip_port(gtk_spin_button_get_value_as_int((GtkSpinButton *)(ptr)));
 }
 
 /**
  * Account settings tab
  */
-GtkWidget *
+    GtkWidget *
 create_accounts_tab()
 {
-	GtkWidget *ret;
-	GtkWidget *scrolledWindow;
-	GtkWidget *treeView;
-	GtkWidget *buttonBox;
-	GtkCellRenderer *renderer;
-	GtkTreeViewColumn *treeViewColumn;
-	GtkTreeSelection *treeSelection;
-
-	selectedAccount = NULL;
-
-	ret = gtk_vbox_new(FALSE, 10); 
-	gtk_container_set_border_width(GTK_CONTAINER (ret), 10);
-
-	scrolledWindow = gtk_scrolled_window_new(NULL, NULL);
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_SHADOW_IN);
-	gtk_box_pack_start(GTK_BOX(ret), scrolledWindow, TRUE, TRUE, 0);
-
-	accountStore = gtk_list_store_new(COLUMN_ACCOUNT_COUNT,
-			G_TYPE_STRING,  // Name
-			G_TYPE_STRING,  // Protocol
-			G_TYPE_STRING,  // Status
-			G_TYPE_BOOLEAN, // Enabled / Disabled
-			G_TYPE_POINTER  // Pointer to the Object
-			);
-
-	treeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(accountStore));
-	treeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW (treeView));
-	g_signal_connect(G_OBJECT (treeSelection), "changed",
-			G_CALLBACK (select_account),
-			accountStore);
-
-	renderer = gtk_cell_renderer_text_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes ("Alias",
-			renderer,
-			"markup", COLUMN_ACCOUNT_ALIAS,
-			NULL);
-	gtk_tree_view_append_column (GTK_TREE_VIEW(treeView), treeViewColumn);
-	
-	// A double click on the account line opens the window to edit the account
-	g_signal_connect( G_OBJECT( treeView ) , "row-activated" , G_CALLBACK( edit_account ) , NULL );
-
-	renderer = gtk_cell_renderer_text_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes (_("Protocol"),
-			renderer,
-			"markup", COLUMN_ACCOUNT_TYPE,
-			NULL);
-	gtk_tree_view_append_column (GTK_TREE_VIEW(treeView), treeViewColumn);
-
-	renderer = gtk_cell_renderer_text_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes (_("Status"),
-			renderer,
-			"markup", COLUMN_ACCOUNT_STATUS,
-			NULL);
-	gtk_tree_view_append_column (GTK_TREE_VIEW(treeView), treeViewColumn);
-	
-	renderer = gtk_cell_renderer_toggle_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes("", renderer, "active", COLUMN_ACCOUNT_ACTIVE , NULL);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn);
-	g_signal_connect( G_OBJECT(renderer) , "toggled" , G_CALLBACK(enable_account), (gpointer)treeView );
-
-	g_object_unref(G_OBJECT(accountStore));
-	gtk_container_add(GTK_CONTAINER(scrolledWindow), treeView);
-
-	 // Create button box
-        buttonBox = gtk_vbox_new(FALSE, 0);
-        gtk_container_set_border_width(GTK_CONTAINER(buttonBox), 10);
-        gtk_box_pack_start(GTK_BOX(ret), buttonBox, FALSE, FALSE, 0);
-
-        accountMoveUpButton = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
-        gtk_widget_set_sensitive(GTK_WIDGET(accountMoveUpButton), FALSE);
-        gtk_box_pack_start(GTK_BOX(buttonBox), accountMoveUpButton, FALSE, FALSE, 0);
-        g_signal_connect(G_OBJECT(accountMoveUpButton), "clicked", G_CALLBACK(account_move_up), treeView);
+    GtkWidget *ret;
+    GtkWidget *scrolledWindow;
+    GtkWidget *treeView;
+    GtkWidget *buttonBox;
+    GtkCellRenderer *renderer;
+    GtkTreeViewColumn *treeViewColumn;
+    GtkTreeSelection *treeSelection;
+
+    selectedAccount = NULL;
+
+    ret = gtk_vbox_new(FALSE, 10); 
+    gtk_container_set_border_width(GTK_CONTAINER (ret), 10);
+
+    scrolledWindow = gtk_scrolled_window_new(NULL, NULL);
+    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+    gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_SHADOW_IN);
+    gtk_box_pack_start(GTK_BOX(ret), scrolledWindow, TRUE, TRUE, 0);
+
+    accountStore = gtk_list_store_new(COLUMN_ACCOUNT_COUNT,
+            G_TYPE_STRING,  // Name
+            G_TYPE_STRING,  // Protocol
+            G_TYPE_STRING,  // Status
+            G_TYPE_BOOLEAN, // Enabled / Disabled
+            G_TYPE_POINTER  // Pointer to the Object
+            );
+
+    treeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(accountStore));
+    treeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW (treeView));
+    g_signal_connect(G_OBJECT (treeSelection), "changed",
+            G_CALLBACK (select_account),
+            accountStore);
+
+    renderer = gtk_cell_renderer_text_new();
+    treeViewColumn = gtk_tree_view_column_new_with_attributes ("Alias",
+            renderer,
+            "markup", COLUMN_ACCOUNT_ALIAS,
+            NULL);
+    gtk_tree_view_append_column (GTK_TREE_VIEW(treeView), treeViewColumn);
+
+    // A double click on the account line opens the window to edit the account
+    g_signal_connect( G_OBJECT( treeView ) , "row-activated" , G_CALLBACK( edit_account ) , NULL );
+
+    renderer = gtk_cell_renderer_text_new();
+    treeViewColumn = gtk_tree_view_column_new_with_attributes (_("Protocol"),
+            renderer,
+            "markup", COLUMN_ACCOUNT_TYPE,
+            NULL);
+    gtk_tree_view_append_column (GTK_TREE_VIEW(treeView), treeViewColumn);
+
+    renderer = gtk_cell_renderer_text_new();
+    treeViewColumn = gtk_tree_view_column_new_with_attributes (_("Status"),
+            renderer,
+            "markup", COLUMN_ACCOUNT_STATUS,
+            NULL);
+    gtk_tree_view_append_column (GTK_TREE_VIEW(treeView), treeViewColumn);
+
+    renderer = gtk_cell_renderer_toggle_new();
+    treeViewColumn = gtk_tree_view_column_new_with_attributes("", renderer, "active", COLUMN_ACCOUNT_ACTIVE , NULL);
+    gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), treeViewColumn);
+    g_signal_connect( G_OBJECT(renderer) , "toggled" , G_CALLBACK(enable_account), (gpointer)treeView );
+
+    g_object_unref(G_OBJECT(accountStore));
+    gtk_container_add(GTK_CONTAINER(scrolledWindow), treeView);
+
+    // Create button box
+    buttonBox = gtk_vbox_new(FALSE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(buttonBox), 10);
+    gtk_box_pack_start(GTK_BOX(ret), buttonBox, FALSE, FALSE, 0);
+
+    accountMoveUpButton = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
+    gtk_widget_set_sensitive(GTK_WIDGET(accountMoveUpButton), FALSE);
+    gtk_box_pack_start(GTK_BOX(buttonBox), accountMoveUpButton, FALSE, FALSE, 0);
+    g_signal_connect(G_OBJECT(accountMoveUpButton), "clicked", G_CALLBACK(account_move_up), treeView);
+
+    accountMoveDownButton = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
+    gtk_widget_set_sensitive(GTK_WIDGET(accountMoveDownButton), FALSE);
+    gtk_box_pack_start(GTK_BOX(buttonBox), accountMoveDownButton, FALSE, FALSE, 0);
+    g_signal_connect(G_OBJECT(accountMoveDownButton), "clicked", G_CALLBACK(account_move_down), treeView);
+
+    /* The buttons to press! */
+    buttonBox = gtk_hbutton_box_new();
+    gtk_box_set_spacing(GTK_BOX(buttonBox), 10); //GAIM_HIG_BOX_SPACE
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonBox), GTK_BUTTONBOX_SPREAD);
+    gtk_box_pack_start(GTK_BOX(ret), buttonBox, FALSE, FALSE, 0);
+    gtk_widget_show (buttonBox); 
+
+    addButton = gtk_button_new_from_stock (GTK_STOCK_ADD);
+    g_signal_connect_swapped(G_OBJECT(addButton), "clicked",
+            G_CALLBACK(add_account), NULL);
+    gtk_box_pack_start(GTK_BOX(buttonBox), addButton, FALSE, FALSE, 0);
+    gtk_widget_show(addButton);
+
+    editButton = gtk_button_new_from_stock (GTK_STOCK_EDIT);
+    g_signal_connect_swapped(G_OBJECT(editButton), "clicked",
+            G_CALLBACK(edit_account), NULL);
+    gtk_box_pack_start(GTK_BOX(buttonBox), editButton, FALSE, FALSE, 0);
+    gtk_widget_show(editButton);
+
+    deleteButton = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
+    g_signal_connect_swapped(G_OBJECT(deleteButton), "clicked",
+            G_CALLBACK(delete_account), stunFrame);
+    gtk_box_pack_start(GTK_BOX(buttonBox), deleteButton, FALSE, FALSE, 0);
+    gtk_widget_show(deleteButton);
+
+    gtk_widget_show_all(ret);
+
+    config_window_fill_account_list();
+
+    return ret;
+}
+
+void stun_state( void )
+{
+    
+    guint i, size;
+    gchar * stun_enabled = "FALSE";
+    account_t * account;
+
+    gboolean stunActive = (gboolean)gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( stunEnable ));
+    gtk_widget_set_sensitive( GTK_WIDGET( stunServer ) , stunActive );
+    // Check if we actually change the state
+    size = account_list_get_size();
+    for(i=0; i<size; i++)
+    {
+        account = account_list_get_nth(i);
+        if( strcmp(g_hash_table_lookup(account->properties, ACCOUNT_TYPE), "SIP" ) == 0 )
+        {
+            stun_enabled = g_hash_table_lookup(account->properties, ACCOUNT_SIP_STUN_ENABLED);
+            break;
+        }
+    }
+    if( (stunActive && strcmp(stun_enabled, "FALSE")==0) || (!stunActive && strcmp(stun_enabled, "TRUE")==0) )
+    {
+        gtk_widget_set_sensitive( GTK_WIDGET( applyButton ) , TRUE );
+    }
+    else
+        gtk_widget_set_sensitive( GTK_WIDGET( applyButton ) , FALSE );
 
-        accountMoveDownButton = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
-        gtk_widget_set_sensitive(GTK_WIDGET(accountMoveDownButton), FALSE);
-        gtk_box_pack_start(GTK_BOX(buttonBox), accountMoveDownButton, FALSE, FALSE, 0);
-        g_signal_connect(G_OBJECT(accountMoveDownButton), "clicked", G_CALLBACK(account_move_down), treeView);
-	
-	/* The buttons to press! */
-	buttonBox = gtk_hbutton_box_new();
-	gtk_box_set_spacing(GTK_BOX(buttonBox), 10); //GAIM_HIG_BOX_SPACE
-	gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonBox), GTK_BUTTONBOX_SPREAD);
-	gtk_box_pack_start(GTK_BOX(ret), buttonBox, FALSE, FALSE, 0);
-	gtk_widget_show (buttonBox); 
-
-	addButton = gtk_button_new_from_stock (GTK_STOCK_ADD);
-	g_signal_connect_swapped(G_OBJECT(addButton), "clicked",
-			G_CALLBACK(add_account), NULL);
-	gtk_box_pack_start(GTK_BOX(buttonBox), addButton, FALSE, FALSE, 0);
-	gtk_widget_show(addButton);
-
-	editButton = gtk_button_new_from_stock (GTK_STOCK_EDIT);
-	g_signal_connect_swapped(G_OBJECT(editButton), "clicked",
-			G_CALLBACK(edit_account), NULL);
-	gtk_box_pack_start(GTK_BOX(buttonBox), editButton, FALSE, FALSE, 0);
-	gtk_widget_show(editButton);
-	
-	deleteButton = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
-	g_signal_connect_swapped(G_OBJECT(deleteButton), "clicked",
-			G_CALLBACK(delete_account), NULL);
-	gtk_box_pack_start(GTK_BOX(buttonBox), deleteButton, FALSE, FALSE, 0);
-	gtk_widget_show(deleteButton);
-	
-	gtk_widget_show_all(ret);
-
-	config_window_fill_account_list();
-
-	return ret;
 }
 
-GtkWidget*
+void update_registration( void )
+{
+    guint nb_accounts, i;
+    account_t *current;
+
+    nb_accounts = account_list_get_size();
+
+    for(i=0; i<nb_accounts;i++){
+        
+        current = account_list_get_nth(i);
+        // If SIP account, then set the new value
+        if( strcmp(g_hash_table_lookup(current->properties, ACCOUNT_TYPE), "SIP" ) == 0 )
+        {
+            g_hash_table_replace(current->properties, g_strdup(ACCOUNT_SIP_STUN_SERVER), 
+                                    g_strdup((gchar *)gtk_entry_get_text(GTK_ENTRY(stunServer))));
+            g_hash_table_replace(current->properties, g_strdup(ACCOUNT_SIP_STUN_ENABLED), 
+                                    g_strdup(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stunEnable)) ? "TRUE": "FALSE"));
+            dbus_set_account_details(current);
+        }
+    }
+
+    gtk_widget_set_sensitive(GTK_WIDGET( applyButton ) , FALSE );
+}
+
+GtkWidget* create_stun_tab()
+{
+    GtkWidget * tableNat;
+    gchar * stun_server= "stun.fwdnet.net:3478";
+    gchar * stun_enabled = "FALSE";
+    GtkWidget * label;
+    account_t * account;
+    guint i, size;
+
+    // All SIP accounts are supposed to have the same STUN configuration
+    // So let's take the first SIP account we find
+    size = account_list_get_size();
+    for(i=0; i<size; i++)
+    {
+        account = account_list_get_nth(i);
+        if( strcmp(g_hash_table_lookup(account->properties, ACCOUNT_TYPE), "SIP" ) == 0 )
+        {
+            stun_enabled = g_hash_table_lookup(account->properties, ACCOUNT_SIP_STUN_ENABLED);
+            stun_server = g_hash_table_lookup(account->properties, ACCOUNT_SIP_STUN_SERVER);
+            break;
+        }
+    }
+    
+    tableNat = gtk_table_new ( 3, 2  , FALSE/* homogeneous */);
+
+    // NAT detection code section
+    label = gtk_label_new(_("Stun parameters will apply to each SIP account created."));
+    gtk_table_attach( GTK_TABLE( tableNat ), label, 0, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+    gtk_misc_set_alignment(GTK_MISC (label), 0.5, 0.5);
+
+    stunEnable = gtk_check_button_new_with_mnemonic(_("E_nable STUN"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stunEnable), strcmp(stun_enabled,"TRUE") == 0 ? TRUE: FALSE);
+    g_signal_connect( G_OBJECT (GTK_TOGGLE_BUTTON(stunEnable)) , "toggled" , G_CALLBACK( stun_state ), NULL);
+#if GTK_CHECK_VERSION(2,12,0)
+    gtk_widget_set_tooltip_text( GTK_WIDGET( stunEnable ) , _("Enable it if you are behind a firewall"));
+#endif
+    gtk_table_attach ( GTK_TABLE( tableNat ), stunEnable, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+
+    stunServer = gtk_entry_new();
+    gtk_label_set_mnemonic_widget (GTK_LABEL (label), stunServer);
+    gtk_entry_set_text(GTK_ENTRY(stunServer), stun_server);
+#if GTK_CHECK_VERSION(2,12,0)
+    gtk_widget_set_tooltip_text( GTK_WIDGET( stunServer ) , _("Format: name.server:port"));
+#endif
+    gtk_table_attach ( GTK_TABLE( tableNat ), stunServer, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+    gtk_widget_set_sensitive( GTK_WIDGET( stunServer ), gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stunEnable)));
+
+    applyButton = gtk_button_new_from_stock(GTK_STOCK_APPLY);
+    gtk_widget_set_size_request( GTK_WIDGET(applyButton), 100, 30);
+    gtk_widget_set_sensitive( GTK_WIDGET( applyButton ), FALSE );
+    gtk_table_attach ( GTK_TABLE( tableNat ), applyButton, 0, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+    g_signal_connect( G_OBJECT( applyButton) , "clicked" , update_registration , NULL);
+
+    gtk_widget_show_all(tableNat);
+    gtk_container_set_border_width (GTK_CONTAINER(tableNat), 15);
+
+    return tableNat;
+}
+
+
+
+    GtkWidget*
 create_general_settings ()
 {
 
     int curPort;
     int n;
 
-  GtkWidget *ret;
-
-  GtkWidget *notifFrame;
-  GtkWidget *notifBox;
-  GtkWidget *notifAll;
-  GtkWidget *widg;
-
-  GtkWidget *trayFrame;
-  GtkWidget *trayBox;
-  GtkWidget *trayItem;
-
-  GtkWidget *frame;
-  GtkWidget *vbox;
-  GtkWidget *hbox;
-  GtkWidget *value;
-  GtkWidget *label;
-  GtkWidget *cleanButton;
-  GtkWidget *entryPort;
-
-  // Main widget
-  ret = gtk_vbox_new(FALSE, 10);
-  gtk_container_set_border_width(GTK_CONTAINER(ret), 10);
-
-  // Notifications Frame
-  notifFrame = gtk_frame_new(_("Desktop Notification"));
-  gtk_box_pack_start(GTK_BOX(ret), notifFrame, FALSE, FALSE, 0);
-  gtk_widget_show( notifFrame );
-
-  notifBox = gtk_vbox_new(FALSE, 10);
-  gtk_widget_show( notifBox );
-  gtk_container_add( GTK_CONTAINER(notifFrame) , notifBox);
-  
-  notifAll = gtk_check_button_new_with_mnemonic( _("_Enable"));
-  gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(notifAll), dbus_get_notify() );
-  gtk_box_pack_start( GTK_BOX(notifBox) , notifAll , TRUE , TRUE , 1);
-  g_signal_connect(G_OBJECT( notifAll ) , "clicked" , G_CALLBACK( set_notif_level ) , NULL );
-
-  widg = gtk_check_button_new_with_mnemonic(  _("_Notify voice mails"));
-  gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(widg), dbus_get_mail_notify() );
-  gtk_box_pack_start( GTK_BOX(notifBox) , widg , TRUE , TRUE , 1);
-  g_signal_connect(G_OBJECT( widg ) , "clicked" , G_CALLBACK( set_mail_notif ) , NULL);
-
-  // System Tray option frame
-  trayFrame = gtk_frame_new(_("System Tray Icon"));
-  gtk_box_pack_start(GTK_BOX(ret), trayFrame, FALSE, FALSE, 0);
-  gtk_widget_show( trayFrame );
-
-  trayBox = gtk_vbox_new(FALSE, 10);
-  gtk_widget_show( trayBox );
-  gtk_container_add( GTK_CONTAINER(trayFrame) , trayBox);
-  
-  GtkWidget* trayItem1 = gtk_radio_button_new_with_mnemonic(NULL,  _("_Popup main window on incoming call"));
-  gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(trayItem1), dbus_popup_mode() );
-  gtk_box_pack_start( GTK_BOX(trayBox) , trayItem1 , TRUE , TRUE , 1);
-  g_signal_connect(G_OBJECT( trayItem1 ) , "clicked" , G_CALLBACK( set_popup_mode ) , NULL);
-
-  trayItem = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(trayItem1), _("Ne_ver popup main window"));
-  gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(trayItem), !dbus_popup_mode() );
-  gtk_box_pack_start( GTK_BOX(trayBox) , trayItem , TRUE , TRUE , 1);
-  
-  trayItem = gtk_check_button_new_with_mnemonic(_("_Start hidden"));
-  gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(trayItem), dbus_is_start_hidden() );
-  gtk_box_pack_start( GTK_BOX(trayBox) , trayItem , TRUE , TRUE , 1);
-  g_signal_connect(G_OBJECT( trayItem ) , "clicked" , G_CALLBACK( start_hidden ) , NULL);
-
-  /** HISTORY CONFIGURATION */
-  frame = gtk_frame_new(_("Calls History"));
-  gtk_box_pack_start(GTK_BOX(ret), frame, FALSE, FALSE, 0);
-  gtk_widget_show( frame );
-
-  vbox = gtk_vbox_new(FALSE, 10);
-  gtk_widget_show( vbox );
-  gtk_container_add( GTK_CONTAINER(frame) , vbox);
-  
-  label = gtk_label_new_with_mnemonic(_("_Maximum number of calls"));
-  gtk_box_pack_start( GTK_BOX(vbox) , label , TRUE , TRUE , 0);
-  
-  value = gtk_hscale_new_with_range(0.0 , 50.0 , 5.0);
-  gtk_label_set_mnemonic_widget (GTK_LABEL (label), value);
-  gtk_scale_set_digits( GTK_SCALE(value) , 0);
-  gtk_scale_set_value_pos( GTK_SCALE(value) , GTK_POS_RIGHT); 
-  gtk_range_set_value( GTK_RANGE( value ) , dbus_get_max_calls());
-  gtk_box_pack_start( GTK_BOX(vbox) , value , TRUE , TRUE , 0);
-  g_signal_connect( G_OBJECT( value) , "value-changed" , G_CALLBACK( update_max_value ) , NULL);
-
-  cleanButton = gtk_button_new_from_stock( GTK_STOCK_CLEAR );
-  gtk_box_pack_end( GTK_BOX(vbox) , cleanButton , FALSE , TRUE , 0);
-  g_signal_connect( G_OBJECT( cleanButton ) , "clicked" , G_CALLBACK( clean_history ) , NULL);
-  
-  /** PULSEAUDIO CONFIGURATION */
-  frame = gtk_frame_new( _("PulseAudio sound server"));
-  gtk_box_pack_start(GTK_BOX(ret), frame, FALSE, FALSE, 0);
-  gtk_widget_show( frame );
-
-  vbox = gtk_vbox_new(FALSE, 10);
-  gtk_widget_show( vbox );
-  gtk_container_add( GTK_CONTAINER(frame) , vbox);
-
-  widg = gtk_check_button_new_with_mnemonic(  _("_Control running applications volume"));
-  gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(widg), dbus_get_pulse_app_volume_control() );
-  gtk_box_pack_start( GTK_BOX(vbox) , widg , TRUE , TRUE , 1);
-  g_signal_connect(G_OBJECT( widg ) , "clicked" , G_CALLBACK( set_pulse_app_volume_control ) , NULL);
-
-  n = account_list_get_sip_account_number();
-  printf("sip account number = %i\n", n);
-
-  /** SIP port information */
-  curPort = dbus_get_sip_port();
-  if(curPort <= 0 || curPort > 65535)
-    curPort = 5060;
-
-  frame = gtk_frame_new( _("SIP Port"));
-  gtk_box_pack_start(GTK_BOX(ret), frame, FALSE, FALSE, 0);
-  gtk_widget_show( frame );
-  gtk_widget_set_sensitive( GTK_WIDGET(frame), (n==0)?FALSE:TRUE );
-
-  hbox = gtk_hbox_new(FALSE, 10);
-  gtk_widget_show( hbox );
-  gtk_container_add( GTK_CONTAINER(frame) , hbox);
-
-  GtkWidget *applyButton = gtk_button_new_with_label(_("Apply"));
-  gtk_widget_set_size_request(applyButton, 60, 35);
-  //gtk_widget_set_sensitive( GTK_WIDGET(applyButton), (n==0)?FALSE:TRUE );
-
-  label = gtk_label_new(_("Port:"));
-
-  entryPort = gtk_spin_button_new_with_range(1, 65535, 1);
-  gtk_label_set_mnemonic_widget (GTK_LABEL (label), entryPort);
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(entryPort), curPort);
-  
-  gtk_box_pack_start( GTK_BOX(hbox) , label , TRUE , TRUE , 1);
-  gtk_box_pack_start( GTK_BOX(hbox) , entryPort , TRUE , TRUE , 1);
-  gtk_box_pack_start( GTK_BOX(hbox) , applyButton , FALSE , FALSE , 1);
-
-  g_signal_connect( G_OBJECT( applyButton) , "clicked" , G_CALLBACK( update_port ) , entryPort);
-
-  gtk_widget_show_all(ret);
-  
-  return ret;
+    GtkWidget *ret;
+
+    GtkWidget *notifFrame;
+    GtkWidget *notifBox;
+    GtkWidget *notifAll;
+    GtkWidget *widg;
+
+    GtkWidget *trayFrame;
+    GtkWidget *trayBox;
+    GtkWidget *trayItem;
+
+    GtkWidget *frame;
+    GtkWidget *vbox;
+    GtkWidget *hbox;
+    GtkWidget *value;
+    GtkWidget *label;
+    GtkWidget *cleanButton;
+    GtkWidget *entryPort;
+
+    // Main widget
+    ret = gtk_vbox_new(FALSE, 10);
+    gtk_container_set_border_width(GTK_CONTAINER(ret), 10);
+
+    // Notifications Frame
+    notifFrame = gtk_frame_new(_("Desktop Notification"));
+    gtk_box_pack_start(GTK_BOX(ret), notifFrame, FALSE, FALSE, 0);
+    gtk_widget_show( notifFrame );
+
+    notifBox = gtk_vbox_new(FALSE, 10);
+    gtk_widget_show( notifBox );
+    gtk_container_add( GTK_CONTAINER(notifFrame) , notifBox);
+
+    notifAll = gtk_check_button_new_with_mnemonic( _("_Enable"));
+    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(notifAll), dbus_get_notify() );
+    gtk_box_pack_start( GTK_BOX(notifBox) , notifAll , TRUE , TRUE , 1);
+    g_signal_connect(G_OBJECT( notifAll ) , "clicked" , G_CALLBACK( set_notif_level ) , NULL );
+
+    widg = gtk_check_button_new_with_mnemonic(  _("_Notify voice mails"));
+    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(widg), dbus_get_mail_notify() );
+    gtk_box_pack_start( GTK_BOX(notifBox) , widg , TRUE , TRUE , 1);
+    g_signal_connect(G_OBJECT( widg ) , "clicked" , G_CALLBACK( set_mail_notif ) , NULL);
+
+    // System Tray option frame
+    trayFrame = gtk_frame_new(_("System Tray Icon"));
+    gtk_box_pack_start(GTK_BOX(ret), trayFrame, FALSE, FALSE, 0);
+    gtk_widget_show( trayFrame );
+
+    trayBox = gtk_vbox_new(FALSE, 10);
+    gtk_widget_show( trayBox );
+    gtk_container_add( GTK_CONTAINER(trayFrame) , trayBox);
+
+    GtkWidget* trayItem1 = gtk_radio_button_new_with_mnemonic(NULL,  _("_Popup main window on incoming call"));
+    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(trayItem1), dbus_popup_mode() );
+    gtk_box_pack_start( GTK_BOX(trayBox) , trayItem1 , TRUE , TRUE , 1);
+    g_signal_connect(G_OBJECT( trayItem1 ) , "clicked" , G_CALLBACK( set_popup_mode ) , NULL);
+
+    trayItem = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(trayItem1), _("Ne_ver popup main window"));
+    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(trayItem), !dbus_popup_mode() );
+    gtk_box_pack_start( GTK_BOX(trayBox) , trayItem , TRUE , TRUE , 1);
+
+    trayItem = gtk_check_button_new_with_mnemonic(_("_Start hidden"));
+    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(trayItem), dbus_is_start_hidden() );
+    gtk_box_pack_start( GTK_BOX(trayBox) , trayItem , TRUE , TRUE , 1);
+    g_signal_connect(G_OBJECT( trayItem ) , "clicked" , G_CALLBACK( start_hidden ) , NULL);
+
+    /** HISTORY CONFIGURATION */
+    frame = gtk_frame_new(_("Calls History"));
+    gtk_box_pack_start(GTK_BOX(ret), frame, FALSE, FALSE, 0);
+    gtk_widget_show( frame );
+
+    vbox = gtk_vbox_new(FALSE, 10);
+    gtk_widget_show( vbox );
+    gtk_container_add( GTK_CONTAINER(frame) , vbox);
+
+    label = gtk_label_new_with_mnemonic(_("_Maximum number of calls"));
+    gtk_box_pack_start( GTK_BOX(vbox) , label , TRUE , TRUE , 0);
+
+    value = gtk_hscale_new_with_range(0.0 , 50.0 , 5.0);
+    gtk_label_set_mnemonic_widget (GTK_LABEL (label), value);
+    gtk_scale_set_digits( GTK_SCALE(value) , 0);
+    gtk_scale_set_value_pos( GTK_SCALE(value) , GTK_POS_RIGHT); 
+    gtk_range_set_value( GTK_RANGE( value ) , dbus_get_max_calls());
+    gtk_box_pack_start( GTK_BOX(vbox) , value , TRUE , TRUE , 0);
+    g_signal_connect( G_OBJECT( value) , "value-changed" , G_CALLBACK( update_max_value ) , NULL);
+
+    cleanButton = gtk_button_new_from_stock( GTK_STOCK_CLEAR );
+    gtk_box_pack_end( GTK_BOX(vbox) , cleanButton , FALSE , TRUE , 0);
+    g_signal_connect( G_OBJECT( cleanButton ) , "clicked" , G_CALLBACK( clean_history ) , NULL);
+
+    /** PULSEAUDIO CONFIGURATION */
+    frame = gtk_frame_new( _("PulseAudio sound server"));
+    gtk_box_pack_start(GTK_BOX(ret), frame, FALSE, FALSE, 0);
+    gtk_widget_show( frame );
+
+    vbox = gtk_vbox_new(FALSE, 10);
+    gtk_widget_show( vbox );
+    gtk_container_add( GTK_CONTAINER(frame) , vbox);
+
+    widg = gtk_check_button_new_with_mnemonic(  _("_Control running applications volume"));
+    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(widg), dbus_get_pulse_app_volume_control() );
+    gtk_box_pack_start( GTK_BOX(vbox) , widg , TRUE , TRUE , 1);
+    g_signal_connect(G_OBJECT( widg ) , "clicked" , G_CALLBACK( set_pulse_app_volume_control ) , NULL);
+
+    n = account_list_get_sip_account_number();
+    printf("sip account number = %i\n", n);
+
+    /** SIP port information */
+    curPort = dbus_get_sip_port();
+    if(curPort <= 0 || curPort > 65535)
+        curPort = 5060;
+
+    frame = gtk_frame_new( _("SIP Port"));
+    gtk_box_pack_start(GTK_BOX(ret), frame, FALSE, FALSE, 0);
+    gtk_widget_show( frame );
+    gtk_widget_set_sensitive( GTK_WIDGET(frame), (n==0)?FALSE:TRUE );
+
+    hbox = gtk_hbox_new(FALSE, 10);
+    gtk_widget_show( hbox );
+    gtk_container_add( GTK_CONTAINER(frame) , hbox);
+
+    GtkWidget *applyButton = gtk_button_new_from_stock(GTK_STOCK_APPLY);
+    //gtk_widget_set_size_request(applyButton, 100, 35);
+    //gtk_widget_set_sensitive( GTK_WIDGET(applyButton), (n==0)?FALSE:TRUE );
+
+    label = gtk_label_new(_("Port:"));
+
+    entryPort = gtk_spin_button_new_with_range(1, 65535, 1);
+    gtk_label_set_mnemonic_widget (GTK_LABEL (label), entryPort);
+    gtk_spin_button_set_value(GTK_SPIN_BUTTON(entryPort), curPort);
+
+    gtk_box_pack_start( GTK_BOX(hbox) , label , TRUE , TRUE , 1);
+    gtk_box_pack_start( GTK_BOX(hbox) , entryPort , TRUE , TRUE , 1);
+    gtk_box_pack_start( GTK_BOX(hbox) , applyButton , FALSE , FALSE , 1);
+
+    g_signal_connect( G_OBJECT( applyButton) , "clicked" , G_CALLBACK( update_port ) , entryPort);
+
+    gtk_widget_show_all(ret);
+
+    return ret;
 }
 
 
 /**
  * Show configuration window with tabs
  */
-void
+    void
 show_config_window ()
 {
-	GtkDialog * dialog;
-	GtkWidget * notebook;
-	GtkWidget * tab;
-
-	dialogOpen = TRUE;
-
-	dialog = GTK_DIALOG(gtk_dialog_new_with_buttons (_("Preferences"),
-				GTK_WINDOW(get_main_window()),
-				GTK_DIALOG_DESTROY_WITH_PARENT,
-				GTK_STOCK_CLOSE,
-				GTK_RESPONSE_ACCEPT,
-				NULL));
-
-	// Set window properties
-      	gtk_dialog_set_has_separator(dialog, FALSE);
-	gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 400);
-	gtk_container_set_border_width(GTK_CONTAINER(dialog), 0);
-
-	// Create tabs container
-	notebook = gtk_notebook_new();
-	gtk_box_pack_start(GTK_BOX (dialog->vbox), notebook, TRUE, TRUE, 0);
-	gtk_container_set_border_width(GTK_CONTAINER(notebook), 10);
-	gtk_widget_show(notebook);
-
-	// General settings tab
-	tab = create_general_settings();
-	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("General Settings")));
-	gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab);
-	
-	// Audio tab
-	tab = create_audio_configuration();	
-	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("Audio Settings")));
-	gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab);
-
-	gtk_notebook_set_current_page( GTK_NOTEBOOK( notebook) ,  1);
-
-	gtk_dialog_run(dialog);
-
-	dialogOpen = FALSE;
-
-	gtk_widget_destroy(GTK_WIDGET(dialog));
-}
+    GtkDialog * dialog;
+    GtkWidget * notebook;
+    GtkWidget * tab;
 
-/*
- * Show accounts tab in a different window
- */
-void
-show_accounts_window( void )
-{
-  GtkDialog * dialog;
-  GtkWidget * accountFrame;
-  GtkWidget * tab;
+    dialogOpen = TRUE;
+
+    dialog = GTK_DIALOG(gtk_dialog_new_with_buttons (_("Preferences"),
+                GTK_WINDOW(get_main_window()),
+                GTK_DIALOG_DESTROY_WITH_PARENT,
+                GTK_STOCK_CLOSE,
+                GTK_RESPONSE_ACCEPT,
+                NULL));
+
+    // Set window properties
+    gtk_dialog_set_has_separator(dialog, FALSE);
+    gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 400);
+    gtk_container_set_border_width(GTK_CONTAINER(dialog), 0);
 
-  accDialogOpen = TRUE;
+    // Create tabs container
+    notebook = gtk_notebook_new();
+    gtk_box_pack_start(GTK_BOX (dialog->vbox), notebook, TRUE, TRUE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(notebook), 10);
+    gtk_widget_show(notebook);
 
-  dialog = GTK_DIALOG(gtk_dialog_new_with_buttons (_("Accounts"),
-                              GTK_WINDOW(get_main_window()),
-                              GTK_DIALOG_DESTROY_WITH_PARENT,
-                              GTK_STOCK_CLOSE,
-                              GTK_RESPONSE_ACCEPT,
-                              NULL));
+    // General settings tab
+    tab = create_general_settings();
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("General Settings")));
+    gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab);
 
-        // Set window properties
-        gtk_dialog_set_has_separator(dialog, FALSE);
-        gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 500);
-        gtk_container_set_border_width(GTK_CONTAINER(dialog), 0);
+    // Audio tab
+    tab = create_audio_configuration();	
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("Audio Settings")));
+    gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab);
 
-	accountFrame = gtk_frame_new( _("Accounts previously setup"));
-	gtk_box_pack_start( GTK_BOX( dialog->vbox ), accountFrame , TRUE, TRUE, 0);
-        gtk_container_set_border_width(GTK_CONTAINER(accountFrame), 10);
-        gtk_widget_show(accountFrame);
+    gtk_notebook_set_current_page( GTK_NOTEBOOK( notebook) ,  1);
 
-	// Accounts tab
-        tab = create_accounts_tab();
+    gtk_dialog_run(dialog);
 
-	gtk_container_add(GTK_CONTAINER(accountFrame) , tab);
+    dialogOpen = FALSE;
 
-      gtk_dialog_run( dialog );
+    gtk_widget_destroy(GTK_WIDGET(dialog));
+}
 
-      accDialogOpen=FALSE;
-      gtk_widget_destroy(GTK_WIDGET(dialog));
-      if( account_list_get_size() >0 && account_list_get_current()==NULL ) 
-	account_list_set_current_pos(0);
-      toolbar_update_buttons();
+/*
+ * Show accounts tab in a different window
+ */
+    void
+show_accounts_window( void )
+{
+    GtkDialog * dialog;
+    GtkWidget * accountFrame;
+    GtkWidget * tab;
+
+    accDialogOpen = TRUE;
+
+    dialog = GTK_DIALOG(gtk_dialog_new_with_buttons (_("Accounts"),
+                GTK_WINDOW(get_main_window()),
+                GTK_DIALOG_DESTROY_WITH_PARENT,
+                GTK_STOCK_CLOSE,
+                GTK_RESPONSE_ACCEPT,
+                NULL));
+
+    // Set window properties
+    gtk_dialog_set_has_separator(dialog, FALSE);
+    gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 500);
+    gtk_container_set_border_width(GTK_CONTAINER(dialog), 0);
+
+    accountFrame = gtk_frame_new( _("Accounts previously setup"));
+    gtk_box_pack_start( GTK_BOX( dialog->vbox ), accountFrame , TRUE, TRUE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(accountFrame), 10);
+    gtk_widget_show(accountFrame);
+
+    // Accounts tab
+    tab = create_accounts_tab();
+
+    gtk_container_add(GTK_CONTAINER(accountFrame) , tab);
+
+    // Stun Frame, displayed only if at least 1 SIP account is configured
+    stunFrame = gtk_frame_new(_("Network Address Translation"));
+    gtk_box_pack_start( GTK_BOX( dialog->vbox ), stunFrame , TRUE, TRUE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(stunFrame), 10);
+    gtk_widget_show(stunFrame);
+
+    gtk_container_add(GTK_CONTAINER(stunFrame), create_stun_tab());
+    
+    if( account_list_get_sip_account_number() == 0 )
+    {
+        gtk_widget_set_sensitive(GTK_WIDGET(stunFrame), FALSE);
+    }
+
+    gtk_dialog_run( dialog );
+
+    accDialogOpen=FALSE;
+    gtk_widget_destroy(GTK_WIDGET(dialog));
+    if( account_list_get_size() >0 && account_list_get_current()==NULL ) 
+        account_list_set_current_pos(0);
+    toolbar_update_buttons();
 }
 
+void config_window_set_stun_visible()
+{
+    gtk_widget_set_sensitive( GTK_WIDGET(stunFrame), TRUE );
+}
diff --git a/sflphone-gtk/src/configwindow.h b/sflphone-gtk/src/configwindow.h
index a954d77ffe4a55e2d9662a884f3048ff1a5ee11c..0c10c524d20000f36e4de65574feca8ace8045ad 100644
--- a/sflphone-gtk/src/configwindow.h
+++ b/sflphone-gtk/src/configwindow.h
@@ -109,4 +109,6 @@ void show_config_window();
  */
 void show_accounts_window();
 
+void config_window_set_stun_visible();
+
 #endif