diff --git a/inc/lektor/net.h b/inc/lektor/net.h
index e25534f5dd589694bd0c90c42a6d9f7816f6b1ab..19a8a9278ef9571b47fafe91faba73d83df91758 100644
--- a/inc/lektor/net.h
+++ b/inc/lektor/net.h
@@ -37,12 +37,12 @@ struct lkt_state {
     size_t fds_len;
     size_t fds_max;
 
-    sqlite3 *db;
+    volatile sqlite3 *db;
     const char *kara_prefix;
 
     struct lkt_repo repo;
 
-    enum mpd_idle_flag mpd_idle_events;
+    volatile enum mpd_idle_flag mpd_idle_events;
 
     struct lkt_win win;
 };
diff --git a/src/commands.c b/src/commands.c
index e6309f854ab9b1dc6ccfd54bd07e52130792c13a..dc44865ae17b1a6540f1396264a1e781e64f84a0 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -70,7 +70,7 @@ command_rescan(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]
     return false;
     srv->mpd_idle_events |= MPD_IDLE_UPDATE;
     srv->mpd_idle_events |= MPD_IDLE_DATABASE;
-    return database_update(srv->db, srv->kara_prefix);
+    return database_update((sqlite3 *) srv->db, srv->kara_prefix);
 }
 
 inline bool
@@ -91,7 +91,7 @@ command_currentsong(struct lkt_state *srv, size_t c)
 
     memset(&kara, 0, sizeof(struct kara_metadata));
 
-    if (!database_queue_current_kara(srv->db, &kara, NULL))
+    if (!database_queue_current_kara((sqlite3 *) srv->db, &kara, NULL))
         LOG_ERROR_SCT("COMMAND", "%s", "Failed to get information about the current kara");
 
     out = lkt_message_new();
@@ -121,8 +121,8 @@ command_status(struct lkt_state *srv, size_t c)
 
     RETURN_UNLESS(srv, "Invalid argument", false);
     win = &srv->win;
-    RETURN_UNLESS(database_queue_state(srv->db, &queue_state), "Can't determine playback status", false);
-    database_queue_current_kara(srv->db, NULL, &songid);
+    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);
     win->get_elapsed(win, &elapsed);
     win->get_duration(win, &duration);
 
@@ -469,7 +469,7 @@ lkt_callback_insert_v1(struct lkt_state *srv, size_t c, int id, int id_len, cons
     (void) c;
     (void) sql_row;
     (void) id_len;
-    return database_queue_add_id(srv->db, id, 5);
+    return database_queue_add_id((sqlite3 *) srv->db, id, 5);
 }
 
 static bool
@@ -546,7 +546,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(srv->db, col_name, rgx, &search), "Failed to init search", false);
+    RETURN_UNLESS(init((sqlite3 *) srv->db, col_name, rgx, &search), "Failed to init search", false);
 
     for (count = 0; database_search_iter(&search); ++count)
         continue;
@@ -599,19 +599,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(srv->db, "random", val);
+        ret = database_config_queue((sqlite3 *) srv->db, "random", val);
         break;
     case lkt_playback_option_single:
-        ret = database_config_queue(srv->db, "single", val);
+        ret = database_config_queue((sqlite3 *) srv->db, "single", val);
         break;
     case lkt_playback_option_consume:
-        ret = database_config_queue(srv->db, "consume", val);
+        ret = database_config_queue((sqlite3 *) srv->db, "consume", val);
         break;
     case lkt_playback_option_repeat:
-        ret = database_config_queue(srv->db, "repeat", val);
+        ret = database_config_queue((sqlite3 *) srv->db, "repeat", val);
         break;
     case lkt_playback_option_volume:
-        ret = database_config_queue(srv->db, "volume", val);
+        ret = database_config_queue((sqlite3 *) 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;
@@ -632,8 +632,8 @@ command_set_pos(sqlite3 *db, struct lkt_win *win, enum mpd_idle_flag *watch_mask
 {
     char filepath[PATH_MAX];
     *watch_mask_ptr |= MPD_IDLE_PLAYER;
-    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_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 win->load_file(win, filepath);
 }
 
@@ -809,17 +809,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(srv->db, from, from, &callback);
+    return database_queue_list((sqlite3 *) 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(srv->db, from, to, &callback);
+        return database_queue_list((sqlite3 *) 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(srv->db, from, to, &callback);
+        return database_queue_list((sqlite3 *) srv->db, from, to, &callback);
     }
 }
 
@@ -827,7 +827,7 @@ 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(srv->db, argv[0]), "Failed to authentificate user", false);
+    RETURN_UNLESS(database_user_authentificate((sqlite3 *) srv->db, argv[0]), "Failed to authentificate user", false);
     lkt_client_auth(srv, c, true);
     return true;
 }
