diff --git a/inc/Makefile.am b/inc/Makefile.am
index 285fe6069208aa0fb53aa774670ec048dcd65670..05db39c4310193702ca810f17495b18996c2b293 100644
--- a/inc/Makefile.am
+++ b/inc/Makefile.am
@@ -1,4 +1,3 @@
 nobase_include_HEADERS  = lektor/cmd.h lektor/commands.h lektor/config.h lektor/database.h
 nobase_include_HEADERS += lektor/mkv.h lektor/net.h lektor/reg.h lektor/thread.h lektor/uri.h
-nobase_include_HEADERS += lektor/bufferfd.h lektor/common.h lektor/macro.h lektor/queue.h
-nobase_include_HEADERS += lektor/stack.h
+nobase_include_HEADERS += lektor/bufferfd.h lektor/common.h lektor/queue.h lektor/stack.h
diff --git a/inc/lektor/cmd.h b/inc/lektor/cmd.h
index 406970c0aab81334942de212af6891426103f849..1eb5c0f28e786aec82d17b098d4a5a2291ee22e5 100644
--- a/inc/lektor/cmd.h
+++ b/inc/lektor/cmd.h
@@ -4,29 +4,30 @@
 #include <stdnoreturn.h>
 #include <stddef.h>
 
-#define LKT_OPT_NULL            { .name = NULL, .call = NULL }
-#define LKT_OPT_DEFAULT(func)   { .name = NULL, .call = func }
+#define CMD_OPT_NULL            { .name = NULL, .call = NULL }
+#define CMD_OPT_DEFAULT(func)   { .name = NULL, .call = func }
 
-struct lkt_cmd_args {
+struct cmd_args {
     int argc;               /* The number of arguments passed.  */
     const char **argv;      /* An array of argument passed.     */
 };
 
-typedef void (*lkt_cmd_callback)(struct lkt_cmd_args *);
+typedef void (*cmd_callback)(struct cmd_args *);
 
-struct lkt_cmd_opt {
+struct cmd_opt {
     const char *name;
-    lkt_cmd_callback call;
+    cmd_callback call;
 };
 
 /* Parse the command line with the list of options. No parameter may be NULL.
    Does not return. */
-noreturn void lkt_cmd_parse(struct lkt_cmd_opt *opts, int argc, const char **argv);
+noreturn void cmd_parse(struct cmd_opt *opts, int argc, const char **argv);
 
 /* Must be setted for the lkt_cmd_parse function to display the correct help
    in case of errors. */
 extern const char *executable_name;
 
+/* Prints the help and exit */
 noreturn void print_help(void);
 
 #endif /* __LKT_CMD_H__ */
diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h
index 64cc7793b5eec055cb9cbd2d03bbaf11e5761ea8..395d23523372d2b69a6c8dc1cf336fea67a66821 100644
--- a/inc/lektor/commands.h
+++ b/inc/lektor/commands.h
@@ -15,27 +15,27 @@
  */
 
 /* Querying lektor's status */
-bool command_currentsong(struct lkt_state *srv, size_t c);
-bool command_status     (struct lkt_state *srv, size_t c);
+bool command_currentsong(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX]);
+bool command_status     (struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX]);
 
 /* Controlling playback */
