diff --git a/inc/common/queue.h b/inc/common/queue.h
new file mode 100644
index 0000000000000000000000000000000000000000..d80806a5dc940281409157b9de03927e2c248ac3
--- /dev/null
+++ b/inc/common/queue.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <mqueue.h>
+
+#define LEKTORD_QUEUE_NAME "LEKTORD_QUEUE"
+
+enum lkt_event_type {
+    lkt_event_null = 0,         /* NULL         */
+    lkt_event_play_pos = 10,    /* size_t       */
+    lkt_event_play_file = 11,   /* const char*  */
+} type;
+
+typedef struct {
+    unsigned int type;
+    void *attr;
+} lkt_event;
+
+mqd_t lkt_queue_open(void);
+void lkt_queue_close(mqd_t queue);
+
+void lkt_queue_send(enum lkt_event_type, void *attr);
+lkt_event lkt_queue_handle(mqd_t queue);
diff --git a/meson.build b/meson.build
index d3a1af2027754a1fab4de39f63da1c8dec346157..4c1dc2a02fdf4f1bf3b746db0b67e809d3bfe5d8 100644
--- a/meson.build
+++ b/meson.build
@@ -54,6 +54,7 @@ mthread_sources = [ 'src/mthread/mthread.c'
 ## Common files
 common_sources = [ 'src/common.c'
                  , 'src/stack.c'
+                 , 'src/queue.c'
                  , 'src/bufferfd.c'
                  ]
 
diff --git a/src/queue.c b/src/queue.c
new file mode 100644
index 0000000000000000000000000000000000000000..bd6585311bcae957fbb0b4022023944958a092cf
--- /dev/null
+++ b/src/queue.c
@@ -0,0 +1,67 @@
+#define _POSIX_C_SOURCE 200809L
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <stdio.h>
+#include <common/common.h>
+#include <common/queue.h>
+
+mqd_t
+lkt_queue_open(void)
+{
+    errno = 0;
+    mqd_t ret = mq_open(LEKTORD_QUEUE_NAME, O_RDONLY | O_CREAT | O_NONBLOCK); /* Check EAGAIN */
+
+    switch (errno) {
+    case 0:
+        return ret;
+
+    case EACCES:
+        LOG_ERROR_SCT("QUEUE", "Queue %s already exists", LEKTORD_QUEUE_NAME);
+        return 0;
+
+    case ENOMEM:
+        LOG_ERROR_SCT("QUEUE", "%s", "Out of memory");
+        exit(EXIT_FAILURE);
+
+    default:
+        LOG_ERROR_SCT("QUEUE", "Unhandled error '%d'", errno);
+        exit(EXIT_FAILURE);
+    }
+
+}
+
+void
+lkt_queue_close(mqd_t queue)
+{
+    mq_unlink(LEKTORD_QUEUE_NAME);
+    mq_close(queue);
+}
+
+void
+lkt_queue_send(enum lkt_event_type type, void *attr)
+{
+    mqd_t queue = mq_open(LEKTORD_QUEUE_NAME, O_WRONLY);
+    if (queue >= 0) {
+        if (mq_send(queue, attr, sizeof(void *), type))
+            LOG_WARN_SCT("QUEUE", "Failed to send msg of type %d", type);
+        mq_close(queue);
+    } else
+        LOG_ERROR_SCT("QUEUE", "Failed to open queue '%s'", LEKTORD_QUEUE_NAME);
+}
+
+lkt_event
+lkt_queue_handle(mqd_t queue)
+{
+    lkt_event event;
+    errno = 0;
+    ssize_t len = mq_receive(queue, event.attr, sizeof(void *), &event.type);
+
+    if (len <= 0 || errno == EAGAIN) {
+        memset(&event, 0, sizeof(lkt_event));
+        return event;
+    } else
+        return event;
+}