diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h
index 8ea3e82fbb321e50a1f17a144296a5949fb4f52c..452d46bb66de87a963e52de47934b0e08912540e 100644
--- a/inc/lektor/commands.h
+++ b/inc/lektor/commands.h
@@ -18,36 +18,36 @@ bool command_currentsong(struct lkt_state *srv, size_t c);
 bool command_status     (struct lkt_state *srv, size_t c);
 
 /* Controlling playback */
-bool command_next    (sqlite3 *db, struct lkt_win *win,                                   enum mpd_idle_flag *watch_mask_ptr);
-bool command_pause   (sqlite3 *db, struct lkt_win *win,                                   enum mpd_idle_flag *watch_mask_ptr);
-bool command_previous(sqlite3 *db, struct lkt_win *win,                                   enum mpd_idle_flag *watch_mask_ptr);
-bool command_play    (sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr);
-bool command_stop    (sqlite3 *db, struct lkt_win *win,                                   enum mpd_idle_flag *watch_mask_ptr);
+bool command_next    (volatile sqlite3 *db, struct lkt_win *win,                                   mpd_idle_flag *watch_mask_ptr);
+bool command_pause   (volatile sqlite3 *db, struct lkt_win *win,                                   mpd_idle_flag *watch_mask_ptr);
+bool command_previous(volatile sqlite3 *db, struct lkt_win *win,                                   mpd_idle_flag *watch_mask_ptr);
+bool command_play    (volatile sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr);
+bool command_stop    (volatile sqlite3 *db, struct lkt_win *win,                                   mpd_idle_flag *watch_mask_ptr);
 
-bool command_set_pos(sqlite3 *db, struct lkt_win *win, enum mpd_idle_flag *watch_mask_ptr, int index);
+bool command_set_pos(volatile sqlite3 *db, struct lkt_win *win, mpd_idle_flag *watch_mask_ptr, int index);
 
 /* The queue */
-bool command_add    (sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr);
-bool command_addid  (sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr);
-bool command_del    (sqlite3 *db, struct lkt_win *win, char *pos_range,                  enum mpd_idle_flag *watch_mask_ptr);
-bool command_delid  (sqlite3 *db, struct lkt_win *win, char *id,                         enum mpd_idle_flag *watch_mask_ptr);
-bool command_clear  (sqlite3 *db,                                                        enum mpd_idle_flag *watch_mask_ptr);
-bool command_crop   (sqlite3 *db,                                                        enum mpd_idle_flag *watch_mask_ptr);
-bool command_move   (sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX],                      enum mpd_idle_flag *watch_mask_ptr);
-bool command_shuffle(sqlite3 *db,                                                        enum mpd_idle_flag *watch_mask_ptr);
-bool command_playid (sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr);
+bool command_add    (volatile sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr);
+bool command_addid  (volatile sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr);
+bool command_del    (volatile sqlite3 *db, struct lkt_win *win, char *pos_range,                  mpd_idle_flag *watch_mask_ptr);
+bool command_delid  (volatile sqlite3 *db, struct lkt_win *win, char *id,                         mpd_idle_flag *watch_mask_ptr);
+bool command_clear  (volatile sqlite3 *db,                                                        mpd_idle_flag *watch_mask_ptr);
+bool command_crop   (volatile sqlite3 *db,                                                        mpd_idle_flag *watch_mask_ptr);
+bool command_move   (volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX],                      mpd_idle_flag *watch_mask_ptr);
+bool command_shuffle(volatile sqlite3 *db,                                                        mpd_idle_flag *watch_mask_ptr);
+bool command_playid (volatile sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr);
 
 bool command_queue_list(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX]);
 bool command_queue_find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], long continuation);
 
 /* The playlists */
-bool command_plt_create(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr);
-bool command_plt_remove(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr);
-bool command_plt_clear (sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr);
-bool command_plt_rename(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr);
-bool command_plt_export(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr);
-bool command_plt_import(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr);
-bool command_plt_add   (sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr);
+bool command_plt_create(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr);
+bool command_plt_remove(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr);
+bool command_plt_clear (volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr);
+bool command_plt_rename(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr);
+bool command_plt_export(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr);
+bool command_plt_import(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr);
+bool command_plt_add   (volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr);
 
 /* The help */
 bool command_help(struct lkt_state *srv, size_t c);
@@ -82,8 +82,8 @@ 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, 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, volatile sqlite3 *db, char *argv[LKT_MESSAGE_ARGS_MAX]);
 
 /* Program management control */
 bool command_restart(struct lkt_state *srv, size_t c);
diff --git a/inc/lektor/common.h b/inc/lektor/common.h
index 3495f2519ccaadb965b05807dab896e78c3056c5..ebb7faabb2356896afd2c17fd0c5f8a8b32745e5 100644
--- a/inc/lektor/common.h
+++ b/inc/lektor/common.h
@@ -36,7 +36,7 @@
 #define LKT_MESSAGE_MAX                 2048
 #define LKT_DEFAULT_LIST_SIZE           10
 