-bool command_next    (struct lkt_state *srv);
-bool command_pause   (struct lkt_state *srv);
-bool command_previous(struct lkt_state *srv);
+bool command_next    (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
+bool command_pause   (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
+bool command_previous(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
 bool command_play    (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
-bool command_stop    (struct lkt_state *srv);
+bool command_playid  (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
+bool command_stop    (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
 
-bool command_set_pos(struct lkt_state *srv, int index);
+bool command_set_pos(struct lkt_state *srv, int index); /* FIXME: Not used in net/listen.c */
 
 /* The queue */
 bool command_add    (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX], int priority);
 bool command_addid  (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
-bool command_delid  (struct lkt_state *srv, char *id);
-bool command_clear  (struct lkt_state *srv);
-bool command_crop   (struct lkt_state *srv);
+bool command_delid  (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
+bool command_clear  (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
+bool command_crop   (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
 bool command_move   (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
-bool command_shuffle(struct lkt_state *srv);
-bool command_playid (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
+bool command_shuffle(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
 bool command_dump   (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
 
 bool command_queue_list(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX]);
@@ -48,11 +48,11 @@ bool command_plt_rename(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX])
 bool command_plt_export(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
 bool command_plt_import(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
 bool command_plt_add   (struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]);
-bool command_plt_list  (struct lkt_state *srv, size_t c, long cont);
-bool command_plt_ctx   (struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX], long cont);
+bool command_plt_list  (struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX], int cont);
+bool command_plt_ctx   (struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX], int cont);
 
 /* The help */
-bool command_help(struct lkt_state *srv, size_t c);
+bool command_help(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX]);
 
 /* Respond to the idle command */
 bool command_idle(struct lkt_state *srv, size_t c, struct lkt_command *cmd);
@@ -77,14 +77,14 @@ enum lkt_playback_option {
 bool command_set_playback_option(struct lkt_state *srv, size_t c, enum lkt_playback_option opt, char *args[LKT_MESSAGE_ARGS_MAX]);
 
 /* Authentificate users */
-bool command_password(struct lkt_state *srv, size_t c,                       char *argv[LKT_MESSAGE_ARGS_MAX]);
-bool command_user_add(struct lkt_state *srv, size_t c, volatile sqlite3 *db, char *argv[LKT_MESSAGE_ARGS_MAX]);
+bool command_password(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
+bool command_user_add(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
 
 /* Program management control */
-bool command_restart(struct lkt_state *srv, size_t c);
-bool command_kill   (struct lkt_state *srv, size_t c);
+bool command_restart(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
+bool command_kill   (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
 bool command_update (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
-bool command_rescan (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX], bool forced);
+bool command_rescan (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX], int forced);
 
 /* Sticker management */
 bool command_sticker_create(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
diff --git a/inc/lektor/common.h b/inc/lektor/common.h
index fd0cf4f2e77950ffc900e665a35cac38f1e94b99..53d1729f0f7dbebd6ff269cde58bf99044402816 100644
--- a/inc/lektor/common.h
+++ b/inc/lektor/common.h
@@ -1,9 +1,173 @@
 #if ! defined(__LKT_COMMON_H__)
 #define __LKT_COMMON_H__
 
-#include <lektor/macro.h>
 #include <unistd.h>
 #include <stdint.h>
+#include <stdlib.h>
+
+/* Max value for any buffer, to not squash the stack. */
+#define BUFFER_MAX 4096
+
+#ifndef __GNUC__
+#define inline
+#endif
+
+#ifndef MAX
+#define MAX(a, b) ((a) < (b) ? (b) : (a))
+#endif /* MAX */
+
+#ifndef MIN
+#define MIN(a, b) ((a) > (b) ? (b) : (a))
+#endif /* MIN */
+
+#define RETURN_IF(cond, msg, ret)       \
+    if (cond) {                         \
+        LOG_DEBUG("DEBUG", "%s", msg);  \
+        return ret;                     \
+    }
+#define GOTO_IF(cond, msg, label)       \
+    if (cond) {                         \
+        LOG_DEBUG("DEBUG", "%s", msg);  \
+        goto label;                     \
+    }
+
+#define GOTO_UNLESS(cond, msg, label)   GOTO_IF(!(cond), msg, label)
+#define RETURN_UNLESS(cond, msg, ret)   RETURN_IF(!(cond), msg, ret)
+#define NOTHING                         /* Usefull to return nothing in previous macros */
+
+#define STRTOL(ret, str, endptr, err_flag)                  \
+{                                                           \
+    err_flag = 0;                                           \
+    errno    = 0;                                           \
+    ret      = str == NULL ? 0 : strtol(str, &(endptr), 0); \
+    err_flag = errno != 0 || endptr == str;                 \
+}
+
+extern int log_level;
+enum log_level {
+    ERROR   = 1,
+    WARN    = 2,
+    INFO    = 3,
+    DEBUG   = 4,
+};
+
+void __lkt_log(enum log_level, const char *section, const char *func, const char *format, ...);
+#define LOG_INFO( section, ...) __lkt_log(INFO,  section, __func__, __VA_ARGS__)
+#define LOG_WARN( section, ...) __lkt_log(WARN,  section, __func__, __VA_ARGS__)
+#define LOG_ERROR(section, ...) __lkt_log(ERROR, section, __func__, __VA_ARGS__)
+#define LOG_DEBUG(section, ...) __lkt_log(DEBUG, section, __func__, __VA_ARGS__)
+
+#define SELF_EXECUTABLE_LINUX       "/proc/self/exe"
+#define SELF_EXECUTABLE_FREEBSD     "/proc/curproc/file"
+#define SELF_EXECUTABLE_SOLARIS     "/proc/self/path/a.out"
+
+#define LKT_ENV_RESTART             "__LKT_RESTART"
+#define LKT_ENV_CURRENT             "__LKT_CURRENT"
+
+#define LKT_LINE_MAX                1024
+#define LKT_MAX_SQLITE_STATEMENT    1024
+#define LKT_PROTECTED_DATABASE      "disk"
+
+#define LKT_DB_ID                   "id"
+#define LKT_DB_NAME                 "source_name"
+#define LKT_DB_TITLE                "song_title"
+#define LKT_DB_CAT                  "category"
+#define LKT_DB_TYPE                 "song_type"
+#define LKT_DB_AUTHOR               "author_name"
+#define LKT_DB_LANG                 "language"
+#define LKT_DB_ALL                  "string"
+
+#define LEKTOR_TAG_MAX              256
+#define LKT_MESSAGE_ARGS_MAX        32
+#define LKT_MESSAGE_MAX             2048
+#define LKT_DEFAULT_LIST_SIZE       10
+
+typedef volatile enum {
+    MPD_IDLE_NONE               = 0,
+
+    MPD_IDLE_DATABASE           = ( 1 << 1  ),
+    MPD_IDLE_UPDATE             = ( 1 << 2  ),
+    MPD_IDLE_STORED_PLAYLIST    = ( 1 << 3  ),
+    MPD_IDLE_PLAYLIST           = ( 1 << 4  ),
+    MPD_IDLE_PLAYER             = ( 1 << 5  ),
+    MPD_IDLE_MIXER              = ( 1 << 6  ),
+    MPD_IDLE_OUTPUT             = ( 1 << 7  ),
+    MPD_IDLE_OPTIONS            = ( 1 << 8  ),
+    MPD_IDLE_PARTITION          = ( 1 << 9  ),
+    MPD_IDLE_STICKER            = ( 1 << 10 ),
+    MPD_IDLE_SUBSCRIPTION       = ( 1 << 11 ),
+    MPD_IDLE_MESSAGE            = ( 1 << 12 ),
+
+    MPD_IDLE_ALL =
+        MPD_IDLE_DATABASE | MPD_IDLE_UPDATE       | MPD_IDLE_STORED_PLAYLIST  |
+        MPD_IDLE_PLAYLIST | MPD_IDLE_PLAYER       | MPD_IDLE_MIXER            |
+        MPD_IDLE_OUTPUT   | MPD_IDLE_OPTIONS      | MPD_IDLE_PARTITION        |
+        MPD_IDLE_STICKER  | MPD_IDLE_SUBSCRIPTION | MPD_IDLE_MESSAGE,
+} mpd_idle_flag;
+
+#define LKT_BACKLOG         32
+#define COMMAND_LIST_MAX    64
+#define BUFFER_OUT_MAX      16
+#define MPD_VERSION         "0.21.16"
+
+#define SQLITE_PREPARE(db, stmt, SQL, goto_label)                               \
+    if (sqlite3_prepare_v2((sqlite3 *) db, SQL, -1, &(stmt), 0) != SQLITE_OK) { \
+        LOG_ERROR("DB", "Failed to prepare statement: %s",                      \
+                  sqlite3_errmsg((sqlite3 *) db));                              \
+        goto goto_label;                                                        \
+    }
+
+#define SQLITE_EXEC(db, SQL, goto_label)                                        \
+    if (sqlite3_exec((sqlite3 *) db, SQL, NULL, NULL, NULL) != SQLITE_OK) {     \
+        LOG_ERROR("DB", "Failed to exec statement: %s",                         \
+                  sqlite3_errmsg((sqlite3 *) db));                              \
+        goto goto_label;                                                        \
+    }
+
+#define SQLITE_BIND_TEXT(db, stmt, pos, text, error) {                          \
+    if (sqlite3_bind_text(stmt, pos, text, -1, 0) != SQLITE_OK) {               \
+        LOG_ERROR("DB", "Failed to bind text %s at pos %d: %s",                 \
+                  (const char *) text, pos,                                     \
+                  sqlite3_errmsg((sqlite3 *) db));                              \
+        goto error;                                                             \
+    }}
+
+#define SQLITE_BIND_INT(db, stmt, pos, integer, error) {                        \
+    if (sqlite3_bind_int(stmt, pos, integer) != SQLITE_OK) {                    \
+        LOG_ERROR("DB", "Failed to bind int %d at pos %d: %s",                  \
+                  integer, pos, sqlite3_errmsg((sqlite3 *) db));                \
+        goto error;                                                             \
+    }}
+
+#define SQLITE_STEP(db, stmt, code, error)                                      \
+    if (sqlite3_step(stmt) != code) {                                           \
+        LOG_ERROR("DB", "Failed to step: %s",                                   \
+                  sqlite3_errmsg((sqlite3 *) db));                              \
+        goto error;                                                             \
+    }
+
+#define SQLITE_STEP_ROW(db, stmt, error)    SQLITE_STEP(db, stmt, SQLITE_ROW, error)
+#define SQLITE_STEP_DONE(db, stmt, error)   SQLITE_STEP(db, stmt, SQLITE_DONE, error)
+
+#define SQLITE_DO_ROLLBACK(db) \
+    sqlite3_exec((sqlite3 *) db, "ROLLBACK TRANSACTION;\n", NULL, NULL, NULL);
+
+#define STR_MATCH(str1, str2)           (! strcasecmp(str1, str2))
+#define STR_NMATCH(str1, str2, n)       (! strncasecmp(str1, str2, n))
+
+#define sqlite3_column_chars (const char *) sqlite3_column_text
+
+#define GET_VA_COUNT(...)   PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
+#define PP_NARG_(...)       PP_ARG_N(__VA_ARGS__)
+#define PP_ARG_N(   _1, _2, _3, _4, _5, _6, _7, _8, _9,_10,_11,_12,_13,_14,     \
+                    _15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,    \
+                    _29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,    \
+                    _43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,    \
+                    _57,_58,_59,_60,_61,_62,_63,N,...) N
+#define PP_RSEQ_N() 63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,   \
+                    44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,   \
+                    25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,  \
+                    4,3,2,1,0
 
 #define not_implemented() __not_implemented(__func__,__FILE__,__LINE__)
 extern void __not_implemented(const char *func, char *file, int line);
diff --git a/inc/lektor/macro.h b/inc/lektor/macro.h
deleted file mode 100644
index 6340969fcd4133be64bcce60b4895a26069c2e2b..0000000000000000000000000000000000000000
--- a/inc/lektor/macro.h
+++ /dev/null
@@ -1,186 +0,0 @@
-#if ! defined(__LKT_MACRO_H__)
-#define __LKT_MACRO_H__
-
-#include <stdint.h>
-#include <stdlib.h>
-
-/* Max value for any buffer, to not squash the stack. */
-#define BUFFER_MAX 4096
-
-#ifndef __GNUC__
-#define inline
-#endif
-
-/* Macros */
-
-#ifndef MAX
-#define MAX(a, b) ((a) < (b) ? (b) : (a))
-#endif /* MAX */
-
-#ifndef MIN
-#define MIN(a, b) ((a) > (b) ? (b) : (a))
-#endif /* MIN */
-
-#define RETURN_IF(cond, msg, ret)       \
-    if (cond) {                         \
-        LOG_DEBUG("DEBUG", "%s", msg);  \
-        return ret;                     \
-    }
-#define GOTO_IF(cond, msg, label)       \
-    if (cond) {                         \
-        LOG_DEBUG("DEBUG", "%s", msg);  \
-        goto label;                     \
-    }
-
-#define GOTO_UNLESS(cond, msg, label)   GOTO_IF(!(cond), msg, label)
-#define RETURN_UNLESS(cond, msg, ret)   RETURN_IF(!(cond), msg, ret)
-#define NOTHING                         /* Usefull to return nothing. */
-
-#define STRTOL(ret, str, endptr, err_flag)                  \
-{                                                           \
-    err_flag = 0;                                           \
-    errno    = 0;                                           \
-    ret      = str == NULL ? 0 : strtol(str, &(endptr), 0); \
-    err_flag = errno != 0 || endptr == str;                 \
-}
-
-extern int log_level;
-enum log_level {
-    ERROR   = 1,
-    WARN    = 2,
-    INFO    = 3,
-    DEBUG   = 4,
-};
-
-void __lkt_log(enum log_level, const char *section, const char *func, const char *format, ...);
-#define LOG_INFO( section, ...) __lkt_log(INFO,  section, __func__, __VA_ARGS__)
-#define LOG_WARN( section, ...) __lkt_log(WARN,  section, __func__, __VA_ARGS__)
-#define LOG_ERROR(section, ...) __lkt_log(ERROR, section, __func__, __VA_ARGS__)
-#define LOG_DEBUG(section, ...) __lkt_log(DEBUG, section, __func__, __VA_ARGS__)
-
-/* Defines for lektor */
-
-#define INI_MAX_LINE_LEN    512
-#define INI_MAX_SECTION_LEN 80
-
-#define URL_MAX_LEN         1024
-
-#define SELF_EXECUTABLE_LINUX       "/proc/self/exe"
-#define SELF_EXECUTABLE_FREEBSD     "/proc/curproc/file"
-#define SELF_EXECUTABLE_SOLARIS     "/proc/self/path/a.out"
-
-#define LKT_ENV_RESTART             "__LKT_RESTART"
-#define LKT_ENV_CURRENT             "__LKT_CURRENT"
-
-#define LKT_MAX_SQLITE_STATEMENT    1024
-#define PROTECTED_DATABASE          "disk"
-
-#define LKT_DB_ID                   "id"
-#define LKT_DB_NAME                 "source_name"
-#define LKT_DB_TITLE                "song_title"
-#define LKT_DB_CAT                  "category"
-#define LKT_DB_TYPE                 "song_type"
-#define LKT_DB_AUTHOR               "author_name"
-#define LKT_DB_LANG                 "language"
-#define LKT_DB_ALL                  "string"
-
-#define LEKTOR_TAG_MAX              256
-#define LKT_MESSAGE_ARGS_MAX        32
-#define LKT_MESSAGE_MAX             2048
-#define LKT_DEFAULT_LIST_SIZE       10
-
-typedef volatile enum {
-    MPD_IDLE_NONE               = 0,
-
-    MPD_IDLE_DATABASE           = ( 1 << 1  ),
-    MPD_IDLE_UPDATE             = ( 1 << 2  ),
-    MPD_IDLE_STORED_PLAYLIST    = ( 1 << 3  ),
-    MPD_IDLE_PLAYLIST           = ( 1 << 4  ),
-    MPD_IDLE_PLAYER             = ( 1 << 5  ),
-    MPD_IDLE_MIXER              = ( 1 << 6  ),
-    MPD_IDLE_OUTPUT             = ( 1 << 7  ),
-    MPD_IDLE_OPTIONS            = ( 1 << 8  ),
-    MPD_IDLE_PARTITION          = ( 1 << 9  ),
-    MPD_IDLE_STICKER            = ( 1 << 10 ),
-    MPD_IDLE_SUBSCRIPTION       = ( 1 << 11 ),
-    MPD_IDLE_MESSAGE            = ( 1 << 12 ),
-
-    MPD_IDLE_ALL =
-        MPD_IDLE_DATABASE | MPD_IDLE_UPDATE | MPD_IDLE_STORED_PLAYLIST  |
-        MPD_IDLE_PLAYLIST | MPD_IDLE_PLAYER | MPD_IDLE_MIXER            |
-        MPD_IDLE_OUTPUT | MPD_IDLE_OPTIONS | MPD_IDLE_PARTITION         |
-        MPD_IDLE_STICKER | MPD_IDLE_SUBSCRIPTION | MPD_IDLE_MESSAGE,
-} mpd_idle_flag;
-
-#define LKT_BACKLOG         32
-#define COMMAND_LIST_MAX    64
-#define BUFFER_OUT_MAX      16
-#define MPD_VERSION         "0.21.16"
-
-/* Macros */
-
-#define SQLITE_PREPARE(db, stmt, SQL, goto_label)                               \
-    if (sqlite3_prepare_v2((sqlite3 *) db, SQL, -1, &(stmt), 0) != SQLITE_OK) { \
-        LOG_ERROR("DB", "Failed to prepare statement: %s",                      \
-                      sqlite3_errmsg((sqlite3 *) db));                          \
-        goto goto_label;                                                        \
-    }
-
-#define SQLITE_EXEC(db, SQL, goto_label)                                        \
-    if (sqlite3_exec((sqlite3 *) db, SQL, NULL, NULL, NULL) != SQLITE_OK) {     \
-        LOG_ERROR("DB", "Failed to exec statement: %s",                     \
-                      sqlite3_errmsg((sqlite3 *) db));                          \
-        goto goto_label;                                                        \
-    }
-
-#define SQLITE_BIND_TEXT(db, stmt, pos, text, error) {              \
-    if (sqlite3_bind_text(stmt, pos, text, -1, 0) != SQLITE_OK) {   \
-        LOG_ERROR("DB", "Failed to bind text %s at pos %d: %s",     \
-                      (const char *) text, pos,                     \
-                      sqlite3_errmsg((sqlite3 *) db));              \
-        goto error;                                                 \
-    }}
-
-#define SQLITE_BIND_INT(db, stmt, pos, integer, error) {            \
-    if (sqlite3_bind_int(stmt, pos, integer) != SQLITE_OK) {        \
-        LOG_ERROR("DB", "Failed to bind int %d at pos %d: %s",      \
-                      integer, pos, sqlite3_errmsg((sqlite3 *) db));\
-        goto error;                                                 \
-    }}
-
-#define SQLITE_STEP(db, stmt, code, error)                          \
-    if (sqlite3_step(stmt) != code) {                               \
-        LOG_ERROR("DB", "Failed to step: %s",                       \
-                      sqlite3_errmsg((sqlite3 *) db));              \
-        goto error;                                                 \
-    }
-
-#define SQLITE_STEP_ROW(db, stmt, error)    SQLITE_STEP(db, stmt, SQLITE_ROW, error)
-#define SQLITE_STEP_DONE(db, stmt, error)   SQLITE_STEP(db, stmt, SQLITE_DONE, error)
-
-#define SQLITE_DO_ROLLBACK(db)                                      \
-    sqlite3_exec((sqlite3 *) db, "ROLLBACK TRANSACTION;\n", NULL, NULL, NULL);
-
-#define STR_MATCH(str1, str2)           (! strcasecmp(str1, str2))
-#define STR_NMATCH(str1, str2, n)       (! strncasecmp(str1, str2, n))
-
-#define sqlite3_column_chars (const char *) sqlite3_column_text
-
-#define GET_VA_COUNT(...)   PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
-#define PP_NARG_(...)       PP_ARG_N(__VA_ARGS__)
-#define PP_ARG_N( _1, _2, _3, _4, _5, _6, _7, _8, _9,_10,   \
-                  _11,_12,_13,_14,_15,_16,_17,_18,_19,_20,  \
-                  _21,_22,_23,_24,_25,_26,_27,_28,_29,_30,  \
-                  _31,_32,_33,_34,_35,_36,_37,_38,_39,_40,  \
-                  _41,_42,_43,_44,_45,_46,_47,_48,_49,_50,  \
-                  _51,_52,_53,_54,_55,_56,_57,_58,_59,_60,  \
-                  _61,_62,_63,N,...) N
-#define PP_RSEQ_N() 63,62,61,60,                   \
-                    59,58,57,56,55,54,53,52,51,50, \
-                    49,48,47,46,45,44,43,42,41,40, \
-                    39,38,37,36,35,34,33,32,31,30, \
-                    29,28,27,26,25,24,23,22,21,20, \
-                    19,18,17,16,15,14,13,12,11,10, \
-                    9,8,7,6,5,4,3,2,1,0
-
-#endif /* __LKT_MACRO_H__ */
diff --git a/inc/lektor/queue.h b/inc/lektor/queue.h
index 194110bd5e852a8445364528b3cbd5a7ffda05ad..326e3324a119de3277ac27e54cab3c598c50c6b8 100644
--- a/inc/lektor/queue.h
+++ b/inc/lektor/queue.h
@@ -5,16 +5,16 @@
 #include <lektor/common.h>
 
 enum {
-    _LKT_PLAY_STOP   = 0,
-    _LKT_PLAY_PLAY   = 1,
-    _LKT_PLAY_PAUSE  = 2,
-    _LKT_PLAY_TOGGLE = 3,
+    __LKT_PLAY_STOP   = 0,
+    __LKT_PLAY_PLAY   = 1,
+    __LKT_PLAY_PAUSE  = 2,
+    __LKT_PLAY_TOGGLE = 3,
 };
 
-#define LKT_PLAY_STOP   ((void *) (size_t) _LKT_PLAY_STOP)
-#define LKT_PLAY_PLAY   ((void *) (size_t) _LKT_PLAY_PLAY)
-#define LKT_PLAY_PAUSE  ((void *) (size_t) _LKT_PLAY_PAUSE)
-#define LKT_PLAY_TOGGLE ((void *) (size_t) _LKT_PLAY_TOGGLE)
+#define LKT_PLAY_STOP   ((void *) (size_t) __LKT_PLAY_STOP)
+#define LKT_PLAY_PLAY   ((void *) (size_t) __LKT_PLAY_PLAY)
+#define LKT_PLAY_PAUSE  ((void *) (size_t) __LKT_PLAY_PAUSE)
+#define LKT_PLAY_TOGGLE ((void *) (size_t) __LKT_PLAY_TOGGLE)
 
 enum lkt_event_type {
     lkt_event_null          = 0,        // NULL
@@ -29,13 +29,11 @@ enum lkt_event_type {
     lkt_event_skip_current  = (1 << 9), // NULL
 };
 
-#define lkt_event_play ( lkt_event_play_pos | lkt_event_play_file |     \
-                         lkt_event_play_next | lkt_event_play_prev |    \
-                         lkt_event_play_toggle | lkt_event_skip_current \
-                       )
-#define lkt_event_prop ( lkt_event_prop_vol | lkt_event_prop_dur |      \
-                         lkt_event_prop_time                            \
-                       )
+#define lkt_event_play ( lkt_event_play_pos    | lkt_event_play_file    \
+                       | lkt_event_play_next   | lkt_event_play_prev    \
+                       | lkt_event_play_toggle | lkt_event_skip_current )
+#define lkt_event_prop ( lkt_event_prop_vol    | lkt_event_prop_dur     \
+                       | lkt_event_prop_time                            )
 
 typedef struct {
     unsigned int type;
diff --git a/src/base/commands.c b/src/base/commands.c
index ee0e36b370715f7f3e661b5c631731f6ff6b7a2e..f17b0453a0a9b6d6945753755e080c9d5f2d532e 100644
--- a/src/base/commands.c
+++ b/src/base/commands.c
@@ -19,7 +19,8 @@
 #include <unistd.h>
 
 inline bool
-command_restart(struct lkt_state *srv, size_t c)
+command_restart(struct lkt_state *srv, size_t c,
+                char __attribute__((unused)) *argv[LKT_MESSAGE_ARGS_MAX])
 {
     const char *const argv[] = { executable_name, NULL };
     struct lkt_queue_state sta = {0};
@@ -71,7 +72,7 @@ __rescan(void *arg)
 }
 
 bool
-command_rescan(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX], bool forced)
+command_rescan(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX], int forced)
 {
     UNUSED(argv);
     RETURN_UNLESS(lkt_client_auth(srv, c, false), "Failed to authentificate user", false);
@@ -88,7 +89,8 @@ command_rescan(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]
 }
 
 inline bool
-command_kill(struct lkt_state *srv, size_t c)
+command_kill(struct lkt_state *srv, size_t c,
+             char __attribute__((unused)) *argv[LKT_MESSAGE_ARGS_MAX])
 {
     RETURN_UNLESS(lkt_client_auth(srv, c, false), "Failed to authentificate user", false);
     LOG_INFO("GENERAL",  "Stopping lektord");
@@ -99,7 +101,8 @@ command_kill(struct lkt_state *srv, size_t c)
 }
 
 bool
-command_currentsong(struct lkt_state *srv, size_t c)
+command_currentsong(struct lkt_state *srv, size_t c,
+                    char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX])
 {
     struct lkt_message *out;
     struct kara_metadata kara;
@@ -127,7 +130,8 @@ command_currentsong(struct lkt_state *srv, size_t c)
 }
 
 bool
-command_status(struct lkt_state *srv, size_t c)
+command_status(struct lkt_state *srv, size_t c,
+               char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX])
 {
     struct lkt_message *out;
     struct lkt_queue_state queue_state;
@@ -165,7 +169,7 @@ command_status(struct lkt_state *srv, size_t c)
 }
 
 bool
-command_next(struct lkt_state *srv)
+command_next(struct lkt_state *srv, char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX])
 {
     srv->mpd_idle_events |= MPD_IDLE_PLAYER;
     char filepath[PATH_MAX];
@@ -175,7 +179,7 @@ command_next(struct lkt_state *srv)
 }
 
 bool
