diff --git a/daemon/src/main.cpp b/daemon/src/main.cpp
index e7a68e114bcce62ac04d88f2b56204114d9856a9..2891ff76aca2b03a9b2989977c127c335621855c 100644
--- a/daemon/src/main.cpp
+++ b/daemon/src/main.cpp
@@ -121,10 +121,12 @@ namespace {
     }
 }
 
-void signal_handler(int code)
-{
-    std::cerr << "Caught signal " << strsignal(code) << ", terminating..." << std::endl;
-    Manager::instance().finish();
+namespace {
+    void signal_handler(int code)
+    {
+        std::cerr << "Caught signal " << strsignal(code) << ", terminating..." << std::endl;
+        Manager::instance().finish();
+    }
 }
 
 int main(int argc, char *argv [])
diff --git a/gnome/src/actions.c b/gnome/src/actions.c
index d3bee67268bdb927cfc0558d55b5256fd69d1615..eaf77ff91cd193ca9be68b14578bc9f7c52f76b4 100644
--- a/gnome/src/actions.c
+++ b/gnome/src/actions.c
@@ -143,9 +143,9 @@ status_bar_display_account()
 
 
 void
-sflphone_quit()
+sflphone_quit(gboolean force_quit)
 {
-    if (calllist_get_size(current_calls_tab) == 0 || main_window_ask_quit()) {
+    if (force_quit || calllist_get_size(current_calls_tab) == 0 || main_window_ask_quit()) {
         dbus_unregister(getpid());
         dbus_clean();
         account_list_free();
diff --git a/gnome/src/actions.h b/gnome/src/actions.h
index 6349c4cb8be4d410f2b833d0a173496906fb1b49..4bb3cbdf1382a3a336a1cb2447026d8a5cf2891f 100644
--- a/gnome/src/actions.h
+++ b/gnome/src/actions.h
@@ -57,7 +57,7 @@ gboolean sflphone_init(GError **error);
 /**
  * Steps when closing the application.  Will ask for confirmation if a call is in progress.
  */
-void sflphone_quit();
+void sflphone_quit(gboolean force_quit);
 
 /**
  * Hang up / refuse the current call
diff --git a/gnome/src/main.c b/gnome/src/main.c
index 7c5da73a9639c3530c9c79977b22fb5d0c952dd2..6c579516b2a4ef8467d55dcaf8cc7805f8b25557 100644
--- a/gnome/src/main.c
+++ b/gnome/src/main.c
@@ -43,9 +43,20 @@
 #include "shortcuts.h"
 #include "history.h"
 
+static void
+signal_handler(int code)
+{
+    printf("Caught signal %s, terminating...\n", strsignal(code));
+    sflphone_quit(TRUE);
+}
+
 int
 main(int argc, char *argv[])
 {
+    signal(SIGINT, signal_handler);
+    signal(SIGHUP, signal_handler);
+    signal(SIGTERM, signal_handler);
+
     GError *error = NULL;
     // Handle logging
     int i;
diff --git a/gnome/src/mainwindow.c b/gnome/src/mainwindow.c
index 398de6e996177fec1a02c1e9476de11f0ff84b72..9d77a6a72d48295243cf8c302d85946eda7f84ee 100644
--- a/gnome/src/mainwindow.c
+++ b/gnome/src/mainwindow.c
@@ -116,7 +116,7 @@ on_delete(GtkWidget * widget UNUSED, gpointer data UNUSED)
         gtk_widget_hide(get_main_window());
         set_minimized(TRUE);
     } else
-        sflphone_quit();
+        sflphone_quit(FALSE);
 
     return TRUE;
 }
diff --git a/gnome/src/statusicon.c b/gnome/src/statusicon.c
index b94864c3f0e73f97bac5d72f7e11ad25b683745e..947e39bb6e3740395b699df4b9e5d7c9b56b3cab 100644
--- a/gnome/src/statusicon.c
+++ b/gnome/src/statusicon.c
@@ -76,7 +76,7 @@ hide_status_hangup_icon()
 void
 status_quit(void * foo UNUSED)
 {
-    sflphone_quit();
+    sflphone_quit(FALSE);
 }
 
 void
diff --git a/gnome/src/uimanager.c b/gnome/src/uimanager.c
index 6e2b6431f0ebbed4646ccc5b7e796fff03011bd8..79aca847e906ead253f1be1f1f3195bf1a6d4f0d 100644
--- a/gnome/src/uimanager.c
+++ b/gnome/src/uimanager.c
@@ -623,7 +623,7 @@ call_new_call(void * foo UNUSED)
 static void
 call_quit(void * foo UNUSED)
 {
-    sflphone_quit();
+    sflphone_quit(FALSE);
 }
 
 static void
@@ -633,7 +633,7 @@ call_minimize(void * foo UNUSED)
         gtk_widget_hide(get_main_window());
         set_minimized(TRUE);
     } else
-        sflphone_quit();
+        sflphone_quit(FALSE);
 }
 
 static void