-enum mpd_idle_flag {
+typedef volatile enum {
     MPD_IDLE_NONE               = 0,
 
     MPD_IDLE_DATABASE           = ( 1 << 1  ),
@@ -57,7 +57,7 @@ enum mpd_idle_flag {
         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
diff --git a/inc/lektor/config.h b/inc/lektor/config.h
index 618de57c06aacfaf1cb041d704032f1e7dbe7441..323e900ba5c80c9aebe43a449fed2052e33c7bdd 100644
--- a/inc/lektor/config.h
+++ b/inc/lektor/config.h
@@ -50,7 +50,7 @@ static const char *const lkt_default_config_file =
 /* It is just an alias to the consecutive use of config_detect_file and
    config_new function, with the return an '&&' between the two returns of the
    two other functions. */
-int config_open(sqlite3 *db);
+int config_open(volatile sqlite3 *db);
 
 /* Get the path to the config file that may be red, taking into account the
    priority between existing files. The returned path is a path to an existing
@@ -60,9 +60,9 @@ int config_detect_file(char *conf, size_t conf_len);
 /* Create and read the configuration in the conf file and write it into
    lkt_conf. The type is opaque because it's a C++ class.
    Return 0 if the read operation was a success, a non zero value otherwise. */
-int config_new(sqlite3 *db, const char *conf);
+int config_new(volatile sqlite3 *db, const char *conf);
 
 /* Load a module by its name. Also initialize the mod pointer. No check on data
    type is done, it is up to the user to check if the structure passed as a
    `void*` is the right structure. */
-int load_module_by_name(sqlite3 *db, const char *name, void *mod);
+int load_module_by_name(volatile sqlite3 *db, const char *name, void *mod);
diff --git a/inc/lektor/database.h b/inc/lektor/database.h
index f74e2a16332743df3e584b1da30aa229c5bad011..e1bffe157531612952a744378f9b7bff822c5604 100644
--- a/inc/lektor/database.h
+++ b/inc/lektor/database.h
@@ -23,61 +23,61 @@ struct lkt_queue_state {
 };
 
 long database_get_timestamp(volatile sqlite3 *db);
-void database_stamp(volatile sqlite3 *db);
-void database_updated(volatile sqlite3 *db);
+void database_stamp        (volatile sqlite3 *db);
+void database_updated      (volatile sqlite3 *db);
 
 /* Open correctly a database for lektor. */
-bool database_new   (sqlite3 **db);
+bool database_new   (volatile sqlite3 **db);
 bool database_init  (const char *dbpath);
-bool database_open  (sqlite3 *db, const char *dbpath);
-bool database_attach(sqlite3 *db, const char *name, const char *dbpath);
-bool database_detach(sqlite3 *db, const char *name);
+bool database_open  (volatile sqlite3 *db, const char *dbpath);
+bool database_attach(volatile sqlite3 *db, const char *name, const char *dbpath);
+bool database_detach(volatile sqlite3 *db, const char *name);
 
 /* Get information on the queue and currently playing kara. */
-bool database_queue_state       (sqlite3 *db, struct lkt_queue_state *res);
-bool database_queue_current_kara(sqlite3 *db, struct kara_metadata *res, int *id);
+bool database_queue_state       (volatile sqlite3 *db, struct lkt_queue_state *res);
+bool database_queue_current_kara(volatile sqlite3 *db, struct kara_metadata *res, int *id);
 
-bool database_queue_set_paused       (sqlite3 *db, bool paused);
-bool database_queue_set_current_index(sqlite3 *db, int idx);
-bool database_queue_get_current_file (sqlite3 *db, char filepath[PATH_MAX]);
+bool database_queue_set_paused       (volatile sqlite3 *db, bool paused);
+bool database_queue_set_current_index(volatile sqlite3 *db, int idx);
+bool database_queue_get_current_file (volatile sqlite3 *db, char filepath[PATH_MAX]);
 
 /* Mpv and database synchronisation. */
-bool database_sync_mpv_state(sqlite3 *db, mpv_handle **mpv);
+bool database_sync_mpv_state(volatile sqlite3 *db, mpv_handle **mpv);
 
 /* Update the database. */
-bool database_update(volatile sqlite3 *db, const char *kara_dir);
-bool database_update_add(volatile sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail);
+bool database_update              (volatile sqlite3 *db, const char *kara_dir);
+bool database_update_add          (volatile sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail);
 bool database_update_set_available(volatile sqlite3 *db, uint64_t id);
 
 /* Control the content of the queue. */
-bool database_queue_add_id      (sqlite3 *db, int id,               int priority);
-bool database_queue_add_query   (sqlite3 *db, const char *query,    int priority);
-bool database_queue_add_author  (sqlite3 *db, const char *author,   int priority);
-bool database_queue_add_language(sqlite3 *db, const char *author,   int priority);
-bool database_queue_add_category(sqlite3 *db, const char *author,   int priority);
-bool database_queue_add_type    (sqlite3 *db, const char *author,   int priority);
-bool database_queue_add_plt     (sqlite3 *db, const char *plt_name, int priority);
-
-bool database_queue_insert_query   (sqlite3 *db, const char *query, int pos);
-bool database_queue_insert_id      (sqlite3 *db, int id);
-bool database_queue_insert_author  (sqlite3 *db, const char *author);
-bool database_queue_insert_language(sqlite3 *db, const char *author);
-bool database_queue_insert_category(sqlite3 *db, const char *author);
-bool database_queue_insert_type    (sqlite3 *db, const char *author);
-bool database_queue_insert_plt     (sqlite3 *db, const char *plt_name);
-
-bool database_queue_del_id (sqlite3 *db, int id);
-bool database_queue_del_pos(sqlite3 *db, int pos);
-bool database_queue_clear  (sqlite3 *db);
-bool database_queue_crop   (sqlite3 *db);
-bool database_queue_move   (sqlite3 *db, int from, int to);
-bool database_queue_shuffle(sqlite3 *db);
-bool database_queue_seekid (sqlite3 *db, int id, int *out_pos);
+bool database_queue_add_id      (volatile sqlite3 *db, int id,               int priority);
+bool database_queue_add_query   (volatile sqlite3 *db, const char *query,    int priority);
+bool database_queue_add_author  (volatile sqlite3 *db, const char *author,   int priority);
+bool database_queue_add_language(volatile sqlite3 *db, const char *author,   int priority);
+bool database_queue_add_category(volatile sqlite3 *db, const char *author,   int priority);
+bool database_queue_add_type    (volatile sqlite3 *db, const char *author,   int priority);
+bool database_queue_add_plt     (volatile sqlite3 *db, const char *plt_name, int priority);
+
+bool database_queue_insert_query   (volatile sqlite3 *db, const char *query, int pos);
+bool database_queue_insert_id      (volatile sqlite3 *db, int id);
+bool database_queue_insert_author  (volatile sqlite3 *db, const char *author);
+bool database_queue_insert_language(volatile sqlite3 *db, const char *author);
+bool database_queue_insert_category(volatile sqlite3 *db, const char *author);
+bool database_queue_insert_type    (volatile sqlite3 *db, const char *author);
+bool database_queue_insert_plt     (volatile sqlite3 *db, const char *plt_name);
+
+bool database_queue_del_id (volatile sqlite3 *db, int id);
+bool database_queue_del_pos(volatile sqlite3 *db, int pos);
+bool database_queue_clear  (volatile sqlite3 *db);
+bool database_queue_crop   (volatile sqlite3 *db);
+bool database_queue_move   (volatile sqlite3 *db, int from, int to);
+bool database_queue_shuffle(volatile sqlite3 *db);
+bool database_queue_seekid (volatile sqlite3 *db, int id, int *out_pos);
 
 /* Control the playing state of the queue. */
-bool database_queue_toggle_pause(sqlite3 *db);
-bool database_queue_play        (sqlite3 *db, int pos);
-bool database_queue_stop        (sqlite3 *db);
+bool database_queue_toggle_pause(volatile sqlite3 *db);
+bool database_queue_play        (volatile sqlite3 *db, int pos);
+bool database_queue_stop        (volatile sqlite3 *db);
 
 /* A search callback to be called after each matched row */
 struct lkt_callback {
@@ -88,11 +88,11 @@ struct lkt_callback {
 };
 
 /* List the content of the queue */
-bool database_queue_list(sqlite3 *db, size_t from, size_t to, struct lkt_callback *callback);
+bool database_queue_list(volatile sqlite3 *db, size_t from, size_t to, struct lkt_callback *callback);
 
 /* Search the database */
 struct lkt_search {
-    sqlite3 *db;
+    volatile sqlite3 *db;
     sqlite3_stmt *stmt;
     enum lkt_search_type {
         lkt_search_database,
@@ -109,24 +109,24 @@ struct lkt_search {
 typedef bool (*lkt_search_database_func)(struct lkt_state *srv, size_t c, int id, int id_len,
         const char *row);
 
-bool database_search_database_init(sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret);
-bool database_search_queue_init   (sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret);
+bool database_search_database_init(volatile sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret);
+bool database_search_queue_init   (volatile sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret);
 bool database_search_iter(struct lkt_search *item);
 
 /* Next and prev operation on the queue. */
-bool database_queue_next(sqlite3 *db, char filepath[PATH_MAX]);
-bool database_queue_prev(sqlite3 *db, char filepath[PATH_MAX]);
+bool database_queue_next(volatile sqlite3 *db, char filepath[PATH_MAX]);
+bool database_queue_prev(volatile sqlite3 *db, char filepath[PATH_MAX]);
 
 /* Set a value in the config table */
-bool database_config_set     (sqlite3 *db, const char *section, const char *key, const char *value);
-bool database_config_get_text(sqlite3 *db, const char *section, const char *key, char *value, size_t len);
-bool database_config_get_int (sqlite3 *db, const char *section, const char *key, int *value);
-bool database_config_exists  (sqlite3 *db, const char *section, const char *key);
-bool database_config_queue   (sqlite3 *db, const char *option,  int value);
-bool database_config_queue_default(sqlite3 *db);
+bool database_config_set     (volatile sqlite3 *db, const char *section, const char *key, const char *value);
+bool database_config_get_text(volatile sqlite3 *db, const char *section, const char *key, char *value, size_t len);
+bool database_config_get_int (volatile sqlite3 *db, const char *section, const char *key, int *value);
+bool database_config_exists  (volatile sqlite3 *db, const char *section, const char *key);
+bool database_config_queue   (volatile sqlite3 *db, const char *option,  int value);
+bool database_config_queue_default(volatile sqlite3 *db);
 
 /* Get a value from the config table */
-bool database_get_config(sqlite3 *db, const char *option, int *value);
+bool database_get_config(volatile sqlite3 *db, const char *option, int *value);
 
 /* Playlists */
 struct lkt_playlist_metadata {
@@ -136,20 +136,20 @@ struct lkt_playlist_metadata {
 };
 
 /* Control playlists */
-bool database_plt_create    (sqlite3 *db, const char *name);
-bool database_plt_remove    (sqlite3 *db, const char *name);
-bool database_plt_remove_pos(sqlite3 *db, const char *name, int pos);
-bool database_plt_clear     (sqlite3 *db, const char *name);
-bool database_plt_rename    (sqlite3 *db, const char *old_name, const char *new_name);
+bool database_plt_create    (volatile sqlite3 *db, const char *name);
+bool database_plt_remove    (volatile sqlite3 *db, const char *name);
+bool database_plt_remove_pos(volatile sqlite3 *db, const char *name, int pos);
+bool database_plt_clear     (volatile sqlite3 *db, const char *name);
+bool database_plt_rename    (volatile sqlite3 *db, const char *old_name, const char *new_name);
 
-bool database_plt_export(sqlite3 *db, const char *name);
-bool database_plt_import(sqlite3 *db, const char *name);
+bool database_plt_export(volatile sqlite3 *db, const char *name);
+bool database_plt_import(volatile sqlite3 *db, const char *name);
 
-bool database_plt_add_uri(sqlite3 *db, const char *name, struct lkt_uri *uri);
+bool database_plt_add_uri(volatile sqlite3 *db, const char *name, struct lkt_uri *uri);
 
 /* User control, yeah, MPD authentification sucks. */
-bool database_user_authentificate(sqlite3 *db, const char *password);
-bool database_user_add(sqlite3 *db, const char *username, const char *password);
+bool database_user_authentificate(volatile sqlite3 *db, const char *password);
+bool database_user_add(volatile sqlite3 *db, const char *username, const char *password);
 
 /* Stickers manipulations. */
 struct sticker_callback {
@@ -160,9 +160,9 @@ struct sticker_callback {
     bool (*call)(void *args, const char *sticker, const char *type, int uri, int value);
 };
 
-bool database_sticker_create        (sqlite3 *db, const char *name);
-bool database_sticker_delete        (sqlite3 *db, const char *name);
-bool database_sticker_delete_specify(sqlite3 *sb, const char *type, int uri, const char *name);
-bool database_sticker_list          (sqlite3 *db, const char *type, struct sticker_callback *call);
-bool database_sticker_set           (sqlite3 *db, const char *type, const char *name, int uri, int value);
-bool database_sticker_get           (sqlite3 *db, const char *type, const char *name, int uri, struct sticker_callback *call);
+bool database_sticker_create        (volatile sqlite3 *db, const char *name);
+bool database_sticker_delete        (volatile sqlite3 *db, const char *name);
+bool database_sticker_delete_specify(volatile sqlite3 *sb, const char *type, int uri, const char *name);
+bool database_sticker_list          (volatile sqlite3 *db, const char *type, struct sticker_callback *call);
+bool database_sticker_set           (volatile sqlite3 *db, const char *type, const char *name, int uri, int value);
+bool database_sticker_get           (volatile sqlite3 *db, const char *type, const char *name, int uri, struct sticker_callback *call);
diff --git a/inc/lektor/module/module_sdl2.h b/inc/lektor/module/module_sdl2.h
index 90eacc578aa4d769643c33c59e9eff5ff847fd22..5d63ef14c6be730455829b99d3ef23444b4317c2 100644
--- a/inc/lektor/module/module_sdl2.h
+++ b/inc/lektor/module/module_sdl2.h
@@ -24,4 +24,4 @@ bool module_sdl2_set_volume(struct lkt_win *const win, int vol);
 bool module_sdl2_get_duration(struct lkt_win *const win, int *dur_sec);
 bool module_sdl2_get_elapsed(struct lkt_win *const win, int *elapsed_sec);
 
-bool module_sdl2_handle_events(struct lkt_win *const win, sqlite3 *db, enum mpd_idle_flag *mpd_idle_events);
+bool module_sdl2_handle_events(struct lkt_win *const win, volatile sqlite3 *db, mpd_idle_flag *mpd_idle_events);
diff --git a/inc/lektor/module/module_x11.h b/inc/lektor/module/module_x11.h
index 0ea84737be6fed8b92296da2d9dc3b46483ed552..8d4dcb57eadc33ad4c5cd071583d639fe6f66774 100644
--- a/inc/lektor/module/module_x11.h
+++ b/inc/lektor/module/module_x11.h
@@ -24,4 +24,4 @@ bool module_x11_set_volume(struct lkt_win *const win, int vol);
 bool module_x11_get_duration(struct lkt_win *const win, int *dur_sec);
 bool module_x11_get_elapsed(struct lkt_win *const win, int *elapsed_sec);
 
-bool module_x11_handle_events(struct lkt_win *const win, sqlite3 *db, enum mpd_idle_flag *mpd_idle_events);
+bool module_x11_handle_events(struct lkt_win *const win, volatile sqlite3 *db, mpd_idle_flag *mpd_idle_events);
diff --git a/inc/lektor/module/mpv.h b/inc/lektor/module/mpv.h
index ce9c63e64d5ec03fc5fdb4ad9f00dcb3366b69de..a05fdaf900d5e2ad7a42de29dfaa929551fe7f87 100644
--- a/inc/lektor/module/mpv.h
+++ b/inc/lektor/module/mpv.h
@@ -3,6 +3,7 @@
 #include <sqlite3.h>
 #include <mpv/client.h>
 #include <lektor/net.h>
+#include <lektor/common.h>
 
 void lmpv_free(mpv_handle **ctx);
 mpv_handle *lmpv_new(unsigned long int wid);
@@ -12,5 +13,5 @@ mpv_handle *lmpv_prepare(void);
 int lmpv_set_volume(mpv_handle *ctx, int vol);
 int lmpv_load_file(mpv_handle *ctx, const char *file);
 int lmpv_toggle_pause(mpv_handle *ctx);
-int lmpv_handle(struct lkt_win *win, mpv_handle *ctx, sqlite3 *db, enum mpd_idle_flag *mpd_idle_flag,
-                int *time_pos, int *time_duration);
+int lmpv_handle(struct lkt_win *win, mpv_handle *ctx, volatile sqlite3 *db, mpd_idle_flag *mpd_idle_flag,
+                volatile int *time_pos, volatile int *time_duration);
diff --git a/inc/lektor/net.h b/inc/lektor/net.h
index f6a7f4afc8349ccb53c491ee70d69697a7ffbe8c..fa721922d37e843e5d50cb0c82554779421a5950 100644
--- a/inc/lektor/net.h
+++ b/inc/lektor/net.h
@@ -73,7 +73,7 @@ struct lkt_state {
 
     struct lkt_repo repo;
 
-    volatile enum mpd_idle_flag mpd_idle_events;
+    mpd_idle_flag mpd_idle_events;
 
     struct lkt_win win;
 };
@@ -89,7 +89,7 @@ void lkt_set_continuation(struct lkt_state *srv, size_t c, int i);
 
 /* Get the mask to watch for events for a given client, to be used with the `idle` command.
  * Return a pointer to the client's mask */
-enum mpd_idle_flag *lkt_client_get_mask(struct lkt_state *srv, size_t c);
+mpd_idle_flag *lkt_client_get_mask(struct lkt_state *srv, size_t c);
 
 /* Register a client as authentificated. */
 bool lkt_client_auth(struct lkt_state *srv, size_t c, bool set_auth);
diff --git a/inc/lektor/window.h b/inc/lektor/window.h
index 624c05c8284414c2f9b00e2c9ce570d7a9a4b281..ab5f43b8b7e453874f393558029a0a6eb60e69fd 100644
--- a/inc/lektor/window.h
+++ b/inc/lektor/window.h
@@ -30,7 +30,7 @@ struct lkt_win {
     bool (*get_elapsed)(struct lkt_win *win, int *elapsed_sec);
 
     /* Handle loop event */
-    bool (*handle_events)(struct lkt_win *win, sqlite3 *db, enum mpd_idle_flag *mpd_idle_events);
+    bool (*handle_events)(struct lkt_win *win, volatile sqlite3 *db, mpd_idle_flag *mpd_idle_events);
 };
 
 enum lkt_win_type {
diff --git a/src/commands.c b/src/commands.c
index 890c26d318cdbf69c6e1600c1426c2baa6b67030..cc53c0c4a97f77739c24b2d270c2a7c276f1cf6b 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -94,7 +94,7 @@ command_currentsong(struct lkt_state *srv, size_t c)
 
     memset(&kara, 0, sizeof(struct kara_metadata));
 
-    if (!database_queue_current_kara((sqlite3 *) srv->db, &kara, NULL))
+    if (!database_queue_current_kara(srv->db, &kara, NULL))
         LOG_ERROR_SCT("COMMAND", "%s", "Failed to get information about the current kara");
 
     out = lkt_message_new();
@@ -124,8 +124,8 @@ command_status(struct lkt_state *srv, size_t c)
 
     RETURN_UNLESS(srv, "Invalid argument", false);
     win = &srv->win;
-    RETURN_UNLESS(database_queue_state((sqlite3 *) srv->db, &queue_state), "Can't determine playback status", false);
-    database_queue_current_kara((sqlite3 *) srv->db, NULL, &songid);
+    RETURN_UNLESS(database_queue_state(srv->db, &queue_state), "Can't determine playback status", false);
+    database_queue_current_kara(srv->db, NULL, &songid);
     win->get_elapsed(win, &elapsed);
     win->get_duration(win, &duration);
 
@@ -154,7 +154,7 @@ command_status(struct lkt_state *srv, size_t c)
 }
 
 bool
-command_next(sqlite3 *db, struct lkt_win *win, enum mpd_idle_flag *watch_mask_ptr)
+command_next(volatile sqlite3 *db, struct lkt_win *win, mpd_idle_flag *watch_mask_ptr)
 {
     *watch_mask_ptr |= MPD_IDLE_PLAYER;
     char filepath[PATH_MAX];
@@ -162,14 +162,14 @@ command_next(sqlite3 *db, struct lkt_win *win, enum mpd_idle_flag *watch_mask_pt
 }
 
 bool
-command_pause(sqlite3 *db, struct lkt_win *win, enum mpd_idle_flag *watch_mask_ptr)
+command_pause(volatile sqlite3 *db, struct lkt_win *win, mpd_idle_flag *watch_mask_ptr)
 {
     *watch_mask_ptr |= MPD_IDLE_PLAYER;
     return database_queue_toggle_pause(db) && win->toggle_pause(win);
 }
 
 bool
-command_previous(sqlite3 *db, struct lkt_win *win, enum mpd_idle_flag *watch_mask_ptr)
+command_previous(volatile sqlite3 *db, struct lkt_win *win, mpd_idle_flag *watch_mask_ptr)
 {
     *watch_mask_ptr |= MPD_IDLE_PLAYER;
     char filepath[PATH_MAX];
@@ -177,7 +177,7 @@ command_previous(sqlite3 *db, struct lkt_win *win, enum mpd_idle_flag *watch_mas
 }
 
 static inline bool
-__play_that_file(sqlite3 *db, struct lkt_win *win, int pos)
+__play_that_file(volatile sqlite3 *db, struct lkt_win *win, int pos)
 {
     char filepath[PATH_MAX];
     RETURN_UNLESS(pos, "Invalid argument", false);
@@ -188,8 +188,7 @@ __play_that_file(sqlite3 *db, struct lkt_win *win, int pos)
 }
 
 bool
-command_play(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX],
-             enum mpd_idle_flag *watch_mask_ptr)
+command_play(volatile sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     *watch_mask_ptr |= MPD_IDLE_PLAYER;
     char *endptr;
@@ -210,8 +209,7 @@ command_play(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX],
 }
 
 bool
-command_playid(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX],
-               enum mpd_idle_flag *watch_mask_ptr)
+command_playid(volatile sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     *watch_mask_ptr |= MPD_IDLE_PLAYER;
     char *endptr;
@@ -236,7 +234,7 @@ command_playid(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX
 
 
 bool
-command_stop(sqlite3 *db, struct lkt_win *win, enum mpd_idle_flag *watch_mask_ptr)
+command_stop(volatile sqlite3 *db, struct lkt_win *win, mpd_idle_flag *watch_mask_ptr)
 {
     RETURN_UNLESS(database_queue_stop(db), "DB error", false);
     win->close(win);
@@ -245,8 +243,7 @@ command_stop(sqlite3 *db, struct lkt_win *win, enum mpd_idle_flag *watch_mask_pt
 }
 
 bool
-command_add(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX],
-            enum mpd_idle_flag *watch_mask_ptr)
+command_add(volatile sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     RETURN_UNLESS(args, "Invalid argument", false);
     *watch_mask_ptr |= MPD_IDLE_PLAYLIST;
@@ -289,8 +286,7 @@ command_add(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX],
 }
 
 bool
-command_addid(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX],
-              enum mpd_idle_flag *watch_mask_ptr)
+command_addid(volatile sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     UNUSED(win);
     long id;
@@ -309,21 +305,21 @@ command_addid(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX]
 }
 
 inline bool
-command_clear(sqlite3 *db, enum mpd_idle_flag *watch_mask_ptr)
+command_clear(volatile sqlite3 *db, mpd_idle_flag *watch_mask_ptr)
 {
     *watch_mask_ptr |= MPD_IDLE_PLAYLIST;
     return database_queue_clear(db);
 }
 
 inline bool
-command_crop(sqlite3 *db, enum mpd_idle_flag *watch_mask_ptr)
+command_crop(volatile sqlite3 *db, mpd_idle_flag *watch_mask_ptr)
 {
     *watch_mask_ptr |= MPD_IDLE_PLAYLIST;
     return database_queue_crop(db);
 }
 
 bool
-command_delid(sqlite3 *db, struct lkt_win *win, char *id_str, enum mpd_idle_flag *watch_mask_ptr)
+command_delid(volatile sqlite3 *db, struct lkt_win *win, char *id_str, mpd_idle_flag *watch_mask_ptr)
 {
     UNUSED(win);
     long id;
@@ -346,7 +342,7 @@ command_delid(sqlite3 *db, struct lkt_win *win, char *id_str, enum mpd_idle_flag
 }
 
 bool
-command_move(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr)
+command_move(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     long from, to;
     char *endptr;
@@ -387,7 +383,7 @@ command_help(struct lkt_state *srv, size_t c)
 bool
 command_idle(struct lkt_state *srv, size_t c, struct lkt_command *cmd)
 {
-    enum mpd_idle_flag *clt_mask = lkt_client_get_mask(srv, c);
+    mpd_idle_flag *clt_mask = lkt_client_get_mask(srv, c);
     bool once = false;
 
     for (size_t i = 0; cmd->args[i]; ++i) {
@@ -432,7 +428,7 @@ command_idle(struct lkt_state *srv, size_t c, struct lkt_command *cmd)
 inline bool
 command_noidle(struct lkt_state *srv, size_t c)
 {
-    enum mpd_idle_flag *clt_mask = lkt_client_get_mask(srv, c);
+    mpd_idle_flag *clt_mask = lkt_client_get_mask(srv, c);
     *clt_mask = MPD_IDLE_NONE;
     return true;
 }
@@ -470,12 +466,12 @@ static bool
 lkt_callback_insert_v1(struct lkt_state *srv, size_t c, int id, int id_len, const char *sql_row)
 {
     UNUSED(sql_row, id_len, c);
-    return database_queue_add_id((sqlite3 *) srv->db, id, 5);
+    return database_queue_add_id(srv->db, id, 5);
 }
 
 static bool
 __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], long continuation,
-       enum lkt_find_action action, bool(*init)(sqlite3 *, char *, char *, struct lkt_search *))
+       enum lkt_find_action action, bool(*init)(volatile sqlite3 *, char *, char *, struct lkt_search *))
 {
     char rgx[PATH_MAX], *col_name, *mpd_tag;
     int count;
@@ -547,7 +543,7 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo
 
     /* Make the search langand do the right action */
 
-    RETURN_UNLESS(init((sqlite3 *) srv->db, col_name, rgx, &search), "Failed to init search", false);
+    RETURN_UNLESS(init(srv->db, col_name, rgx, &search), "Failed to init search", false);
 
     for (count = 0; database_search_iter(&search); ++count)
         continue;
@@ -599,19 +595,19 @@ command_set_playback_option(struct lkt_state *srv, size_t c, enum lkt_playback_o
 
     switch (opt) {
     case lkt_playback_option_random:
-        ret = database_config_queue((sqlite3 *) srv->db, "random", val);
+        ret = database_config_queue(srv->db, "random", val);
         break;
     case lkt_playback_option_single:
-        ret = database_config_queue((sqlite3 *) srv->db, "single", val);
+        ret = database_config_queue(srv->db, "single", val);
         break;
     case lkt_playback_option_consume:
-        ret = database_config_queue((sqlite3 *) srv->db, "consume", val);
+        ret = database_config_queue(srv->db, "consume", val);
         break;
     case lkt_playback_option_repeat:
-        ret = database_config_queue((sqlite3 *) srv->db, "repeat", val);
+        ret = database_config_queue(srv->db, "repeat", val);
         break;
     case lkt_playback_option_volume:
-        ret = database_config_queue((sqlite3 *) srv->db, "volume", val);
+        ret = database_config_queue(srv->db, "volume", val);
         LOG_INFO_SCT("COMMAND", "Set volume to %ld", val);
         ret &= win->set_volume(win, val);
         srv->mpd_idle_events |= MPD_IDLE_MIXER;
@@ -628,17 +624,17 @@ command_set_playback_option(struct lkt_state *srv, size_t c, enum lkt_playback_o
 }
 
 bool
-command_set_pos(sqlite3 *db, struct lkt_win *win, enum mpd_idle_flag *watch_mask_ptr, int index)
+command_set_pos(volatile sqlite3 *db, struct lkt_win *win, mpd_idle_flag *watch_mask_ptr, int index)
 {
     char filepath[PATH_MAX];
     *watch_mask_ptr |= MPD_IDLE_PLAYER;
-    RETURN_UNLESS(database_queue_set_current_index((sqlite3 *)db, index), "Failed to set position in queue", false);
-    RETURN_UNLESS(database_queue_get_current_file((sqlite3 *)db, filepath), "Failed to get filename", false);
+    RETURN_UNLESS(database_queue_set_current_index(db, index), "Failed to set position in queue", false);
+    RETURN_UNLESS(database_queue_get_current_file(db, filepath), "Failed to get filename", false);
     return win->load_file(win, filepath);
 }
 
 bool
-command_plt_add(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr)
+command_plt_add(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     RETURN_UNLESS(args && args[0], "Invalid argument", false);
 
@@ -671,7 +667,7 @@ end_plt_add_uri:
 }
 
 bool
-command_plt_remove(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr)
+command_plt_remove(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     char *endptr;
     long pos;
@@ -693,7 +689,7 @@ command_plt_remove(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_
 }
 
 bool
-command_plt_clear(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr)
+command_plt_clear(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     RETURN_UNLESS(args && args[0], "Invalid argument", false);
     RETURN_UNLESS(database_plt_clear(db, args[0]), "Failed to clear playlist", false);
@@ -702,7 +698,7 @@ command_plt_clear(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_f
 }
 
 bool
-command_plt_rename(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr)
+command_plt_rename(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     RETURN_UNLESS(args && args[0] && args[1], "Invalid argument", false);
     RETURN_UNLESS(database_plt_rename(db, args[0], args[1]), "Failed to rename playlist", false);
@@ -711,7 +707,7 @@ command_plt_rename(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_
 }
 
 bool
-command_plt_export(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr)
+command_plt_export(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     RETURN_UNLESS(args && args[0] && args[1], "Invalid argument", false);
     RETURN_UNLESS(database_attach(db, args[0], args[1]), "Failed to attach database", false);
@@ -723,7 +719,7 @@ command_plt_export(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_
 }
 
 bool
-command_plt_import(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr)
+command_plt_import(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     RETURN_UNLESS(args && args[0] && args[1], "Invalid argument", false);
     RETURN_UNLESS(database_attach(db, args[0], args[1]), "Failed to attach database", false);
@@ -735,7 +731,7 @@ command_plt_import(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_
 }
 
 bool
-command_plt_add_uri(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr)
+command_plt_add_uri(volatile sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], mpd_idle_flag *watch_mask_ptr)
 {
     RETURN_UNLESS(args && args[0] && args[1], "Invalid argument", false);
     struct lkt_uri uri;
@@ -748,7 +744,7 @@ command_plt_add_uri(sqlite3 *db, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle
 }
 
 bool
-command_shuffle(sqlite3 *db, enum mpd_idle_flag *watch_mask_ptr)
+command_shuffle(volatile sqlite3 *db, mpd_idle_flag *watch_mask_ptr)
 {
     RETURN_UNLESS(database_queue_shuffle(db), "Failed to shuffle", false);
     *watch_mask_ptr |= MPD_IDLE_PLAYER;
@@ -809,17 +805,17 @@ command_queue_list(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_
     /* The command is used in its relative forme, display elements from the
        current one. */
 only_one:
-    return database_queue_list((sqlite3 *) srv->db, from, from, &callback);
+    return database_queue_list(srv->db, from, from, &callback);
 
     /* The command is used with a range specifier. */
 is_a_range:
     if (to - from + 1 < lkt_remaining_msg(srv, c) - 2) {
         lkt_set_continuation(srv, c, 0);
-        return database_queue_list((sqlite3 *) srv->db, from, to, &callback);
+        return database_queue_list(srv->db, from, to, &callback);
     } else {
         to = from + lkt_remaining_msg(srv, c) - 3;
         lkt_set_continuation(srv, c, to + 1);
-        return database_queue_list((sqlite3 *) srv->db, from, to, &callback);
+        return database_queue_list(srv->db, from, to, &callback);
     }
 }
 
@@ -827,13 +823,13 @@ bool
 command_password(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX])
 {
     RETURN_UNLESS(argv[0], "Invalid argument", false);
-    RETURN_UNLESS(database_user_authentificate((sqlite3 *) srv->db, argv[0]), "Failed to authentificate user", false);
+    RETURN_UNLESS(database_user_authentificate(srv->db, argv[0]), "Failed to authentificate user", false);
     lkt_client_auth(srv, c, true);
     return true;
 }
 
 bool
-command_user_add(struct lkt_state *srv, size_t c, sqlite3 *db, char *argv[LKT_MESSAGE_ARGS_MAX])
+command_user_add(struct lkt_state *srv, size_t c, volatile sqlite3 *db, 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);
@@ -933,7 +929,7 @@ command_sticker_get(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS
         .c = c,
         .call = sticker_send_one_value,
     };
-    RETURN_UNLESS(database_sticker_get((sqlite3 *) srv->db, argv[0], argv[2], uri, &cb), "Failed to get sticker",
+    RETURN_UNLESS(database_sticker_get(srv->db, argv[0], argv[2], uri, &cb), "Failed to get sticker",
                   false);
     return true;
 }
@@ -945,7 +941,7 @@ command_sticker_set(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS
     RETURN_UNLESS(argv[0] && argv[1] && argv[2] && argv[3] && !argv[4], "Invalid argument", false);
     int uri = atoi(argv[1]);    /* FIXME: Use strtol. */
     int value = atoi(argv[4]);  /* FIXME: Use strtol. */
-    RETURN_UNLESS(database_sticker_set((sqlite3 *) srv->db, argv[0], argv[2], uri, value), "Failed to get sticker", false);
+    RETURN_UNLESS(database_sticker_set(srv->db, argv[0], argv[2], uri, value), "Failed to get sticker", false);
     srv->mpd_idle_events |= MPD_IDLE_STICKER;
     return true;
 }
@@ -982,18 +978,18 @@ command_sticker_list(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARG
 
 just_list_all:
     callback.call = sticker_send_all;
-    return database_sticker_list((sqlite3 *) srv->db, argv[0], &callback);
+    return database_sticker_list(srv->db, argv[0], &callback);
 
 simple_list_command:
     callback.uri  = atoi(argv[1]);   /* FIXME: Use strtol. */
     callback.call = sticker_send_check_uri;
-    return database_sticker_list((sqlite3 *) srv->db, argv[0], &callback);
+    return database_sticker_list(srv->db, argv[0], &callback);
 
 list_stickers_in_uri:
     callback.uri  = atoi(argv[1]);  /* FIXME: Use strtol. */
     callback.name = argv[2];
     callback.call = sticker_send_value_check_uri_name;
-    return database_sticker_list((sqlite3 *) srv->db, argv[0], &callback);
+    return database_sticker_list(srv->db, argv[0], &callback);
     return false;
 
 list_stickers_check_value:
@@ -1003,13 +999,13 @@ list_stickers_check_value:
     switch (argv[3][0]) {
     case '=':
         callback.call = sticker_check_is_present_eq;
-        return database_sticker_list((sqlite3 *) srv->db, argv[0], &callback);
+        return database_sticker_list(srv->db, argv[0], &callback);
     case '<':
         callback.call = sticker_check_is_present_lt;
-        return database_sticker_list((sqlite3 *) srv->db, argv[0], &callback);
+        return database_sticker_list(srv->db, argv[0], &callback);
     case '>':
         callback.call = sticker_check_is_present_gt;
-        return database_sticker_list((sqlite3 *) srv->db, argv[0], &callback);
+        return database_sticker_list(srv->db, argv[0], &callback);
     default:
         return 0;
     }
@@ -1026,5 +1022,5 @@ command_sticker_delete(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_A
     RETURN_UNLESS(argv[0] && argv[1], "Invalid argument", false);
     int uri = atoi(argv[1]);
     srv->mpd_idle_events |= MPD_IDLE_STICKER;
-    return database_sticker_delete_specify((sqlite3 *) srv->db, argv[0], uri, argv[2]);
+    return database_sticker_delete_specify(srv->db, argv[0], uri, argv[2]);
 }
diff --git a/src/config.c b/src/config.c
index 7f1b3ada29f604d5212325d8e3343933aefe045b..e9348887180bb8790c50fc7664f06de2dd608e80 100644
--- a/src/config.c
+++ b/src/config.c
@@ -44,7 +44,7 @@ load_so(const char *const mod_path, const char *const mod_init, void *mod)
 }
 
 inline int
-load_module_by_name(sqlite3 *db, const char *name, void *mod)
+load_module_by_name(volatile sqlite3 *db, const char *name, void *mod)
 {
     char mod_path[PATH_MAX], mod_load[INI_MAX_LINE];
 
@@ -58,7 +58,7 @@ load_module_by_name(sqlite3 *db, const char *name, void *mod)
 }
 
 inline static int
-validate_conf(sqlite3 *db)
+validate_conf(volatile sqlite3 *db)
 {
 #define CHK_OPTION(section, name)                                       \
     if (!database_config_exists(db, section, name)) {                   \
@@ -164,9 +164,9 @@ found:
 }
 
 int
-config_new(sqlite3 *db, const char *conf)
+config_new(volatile sqlite3 *db, const char *conf)
 {
-    if (ini_parse(conf, handler, db)) {
+    if (ini_parse(conf, handler, (void *) db)) {
         LOG_ERROR("Failed to parse file %s", conf);
         return 1;
     }
@@ -180,7 +180,7 @@ config_new(sqlite3 *db, const char *conf)
 }
 
 int
-config_open(sqlite3 *db)
+config_open(volatile sqlite3 *db)
 {
     char conf_file[PATH_MAX];
     int ret = 1;
diff --git a/src/database/config.c b/src/database/config.c
index 60c59427d60ebee07a688a36882d9f37cfb6c279..c2802ffdc9ae32a7d2179d26c27013c3ebc11ab5 100644
--- a/src/database/config.c
+++ b/src/database/config.c
@@ -8,7 +8,7 @@
 #include <string.h>
 
 bool
-database_config_set(sqlite3 *db, const char *section, const char *key, const char *value)
+database_config_set(volatile sqlite3 *db, const char *section, const char *key, const char *value)
 {
     static const char *SQL_STMT =
         "INSERT OR REPLACE INTO"
@@ -26,7 +26,7 @@ database_config_set(sqlite3 *db, const char *section, const char *key, const cha
     code = sqlite3_step(stmt);
 
     if (code != SQLITE_OK && code != SQLITE_DONE) {
-        LOG_ERROR_SCT("DB", "Failed to insert or replace: %s", sqlite3_errmsg(db));
+        LOG_ERROR_SCT("DB", "Failed to insert or replace: %s", sqlite3_errmsg((sqlite3 *) db));
         goto error;
     }
 
@@ -37,7 +37,7 @@ error:
 }
 
 bool
-database_config_get_text(sqlite3 *db, const char *section, const char *key, char *value, size_t len)
+database_config_get_text(volatile sqlite3 *db, const char *section, const char *key, char *value, size_t len)
 {
     static const char *SQL_STMT =
         "SELECT value"
@@ -62,7 +62,7 @@ error:
 }
 
 bool
-database_config_exists(sqlite3 *db, const char *section, const char *key)
+database_config_exists(volatile sqlite3 *db, const char *section, const char *key)
 {
     static const char *SQL_STMT =
         "SELECT value"
@@ -83,7 +83,7 @@ error:
 }
 
 bool
-database_config_get_int(sqlite3 *db, const char *section, const char *key, int *value)
+database_config_get_int(volatile sqlite3 *db, const char *section, const char *key, int *value)
 {
     static const char *SQL_STMT =
         "SELECT CAST(value AS INTEGER)"
@@ -106,7 +106,7 @@ error:
 }
 
 bool
-database_config_queue(sqlite3 *db, const char *option, int value)
+database_config_queue(volatile sqlite3 *db, const char *option, int value)
 {
     static const char *SQL_STMT_TMP = "UPDATE queue_state SET %s = ? WHERE id = 42;";
     char SQL_STMT[LKT_MAX_SQLITE_STATEMENT];
@@ -136,7 +136,7 @@ error:
 }
 
 bool
-database_config_queue_default(sqlite3 *db)
+database_config_queue_default(volatile sqlite3 *db)
 {
     static const char *SQL_DEFAULT =
         "UPDATE queue_state SET"
@@ -155,7 +155,7 @@ error:
 }
 
 bool
-database_get_config(sqlite3 *db, const char *option, int *value)
+database_get_config(volatile sqlite3 *db, const char *option, int *value)
 {
     static const char *SQL_STMT_TMP = "SELECT %s FROM queue_state WHERE id = 42;";
     char SQL_STMT[LKT_MAX_SQLITE_STATEMENT];
diff --git a/src/database/find.c b/src/database/find.c
index e801b631e548c0ed88c097fa3928b848e32cfbc7..ffc4b43706745737dbf21e8289763ac18fdae11c 100644
--- a/src/database/find.c
+++ b/src/database/find.c
@@ -8,7 +8,7 @@
 #include <string.h>
 
 bool
-database_search_database_init(sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret)
+database_search_database_init(volatile sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret)
 {
     RETURN_UNLESS(ret, "Exit because return pointer is NULL", false);
     static const char *SQL_STMT_TEMPLATE =
@@ -34,7 +34,7 @@ error:
 
 
 bool
-database_search_queue_init(sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret)
+database_search_queue_init(volatile sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret)
 {
     RETURN_UNLESS(ret, "Exit because return pointer is NULL", false);
     static const char *SQL_STMT_TEMPLATE =
@@ -89,7 +89,7 @@ database_search_iter(struct lkt_search *item)
     }
 
 error:
-    LOG_ERROR_SCT("DB", "sqlite3_step failed: %s", sqlite3_errmsg(item->db));
+    LOG_ERROR_SCT("DB", "sqlite3_step failed: %s", sqlite3_errmsg((sqlite3 *) item->db));
 error_or_done:
     sqlite3_finalize(item->stmt);
     return false;
diff --git a/src/database/open.c b/src/database/open.c
index 61414c90395852fbf6838cd4428b46f8a7428688..dfc470ee46d78c0fdea3151cc90342f8621e0862 100644
--- a/src/database/open.c
+++ b/src/database/open.c
@@ -54,7 +54,7 @@ is_sql_str_invalid(const char *str)
 }
 
 bool
-database_new(sqlite3 **db)
+database_new(volatile sqlite3 **db)
 {
     static int flags = SQLITE_OPEN_READWRITE    |   /* Open in RW mode              */
                        SQLITE_OPEN_SHAREDCACHE  |   /* hHared cache for databases   */
@@ -63,7 +63,7 @@ database_new(sqlite3 **db)
     RETURN_IF(SQLITE_OK != sqlite3_enable_shared_cache(1), "Failed to enable shared cache", false);
     RETURN_IF(sqlite3_soft_heap_limit64(HEAP_LIMIT_SOFT) < 0, "Failed to set soft heap limit", false);
     RETURN_IF(sqlite3_hard_heap_limit64(HEAP_LIMIT_HARD) < 0, "Failed to set soft heap limit", false);
-    RETURN_IF(SQLITE_OK != sqlite3_open_v2(":memory:", db, flags, NULL), "Failed to open :memory:", false);
+    RETURN_IF(SQLITE_OK != sqlite3_open_v2(":memory:", (sqlite3 **) db, flags, NULL), "Failed to open :memory:", false);
     SQLITE_EXEC(*db, SQL_MEM_SCHEM, err_not_init);
     return true;
 err_not_init:
@@ -72,7 +72,7 @@ err_not_init:
 }
 
 static inline bool
-__attach(sqlite3 *db, const char *name, const char *path)
+__attach(volatile sqlite3 *db, const char *name, const char *path)
 {
     static const char SQL_ATTACH_TEMPLATE[] = "ATTACH '%s' AS '%s';";
     char SQL_ATTACH[LKT_MAX_SQLITE_STATEMENT];
@@ -88,7 +88,7 @@ err_no_attach:
 }
 
 static inline bool
-__detach(sqlite3 *db, const char *name)
+__detach(volatile sqlite3 *db, const char *name)
 {
     static const char SQL_DETACH_TEMPLATE[] = "DETACH '%s';\n";
     char SQL_DETACH[LKT_MAX_SQLITE_STATEMENT];
@@ -104,7 +104,7 @@ err_no_detach:
 }
 
 static inline bool
-__is_attached(sqlite3 *db, const char *name)
+__is_attached(volatile sqlite3 *db, const char *name)
 {
     static const char *SQL_STMT = "SELECT name FROM pragma_database_list WHERE name = ?;\n";
     sqlite3_stmt *stmt = 0;
@@ -120,7 +120,7 @@ error:
 }
 
 bool
-database_open(sqlite3 *db, const char *dbpath)
+database_open(volatile sqlite3 *db, const char *dbpath)
 {
     if (is_sql_str_invalid(dbpath)) {
         LOG_ERROR("The database path '%s' is invalid", dbpath);
@@ -130,7 +130,7 @@ database_open(sqlite3 *db, const char *dbpath)
 }
 
 bool
-database_attach(sqlite3 *db, const char *name, const char *dbpath)
+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 database with the same name", false);
@@ -155,7 +155,7 @@ database_attach(sqlite3 *db, const char *name, const char *dbpath)
 }
 
 bool
-database_detach(sqlite3 *db, const char *name)
+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);
diff --git a/src/database/playlist.c b/src/database/playlist.c
index 086f580bd911e19526e4bb4ad3b248e918995323..0dbb4ac59036762122a1fa11bf38f90e1b430624 100644
--- a/src/database/playlist.c
+++ b/src/database/playlist.c
@@ -11,7 +11,7 @@ extern int
 is_sql_str_invalid(const char *str);
 
 bool
-database_plt_create(sqlite3 *db, const char *name)
+database_plt_create(volatile sqlite3 *db, const char *name)
 {
     static const char *SQL_STMT =
         "INSERT INTO playlist (name, last_update) VALUES (?, strftime('%s', 'now'));";
@@ -27,7 +27,7 @@ error:
 }
 
 bool
-database_plt_remove(sqlite3 *db, const char *name)
+database_plt_remove(volatile sqlite3 *db, const char *name)
 {
     static const char *SQL_STMT = "DELETE FROM playlist WHERE name = ?;";
     sqlite3_stmt *stmt = NULL;
@@ -42,7 +42,7 @@ error:
 }
 
 bool
-database_plt_remove_pos(sqlite3 *db, const char *name, int pos)
+database_plt_remove_pos(volatile sqlite3 *db, const char *name, int pos)
 {
     static const char *SQL_STMT =
         "DELETE FROM kara_playlist "
@@ -60,7 +60,7 @@ error:
 }
 
 bool
-database_plt_clear(sqlite3 *db, const char *name)
+database_plt_clear(volatile sqlite3 *db, const char *name)
 {
     static const char *SQL_STMT =
         "DELETE FROM kara_playlist WHERE playlist_id = (SELECT id FROM playlist WHERE name = ?);";
@@ -76,7 +76,7 @@ error:
 }
 
 bool
-database_plt_rename(sqlite3 *db, const char *old_name, const char *new_name)
+database_plt_rename(volatile sqlite3 *db, const char *old_name, const char *new_name)
 {
     static const char *SQL_STMT = "UPDATE playlist SET name = ? WHERE name = ?;";
     sqlite3_stmt *stmt = NULL;
@@ -92,7 +92,7 @@ error:
 }
 
 bool
-database_plt_export(sqlite3 *db, const char *name)
+database_plt_export(volatile sqlite3 *db, const char *name)
 {
     static const char *SQL_SCHEM =
         "CREATE TABLE IF NOT EXISTS %s.content"
@@ -115,7 +115,7 @@ database_plt_export(sqlite3 *db, const char *name)
     code = sqlite3_step(stmt);
 
     if (code != SQLITE_DONE && code != SQLITE_OK) {
-        LOG_ERROR_SCT("DB", "Failed to create schema: %s", sqlite3_errmsg(db));
+        LOG_ERROR_SCT("DB", "Failed to create schema: %s", sqlite3_errmsg((sqlite3 *) db));
         goto error;
     }
 
@@ -126,7 +126,7 @@ error:
 }
 
 bool
-database_plt_import(sqlite3 *db, const char *name)
+database_plt_import(volatile sqlite3 *db, const char *name)
 {
     static const char *SQL_SCHEM =
         "INSERT OR IGNORE INTO kara_playlist (kara_id, playlist_id)"
@@ -151,7 +151,7 @@ error:
 }
 
 bool
-database_plt_add_uri(sqlite3 *db, const char *name, struct lkt_uri *uri)
+database_plt_add_uri(volatile sqlite3 *db, const char *name, struct lkt_uri *uri)
 {
     static const char *SQL =
         "WITH plt_id(id) AS (SELECT playlist.id AS id FROM playlist WHERE name COLLATE nocase = ?) "
diff --git a/src/database/queue.c b/src/database/queue.c
index 341455f016c363839f23ba996643ef70a84ef045..7adbac37caf29a97d7c426ef2ca4af91bf2c7cc2 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -11,7 +11,7 @@
 extern int is_sql_str_invalid(const char *);
 
 bool
-database_queue_state(sqlite3 *db, struct lkt_queue_state *res)
+database_queue_state(volatile sqlite3 *db, struct lkt_queue_state *res)
 {
     static const char *SQL_STMT =
         "SELECT"
@@ -49,7 +49,7 @@ error:
 }
 
 bool
-database_queue_current_kara(sqlite3 *db, struct kara_metadata *res, int *id)
+database_queue_current_kara(volatile sqlite3 *db, struct kara_metadata *res, int *id)
 {
     static const char *SQL_STMT =
         "SELECT song_name, source_name, category, language, author_name, song_type, song_number, kara_id"
@@ -66,12 +66,12 @@ database_queue_current_kara(sqlite3 *db, struct kara_metadata *res, int *id)
        Most of the time it won't be NULL. */
     if (!res)
         goto no_metadata;
-    strncpy(res->song_name, (const char *) sqlite3_column_text(stmt, 0), LEKTOR_TAG_MAX - 1);
+    strncpy(res->song_name,   (const char *) sqlite3_column_text(stmt, 0), LEKTOR_TAG_MAX - 1);
     strncpy(res->source_name, (const char *) sqlite3_column_text(stmt, 1), LEKTOR_TAG_MAX - 1);
-    strncpy(res->category, (const char *) sqlite3_column_text(stmt, 2), LEKTOR_TAG_MAX - 1);
-    strncpy(res->language, (const char *) sqlite3_column_text(stmt, 3), LEKTOR_TAG_MAX - 1);
+    strncpy(res->category,    (const char *) sqlite3_column_text(stmt, 2), LEKTOR_TAG_MAX - 1);
+    strncpy(res->language,    (const char *) sqlite3_column_text(stmt, 3), LEKTOR_TAG_MAX - 1);
     strncpy(res->author_name, (const char *) sqlite3_column_text(stmt, 4), LEKTOR_TAG_MAX - 1);
-    strncpy(res->song_type, (const char *) sqlite3_column_text(stmt, 5), LEKTOR_TAG_MAX - 1);
+    strncpy(res->song_type,   (const char *) sqlite3_column_text(stmt, 5), LEKTOR_TAG_MAX - 1);
     res->song_number = sqlite3_column_int(stmt, 6);
 no_metadata:
     /* Most of the time this will be NULL. */
@@ -85,7 +85,7 @@ error:
 }
 
 static bool
-queue_add_with_col_like_str(sqlite3 *db, const char *col, const char *val, int priority)
+queue_add_with_col_like_str(volatile sqlite3 *db, const char *col, const char *val, int priority)
 {
     RETURN_IF(is_sql_str_invalid(col), "Column name is invalid", false);
 
@@ -112,7 +112,7 @@ error:
 }
 
 static bool
-queue_insert_with_col_like_str(sqlite3 *db, const char *col, const char *val, int pos)
+queue_insert_with_col_like_str(volatile sqlite3 *db, const char *col, const char *val, int pos)
 {
     RETURN_IF(is_sql_str_invalid(col), "Column name is invalid", false);
 
@@ -156,7 +156,7 @@ error:
 }
 
 bool
-database_queue_insert_query(sqlite3 *db, const char *query, int pos)
+database_queue_insert_query(volatile sqlite3 *db, const char *query, int pos)
 {
     bool status = queue_insert_with_col_like_str(db, LKT_DATABASE_KARA_ALL, query, pos);
     LOG_INFO("%s '%s' at %d", status ? "Successfull add query" : "Failed add query", query, pos);
@@ -164,7 +164,7 @@ database_queue_insert_query(sqlite3 *db, const char *query, int pos)
 }
 
 bool
-database_queue_add_plt(sqlite3 *db, const char *plt_name, int priority)
+database_queue_add_plt(volatile sqlite3 *db, const char *plt_name, int priority)
 {
     static const char *SQL_STMT =
         "INSERT INTO queue (kara_id, priority) "
@@ -187,7 +187,7 @@ error:
 }
 
 bool
-database_queue_add_query(sqlite3 *db, const char *query, int priority)
+database_queue_add_query(volatile sqlite3 *db, const char *query, int priority)
 {
     bool status = queue_add_with_col_like_str(db, LKT_DATABASE_KARA_ALL, query, priority);
     LOG_INFO("%s '%s' with prio %d", status ? "Successfull add query" : "Failed add query", query, priority);
@@ -195,7 +195,7 @@ database_queue_add_query(sqlite3 *db, const char *query, int priority)
 }
 
 bool
-database_queue_add_author(sqlite3 *db, const char *author, int priority)
+database_queue_add_author(volatile sqlite3 *db, const char *author, int priority)
 {
     bool status = queue_add_with_col_like_str(db, LKT_DATABASE_NAME_KAUTHOR, author, priority);
     LOG_INFO("%s '%s'", status ? "Successfull add author" : "Failed add author", author);
@@ -203,7 +203,7 @@ database_queue_add_author(sqlite3 *db, const char *author, int priority)
 }
 
 bool
-database_queue_add_language(sqlite3 *db, const char *language, int priority)
+database_queue_add_language(volatile sqlite3 *db, const char *language, int priority)
 {
     bool status = queue_add_with_col_like_str(db, LKT_DATABASE_NAME_KLANG, language, priority);
     LOG_INFO("%s '%s'", status ? "Successfull add language" : "Failed add language", language);
@@ -211,7 +211,7 @@ database_queue_add_language(sqlite3 *db, const char *language, int priority)
 }
 
 bool
-database_queue_add_category(sqlite3 *db, const char *cat, int priority)
+database_queue_add_category(volatile sqlite3 *db, const char *cat, int priority)
 {
     bool status = queue_add_with_col_like_str(db, LKT_DATABASE_NAME_KCAT, cat, priority);
     LOG_INFO("%s '%s'", status ? "Successfull add category" : "Failed add category", cat);
@@ -219,7 +219,7 @@ database_queue_add_category(sqlite3 *db, const char *cat, int priority)
 }
 
 bool
-database_queue_add_type(sqlite3 *db, const char *type, int priority)
+database_queue_add_type(volatile sqlite3 *db, const char *type, int priority)
 {
     bool status = queue_add_with_col_like_str(db, LKT_DATABASE_NAME_KTYPE, type, priority);
     LOG_INFO("%s '%s'", status ? "Successfull add type" : "Failed add type", type);
@@ -227,7 +227,7 @@ database_queue_add_type(sqlite3 *db, const char *type, int priority)
 }
 
 bool
-database_queue_add_id(sqlite3 *db, int id, int priority)
+database_queue_add_id(volatile sqlite3 *db, int id, int priority)
 {
     static const char *SQL_STMT = "INSERT INTO queue (kara_id, priority) VALUES (?,?);";
     bool status = false;
@@ -243,7 +243,7 @@ error:
 }
 
 bool
-database_queue_del_id(sqlite3 *db, int id)
+database_queue_del_id(volatile sqlite3 *db, int id)
 {
     static const char *SQL_TEMPLATE =
         "BEGIN TRANSACTION;"
@@ -264,7 +264,7 @@ error:
 }
 
 bool
-database_queue_next(sqlite3 *db, char filepath[PATH_MAX])
+database_queue_next(volatile sqlite3 *db, char filepath[PATH_MAX])
 {
     static const char *SQL_STMT =
         "SELECT file_path, position, RANDOM()"
@@ -305,7 +305,7 @@ database_queue_next(sqlite3 *db, char filepath[PATH_MAX])
     }
 
     else {
-        LOG_ERROR_SCT("DB", "Failed to fetch next kara: %s", sqlite3_errmsg(db));
+        LOG_ERROR_SCT("DB", "Failed to fetch next kara: %s", sqlite3_errmsg((sqlite3 *) db));
         goto error;
     }
 
@@ -317,7 +317,7 @@ error:
 }
 
 bool
-database_queue_toggle_pause(sqlite3 *db)
+database_queue_toggle_pause(volatile sqlite3 *db)
 {
     static const char *SQL_STMT = "UPDATE queue_state SET paused = 1 - paused";
     SQLITE_EXEC(db, SQL_STMT, error);
@@ -327,7 +327,7 @@ error:
 }
 
 bool
-database_queue_prev(sqlite3 *db, char filepath[PATH_MAX])
+database_queue_prev(volatile sqlite3 *db, char filepath[PATH_MAX])
 {
     static const char *SQL_STMT =
         "SELECT file_path, position "
@@ -365,7 +365,7 @@ database_queue_prev(sqlite3 *db, char filepath[PATH_MAX])
     }
 
     else {
-        LOG_ERROR_SCT("DB", "Failed to fetch prev kara: %s", sqlite3_errmsg(db));
+        LOG_ERROR_SCT("DB", "Failed to fetch prev kara: %s", sqlite3_errmsg((sqlite3 *) db));
         goto error;
     }
 
@@ -377,7 +377,7 @@ error:
 }
 
 bool
-database_queue_clear(sqlite3 *db)
+database_queue_clear(volatile sqlite3 *db)
 {
     static const char *SQL_STMT =
         "BEGIN TRANSACTION;"
@@ -392,7 +392,7 @@ error:
 }
 
 bool
-database_queue_crop(sqlite3 *db)
+database_queue_crop(volatile sqlite3 *db)
 {
     static const char *SQL_STMT =
         "DELETE FROM queue WHERE queue.kara_id <> (SELECT current FROM queue_state LIMIT 1);";
@@ -403,7 +403,7 @@ error:
 }
 
 bool
-database_queue_move(sqlite3 *db, int from, int to)
+database_queue_move(volatile sqlite3 *db, int from, int to)
 {
     /* stmt arguments in order:
      * 1. to
@@ -438,7 +438,7 @@ error:
 }
 
 bool
-database_queue_play(sqlite3 *db, int pos)
+database_queue_play(volatile sqlite3 *db, int pos)
 {
     static const char *SQL_STMT =
         "UPDATE queue_state SET current = ?, paused = 0"
@@ -453,7 +453,7 @@ database_queue_play(sqlite3 *db, int pos)
     code = sqlite3_step(stmt);
 
     if (code != SQLITE_OK && code != SQLITE_DONE) {
-        LOG_ERROR_SCT("DB", "Failed to update queue_state: %s", sqlite3_errmsg(db));
+        LOG_ERROR_SCT("DB", "Failed to update queue_state: %s", sqlite3_errmsg((sqlite3 *) db));
         goto error;
     }
 
@@ -463,7 +463,7 @@ error:
 }
 
 bool
-database_queue_stop(sqlite3 *db)
+database_queue_stop(volatile sqlite3 *db)
 {
     static const char *SQL_STMT = "UPDATE queue_state SET current = NULL;";
     SQLITE_EXEC(db, SQL_STMT, error);
@@ -473,7 +473,7 @@ error:
 }
 
 bool
-database_queue_set_current_index(sqlite3 *db, int idx)
+database_queue_set_current_index(volatile sqlite3 *db, int idx)
 {
     static const char *SQL_GET_TEMPLATE = "UPDATE queue_state SET current = %d;";
     char SQL_GET[LKT_MAX_SQLITE_STATEMENT];
@@ -493,7 +493,7 @@ error:
 }
 
 bool
-database_queue_get_current_file(sqlite3 *db, char filepath[PATH_MAX])
+database_queue_get_current_file(volatile sqlite3 *db, char filepath[PATH_MAX])
 {
     static const char *SQL_STMT =
         "SELECT file_path"
@@ -514,7 +514,7 @@ database_queue_get_current_file(sqlite3 *db, char filepath[PATH_MAX])
         strncpy(filepath, (const char *) sqlite3_column_text(stmt, 0), PATH_MAX);
 
     else {
-        LOG_ERROR_SCT("DB", "Failed to fetch prev kara: %s", sqlite3_errmsg(db));
+        LOG_ERROR_SCT("DB", "Failed to fetch prev kara: %s", sqlite3_errmsg((sqlite3 *) db));
         goto error;
     }
 
@@ -525,7 +525,7 @@ error:
 }
 
 bool
-database_queue_set_paused(sqlite3 *db, bool paused)
+database_queue_set_paused(volatile sqlite3 *db, bool paused)
 {
     const char *SQL = paused ? "UPDATE queue_state SET paused = 1;" : "UPDATE queue_state SET paused = 0;";
     SQLITE_EXEC(db, SQL, error);
@@ -535,7 +535,7 @@ error:
 }
 
 bool
-database_queue_shuffle(sqlite3 *db)
+database_queue_shuffle(volatile sqlite3 *db)
 {
     const char *SQL =
         "BEGIN TRANSACTION;"
@@ -591,7 +591,7 @@ error:
 }
 
 bool
-database_queue_list(sqlite3 *db, size_t from, size_t to, struct lkt_callback *callback)
+database_queue_list(volatile sqlite3 *db, size_t from, size_t to, struct lkt_callback *callback)
 {
     const char *SQL_STMT =
         "WITH content AS ("
@@ -640,7 +640,7 @@ error:
 }
 
 bool
-database_queue_seekid(sqlite3 *db, int id, int *out_pos)
+database_queue_seekid(volatile sqlite3 *db, int id, int *out_pos)
 {
     static const char *SQL_STMT = "SELECT position FROM queue_ WHERE kara_id = ? LIMIT 1";
     int ret;
diff --git a/src/database/stickers.c b/src/database/stickers.c
index 1b4c023b00baf88ff10bbe0f93e4a7fd1332c435..e2fc96ee246307692c49f3f56c9c3f4c4c522ce3 100644
--- a/src/database/stickers.c
+++ b/src/database/stickers.c
@@ -8,7 +8,7 @@
 #include <stdio.h>
 
 bool
-database_sticker_create(sqlite3 *db, const char *name)
+database_sticker_create(volatile sqlite3 *db, const char *name)
 {
     static const char *INSERT =
         "WITH id_max (id) AS (SELECT MAX(id) FROM 'stickers')"
@@ -30,7 +30,7 @@ error:
 }
 
 bool
-database_sticker_delete(sqlite3 *db, const char *name)
+database_sticker_delete(volatile sqlite3 *db, const char *name)
 {
     static const char *INSERT = "DELETE FROM 'stickers' WHERE name = ?;";
     sqlite3_stmt *stmt;
@@ -46,7 +46,7 @@ error:
 }
 
 bool
-database_sticker_list(sqlite3 *db, const char *type, struct sticker_callback *call)
+database_sticker_list(volatile sqlite3 *db, const char *type, struct sticker_callback *call)
 {
     const char *SQL = NULL;
     int ret = false, uri, value;
@@ -106,7 +106,7 @@ error:
 }
 
 bool
-database_sticker_set(sqlite3 *db, const char *type, const char *name, int uri, int value)
+database_sticker_set(volatile sqlite3 *db, const char *type, const char *name, int uri, int value)
 {
     const char *SQL = NULL;
     sqlite3_stmt *stmt;
@@ -147,7 +147,7 @@ error:
 }
 
 bool
-database_sticker_get(sqlite3 *db, const char *type, const char *name, int uri, struct sticker_callback *call)
+database_sticker_get(volatile sqlite3 *db, const char *type, const char *name, int uri, struct sticker_callback *call)
 {
     const char *SQL = NULL;
     sqlite3_stmt *stmt;
@@ -199,7 +199,7 @@ error:
 }
 
 bool
-database_sticker_delete_specify(sqlite3 *db, const char *type, int uri, const char *name)
+database_sticker_delete_specify(volatile sqlite3 *db, const char *type, int uri, const char *name)
 {
     char SQL[LKT_MAX_SQLITE_STATEMENT];
     sqlite3_stmt *stmt;
diff --git a/src/database/user.c b/src/database/user.c
index 11936d7492527e567ad371ad362987e18f093161..ab347f401611a764df89a91429c9ecd3cca6ba7b 100644
--- a/src/database/user.c
+++ b/src/database/user.c
@@ -5,7 +5,7 @@
 #include <stdio.h>
 
 bool
-database_user_authentificate(sqlite3 *db, const char *password)
+database_user_authentificate(volatile sqlite3 *db, const char *password)
 {
     static const char *SQL_STMT = "SELECT username FROM users WHERE password = ?";
     sqlite3_stmt *stmt = 0;
@@ -21,7 +21,7 @@ error:
 }
 
 bool
-database_user_add(sqlite3 *db, const char *username, const char *password)
+database_user_add(volatile sqlite3 *db, const char *username, const char *password)
 {
     static const char *SQL_STMT = "INSERT INTO users (username, password) VALUES (?, ?)";
     sqlite3_stmt *stmt = 0;
diff --git a/src/main/lktadm.c b/src/main/lktadm.c
index 352d21ed5ecb5a572a712216dec9d5b13264bc3f..84a2de4a56232a28e5539cbbafdbd489ba5ac3ee 100644
--- a/src/main/lktadm.c
+++ b/src/main/lktadm.c
@@ -41,7 +41,7 @@ static char kara_dir[PATH_MAX], db_path[PATH_MAX], mkvpropedit[PATH_MAX], sqlite
 void
 open_db(void)
 {
-    if (!database_new(&db))
+    if (!database_new((volatile sqlite3 **) &db))
         fail("Failed to init memory db");
 
     if (config_open(db))
diff --git a/src/module/module_sdl2.c b/src/module/module_sdl2.c
index 2432ca9d591188348e67630ebf577fe0cb9b634a..bce1e3b6477a10186a90fa27d08bbe84a9bcdb8c 100644
--- a/src/module/module_sdl2.c
+++ b/src/module/module_sdl2.c
@@ -39,7 +39,7 @@ struct module_sdl2_window {
 
     /* Things from the server */
     volatile sqlite3 *db;
-    volatile enum mpd_idle_flag *mpd_idle_events;
+    mpd_idle_flag *mpd_idle_events;
 };
 
 /* Private functions. */
@@ -188,9 +188,8 @@ loop:
         }
 
         if (event.type == wakeup_on_mpv_events)
-            lmpv_handle((struct lkt_win *) win, (mpv_handle *) sdl2->mpv, (sqlite3 *) sdl2->db,
-                        (enum mpd_idle_flag *) &sdl2->mpd_idle_events, (int *) &sdl2->mpv_time_pos,
-                        (int *) &sdl2->mpv_duration);
+            lmpv_handle((struct lkt_win *) win, (mpv_handle *) sdl2->mpv, sdl2->db,
+                        sdl2->mpd_idle_events, &sdl2->mpv_time_pos, &sdl2->mpv_duration);
     }
 
     if (redraw) {
@@ -346,7 +345,7 @@ module_sdl2_attach(struct lkt_win *const win, void *server)
 }
 
 bool
-module_sdl2_handle_events(struct lkt_win *const win, sqlite3 *db, enum mpd_idle_flag *mpd_idle_events)
+module_sdl2_handle_events(struct lkt_win *const win, volatile sqlite3 *db, mpd_idle_flag *mpd_idle_events)
 {
     UNUSED(win, db, mpd_idle_events);
     return true;
diff --git a/src/module/module_x11.c b/src/module/module_x11.c
index bec80557594f741c7df43ad4f07fa5230d75afec..8fd16618577280c9f22cdb50e4e6714c8702bebf 100644
--- a/src/module/module_x11.c
+++ b/src/module/module_x11.c
@@ -265,11 +265,10 @@ module_x11_get_elapsed(struct lkt_win *const win, int *elapsed_sec)
 }
 
 bool
-module_x11_handle_events(struct lkt_win *const win, sqlite3 *db, enum mpd_idle_flag *mpd_idle_events)
+module_x11_handle_events(struct lkt_win *const win, volatile sqlite3 *db, mpd_idle_flag *mpd_idle_events)
 {
     RETURN_UNLESS(win && win->window, "Invalid arguments", false);
     struct module_x11_window *xwin = win->window;
     return lx11_handle(xwin) &&
-           ! lmpv_handle(win, xwin->mpv, db, mpd_idle_events, (int *) &xwin->mpv_time_pos,
-                         (int *) &xwin->mpv_duration);
+           ! lmpv_handle(win, xwin->mpv, db, mpd_idle_events, &xwin->mpv_time_pos, &xwin->mpv_duration);
 }
diff --git a/src/module/mpv.c b/src/module/mpv.c
index 735ba8d91509a97efeef61f41e4e9a62c0b9fc46..2fc401d0166cf1898fc1dd121d341fa5072e7956 100644
--- a/src/module/mpv.c
+++ b/src/module/mpv.c
@@ -126,8 +126,8 @@ lmpv_toggle_pause(mpv_handle *ctx)
 }
 
 int
-lmpv_handle(struct lkt_win *win, mpv_handle *ctx, sqlite3 *db, enum mpd_idle_flag *mpd_idle_events,
-            int *time_pos, int *time_duration)
+lmpv_handle(struct lkt_win *win, mpv_handle *ctx, volatile sqlite3 *db, mpd_idle_flag *mpd_idle_events,
+            volatile int *time_pos, volatile int *time_duration)
 {
     int ao_volume;
     struct lkt_queue_state state;
diff --git a/src/net/listen.c b/src/net/listen.c
index 690c1844c6111d77864a47a7a01d5fd648c59a14..35aa74ed7eef616239504b80e3e1788f73e9f021 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -41,7 +41,7 @@ struct lkt_client {
     size_t command_list_len;
     enum lkt_command_list_mode command_list_mode;
 
-    enum mpd_idle_flag mpd_idle_watch;
+    mpd_idle_flag mpd_idle_watch;
     bool request_close;
 
     bool authentificated;
@@ -175,26 +175,25 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
             err = 0;
 
         else if (!strcmp(cmd.name, "next"))
-            err = !command_next((sqlite3 *) srv->db, &srv->win, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = !command_next((sqlite3 *) srv->db, &srv->win, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "pause"))
-            err = !command_pause((sqlite3 *) srv->db, &srv->win, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = !command_pause((sqlite3 *) srv->db, &srv->win, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "previous"))
-            err = !command_previous((sqlite3 *) srv->db, &srv->win, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = !command_previous((sqlite3 *) srv->db, &srv->win, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "play"))
-            err = ! command_play((sqlite3 *) srv->db, &srv->win, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = ! command_play((sqlite3 *) srv->db, &srv->win, cmd.args, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "playid"))
-            err = ! command_playid((sqlite3 *) srv->db, &srv->win, cmd.args,
-                                   (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = ! command_playid((sqlite3 *) srv->db, &srv->win, cmd.args, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "stop"))
-            err = !command_stop((sqlite3 *) srv->db, &srv->win, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = !command_stop((sqlite3 *) srv->db, &srv->win, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "clear"))
-            err = !command_clear((sqlite3 *) srv->db, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = !command_clear((sqlite3 *) srv->db, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "crop"))
-            err = !command_crop((sqlite3 *) srv->db, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = !command_crop((sqlite3 *) srv->db, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "moveid"))
-            err = !command_move((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = !command_move((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "shuffle"))
-            err = !command_shuffle((sqlite3 *) srv->db, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = !command_shuffle((sqlite3 *) srv->db, &srv->mpd_idle_events);
 
         else if (!strcmp(cmd.name, "playlist") || !strcmp(cmd.name, "playlistinfo"))
             err = !command_queue_list(srv, c, cmd.args);
@@ -216,27 +215,27 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
             err = !command_help(srv, c);
 
         else if (!strcmp(cmd.name, "add"))
-            err = !command_add((sqlite3 *) srv->db, &srv->win, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = !command_add((sqlite3 *) srv->db, &srv->win, cmd.args, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "addid"))
-            err = !command_addid((sqlite3 *) srv->db, &srv->win, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = !command_addid((sqlite3 *) srv->db, &srv->win, cmd.args, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "deleteid"))
             err = ! (cmd.args[0] != NULL &&
-                     command_delid((sqlite3 *) srv->db, &srv->win, cmd.args[0], (enum mpd_idle_flag *) &srv->mpd_idle_events));
+                     command_delid((sqlite3 *) srv->db, &srv->win, cmd.args[0], &srv->mpd_idle_events));
 
         else if (!strcmp(cmd.name, "playlistclear"))
-            err = ! command_plt_clear((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = ! command_plt_clear((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "rename"))
-            err = ! command_plt_rename((sqlite3 * ) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = ! command_plt_rename((sqlite3 * ) srv->db, cmd.args, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "playlistdelete"))
-            err = ! command_plt_remove((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = ! command_plt_remove((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "playlistadd"))
-            err = ! command_plt_add((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = ! command_plt_add((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "rm") && cmd.args[0] != NULL && cmd.args[1] == NULL)
-            err = ! command_plt_remove((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = ! command_plt_remove((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "save"))
-            err = ! command_plt_export((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = ! command_plt_export((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "__import"))
-            err = ! command_plt_import((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
+            err = ! command_plt_import((sqlite3 *) srv->db, cmd.args, &srv->mpd_idle_events);
 
         else if (!strcmp(cmd.name, "random"))
             err = !command_set_playback_option(srv, c, lkt_playback_option_random, cmd.args);
@@ -611,7 +610,7 @@ handle_idle_events(struct lkt_state *srv)
 {
     struct lkt_client *current_client;
     struct lkt_message *msg;
-    enum mpd_idle_flag common_mask;
+    mpd_idle_flag common_mask;
     bool once = false;
 
     // No new events
@@ -674,8 +673,9 @@ handle_idle_events(struct lkt_state *srv)
     return 0;
 }
 
-enum mpd_idle_flag *
-lkt_client_get_mask(struct lkt_state *srv, size_t c) {
+mpd_idle_flag *
+lkt_client_get_mask(struct lkt_state *srv, size_t c)
+{
     return &(srv->clients[c - 1].mpd_idle_watch);
 }
 
@@ -702,26 +702,26 @@ lkt_listen(void)
     memset(&srv, 0, sizeof(struct lkt_state));
 
     /* Initialize the system. */
-    RETURN_UNLESS(database_new((sqlite3 **) &srv.db), "Failed to initialize the memory database", 1);
+    RETURN_UNLESS(database_new(&srv.db), "Failed to initialize the memory database", 1);
     RETURN_IF(config_detect_file(conf_file, PATH_MAX), "Failed to find a config file", 1);
-    RETURN_IF(config_new((sqlite3 *) srv.db, conf_file), "Failed to read configuration file", 1);
+    RETURN_IF(config_new(srv.db, conf_file), "Failed to read configuration file", 1);
 
     /* Finish to initialize. */
-    RETURN_UNLESS(database_config_get_text((sqlite3 *) srv.db, "database", "db_path", db_path, PATH_MAX), "Cfg error", 2);
-    RETURN_UNLESS(database_open((sqlite3 *) srv.db, db_path), "Can't open database", 1);
+    RETURN_UNLESS(database_config_get_text(srv.db, "database", "db_path", db_path, PATH_MAX), "Cfg error", 2);
+    RETURN_UNLESS(database_open(srv.db, db_path), "Can't open database", 1);
 
     /* Read the configuration. */
-    RETURN_UNLESS(database_config_get_int( (sqlite3 *) srv.db, "player",   "autoclear", &autoclear),               "Cfg error", 2);
-    RETURN_UNLESS(database_config_get_text((sqlite3 *) srv.db, "database", "kara_dir",  kara_dir, PATH_MAX),       "Cfg error", 2);
-    RETURN_UNLESS(database_config_get_text((sqlite3 *) srv.db, "server",   "host",      host, HOST_NAME_MAX),      "Cfg error", 2);
-    RETURN_UNLESS(database_config_get_text((sqlite3 *) srv.db, "server",   "port",      port, 5),                  "Cfg error", 2);
-    RETURN_UNLESS(database_config_get_text((sqlite3 *) srv.db, "player",   "module",    player_mod, INI_MAX_LINE), "Cfg error", 2);
+    RETURN_UNLESS(database_config_get_int (srv.db, "player",   "autoclear", &autoclear),               "Cfg error", 2);
+    RETURN_UNLESS(database_config_get_text(srv.db, "database", "kara_dir",  kara_dir, PATH_MAX),       "Cfg error", 2);
+    RETURN_UNLESS(database_config_get_text(srv.db, "server",   "host",      host, HOST_NAME_MAX),      "Cfg error", 2);
+    RETURN_UNLESS(database_config_get_text(srv.db, "server",   "port",      port, 5),                  "Cfg error", 2);
+    RETURN_UNLESS(database_config_get_text(srv.db, "player",   "module",    player_mod, INI_MAX_LINE), "Cfg error", 2);
 
     if (kara_dir[strlen(kara_dir) - 1] != '/')
         strncat(kara_dir, "/", PATH_MAX - 1);
 
     srv.kara_prefix = kara_dir;
-    database_config_queue_default((sqlite3 *) srv.db);
+    database_config_queue_default(srv.db);
 
     srv.fds_max = 16;
     srv.fds     = calloc(srv.fds_max, sizeof(struct pollfd));
@@ -735,9 +735,9 @@ lkt_listen(void)
     srv.fds_len = 1;
 
     if (autoclear)
-        database_queue_clear((sqlite3 *) srv.db);
+        database_queue_clear(srv.db);
 
-    RETURN_UNLESS(load_module_by_name((sqlite3 *) srv.db, player_mod, &srv.win), "Can't load module", 3);
+    RETURN_UNLESS(load_module_by_name(srv.db, player_mod, &srv.win), "Can't load module", 3);
     RETURN_UNLESS(srv.win.new(&srv.win), "Can't create window", 3);
     srv.win.attach(&srv.win, &srv);
     RETURN_IF(repo_new(&srv.repo, "kurisu", "https://kurisu.iiens.net", srv.db), "Failed to create repo", 4);
@@ -747,7 +747,7 @@ lkt_listen(void)
             break;
         if (handle_idle_events(&srv) < 0)
             break;
-        srv.win.handle_events(&srv.win, (sqlite3 *) srv.db, (enum mpd_idle_flag *) &srv.mpd_idle_events);
+        srv.win.handle_events(&srv.win, srv.db, &srv.mpd_idle_events);
     }
 
     srv.win.free(&srv.win);