diff --git a/gnome/src/actions.c b/gnome/src/actions.c
index ecf106234399e6c523765e71fe795ad6016b80a9..4e949ff7fc62cdac2a233798db2fd3c3c5f79804 100644
--- a/gnome/src/actions.c
+++ b/gnome/src/actions.c
@@ -155,45 +155,30 @@ void
 status_bar_display_account ()
 {
     gchar* msg;
-    account_t* acc;
 
     statusbar_pop_message (__MSG_ACCOUNT_DEFAULT);
 
-    DEBUG ("status_bar_display_account begin");
-
-    acc = account_list_get_current ();
+    account_t *acc = account_list_get_current ();
+    status_tray_icon_online (acc != NULL);
 
     if (acc) {
-        status_tray_icon_online (TRUE);
         msg = g_markup_printf_escaped ("%s %s (%s)" ,
                                        _ ("Using account"),
                                        (gchar*) g_hash_table_lookup (acc->properties , ACCOUNT_ALIAS),
                                        (gchar*) g_hash_table_lookup (acc->properties , ACCOUNT_TYPE));
     } else {
-        status_tray_icon_online (FALSE);
         msg = g_markup_printf_escaped (_ ("No registered accounts"));
     }
 
     statusbar_push_message (msg, NULL,  __MSG_ACCOUNT_DEFAULT);
     g_free (msg);
-
-    DEBUG ("status_bar_display_account_end");
 }
 
 
-gboolean
+void
 sflphone_quit ()
 {
-    gboolean quit = FALSE;
-    guint count = calllist_get_size (current_calls);
-
-    if (count > 0) {
-        quit = main_window_ask_quit();
-    } else {
-        quit = TRUE;
-    }
-
-    if (quit) {
+    if (calllist_get_size(current_calls) == 0 || main_window_ask_quit()) {
         // Save the history
         sflphone_save_history ();
 
@@ -205,8 +190,6 @@ sflphone_quit ()
         //account_list_clean()
         gtk_main_quit ();
     }
-
-    return quit;
 }
 
 void
@@ -251,8 +234,7 @@ sflphone_hung_up (callable_obj_t * c)
     status_tray_icon_blink (FALSE);
 #endif
 
-    stop_call_clock(c);
-    calltree_update_clock();
+    statusbar_update_clock("");
 }
 
 /** Internal to actions: Fill account list */
@@ -454,7 +436,7 @@ sflphone_hang_up()
 
     calltree_update_call (history, selectedCall, NULL);
 
-    calltree_update_clock();
+    statusbar_update_clock("");
 }
 
 void