-command_pause(struct lkt_state *srv)
+command_pause(struct lkt_state *srv, char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX])
 {
     srv->mpd_idle_events |= MPD_IDLE_PLAYER;
     if (!database_queue_toggle_pause(srv->db))
@@ -184,7 +188,7 @@ command_pause(struct lkt_state *srv)
 }
 
 bool
-command_previous(struct lkt_state *srv)
+command_previous(struct lkt_state *srv, char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX])
 {
     srv->mpd_idle_events |= MPD_IDLE_PLAYER;
     char filepath[PATH_MAX];
@@ -205,7 +209,7 @@ __play_that_file(struct lkt_state *win, int pos)
 }
 
 bool
-command_play(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX])
+command_play(struct lkt_state *srv, char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX])
 {
     char *endptr, err;
     long pos = 1;
@@ -255,7 +259,7 @@ command_playid(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX])
 
 
 bool
-command_stop(struct lkt_state *srv)
+command_stop(struct lkt_state *srv, char __attribute__((unused))  *args[LKT_MESSAGE_ARGS_MAX])
 {
     RETURN_UNLESS(database_queue_stop(srv->db), "DB error", false);
     MOD_CALL(srv->window_mod, "close", 1);
@@ -292,27 +296,28 @@ command_addid(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX])
 }
 
 inline bool
