diff --git a/inc/lektor/net.h b/inc/lektor/net.h
index 8759b8e402ea1c14aece87310cd61dd335103d63..386b2a1beb1c0bde2ab52dd713cbcf7a27eec246 100644
--- a/inc/lektor/net.h
+++ b/inc/lektor/net.h
@@ -67,8 +67,11 @@ struct lkt_state {
     /* For uptime */
     time_t start_date;
 
-    /* Signal handlers for this server */
+    /* Signal handlers for this server.
+     * Catch them all! */
     void (*__signal_INT )(struct lkt_state *);
+    void (*__signal_ILL )(struct lkt_state *);
+    void (*__signal_QUIT)(struct lkt_state *);
     void (*__signal_USR1)(struct lkt_state *);
     void (*__signal_USR2)(struct lkt_state *);
 };
diff --git a/src/net/listen.c b/src/net/listen.c
index 172ce3b937713223271a0282722da0bcbe7516a6..4e81d14b8d02b5631235ad35dc493d64adb16aca 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -794,22 +794,32 @@ redo:
  *******************/
 
 static int __lkt_signal_INT  = 0; /* SIGINT  => close the server */
+static int __lkt_signal_QUIT = 0; /* SIGQUIT => close the server */
+static int __lkt_signal_ILL  = 0; /* SIGILL  => NoT veRy HappY   */
 static int __lkt_signal_USR1 = 0; /* SIGUSR1 => not used         */
 static int __lkt_signal_USR2 = 0; /* SIGUSR2 => not used         */
 
 static void
 __signal_handler(int sig)
 {
-    switch (sig) {
-    case SIGINT:
-        LOG_INFO("SIGNAL", "Got signal SIGINT");
-        __lkt_signal_INT = 1;
+#define __HANDLE(signal)                             \
+    case SIG##signal:                                \
+        LOG_INFO("SIGNAL", "Got signal SIG"#signal); \
+        __lkt_signal_##signal = 1;                   \
         break;
 
+    switch (sig) {
+    __HANDLE(INT)
+    __HANDLE(ILL)
+    __HANDLE(QUIT)
+    __HANDLE(USR1)
+    __HANDLE(USR2)
     default:
         LOG_WARN("SIGNAL", "Not handled signal %d", sig);
         break;
     }
+
+#undef __HANDLE
 }
 
 static void
@@ -825,17 +835,30 @@ __lkt_handle_INT(struct lkt_state *srv)
 
     /* Register default handle for SIGINT, so if you double ctrl+c it exit like
      * it crashed. */
-    LOG_INFO("SIGNAL", "Now use default handler for SIGINT");
-    signal(SIGINT, SIG_DFL);
+    LOG_INFO("SIGNAL", "Now use default handler for SIGINT and SIGQUIT");
+    signal(SIGINT,  SIG_DFL);
+    signal(SIGQUIT, SIG_DFL);
 
     exit(EXIT_SUCCESS);
 }
 
+static void
+__lkt_handle_ILL(struct lkt_state UNUSED *srv)
+{
+    LOG_ERROR("SIGNAL", "Handle the SIGILL, I will try to exit normally");
+    __lkt_handle_INT(srv);
+}
+
 static void
 __lkt_handle_USR1(struct lkt_state UNUSED *srv)
 {
 }
 
+static void
+__lkt_handle_USR2(struct lkt_state UNUSED *srv)
+{
+}
+
 static inline void
 handle_signals(struct lkt_state *srv)
 {
@@ -846,10 +869,15 @@ handle_signals(struct lkt_state *srv)
             srv->__signal_##signal(srv);                                        \
         else                                                                    \
             LOG_WARN("SIGNAL", "No signal handler in server for SIG"#signal);   \
-    }
+    }                                                                           \
+    __lkt_signal_##signal = 0;
+
     __HANDLE(srv, INT)
+    __HANDLE(srv, ILL)
+    __HANDLE(srv, QUIT)
     __HANDLE(srv, USR1)
     __HANDLE(srv, USR2)
+
 #undef __HANDLE
 }
 
@@ -867,11 +895,15 @@ lkt_listen(struct lkt_state *srv)
 
     LOG_INFO("SIGNAL", "Register signal handlers for signals...");
     srv->__signal_INT  = __lkt_handle_INT;
+    srv->__signal_QUIT = __lkt_handle_INT;
     srv->__signal_USR1 = __lkt_handle_USR1;
-    srv->__signal_USR2 = NULL;
+    srv->__signal_USR2 = __lkt_handle_USR2;
+    srv->__signal_ILL  = __lkt_handle_ILL;
     signal(SIGINT,  __signal_handler);
+    signal(SIGILL,  __signal_handler);
     signal(SIGUSR1, __signal_handler);
     signal(SIGUSR2, __signal_handler);
+    signal(SIGQUIT, __signal_handler);
     LOG_INFO("SIGNAL", "Signal handlers registered");
 
     if ((srv->fds[0].fd = init_listening_socket(srv->host, srv->port)) < 0)