@@ -1353,15 +1335,13 @@ static void hist_free_elt(gpointer list)
 
 void sflphone_save_history (void)
 {
-    gint size;
-    gint i;
     QueueElement *current;
     conference_obj_t *conf;
 
     GHashTable *result = g_hash_table_new_full (NULL, g_str_equal, g_free, hist_free_elt);
 
-    size = calllist_get_size (history);
-    for (i = 0; i < size; i++) {
+    gint size = calllist_get_size (history);
+    for (gint i = 0; i < size; i++) {
         current = calllist_get_nth (history, i);
         if (!current) {
             WARN("SFLphone: Warning: %dth element is null", i);
@@ -1384,7 +1364,7 @@ void sflphone_save_history (void)
     }
 
     size = conferencelist_get_size(history);
-    for(i = 0; i < size; i++) {
+    for(gint i = 0; i < size; i++) {
         conf = conferencelist_get_nth(history, i);
         if(!conf) {
             DEBUG("SFLphone: Error: Could not get %dth conference", i);
@@ -1443,36 +1423,13 @@ sflphone_srtp_zrtp_off (callable_obj_t * c)
 void
 sflphone_srtp_zrtp_show_sas (callable_obj_t * c, const gchar* sas, const gboolean verified)
 {
-    if (c == NULL) {
-        DEBUG ("Panic callable obj is NULL in %s at %d", __FILE__, __LINE__);
-    }
-
     c->_sas = g_strdup (sas);
-
-    if (verified == TRUE) {
-        c->_srtp_state = SRTP_STATE_ZRTP_SAS_CONFIRMED;
-    } else {
-        c->_srtp_state = SRTP_STATE_ZRTP_SAS_UNCONFIRMED;
-    }
+    c->_srtp_state = verified ? SRTP_STATE_ZRTP_SAS_CONFIRMED : SRTP_STATE_ZRTP_SAS_UNCONFIRMED;
 
     calltree_update_call (current_calls, c, NULL);
     update_actions();
 }
 
-void
-sflphone_srtp_zrtp_not_supported (callable_obj_t * c)
-{
-    DEBUG ("ZRTP not supported");
-    main_window_zrtp_not_supported (c);
-}
-
-/* Method on sflphoned */
-void
-sflphone_set_confirm_go_clear (callable_obj_t * c)
-{
-    dbus_set_confirm_go_clear (c);
-}
-
 void
 sflphone_request_go_clear (void)
 {
@@ -1483,14 +1440,6 @@ sflphone_request_go_clear (void)
     }
 }
 
-/* Signal sent by sflphoned */
-void
-sflphone_confirm_go_clear (callable_obj_t * c)
-{
-    main_window_confirm_go_clear (c);
-}
-
-
 void
 sflphone_call_state_changed (callable_obj_t * c, const gchar * description, const guint code)
 {
diff --git a/gnome/src/actions.h b/gnome/src/actions.h
index 8415cdba0600ef2d33a8c600f558507ce9029b64..5756dec3e609d969ba0ed1809b7e6847c3e9df5c 100644
--- a/gnome/src/actions.h
+++ b/gnome/src/actions.h
@@ -58,9 +58,8 @@ gboolean sflphone_init () ;
 
 /**
  * Steps when closing the application.  Will ask for confirmation if a call is in progress.
- * @return TRUE if the user wants to quit, FALSE otherwise.
  */
-gboolean sflphone_quit () ;
+void sflphone_quit () ;
 
 /**
  * Hang up / refuse the current call
@@ -263,24 +262,6 @@ void sflphone_srtp_zrtp_off (callable_obj_t * c);
  */
 void sflphone_srtp_zrtp_show_sas (callable_obj_t * c, const gchar* sas, const gboolean verified);
 
-/**
- * Called when the remote peer does not support ZRTP
- * @param c* The current call
- */
-void sflphone_srtp_zrtp_not_supported (callable_obj_t * c);
-
-/**
- * Called when user wants to confirm go clear request.
- * @param c* The call to confirm the go clear request.
- */
-void sflphone_set_confirm_go_clear (callable_obj_t * c);
-
-/**
- * Called when user wants to confirm go clear request.
- * @param c* The call to confirm the go clear request.
- */
-void sflphone_confirm_go_clear (callable_obj_t * c);
-
 /**
  * Called when user wants to clear.
  * @param c* The call on which to go clear
diff --git a/gnome/src/callable_obj.c b/gnome/src/callable_obj.c
index 8367823524018d40cb70776e37004bfdf8854cdf..9a00f2378e971bb8e115ea403bde117f000a7f6f 100644
--- a/gnome/src/callable_obj.c
+++ b/gnome/src/callable_obj.c
@@ -105,60 +105,6 @@ void call_remove_all_errors (callable_obj_t * call)
     g_ptr_array_foreach (call->_error_dialogs, (GFunc) gtk_widget_destroy, NULL);
 }
 
-static void threaded_clock_incrementer (void *pc)
-{
-    callable_obj_t *call = (callable_obj_t *) pc;
-
-    for(;;) {
-        gdk_threads_enter ();
-
-        int duration = difftime (time(NULL), call->_time_start);
-
-        g_snprintf (call->_timestr, 20, "%.2d:%.2d", duration % 60, duration / 60);
-
-        // Update clock only if call is active (current, hold, recording transfer)
-        if ( (call->_state != CALL_STATE_INVALID) &&
-                (call->_state != CALL_STATE_INCOMING) &&
-                (call->_state != CALL_STATE_RINGING) &&
-                (call->_state != CALL_STATE_DIALING) &&
-                (call->_state != CALL_STATE_FAILURE) &&
-                (call->_state != CALL_STATE_BUSY)) {
-            calltree_update_clock();
-        }
-
-        gdk_threads_leave ();
-
-        GTimeVal abs_time;
-        g_get_current_time(&abs_time);
-        g_time_val_add(&abs_time, 1000000);
-        g_mutex_lock(call->mutex);
-        g_cond_timed_wait(call->cond, call->mutex, &abs_time);
-        gboolean ret = call->exitClockThread;
-        g_mutex_unlock(call->mutex);
-
-        if (ret == TRUE)
-            break;
-    }
-
-    g_thread_exit (NULL);
-}
-
-void stop_call_clock (callable_obj_t *c)
-{
-    assert(c->_type == CALL);
-
-    g_mutex_lock(c->mutex);
-    c->exitClockThread = TRUE;
-    g_cond_signal(c->cond);
-    g_mutex_unlock(c->mutex);
-
-    g_thread_join(c->clock_thread);
-    g_mutex_free(c->mutex);
-    g_cond_free(c->cond);
-
-    c->clock_thread = NULL;
-}
-
 callable_obj_t *create_new_call (callable_type_t type, call_state_t state,
                       const gchar* const callID,
                       const gchar* const accountID,
@@ -182,13 +128,6 @@ callable_obj_t *create_new_call (callable_type_t type, call_state_t state,
     obj->_peer_number = g_strdup (peer_number);
     obj->_peer_info = get_peer_info (peer_name, peer_number);
 
-    if (obj->_type == CALL) {
-        obj->mutex = g_mutex_new();
-        obj->cond = g_cond_new();
-        obj->exitClockThread = FALSE;
-        obj->clock_thread = g_thread_create((GThreadFunc) threaded_clock_incrementer, (void *) obj, TRUE, NULL);
-    }
-
     return obj;
 }
 
@@ -283,8 +222,6 @@ void free_callable_obj_t (callable_obj_t *c)
     g_free (c->_recordfile);
 
     g_free (c);
-
-    calltree_update_clock();
 }
 
 gchar* get_peer_info (const gchar* const number, const gchar* const name)
diff --git a/gnome/src/callable_obj.h b/gnome/src/callable_obj.h
index e430e659617de963c6b436518b474d9acc6e7da4..3c4c42ec416e51fad4b59f5180d4efd469d08f83 100644
--- a/gnome/src/callable_obj.h
+++ b/gnome/src/callable_obj.h
@@ -110,7 +110,6 @@ typedef struct  {
     gchar* _accountID;              // The account the call is made with
     time_t _time_start;             // The timestamp the call was initiating
     time_t _time_stop;              // The timestamp the call was over
-    gchar _timestr[20];             // The timestamp as a string format for disply in statusbar
     history_state_t _history_state; // The history state if necessary
     srtp_state_t _srtp_state;       // The state of security on the call
     gchar* _srtp_cipher;            // Cipher used for the srtp session
@@ -164,11 +163,6 @@ typedef struct  {
     GtkWidget *_im_widget;
 
     time_t _time_added;
-
-    GThread *clock_thread;
-    GCond *cond;
-    GMutex *mutex;
-    gboolean exitClockThread;
 } callable_obj_t;
 
 callable_obj_t *create_new_call (callable_type_t, call_state_t, const gchar* const, const gchar* const, const gchar* const, const gchar* const);
@@ -210,9 +204,6 @@ gchar* call_get_peer_number (const gchar*);
 void
 free_callable_obj_t (callable_obj_t *c);
 
-void
-stop_call_clock (callable_obj_t *c);
-
 gchar* get_peer_info (const gchar* const, const gchar* const);
 
 history_state_t get_history_state_from_id (gchar *indice);
diff --git a/gnome/src/contacts/calltree.c b/gnome/src/contacts/calltree.c
index 3c7f779d693dc78f64f9bcc633b84385e1f5254b..3972a511b546f03ba7f9c854405547b2a004d327 100644
--- a/gnome/src/contacts/calltree.c
+++ b/gnome/src/contacts/calltree.c
@@ -604,8 +604,6 @@ void
 calltree_remove_call (calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent)
 {
     GtkTreeIter iter;
-    GValue val;
-    callable_obj_t * iterCall;
     GtkTreeStore* store = tab->store;
 
     if (!c)
@@ -614,17 +612,15 @@ calltree_remove_call (calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent)
     DEBUG ("CallTree: Remove call %s", c->_callID);
 
     int nbChild = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), parent);
-    int i;
-
-    for (i = 0; i < nbChild; i++) {
+    for (int i = 0; i < nbChild; i++) {
         if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter, parent, i)) {
             if (gtk_tree_model_iter_has_child (GTK_TREE_MODEL (store), &iter))
                 calltree_remove_call (tab, c, &iter);
 
-            val.g_type = 0;
+            GValue val = { .g_type = 0 };
             gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter, COLUMN_ACCOUNT_PTR, &val);
 
-            iterCall = (callable_obj_t*) g_value_get_pointer (&val);
+            callable_obj_t * iterCall = g_value_get_pointer (&val);
             g_value_unset (&val);
 
             if (iterCall == c)
@@ -632,16 +628,12 @@ calltree_remove_call (calltab_t* tab, callable_obj_t * c, GtkTreeIter *parent)
         }
     }
 
-    callable_obj_t * selectedCall = calltab_get_selected_call (tab);
-
-    if (selectedCall == c)
+    if (calltab_get_selected_call (tab) == c)
         calltab_select_call (tab, NULL);
 
     update_actions();
 
-    calltree_update_clock();
-
-    DEBUG ("Calltree remove call ended");
+    statusbar_update_clock("");
 }
 
 void
@@ -1202,50 +1194,47 @@ void calltree_remove_conference (calltab_t* tab, const conference_obj_t* conf, G
     conference_obj_t *tempconf = NULL;
     GtkTreeStore* store = tab->store;
     int nbParticipant;
-    int i, j;
 
     DEBUG ("CallTree: Remove conference %s", conf->_confID);
 
     int nbChild = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), parent);
 
-    for (i = 0; i < nbChild; i++) {
-
-        if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_parent, parent, i)) {
-            if (gtk_tree_model_iter_has_child (GTK_TREE_MODEL (store), &iter_parent)) {
+    for (int i = 0; i < nbChild; i++) {
+        if (!gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_parent, parent, i))
+            continue;
+        if (!gtk_tree_model_iter_has_child (GTK_TREE_MODEL (store), &iter_parent))
+           continue;
 
-                calltree_remove_conference (tab, conf, &iter_parent);
+        calltree_remove_conference (tab, conf, &iter_parent);
 
-                confval.g_type = 0;
-                gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter_parent, COLUMN_ACCOUNT_PTR, &confval);
+        confval.g_type = 0;
+        gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter_parent, COLUMN_ACCOUNT_PTR, &confval);
 
-                tempconf = (conference_obj_t*) g_value_get_pointer (&confval);
-                g_value_unset (&confval);
+        tempconf = (conference_obj_t*) g_value_get_pointer (&confval);
+        g_value_unset (&confval);
 
-                if (tempconf == conf) {
+        if (tempconf != conf)
+            continue;
 
-                    nbParticipant = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), &iter_parent);
-                    DEBUG ("CallTree: nbParticipant: %d", nbParticipant);
+        nbParticipant = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), &iter_parent);
+        DEBUG ("CallTree: nbParticipant: %d", nbParticipant);
 
-                    for (j = 0; j < nbParticipant; j++) {
-                        callable_obj_t *call = NULL;
-
-                        if (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_child, &iter_parent, j)) {
+        for (int j = 0; j < nbParticipant; j++) {
+            if (!gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_child, &iter_parent, j))
+                continue;
 
-                            callval.g_type = 0;
-                            gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter_child, COLUMN_ACCOUNT_PTR, &callval);
+            callval.g_type = 0;
+            gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter_child, COLUMN_ACCOUNT_PTR, &callval);
 
-                            call = (callable_obj_t*) g_value_get_pointer (&callval);
-                            g_value_unset (&callval);
+            callable_obj_t *call = g_value_get_pointer (&callval);
+            g_value_unset (&callval);
 
-                            // do not add back call in history calltree when cleaning it
-                            if (call && tab != history)
-                                calltree_add_call (tab, call, NULL);
-                        }
-                    }
-                    gtk_tree_store_remove (store, &iter_parent);
-                }
-            }
+            // do not add back call in history calltree when cleaning it
+            if (call && tab != history)
+                calltree_add_call (tab, call, NULL);
         }
+
+        gtk_tree_store_remove (store, &iter_parent);
     }
 
     update_actions();
@@ -1343,25 +1332,31 @@ void calltree_display (calltab_t *tab)
 }
 
 
-void calltree_update_clock()
+gboolean calltree_update_clock(gpointer data UNUSED)
 {
+    char timestr[20];
+    char *msg = "";
+    long duration;
     callable_obj_t *c = calltab_get_selected_call (current_calls);
-    if (!c || !c->_timestr) {
-        statusbar_update_clock ("");
-        return;
-    }
 
-    if ((c->_state != CALL_STATE_INVALID) &&
-            (c->_state != CALL_STATE_INCOMING) &&
-            (c->_state != CALL_STATE_RINGING) &&
-            (c->_state != CALL_STATE_DIALING) &&
-            (c->_state != CALL_STATE_FAILURE) &&
-            (c->_state != CALL_STATE_BUSY)) {
+    if (c)
+        switch (c->_state) {
+        case CALL_STATE_INVALID:
+        case CALL_STATE_INCOMING:
+        case CALL_STATE_RINGING:
+        case CALL_STATE_FAILURE:
+        case CALL_STATE_DIALING:
+        case CALL_STATE_BUSY:
+            break;
+        default:
+            duration = difftime (time(NULL), c->_time_start);
+            if (duration < 0)
+                duration = 0;
+            g_snprintf (timestr, sizeof(timestr), "%.2ld:%.2ld", duration / 60, duration % 60);
+            msg = timestr;
+        }
 
-        // TODO this make the whole thing crash...
-        statusbar_update_clock (c->_timestr);
-    } else
-        statusbar_update_clock ("");
+    statusbar_update_clock (msg);
 }
 
 
diff --git a/gnome/src/contacts/calltree.h b/gnome/src/contacts/calltree.h
index faf3d61234927ffb57b41a29db91e9bb0b585c92..b41d3bdff36389fefa939833a067927a09aae5f7 100644
--- a/gnome/src/contacts/calltree.h
+++ b/gnome/src/contacts/calltree.h
@@ -118,10 +118,10 @@ void
 row_activated (GtkTreeView *, GtkTreePath *, GtkTreeViewColumn *, void *);
 
 /**
- * Update elapced time based on selected calltree's call
+ * Update elapsed time based on selected calltree's call
  */
-void
-calltree_update_clock();
+gboolean
+calltree_update_clock(gpointer);
 
 /**
  * Get the iter to a row provided the callID/confID
diff --git a/gnome/src/dbus/dbus.c b/gnome/src/dbus/dbus.c
index b1b5f8d301073260f60dcf9c9db96f1b1786546f..adbc9b4ed3f57739890185312c532bac241e75d4 100644
--- a/gnome/src/dbus/dbus.c
+++ b/gnome/src/dbus/dbus.c
@@ -652,10 +652,8 @@ confirm_go_clear_cb (DBusGProxy *proxy UNUSED, const gchar* callID, void * foo
     DEBUG ("DBUS: Confirm Go Clear request");
 
     callable_obj_t * c = calllist_get_call (current_calls, callID);
-
-    if (c) {
-        sflphone_confirm_go_clear (c);
-    }
+    if (c)
+        main_window_confirm_go_clear (c);
 }
 
 static void
@@ -665,7 +663,7 @@ zrtp_not_supported_cb (DBusGProxy *proxy UNUSED, const gchar* callID, void * foo
     callable_obj_t * c = calllist_get_call (current_calls, callID);
 
     if (c) {
-        sflphone_srtp_zrtp_not_supported (c);
+        main_window_zrtp_not_supported (c);
         notify_zrtp_not_supported (c);
     }
 }
diff --git a/gnome/src/mainwindow.c b/gnome/src/mainwindow.c
index e7f129e608c8395ad5f484f9c22a69fc50e08729..0e325472b02b68283115d38ae86ce8ed6e2cf9b6 100644
--- a/gnome/src/mainwindow.c
+++ b/gnome/src/mainwindow.c
@@ -297,14 +297,13 @@ create_main_window ()
     /* dont't show the contact list */
     gtk_widget_hide (contacts->tree);
 
-    //history_init(); // init search
-
     /* don't show waiting layer */
     gtk_widget_hide (waitingLayer);
 
-    // pthread_mutex_init (&statusbar_message_mutex, NULL);
     gmutex = g_mutex_new();
 
+    g_timeout_add(1000, calltree_update_clock, NULL);
+
     // Configuration wizard
     if (account_list_get_size () == 1) {
 #if GTK_CHECK_VERSION(2,10,0)
@@ -441,16 +440,8 @@ statusbar_pop_message (guint id)
 void
 statusbar_update_clock (const gchar * const msg)
 {
-    gchar *message = NULL;
-
-    if (!msg) {
-        statusbar_pop_message (__MSG_ACCOUNT_DEFAULT);
-        statusbar_push_message (message, NULL, __MSG_ACCOUNT_DEFAULT);
-    }
-
-
     g_mutex_lock (gmutex);
-    message = g_strdup (status_current_message);
+    gchar *message = g_strdup (status_current_message);
     g_mutex_unlock (gmutex);
 
     if (message) {
@@ -554,7 +545,7 @@ main_window_confirm_go_clear (callable_obj_t * c)
     mini_dialog = pidgin_mini_dialog_new (_ ("Confirm Go Clear"), desc,
                                           GTK_STOCK_STOP);
     pidgin_mini_dialog_add_button (mini_dialog, _ ("Confirm"),
-                                   (PidginMiniDialogCallback) sflphone_set_confirm_go_clear, NULL);
+                                   (PidginMiniDialogCallback) dbus_set_confirm_go_clear, NULL);
     pidgin_mini_dialog_add_button (mini_dialog, _ ("Stop Call"), sflphone_hang_up,
                                    NULL);