-command_clear(struct lkt_state *srv)
+command_clear(struct lkt_state *srv, char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX])
 {
     srv->mpd_idle_events |= MPD_IDLE_PLAYER;
     return database_queue_clear(srv->db);
 }
 
 inline bool
-command_crop(struct lkt_state *srv)
+command_crop(struct lkt_state *srv, char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX])
 {
     srv->mpd_idle_events |= MPD_IDLE_PLAYER;
     return database_queue_crop(srv->db);
 }
 
 bool
-command_delid(struct lkt_state *srv, char *id_str)
+command_delid(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX])
 {
     long id;
     char *endptr = NULL, err = 0, filepath[PATH_MAX];
     int uri = 0;
 
-    STRTOL(id, id_str, endptr, err);
+    RETURN_UNLESS(args[0], "No id provided", false);
+    STRTOL(id, args[0], endptr, err);
     RETURN_IF(err, "STRTOL failed", false);
 
     database_queue_current_kara(srv->db, NULL, &uri);
@@ -356,7 +361,7 @@ command_move(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX])
 }
 
 bool
-command_help(struct lkt_state *srv, size_t c)
+command_help(struct lkt_state *srv, size_t c, , char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX])
 {
     struct lkt_message *out;
     out = lkt_message_new();
@@ -533,7 +538,9 @@ command_find(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX],
 }
 
 bool