@@ -935,7 +935,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(srv->db, argv[0], argv[2], uri, &cb), "Failed to get sticker", false);
+    RETURN_UNLESS(database_sticker_get((sqlite3 *) srv->db, argv[0], argv[2], uri, &cb), "Failed to get sticker", false);
     return true;
 }
 
@@ -946,7 +946,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(srv->db, argv[0], argv[2], uri, value), "Failed to get sticker", false);
+    RETURN_UNLESS(database_sticker_set((sqlite3 *) srv->db, argv[0], argv[2], uri, value), "Failed to get sticker", false);
     srv->mpd_idle_events |= MPD_IDLE_STICKER;
     return true;
 }
@@ -983,18 +983,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(srv->db, argv[0], &callback);
+    return database_sticker_list((sqlite3 *) 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(srv->db, argv[0], &callback);
+    return database_sticker_list((sqlite3 *) 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(srv->db, argv[0], &callback);
+    return database_sticker_list((sqlite3 *) srv->db, argv[0], &callback);
     return false;
 
 list_stickers_check_value:
@@ -1004,13 +1004,13 @@ list_stickers_check_value:
     switch (argv[3][0]) {
     case '=':
         callback.call = sticker_check_is_present_eq;
-        return database_sticker_list(srv->db, argv[0], &callback);
+        return database_sticker_list((sqlite3 *) srv->db, argv[0], &callback);
     case '<':
         callback.call = sticker_check_is_present_lt;
-        return database_sticker_list(srv->db, argv[0], &callback);
+        return database_sticker_list((sqlite3 *) srv->db, argv[0], &callback);
     case '>':
         callback.call = sticker_check_is_present_gt;
-        return database_sticker_list(srv->db, argv[0], &callback);
+        return database_sticker_list((sqlite3 *) srv->db, argv[0], &callback);
     default:
         return 0;
     }
@@ -1027,5 +1027,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(srv->db, argv[0], uri, argv[2]);
+    return database_sticker_delete_specify((sqlite3 *) srv->db, argv[0], uri, argv[2]);
 }
diff --git a/src/net/listen.c b/src/net/listen.c
index bce45fa800c7f6f6e0e7749a6ec841cf72b4888d..6e526aeac26618358de4029fb4c8bbff0634e20f 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -155,7 +155,7 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
     case MPD_IDLE_NONE:
         /* Commands that requires authentification. */
         if (!strcmp(cmd.name, "__adduser"))
-            err = ! command_user_add(srv, c, srv->db, cmd.args);
+            err = ! command_user_add(srv, c, (sqlite3 *) srv->db, cmd.args);
         else if (!strcmp(cmd.name, "__restart"))
             err = ! command_restart(srv, c);
         else if (!strcmp(cmd.name, "kill"))
@@ -177,25 +177,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(srv->db, &srv->win, &srv->mpd_idle_events);
+            err = !command_next((sqlite3 *) srv->db, &srv->win, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "pause"))
-            err = !command_pause(srv->db, &srv->win, &srv->mpd_idle_events);
+            err = !command_pause((sqlite3 *) srv->db, &srv->win, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "previous"))
-            err = !command_previous(srv->db, &srv->win, &srv->mpd_idle_events);
+            err = !command_previous((sqlite3 *) srv->db, &srv->win, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "play"))
-            err = ! command_play(srv->db, &srv->win, cmd.args, &srv->mpd_idle_events);
+            err = ! command_play((sqlite3 *) srv->db, &srv->win, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "playid"))
-            err = ! command_playid(srv->db, &srv->win, cmd.args, &srv->mpd_idle_events);
+            err = ! command_playid((sqlite3 *) srv->db, &srv->win, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "stop"))
-            err = !command_stop(srv->db, &srv->win, &srv->mpd_idle_events);
+            err = !command_stop((sqlite3 *) srv->db, &srv->win, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "clear"))
-            err = !command_clear(srv->db, &srv->mpd_idle_events);
+            err = !command_clear((sqlite3 *) srv->db, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "crop"))
-            err = !command_crop(srv->db, &srv->mpd_idle_events);
+            err = !command_crop((sqlite3 *) srv->db, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "moveid"))
-            err = !command_move(srv->db, cmd.args, &srv->mpd_idle_events);
+            err = !command_move((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "shuffle"))
-            err = !command_shuffle(srv->db, &srv->mpd_idle_events);
+            err = !command_shuffle((sqlite3 *) srv->db, (enum mpd_idle_flag *) &srv->mpd_idle_events);
 
         else if (!strcmp(cmd.name, "playlist") || !strcmp(cmd.name, "playlistinfo"))
             err = !command_queue_list(srv, c, cmd.args);
