diff --git a/inc/common/queue.h b/inc/common/queue.h
index 14187549552a44f6fb574c19e5fae24370e75f45..95899825ac38f84f20591b1ce036636ff49e4106 100644
--- a/inc/common/queue.h
+++ b/inc/common/queue.h
@@ -20,5 +20,5 @@ typedef struct {
 mqd_t lkt_queue_open(void);
 void lkt_queue_close(mqd_t queue);
 
-void lkt_queue_send(enum lkt_event_type, void *attr);
+void lkt_queue_send(mqd_t, enum lkt_event_type, void *attr);
 lkt_event lkt_queue_handle(mqd_t queue);
diff --git a/src/database/open.c b/src/database/open.c
index 6cc01a60cfb485142881b78f45942a949334db73..dbe7428c014a4cc7da919070942df901a30bec62 100644
--- a/src/database/open.c
+++ b/src/database/open.c
@@ -55,7 +55,7 @@ database_close_all(void)
 }
 
 static inline void
-__inc(volatile sqlite3 *db, const char *name)
+__inc(volatile sqlite3 *db, const char *name, bool check)
 {
     SQLITE_EXEC(db, "UPDATE misc SET opened = (SELECT opened + 1 FROM misc);",
                 error);
@@ -76,10 +76,16 @@ __inc(volatile sqlite3 *db, const char *name)
     return;
 error:
     LOG_ERROR_SCT("DB", "%s", "Database already in use");
-    exit(EXIT_FAILURE);
+    if (check)
+        exit(EXIT_FAILURE);
+    else
+        return;
 out_of_memory:
     LOG_ERROR_SCT("DB", "%s", "Out of memory");
-    exit(EXIT_FAILURE);
+    if (check)
+        exit(EXIT_FAILURE);
+    else
+        return;
 }
 
 int
@@ -192,8 +198,7 @@ retry:
         goto init;
     if (!__check_schema(db))
         goto init;
-    if (check)
-        __inc(db, PROTECTED_DATABASE);
+    __inc(db, PROTECTED_DATABASE, check);
     return true;
 
     /* Need init */
diff --git a/src/main/server.c b/src/main/server.c
index 3ba06e9e2e374bd7fcbae1d4c1fad35b7271284a..71da9f5bada7c5610efb549915da1917137cdb03 100644
--- a/src/main/server.c
+++ b/src/main/server.c
@@ -85,7 +85,6 @@ normal_launch:
         .queue       = lkt_queue_open(),
         .kara_prefix = kara_dir,
     };
-    memset(&srv, 0, sizeof(struct lkt_state));
 
     /* Initialize the system. */
     if (!database_new(&srv.db)) {
@@ -131,7 +130,7 @@ normal_launch:
     char *env_current = env_get(LKT_ENV_CURRENT);
     if (env_current && !STR_MATCH(env_current, "NULL")) {
         LOG_INFO_SCT("INIT", "Restart playback from %s", env_current);
-        lkt_queue_send(lkt_event_play_pos, (void *) (size_t) strtol(env_current, NULL, 0));
+        lkt_queue_send(srv.queue, lkt_event_play_pos, (void *) (size_t) strtol(env_current, NULL, 0));
     }
 
     lkt_listen(&srv);
diff --git a/src/queue.c b/src/queue.c
index a7ae48a380b64e9de9d1ca8b2b6a5b99ce355ba1..50849813a7ef4ba31ae619b7b3fb7d84c08b1dde 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -11,15 +11,16 @@
 mqd_t
 lkt_queue_open(void)
 {
-    errno = 0;
     struct mq_attr attr = {
         .mq_flags   = O_NONBLOCK,
-        .mq_maxmsg  = 8,
+        .mq_maxmsg  = 10,
         .mq_msgsize = sizeof(void *),
-        .mq_curmsgs = 1,
+        .mq_curmsgs = 0,
     };
-    UNUSED(&attr);
-    mqd_t ret = mq_open(LEKTORD_QUEUE_NAME, O_RDWR | O_CREAT, 0622, &attr);
+    mq_unlink(LEKTORD_QUEUE_NAME);
+    errno = 0;
+    mqd_t ret = mq_open(LEKTORD_QUEUE_NAME, O_RDWR | O_CREAT | O_NONBLOCK,
+                        0666, &attr);
 
     switch (errno) {
     case 0:
@@ -48,18 +49,12 @@ lkt_queue_close(mqd_t queue)
 }
 
 void
-lkt_queue_send(enum lkt_event_type type, void *attr)
+lkt_queue_send(mqd_t queue, enum lkt_event_type type, void *attr)
 {
     errno = 0;
-    mqd_t queue = mq_open(LEKTORD_QUEUE_NAME, O_WRONLY);
-    if (queue != (mqd_t) -1) {
-        if (mq_send(queue, attr, sizeof(void *), type))
-            LOG_WARN_SCT("QUEUE", "Failed to send msg of type %d: %s",
-                         type, strerror(errno));
-        mq_close(queue);
-    } else
-        LOG_ERROR_SCT("QUEUE", "Failed to open queue '%s': %s",
-                      LEKTORD_QUEUE_NAME, strerror(errno));
+    if (mq_send(queue, attr, sizeof(void *), type))
+        LOG_WARN_SCT("QUEUE", "Failed to send msg of type %d: %s",
+                     type, strerror(errno));
 }
 
 lkt_event