-command_plt_list(struct lkt_state *srv, size_t c, long cont)
+command_plt_list(struct lkt_state *srv, size_t c,
+                 char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX],
+                 int cont)
 {
     struct lkt_search search = {
         .srv          = srv,
@@ -547,7 +554,8 @@ command_plt_list(struct lkt_state *srv, size_t c, long cont)
     return __iter_search(&search);
 }
 
-bool command_plt_ctx(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX], long cont)
+bool command_plt_ctx(struct lkt_state *srv, size_t c,
+                     char *args[LKT_MESSAGE_ARGS_MAX], int cont)
 {
     struct lkt_search search = {
         .srv          = srv,
@@ -732,7 +740,7 @@ command_plt_add_uri(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX])
 }
 
 bool
-command_shuffle(struct lkt_state *srv)
+command_shuffle(struct lkt_state *srv, char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX])
 {
     RETURN_UNLESS(database_queue_shuffle(srv->db), "Failed to shuffle", false);
     srv->mpd_idle_events |= MPD_IDLE_PLAYER;
@@ -811,11 +819,11 @@ command_password(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MA
 }
 
 bool
-command_user_add(struct lkt_state *srv, size_t c, volatile sqlite3 *db, char *argv[LKT_MESSAGE_ARGS_MAX])
+command_user_add(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX])
 {
     RETURN_UNLESS(argv[0] && argv[1], "Invalid argument", false);
     RETURN_UNLESS(lkt_client_auth(srv, c, false), "Failed to authentificate user", false);
-    RETURN_UNLESS(database_user_add(db, argv[0], argv[1]), "Failed to add user", false);
+    RETURN_UNLESS(database_user_add(srv->db, argv[0], argv[1]), "Failed to add user", false);
     return false;
 }
 