@@ -217,27 +217,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(srv->db, &srv->win, cmd.args, &srv->mpd_idle_events);
+            err = !command_add((sqlite3 *) srv->db, &srv->win, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "addid"))
-            err = !command_addid(srv->db, &srv->win, cmd.args, &srv->mpd_idle_events);
+            err = !command_addid((sqlite3 *) srv->db, &srv->win, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "deleteid"))
             err = ! (cmd.args[0] != NULL &&
-                     command_delid(srv->db, &srv->win, cmd.args[0], &srv->mpd_idle_events));
+                     command_delid((sqlite3 *) srv->db, &srv->win, cmd.args[0], (enum mpd_idle_flag *) &srv->mpd_idle_events));
 
         else if (!strcmp(cmd.name, "playlistclear"))
-            err = ! command_plt_clear(srv->db, cmd.args, &srv->mpd_idle_events);
+            err = ! command_plt_clear((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "rename"))
-            err = ! command_plt_rename(srv->db, cmd.args, &srv->mpd_idle_events);
+            err = ! command_plt_rename((sqlite3* ) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "playlistdelete"))
-            err = ! command_plt_remove(srv->db, cmd.args, &srv->mpd_idle_events);
+            err = ! command_plt_remove((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "playlistadd"))
-            err = ! command_plt_add(srv->db, cmd.args, &srv->mpd_idle_events);
+            err = ! command_plt_add((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "rm") && cmd.args[0] != NULL && cmd.args[1] == NULL)
-            err = ! command_plt_remove(srv->db, cmd.args, &srv->mpd_idle_events);
+            err = ! command_plt_remove((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "save"))
-            err = ! command_plt_export(srv->db, cmd.args, &srv->mpd_idle_events);
+            err = ! command_plt_export((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
         else if (!strcmp(cmd.name, "__import"))
-            err = ! command_plt_import(srv->db, cmd.args, &srv->mpd_idle_events);
+            err = ! command_plt_import((sqlite3 *) srv->db, cmd.args, (enum mpd_idle_flag *) &srv->mpd_idle_events);
 
         else if (!strcmp(cmd.name, "random"))
             err = !command_set_playback_option(srv, c, lkt_playback_option_random, cmd.args);
@@ -698,7 +698,7 @@ handle_repo_hevents(struct lkt_state *srv)
         switch (kara->action) {
         /* Add the downloaded kara to the database. */
         case kara_action_add:
-            if (!database_update_add(srv->db, kara->filename, &kara->mdt, kara->id, true)) {
+            if (!database_update_add((sqlite3 *) srv->db, kara->filename, &kara->mdt, kara->id, true)) {
                 LOG_ERROR("Failed to add downloaded kara with id %lu and path %s", kara->id, kara->filename);
                 goto get_out;
             }
@@ -709,7 +709,7 @@ handle_repo_hevents(struct lkt_state *srv)
 
         /* Add the mdt of the kara to the database. Mark it unavailable. */
         case kara_action_unavail:
-            if (!database_update_add(srv->db, kara->filename, &kara->mdt, kara->id, false)) {
+            if (!database_update_add((sqlite3 *) srv->db, kara->filename, &kara->mdt, kara->id, false)) {
                 LOG_ERROR("Failed to add kara with id %lu with flag unavailable", kara->id);
                 goto get_out;
             }
@@ -750,26 +750,26 @@ lkt_listen(void)
     memset(&srv, 0, sizeof(struct lkt_state));
 
     /* Initialize the system. */
-    RETURN_UNLESS(database_new(&srv.db), "Failed to initialize the memory database", 1);
+    RETURN_UNLESS(database_new((sqlite3 **) &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(srv.db, conf_file), "Failed to read configuration file", 1);
+    RETURN_IF(config_new((sqlite3 *) srv.db, conf_file), "Failed to read configuration file", 1);
 
     /* Finish to initialize. */
-    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);
+    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);
 
     /* Read the configuration. */
-    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);
+    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);
 
     if (kara_dir[strlen(kara_dir) - 1] != '/')
         strncat(kara_dir, "/", PATH_MAX - 1);
 
     srv.kara_prefix = kara_dir;
-    database_config_queue_default(srv.db);
+    database_config_queue_default((sqlite3 *) srv.db);
 
     srv.fds_max = 16;
     srv.fds     = calloc(srv.fds_max, sizeof(struct pollfd));
@@ -783,9 +783,9 @@ lkt_listen(void)
     srv.fds_len = 1;
 
     if (autoclear)
-        database_queue_clear(srv.db);
+        database_queue_clear((sqlite3 *) srv.db);
 
-    RETURN_UNLESS(load_module_by_name(srv.db, player_mod, &srv.win), "Can't load module", 3);
+    RETURN_UNLESS(load_module_by_name((sqlite3 *) 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"), "Failed to create repo", 4);
@@ -796,7 +796,7 @@ lkt_listen(void)
             break;
         if (handle_idle_events(&srv) < 0)
             break;
-        srv.win.handle_events(&srv.win, srv.db, &srv.mpd_idle_events);
+        srv.win.handle_events(&srv.win, (sqlite3 *) srv.db, (enum mpd_idle_flag *) &srv.mpd_idle_events);
         handle_repo_hevents(&srv);
     }