diff --git a/src/database/open.c b/src/database/open.c
index 47f9a0de808de4032b90b30c4242dc713d36495b..41a33ac9610a9082f3fa0a5ca7a16dad7d6b742f 100644
--- a/src/database/open.c
+++ b/src/database/open.c
@@ -199,11 +199,11 @@ database_open(volatile sqlite3 *db, const char *dbpath, bool check)
 
     /* Try the simple attach, for already initialized database */
 retry:
-    if (!__attach(db, PROTECTED_DATABASE, dbpath))
+    if (!__attach(db, LKT_PROTECTED_DATABASE, dbpath))
         goto init;
     if (!__check_schema(db))
         goto init;
-    __inc(db, PROTECTED_DATABASE, check);
+    __inc(db, LKT_PROTECTED_DATABASE, check);
     return true;
 
     /* Need init */
@@ -216,7 +216,7 @@ init:
     retry = true;
     LOG_WARN("DB", "Database '%s' is not correctly initialized, init it",
              dbpath);
-    __detach(db, PROTECTED_DATABASE) ;
+    __detach(db, LKT_PROTECTED_DATABASE) ;
     if (database_init(dbpath))
         goto retry;
     else {
@@ -228,8 +228,8 @@ init:
 bool
 database_attach(volatile sqlite3 *db, const char *name, const char *dbpath)
 {
-    RETURN_UNLESS(strcasecmp(PROTECTED_DATABASE, name), " The database "
-                  PROTECTED_DATABASE " is protected, can't attach a "
+    RETURN_UNLESS(strcasecmp(LKT_PROTECTED_DATABASE, name), " The database "
+                  LKT_PROTECTED_DATABASE " is protected, can't attach a "
                   "database with the same name", false);
 
     if (is_sql_str_invalid(name)) {
@@ -255,8 +255,8 @@ database_attach(volatile sqlite3 *db, const char *name, const char *dbpath)
 bool
 database_detach(volatile sqlite3 *db, const char *name)
 {
-    RETURN_UNLESS(strcasecmp(PROTECTED_DATABASE, name), " The database "
-                  PROTECTED_DATABASE " is protected, can't detach it", false);
+    RETURN_UNLESS(strcasecmp(LKT_PROTECTED_DATABASE, name), " The database "
+                  LKT_PROTECTED_DATABASE " is protected, can't detach it", false);
 
     if (is_sql_str_invalid(name)) {
         LOG_ERROR("DB", "The database name '%s' is invalid", name);
diff --git a/src/main/lkt.c b/src/main/lkt.c
index 58e4e771db8b97f657c2ca28220deb2dc353a917..6a4d1319c0006c5784adc45c9e7b463e61958c3c 100644
--- a/src/main/lkt.c
+++ b/src/main/lkt.c
@@ -171,22 +171,22 @@ send_cmd_with_uri(FILE *sock, char *cmd, int argc, const char **argv)
 /* Functions implementing options. */
 
 #define just_send_one_arg(func, cmd)                \
-noreturn void func (struct lkt_cmd_args *args) {    \
+noreturn void func (struct cmd_args *args) {        \
     fail_if(args->argc != 1, "Invalid argument");   \
     FILE *sock = lkt_connect();                     \
     char buff[2];                                   \
     write_socket(sock, cmd " %s\n", args->argv[0]); \
     exit_with_status(sock, buff);                   \
 }
-just_send_one_arg(stickers_create__, "sticker __create")
+just_send_one_arg(stickers_create__,  "sticker __create")
 just_send_one_arg(stickers_destroy__, "sticker __destroy")
-just_send_one_arg(plt_destroy__, "rm")
-just_send_one_arg(plt_create__, "playlistadd")
-just_send_one_arg(queue_dump__, "__dump")
+just_send_one_arg(plt_destroy__,      "rm")
+just_send_one_arg(plt_create__,       "playlistadd")
+just_send_one_arg(queue_dump__,       "__dump")
 #undef just_send_one_arg
 
 #define just_send(func, msg) /* Just send a simple string functions */  \
-    noreturn void func (struct lkt_cmd_args *args) {                    \
+    noreturn void func (struct cmd_args *args) {                        \
         fail_if(args->argc, "This command takes no arguments");         \
         lkt_send_and_exit(msg, sizeof(msg));                            \
     }
@@ -212,7 +212,7 @@ simple_send_with_password__(const char *cmd)
 }
 
 noreturn void
-restart__(struct lkt_cmd_args *args)
+restart__(struct cmd_args *args)
 {
     if (args->argc != 0)
         fail("Invalid argument, the previous command takes no arguments");
@@ -220,7 +220,7 @@ restart__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-kill__(struct lkt_cmd_args *args)
+kill__(struct cmd_args *args)
 {
     if (args->argc != 0)
         fail("Invalid argument, the previous command takes no arguments");
@@ -228,7 +228,7 @@ kill__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-rescan_or_update__(struct lkt_cmd_args *args, const char *cmd)
+rescan_or_update__(struct cmd_args *args, const char *cmd)
 {
     if (!password)
         fail("Password not provided");
@@ -259,25 +259,25 @@ rescan_or_update__(struct lkt_cmd_args *args, const char *cmd)
 }
 
 noreturn void
-rescan__(struct lkt_cmd_args *args)
+rescan__(struct cmd_args *args)
 {
     rescan_or_update__(args, "rescan");
 }
 
 noreturn void
-update__(struct lkt_cmd_args *args)
+update__(struct cmd_args *args)
 {
     rescan_or_update__(args, "update");
 }
 
 noreturn void
-populate__(struct lkt_cmd_args *args)
+populate__(struct cmd_args *args)
 {
     rescan_or_update__(args, "__rescan");
 }
 
 noreturn void
-queue_replace__(struct lkt_cmd_args *args)
+queue_replace__(struct cmd_args *args)
 {
     if (args->argc != 1)
         fail("Invalid argument");
@@ -314,7 +314,7 @@ queue_replace__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-config__(struct lkt_cmd_args *args)
+config__(struct cmd_args *args)
 {
     int ret = EXIT_SUCCESS;
     if (args->argc == 0)
@@ -324,7 +324,7 @@ config__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-play__(struct lkt_cmd_args *args)
+play__(struct cmd_args *args)
 {
     if (args->argc > 1)
         fail("Invalid argument");
@@ -368,7 +368,7 @@ play__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-ping__(struct lkt_cmd_args *args)
+ping__(struct cmd_args *args)
 {
     if (args->argc != 0)
         fail("Invalid argument, the ping command takes no arguments");
@@ -382,7 +382,7 @@ ping__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-current__(struct lkt_cmd_args *args)
+current__(struct cmd_args *args)
 {
     if (args->argc != 0)
         fail("Invalid argument, the current command takes no arguments");
@@ -449,7 +449,7 @@ ok:
 }
 
 noreturn void
-queue_pop__(struct lkt_cmd_args *args)
+queue_pop__(struct cmd_args *args)
 {
     fail_if(args->argc, "Invalid argument");
     int songid = 0;
@@ -483,7 +483,7 @@ queue_pop__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-status__(struct lkt_cmd_args *args)
+status__(struct cmd_args *args)
 {
     if (args->argc != 0)
         fail("Invalid argument, the status command takes no arguments");
@@ -557,7 +557,7 @@ error:
 }
 
 noreturn void
-queue_delete__(struct lkt_cmd_args *args)
+queue_delete__(struct cmd_args *args)
 {
     if (args->argc != 1)
         fail("Invalid argument, need onlt one argument: queue delete <id>");
@@ -577,7 +577,7 @@ queue_delete__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-queue_add__(struct lkt_cmd_args *args)
+queue_add__(struct cmd_args *args)
 {
     char buff[3];
     fail_if(args->argc < 1, "Invalid arguments");
@@ -588,7 +588,7 @@ queue_add__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-queue_insert__(struct lkt_cmd_args *args)
+queue_insert__(struct cmd_args *args)
 {
     char buff[3];
     fail_if(args->argc < 1, "Invalid arguments");
@@ -599,7 +599,7 @@ queue_insert__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-queue_seek__(struct lkt_cmd_args *args)
+queue_seek__(struct cmd_args *args)
 {
     fail_if(args->argc != 1, "The seek command needs one argument: queue seek <id>");
 
@@ -620,7 +620,7 @@ queue_seek__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-queue_pos__(struct lkt_cmd_args *args)
+queue_pos__(struct cmd_args *args)
 {
     char buff[LKT_MESSAGE_MAX], *endptr;
 
@@ -672,7 +672,7 @@ redo:
 }
 
 noreturn void
-queue_list__(struct lkt_cmd_args *args)
+queue_list__(struct cmd_args *args)
 {
     char buff[LKT_MESSAGE_MAX], *endptr;
     FILE *sock = NULL;
@@ -727,7 +727,7 @@ queue_list__(struct lkt_cmd_args *args)
 /* Functions implementing options, but for for playlists. */
 
 noreturn void
-plt_add__(struct lkt_cmd_args *args)
+plt_add__(struct cmd_args *args)
 {
     char buff[2];
     FILE *sock = lkt_connect();
@@ -748,7 +748,7 @@ plt_add__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-plt_delete__(struct lkt_cmd_args *args)
+plt_delete__(struct cmd_args *args)
 {
     FILE *sock = lkt_connect();
     char buff[2];
@@ -761,7 +761,7 @@ plt_delete__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-stickers_get__(struct lkt_cmd_args *args)
+stickers_get__(struct cmd_args *args)
 {
     char buff[LKT_MESSAGE_MAX];
     FILE *sock;
@@ -791,7 +791,7 @@ stickers_get__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-stickers_set__(struct lkt_cmd_args *args)
+stickers_set__(struct cmd_args *args)
 {
     fail_if(args->argc != 4, "Invalid argument");
     FILE *sock = lkt_connect();
@@ -802,7 +802,7 @@ stickers_set__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-stickers_delete__(struct lkt_cmd_args *args)
+stickers_delete__(struct cmd_args *args)
 {
     FILE *sock;
     char buff[2];
@@ -849,14 +849,14 @@ redo:
 }
 
 noreturn void
-list_plt__(struct lkt_cmd_args *args)
+list_plt__(struct cmd_args *args)
 {
     fail_if(args->argc != 0, "Invalid argument number");
     __continuation_calls("listplaylists");
 }
 
 noreturn void
-list_plt_content__(struct lkt_cmd_args *args)
+list_plt_content__(struct cmd_args *args)
 {
     fail_if(args->argc != 1, "Invalid argument number");
     char buff[LKT_MESSAGE_MAX];
@@ -866,7 +866,7 @@ list_plt_content__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-search_with_cmd__(struct lkt_cmd_args *args, const char *cmd)
+search_with_cmd__(struct cmd_args *args, const char *cmd)
 {
     fail_if(args->argc < 2,                 "Invalid number of arguments");
     fail_if(!lkt_valid_type(args->argv[0]), "Invalid type for the query");
@@ -902,7 +902,7 @@ redo:
 }
 
 noreturn void
-search_get__(struct lkt_cmd_args *args)
+search_get__(struct cmd_args *args)
 {
     fail_if(args->argc != 1, "Invalid number of arguments");
     fail_if(!strtol(args->argv[0], NULL, 0), "Invalid id");
@@ -922,7 +922,7 @@ search_get__(struct lkt_cmd_args *args)
 }
 
 noreturn void
-search_plt__(struct lkt_cmd_args *args)
+search_plt__(struct cmd_args *args)
 {
     if (args->argc == 0)
         list_plt__(args);
@@ -963,7 +963,7 @@ redo:
 }
 
 #define search_with_cmd(func, cmd) /* I don't want to write always the same things */ \
-    noreturn void func (struct lkt_cmd_args *args) { search_with_cmd__(args, #cmd); }
+    noreturn void func (struct cmd_args *args) { search_with_cmd__(args, #cmd); }
 search_with_cmd(search_db__,     search)
 search_with_cmd(search_count__,  count)
 search_with_cmd(search_queue__,  playlistfind)
@@ -971,7 +971,7 @@ search_with_cmd(search_queue__,  playlistfind)
 
 /* Parsing stuff. */
 
-static struct lkt_cmd_opt options_queue[] = {
+static struct cmd_opt options_queue[] = {
     { .name = "insert",     .call = queue_insert__  },
     { .name = "pos",        .call = queue_pos__     },
     { .name = "pop",        .call = queue_pop__     },
@@ -982,28 +982,28 @@ static struct lkt_cmd_opt options_queue[] = {
     { .name = "crop",       .call = queue_crop__    },
     { .name = "replace",    .call = queue_replace__ },
     { .name = "dump",       .call = queue_dump__    },
-    LKT_OPT_DEFAULT(queue_list__),
+    CMD_OPT_DEFAULT(queue_list__),
 };
 
-static struct lkt_cmd_opt options_plt[] = {
+static struct md_opt options_plt[] = {
     { .name = "add",        .call = plt_add__     },
     { .name = "delete",     .call = plt_delete__  },
     { .name = "destroy",    .call = plt_destroy__ },
     { .name = "create",     .call = plt_create__  },
     { .name = "list",       .call = search_plt__  },
-    LKT_OPT_NULL,
+    CMD_OPT_NULL,
 };
 
-static struct lkt_cmd_opt options_search[] = {
+static struct cmd_opt options_search[] = {
     { .name = "database",   .call = search_db__     },
     { .name = "get",        .call = search_get__    },
     { .name = "plt",        .call = search_plt__    },
     { .name = "count",      .call = search_count__  },
     { .name = "queue",      .call = search_queue__  },
-    LKT_OPT_NULL,
+    CMD_OPT_NULL,
 };
 
-static struct lkt_cmd_opt options_admin[] = {
+static struct cmd_opt options_admin[] = {
     { .name = "ping",       .call = ping__     },
     { .name = "kill",       .call = kill__     },
     { .name = "restart",    .call = restart__  },
@@ -1011,22 +1011,22 @@ static struct lkt_cmd_opt options_admin[] = {
     { .name = "update",     .call = update__   },
     { .name = "populate",   .call = populate__ },
     { .name = "config",     .call = config__   },
-    LKT_OPT_NULL,
+    CMD_OPT_NULL,
 };
 
-static struct lkt_cmd_opt options_stickers[] = {
+static struct cmd_opt options_stickers[] = {
     { .name = "get",        .call = stickers_get__      },
     { .name = "set",        .call = stickers_set__      },
     { .name = "delete",     .call = stickers_delete__   },
     { .name = "create",     .call = stickers_create__   },
     { .name = "destroy",    .call = stickers_destroy__  },
-    LKT_OPT_NULL,
+    CMD_OPT_NULL,
 };
 
 #define sub_command(name) /* Create sub-commands here */                            \
-    noreturn void name ## __(struct lkt_cmd_args *args) {                           \
+    noreturn void name ## __(struct cmd_args *args) {                               \
         fail_if(!args->argc, "Invalid command, specify a sub command for " #name);  \
-        lkt_cmd_parse(options_ ## name, args->argc, args->argv);                    \
+        cmd_parse(options_ ## name, args->argc, args->argv);                        \
     }
 sub_command(stickers)
 sub_command(search)
@@ -1034,15 +1034,15 @@ sub_command(plt)
 sub_command(admin)
 
 noreturn void
-queue__(struct lkt_cmd_args *args)
+queue__(struct cmd_args *args)
 {
     if (args->argc == 0)
         queue_list__(args);
-    lkt_cmd_parse(options_queue, args->argc, args->argv);
+    cmd_parse(options_queue, args->argc, args->argv);
 }
 #undef sub_command
 
-static struct lkt_cmd_opt options_[] = {
+static struct cmd_opt options_[] = {
     { .name = "current",  .call = current__  },
     { .name = "play",     .call = play__     },
     { .name = "next",     .call = next__     },
@@ -1121,5 +1121,5 @@ main(int argc, const char **argv)
     password = args.pwd;
 
     /* Communication with lektor. */
-    lkt_cmd_parse(options_, args.argc, args.argv);
+    cmd_parse(options_, args.argc, args.argv);
 }
diff --git a/src/net/listen.c b/src/net/listen.c
index 58c0cc535f222c991aab0b47625b990fd8b54060..5856127b792a09b602c1b98cbd4e73339971cef9 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -167,9 +167,9 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
 
         /* Commands that are available if not in idle mode */
         else if (STR_MATCH(cmd.name, "currentsong"))
-            err = !command_currentsong(srv, c);
+            err = !command_currentsong(srv, c, NULL);
         else if (STR_MATCH(cmd.name, "status"))
-            err = !command_status(srv, c);
+            err = !command_status(srv, c, NULL);
 
         else if (STR_MATCH(cmd.name, "close"))
             err = !lkt_close_client(srv, c);
@@ -177,25 +177,25 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
             err = 0;
 
         else if (STR_MATCH(cmd.name, "next"))
-            err = !command_next(srv);
+            err = !command_next(srv, NULL);
         else if (STR_MATCH(cmd.name, "pause"))
-            err = !command_pause(srv);
+            err = !command_pause(srv, NULL);
         else if (STR_MATCH(cmd.name, "previous"))
-            err = !command_previous(srv);
+            err = !command_previous(srv, NULL);
         else if (STR_MATCH(cmd.name, "play"))
             err = ! command_play(srv, cmd.args);
         else if (STR_MATCH(cmd.name, "playid"))
             err = ! command_playid(srv, cmd.args);
         else if (STR_MATCH(cmd.name, "stop"))
-            err = !command_stop(srv);
+            err = !command_stop(srv, NULL);
         else if (STR_MATCH(cmd.name, "clear"))
-            err = !command_clear(srv);
+            err = !command_clear(srv, NULL);
         else if (STR_MATCH(cmd.name, "crop"))
-            err = !command_crop(srv);
+            err = !command_crop(srv, NULL);
         else if (STR_MATCH(cmd.name, "moveid"))
             err = !command_move(srv, cmd.args);
         else if (STR_MATCH(cmd.name, "shuffle"))
-            err = !command_shuffle(srv);
+            err = !command_shuffle(srv, NULL);
 
         else if (STR_MATCH(cmd.name, "playlist") || STR_MATCH(cmd.name, "playlistinfo"))
             err = !command_queue_list(srv, c, cmd.args);
@@ -743,12 +743,13 @@ redo:
 
     case lkt_event_play_toggle:
         switch ((size_t) evt.attr) {
-        case _LKT_PLAY_PAUSE:
-        case _LKT_PLAY_PLAY:
-        case _LKT_PLAY_TOGGLE:
+        /* FIXME: Don't toggle with the PLAY/PAUSE commands */
+        case __LKT_PLAY_PAUSE:
+        case __LKT_PLAY_PLAY:
+        case __LKT_PLAY_TOGGLE:
             database_queue_toggle_pause(srv->db);
             break;
-        case _LKT_PLAY_STOP:
+        case __LKT_PLAY_STOP:
             database_queue_stop(srv->db);
             break;
         }