diff --git a/inc/lektor/config.h b/inc/lektor/config.h
index f11dc73f0c33c7922a7bdd6973fb04bb22142554..c8722d11a53b0b061eaa7deeae841e0034dd678d 100644
--- a/inc/lektor/config.h
+++ b/inc/lektor/config.h
@@ -5,8 +5,8 @@
 extern "C" {
 #endif
 
+#include <lektor/database.h>
 #include <lektor/common.h>
-#include <sqlite3.h>
 
 /* Forward definition of the lkt_state structure */
 struct lkt_state;
@@ -27,7 +27,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(volatile sqlite3 *db);
+int config_open(lkt_db *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
@@ -37,7 +37,7 @@ 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(volatile sqlite3 *db, const char *conf);
+int config_new(lkt_db *db, const char *conf);
 
 /* Prints the default config file. */
 void config_default(FILE *output);
@@ -50,7 +50,7 @@ void config_default_file(char *dest, size_t len);
 #define env_get           getenv
 
 /* Handle everything for a hook */
-void config_handle_hook(volatile sqlite3 *db, const char *hook_name);
+void config_handle_hook(lkt_db *db, const char *hook_name);
 
 #if defined(__cplusplus)
 }
diff --git a/inc/lektor/database.h b/inc/lektor/database.h
index 53419677135cea4690475ca2ecd7c597167baced..4d00e7b29f5a0f07ac6d0c648de3050423a38e4b 100644
--- a/inc/lektor/database.h
+++ b/inc/lektor/database.h
@@ -14,6 +14,9 @@ extern "C" {
 
 // clang-format off
 
+/* Hide the DB implementation */
+typedef volatile sqlite3 lkt_db;
+
 struct lkt_queue_state {
     int volume;
     int paused;
@@ -32,72 +35,72 @@ typedef enum {
 } LKT_DATABASE_VERSION;
 
 /* Update stuff */
-void database_get_update  (volatile sqlite3 *db, long *timestamp, long *job, int *current);
-void database_stamp       (volatile sqlite3 *db);
-void database_updated     (volatile sqlite3 *db);
-void database_deleted_kara(volatile sqlite3 *db, int **kara_id, size_t *len);
-void database_total_playtime(volatile sqlite3 *db, uint64_t *seconds);
-LKT_DATABASE_VERSION database_get_version(volatile sqlite3 *db);
+void database_get_update  (lkt_db *db, long *timestamp, long *job, int *current);
+void database_stamp       (lkt_db *db);
+void database_updated     (lkt_db *db);
+void database_deleted_kara(lkt_db *db, int **kara_id, size_t *len);
+void database_total_playtime(lkt_db *db, uint64_t *seconds);
+LKT_DATABASE_VERSION database_get_version(lkt_db *db);
 
 /* Open correctly a database for lektor. */
-bool database_new   (volatile sqlite3 **db);
+bool database_new   (lkt_db **db);
 bool database_init  (const char *dbpath);
-bool database_open  (volatile sqlite3 *db, const char *dbpath, bool check);
-bool database_attach(volatile sqlite3 *db, const char *name, const char *dbpath);
-bool database_detach(volatile sqlite3 *db, const char *name);
+bool database_open  (lkt_db *db, const char *dbpath, bool check);
+bool database_attach(lkt_db *db, const char *name, const char *dbpath);
+bool database_detach(lkt_db *db, const char *name);
 void database_close_all(void);
 
 /* Get information on the queue and currently playing kara. */
-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);
-void database_queue_playtime    (volatile sqlite3 *db, uint64_t *seconds);
-
-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]);
-
-bool database_get_kara_id           (volatile sqlite3 *db, char filepath[PATH_MAX], int *id);
-bool database_get_kara_path         (volatile sqlite3 *db, int id, char filepath[PATH_MAX]);
-bool database_get_kara_position     (volatile sqlite3 *db, int id, int *pos);
-bool database_get_kara_mtime_id     (volatile sqlite3 *db, int id, uint64_t *mtime);
-bool database_get_kara_duration_id  (volatile sqlite3 *db, int id, uint64_t *duration);
-bool database_get_kara_mtime_path   (volatile sqlite3 *db, char filepath[PATH_MAX], uint64_t *mtime);
-bool database_get_kara_duration_path(volatile sqlite3 *db, char filepath[PATH_MAX], uint64_t *duration);
-bool database_is_kara_mkv           (volatile sqlite3 *db, char filepath[PATH_MAX], bool *valid_mkv);
-void database_cache_kara            (volatile sqlite3 *db, int id);
-void database_cache_kara_magic      (volatile sqlite3 *db, int id);
+bool database_queue_state       (lkt_db *db, struct lkt_queue_state *res);
+bool database_queue_current_kara(lkt_db *db, struct kara_metadata *res, int *id);
+void database_queue_playtime    (lkt_db *db, uint64_t *seconds);
+
+bool database_queue_set_paused       (lkt_db *db, bool paused);
+bool database_queue_set_current_index(lkt_db *db, int idx);
+bool database_queue_get_current_file (lkt_db *db, char filepath[PATH_MAX]);
+
+bool database_get_kara_id           (lkt_db *db, char filepath[PATH_MAX], int *id);
+bool database_get_kara_path         (lkt_db *db, int id, char filepath[PATH_MAX]);
+bool database_get_kara_position     (lkt_db *db, int id, int *pos);
+bool database_get_kara_mtime_id     (lkt_db *db, int id, uint64_t *mtime);
+bool database_get_kara_duration_id  (lkt_db *db, int id, uint64_t *duration);
+bool database_get_kara_mtime_path   (lkt_db *db, char filepath[PATH_MAX], uint64_t *mtime);
+bool database_get_kara_duration_path(lkt_db *db, char filepath[PATH_MAX], uint64_t *duration);
+bool database_is_kara_mkv           (lkt_db *db, char filepath[PATH_MAX], bool *valid_mkv);
+void database_cache_kara            (lkt_db *db, int id);
+void database_cache_kara_magic      (lkt_db *db, int id);
 
 /* Get a list of all non-cached karas from the disk */
-void database_get_all_non_cached_kara(volatile sqlite3 *db, int **ret_ids, size_t *ret_ids_len);
+void database_get_all_non_cached_kara(lkt_db *db, int **ret_ids, size_t *ret_ids_len);
 
 /* Get a list of all cached karas from the memory */
-void database_get_all_cached_kara(volatile sqlite3 *db, int **ret_ids, size_t *ret_ids_len);
+void database_get_all_cached_kara(lkt_db *db, int **ret_ids, size_t *ret_ids_len);
 
 /* Update the database. */
-bool database_update        (volatile sqlite3 *db, const char *kara_dir, int check_timestamp);
-bool database_update_add    (volatile sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail);
-void database_update_set_new(volatile sqlite3 *db, int id, bool is_new);
-void database_update_del    (volatile sqlite3 *db, int id);
-void database_update_touch  (volatile sqlite3 *db, int id);
+bool database_update        (lkt_db *db, const char *kara_dir, int check_timestamp);
+bool database_update_add    (lkt_db *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail);
+void database_update_set_new(lkt_db *db, int id, bool is_new);
+void database_update_del    (lkt_db *db, int id);
+void database_update_touch  (lkt_db *db, int id);
 
 /* Control the content of the queue. */
-bool database_queue_add_uri(volatile sqlite3 *db, struct lkt_uri *uri, int priority);
-bool database_queue_add_id (volatile sqlite3 *db, int id,              int priority);
-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_flat   (volatile sqlite3 *db);
-bool database_queue_move   (volatile sqlite3 *db, int from, int to);
-bool database_queue_swap   (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);
-bool database_queue_dump   (volatile sqlite3 *db, const char *plt_name);
+bool database_queue_add_uri(lkt_db *db, struct lkt_uri *uri, int priority);
+bool database_queue_add_id (lkt_db *db, int id,              int priority);
+bool database_queue_del_id (lkt_db *db, int id);
+bool database_queue_del_pos(lkt_db *db, int pos);
+bool database_queue_clear  (lkt_db *db);
+bool database_queue_crop   (lkt_db *db);
+bool database_queue_flat   (lkt_db *db);
+bool database_queue_move   (lkt_db *db, int from, int to);
+bool database_queue_swap   (lkt_db *db, int from, int to);
+bool database_queue_shuffle(lkt_db *db);
+bool database_queue_seekid (lkt_db *db, int id, int *out_pos);
+bool database_queue_dump   (lkt_db *db, const char *plt_name);
 
 /* Control the playing state of the queue. */
-bool database_queue_toggle_pause(volatile sqlite3 *db);
-bool database_queue_play        (volatile sqlite3 *db, int pos);
-bool database_queue_stop        (volatile sqlite3 *db);
+bool database_queue_toggle_pause(lkt_db *db);
+bool database_queue_play        (lkt_db *db, int pos);
+bool database_queue_stop        (lkt_db *db);
 
 /* A search callback to be called after each matched row */
 struct lkt_callback {
@@ -108,8 +111,8 @@ struct lkt_callback {
 };
 
 /* List the content of the queue */
-bool database_queue_list(volatile sqlite3 *db, size_t from, size_t to, struct lkt_callback *callback);
-int database_queue_probe_id(volatile sqlite3 *db, int id);
+bool database_queue_list(lkt_db *db, size_t from, size_t to, struct lkt_callback *callback);
+int database_queue_probe_id(lkt_db *db, int id);
 
 /* Sticker construct structure */
 struct lkt_sticker_opt {
@@ -122,7 +125,7 @@ struct lkt_sticker_opt {
 #define LKT_STICKER_OPT_INIT { .name = NULL, .value = 0, .uri = 0, .op = '\0', .type = NULL }
 
 /* Search the database */
-typedef bool (*lkt_search_init_add_func)    (volatile sqlite3 *, struct lkt_uri *, int);
+typedef bool (*lkt_search_init_add_func)    (lkt_db *, struct lkt_uri *, int);
 typedef bool (*lkt_search_database_func)    (struct lkt_state *srv, size_t c, int id, int id_len, const char *row);
 typedef bool (*lkt_search_queue_func)       (struct lkt_state *srv, size_t c, int id, int id_len, const char *row);
 typedef bool (*lkt_search_sticker_func)     (struct lkt_state *srv, size_t c, const char *sticker, const char *type, int uri, int value);
@@ -143,33 +146,33 @@ size_t database_search_get_continuation(struct lkt_search *);
  * function is here if you need to abort a search. */
 void database_search_free(struct lkt_search *);
 
-typedef bool (*database_search_init_func)(volatile sqlite3 *, struct lkt_search *);
-bool database_search_database_init    (volatile sqlite3 *db, struct lkt_search *ret);
-bool database_search_queue_init       (volatile sqlite3 *db, struct lkt_search *ret);
-bool database_search_sticker_init     (volatile sqlite3 *db, struct lkt_search *ret);
-bool database_search_playlist_init    (volatile sqlite3 *db, struct lkt_search *ret);
-bool database_search_listplaylist_init(volatile sqlite3 *db, struct lkt_search *ret);
+typedef bool (*database_search_init_func)(lkt_db *, struct lkt_search *);
+bool database_search_database_init    (lkt_db *db, struct lkt_search *ret);
+bool database_search_queue_init       (lkt_db *db, struct lkt_search *ret);
+bool database_search_sticker_init     (lkt_db *db, struct lkt_search *ret);
+bool database_search_playlist_init    (lkt_db *db, struct lkt_search *ret);
+bool database_search_listplaylist_init(lkt_db *db, struct lkt_search *ret);
 
 /* Iterate through an initialized search structure, will free it when the
  * search is done (return `false`). */
 bool database_search_iter(struct lkt_search *item);
 
-bool database_kara_by_id(volatile sqlite3 *db, int id, struct kara_metadata *kara, char filepath[PATH_MAX]);
+bool database_kara_by_id(lkt_db *db, int id, struct kara_metadata *kara, char filepath[PATH_MAX]);
 
 /* Next and prev operation on the queue. */
-bool database_queue_next        (volatile sqlite3 *db, char filepath[PATH_MAX]);
-bool database_queue_prev        (volatile sqlite3 *db, char filepath[PATH_MAX]);
-bool database_queue_skip_current(volatile sqlite3 *db, char filepath[PATH_MAX]);
+bool database_queue_next        (lkt_db *db, char filepath[PATH_MAX]);
+bool database_queue_prev        (lkt_db *db, char filepath[PATH_MAX]);
+bool database_queue_skip_current(lkt_db *db, char filepath[PATH_MAX]);
 
 /* Set a value in the config table */
-bool database_validate_conf          (volatile 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_text_nospace(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);
+bool database_validate_conf          (lkt_db *db);
+bool database_config_set             (lkt_db *db, const char *section, const char *key, const char *value);
+bool database_config_get_text        (lkt_db *db, const char *section, const char *key, char *value, size_t len);
+bool database_config_get_text_nospace(lkt_db *db, const char *section, const char *key, char *value, size_t len);
+bool database_config_get_int         (lkt_db *db, const char *section, const char *key, int *value);
+bool database_config_exists          (lkt_db *db, const char *section, const char *key);
+bool database_config_queue           (lkt_db *db, const char *option,  int value);
+bool database_config_queue_default   (lkt_db *db);
 
 #define database_config_get_4 database_config_get_int
 #define database_config_get_5 database_config_get_text
@@ -177,12 +180,12 @@ bool database_config_queue_default   (volatile sqlite3 *db);
 
 /* Dump configuration to any stream, form is undefined, this function is here
  * for debug purpose. */
-bool database_config_dump(volatile sqlite3 *db, FILE *f);
+bool database_config_dump(lkt_db *db, FILE *f);
 
 /* Check obfuscation status. If no one is set, set it and return `true`. If
  * there was already an obfuscation status, return `true` if the two are the
  * same, `false` otherwise. */
-bool database_config_obfuscation_check(volatile sqlite3 *db, int obfuscation);
+bool database_config_obfuscation_check(lkt_db *db, int obfuscation);
 
 /* Playlists */
 struct lkt_playlist_metadata {
@@ -192,30 +195,30 @@ struct lkt_playlist_metadata {
 };
 
 /* Control playlists */
-bool database_plt_touch     (volatile sqlite3 *db, const char *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_touch     (lkt_db *db, const char *name);
+bool database_plt_create    (lkt_db *db, const char *name);
+bool database_plt_remove    (lkt_db *db, const char *name);
+bool database_plt_remove_pos(lkt_db *db, const char *name, int pos);
+bool database_plt_clear     (lkt_db *db, const char *name);
+bool database_plt_rename    (lkt_db *db, const char *old_name, const char *new_name);
 
-bool database_plt_export(volatile sqlite3 *db, const char *name);
-bool database_plt_import(volatile sqlite3 *db, const char *name);
+bool database_plt_export(lkt_db *db, const char *name);
+bool database_plt_import(lkt_db *db, const char *name);
 
-bool database_plt_add_uri(volatile sqlite3 *db, const char *name, struct lkt_uri *uri);
+bool database_plt_add_uri(lkt_db *db, const char *name, struct lkt_uri *uri);
 
 /* User control, yeah, MPD authentification sucks. */
-bool database_user_authentificate(volatile sqlite3 *db, const char *password);
-bool database_user_add(volatile sqlite3 *db, const char *username, const char *password);
+bool database_user_authentificate(lkt_db *db, const char *password);
+bool database_user_add(lkt_db *db, const char *username, const char *password);
 
 /* Stickers manipulations. */
-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_set           (volatile sqlite3 *db, const char *type, const char *name, int uri, int value);
+bool database_sticker_create        (lkt_db *db, const char *name);
+bool database_sticker_delete        (lkt_db *db, const char *name);
+bool database_sticker_delete_specify(lkt_db *sb, const char *type, int uri, const char *name);
+bool database_sticker_set           (lkt_db *db, const char *type, const char *name, int uri, int value);
 
 /* Get some stats from the database */
-bool database_stats(volatile sqlite3 *db, int *authors, int *sources, int *karas);
+bool database_stats(lkt_db *db, int *authors, int *sources, int *karas);
 
 // clang-format on
 
diff --git a/inc/lektor/net.h b/inc/lektor/net.h
index 45906613c5c0a86ffa70641f0e62d3ab30ad4809..4887cb71870a872ffc5494c1b2cb8464b065ff28 100644
--- a/inc/lektor/net.h
+++ b/inc/lektor/net.h
@@ -5,6 +5,7 @@
 extern "C" {
 #endif
 
+#include <lektor/database.h>
 #include <lektor/common.h>
 #include <lektor/queue.h>
 #include <lektor/mkv.h>
@@ -14,7 +15,6 @@ extern "C" {
 
 #include <mpv/client.h>
 #include <curl/curl.h>
-#include <sqlite3.h>
 
 struct lkt_state;
 struct lkt_command {
@@ -55,7 +55,7 @@ struct lkt_state {
     struct queue queue;
 
     /* The database */
-    volatile sqlite3 *db;
+    lkt_db *db;
     const char *kara_prefix;
     uint64_t update_total;
     uint64_t update_current;
diff --git a/src/base/config.c b/src/base/config.c
index 4be6566269a8046c991bd784781e9b248679cd6d..4abc2e20ee83bae3cf5c4f7be943903d878100eb 100644
--- a/src/base/config.c
+++ b/src/base/config.c
@@ -27,7 +27,7 @@ skip(char *s)
 }
 
 static int
-handler(volatile sqlite3 *user, const char *section, const char *name, const char *value)
+handler(lkt_db *user, const char *section, const char *name, const char *value)
 {
     RETURN_UNLESS(section && name && value, "I can't complete the database with incomplete lines", 1);
     RETURN_UNLESS(database_config_set(user, section, name, value), "Failed to update the database", 1);
@@ -62,7 +62,7 @@ __set_log_level(const char *name, const char *level)
 }
 
 static inline int
-ini_parse(const char *path, volatile sqlite3 *db)
+ini_parse(const char *path, lkt_db *db)
 {
     char *start, *end, *name, *value;
     char section[LKT_LINE_MAX], line[LKT_LINE_MAX];
@@ -238,7 +238,7 @@ found:
 }
 
 int
-config_new(volatile sqlite3 *db, const char *conf)
+config_new(lkt_db *db, const char *conf)
 {
     if (ini_parse(conf, db)) {
         LOG_ERROR("CONFIG", "Failed to parse file %s", conf);
@@ -264,7 +264,7 @@ config_default(FILE *output)
 }
 
 int
-config_open(volatile sqlite3 *db)
+config_open(lkt_db *db)
 {
     char conf_file[PATH_MAX];
     RETURN_IF(config_detect_file(conf_file, PATH_MAX), "Error while searching for a config file", 1);
@@ -273,7 +273,7 @@ config_open(volatile sqlite3 *db)
 }
 
 void
-config_handle_hook(volatile sqlite3 *db, const char *hook_name)
+config_handle_hook(lkt_db *db, const char *hook_name)
 {
     char hook_handlers[LKT_LINE_MAX];
     if (!database_config_get_text_nospace(db, "hook", hook_name, hook_handlers, LKT_LINE_MAX)) {
diff --git a/src/base/launch.c b/src/base/launch.c
index e7ffc7dfa26abd3b6c7887daa0899e8a827f4a2b..adaf41d0e0a851f6a907659508b3daef1a77906f 100644
--- a/src/base/launch.c
+++ b/src/base/launch.c
@@ -186,7 +186,7 @@ ___sleep(void)
 
 /* Cache karas into disk */
 PRIVATE_FUNCTION void
-___cache_kara(volatile sqlite3 *db)
+___cache_kara(lkt_db *db)
 {
     size_t ids_count = 0;
     int *ids         = NULL;
@@ -212,7 +212,7 @@ ___cache_kara(volatile sqlite3 *db)
 
 /* Check magic number */
 PRIVATE_FUNCTION void
-___check_kara(volatile sqlite3 *db)
+___check_kara(lkt_db *db)
 {
     size_t ids_count = 0;
     int *ids         = NULL;
@@ -240,7 +240,7 @@ PRIVATE_FUNCTION void *
 ___caching_walker(void *args)
 {
     lkt_thread_set_name("lektord/caching");
-    volatile sqlite3 *db = (volatile sqlite3 *)args;
+    lkt_db *db = (lkt_db *)args;
     ___cache_kara(db);
     ___check_kara(db);
     return NULL;
@@ -252,7 +252,7 @@ launch_caching(va_list *args)
     int ret_code = 1;
     va_list copy;
     va_copy(copy, *args);
-    volatile sqlite3 *db = (volatile sqlite3 *)va_arg(copy, volatile sqlite3 *);
+    lkt_db *db = (lkt_db *)va_arg(copy, lkt_db *);
 
     if (database_get_version(db) == LKT_DATABASE_VERSION_MK_7_1) {
         ret_code = 0;
diff --git a/src/database/cache.c b/src/database/cache.c
index ee25a62b55244abd822ef99de73cfa778383f558..b2801033dd39d582ebb1a3370e8b6922a4b30289 100644
--- a/src/database/cache.c
+++ b/src/database/cache.c
@@ -6,12 +6,12 @@
 #include <math.h>
 
 /* Forward declarations for set operations */
-PRIVATE_FUNCTION bool database_set_kara_mtime_id(volatile sqlite3 *, int, uint64_t);
-PRIVATE_FUNCTION bool database_set_kara_duration_id(volatile sqlite3 *, int, uint64_t);
+PRIVATE_FUNCTION bool database_set_kara_mtime_id(lkt_db *, int, uint64_t);
+PRIVATE_FUNCTION bool database_set_kara_duration_id(lkt_db *, int, uint64_t);
 
 /* Is cached? */
 PRIVATE_FUNCTION bool
-database_is_kara_cached(volatile sqlite3 *db, int id)
+database_is_kara_cached(lkt_db *db, int id)
 {
     static const char *SQL = "SELECT cached_mtime, cached_duration FROM kara WHERE id = ?;";
     sqlite3_stmt *stmt     = NULL;
@@ -36,7 +36,7 @@ get_mtime(const char *path)
 }
 
 PRIVATE_FUNCTION void
-___database_cache_kara_magic_by_file(volatile sqlite3 *db, const char *filename)
+___database_cache_kara_magic_by_file(lkt_db *db, const char *filename)
 {
     /* Update the mkv magic error */
     int magic_error        = mkv_check_magic(filename);
@@ -56,7 +56,7 @@ error:
 }
 
 void
-database_cache_kara_magic(volatile sqlite3 *db, int id)
+database_cache_kara_magic(lkt_db *db, int id)
 {
     /* Get the filepath */
     char filename[PATH_MAX];
@@ -72,7 +72,7 @@ database_cache_kara_magic(volatile sqlite3 *db, int id)
 }
 
 bool
-database_is_kara_mkv(volatile sqlite3 *db, char filepath[PATH_MAX], bool *valid_mkv)
+database_is_kara_mkv(lkt_db *db, char filepath[PATH_MAX], bool *valid_mkv)
 {
     static const char *SQL = "SELECT magic_error FROM kara_cache WHERE file_path = ?;";
     sqlite3_stmt *stmt     = NULL;
@@ -106,7 +106,7 @@ error:
 
 /* Request to cache a kara */
 void
-database_cache_kara(volatile sqlite3 *db, int id)
+database_cache_kara(lkt_db *db, int id)
 {
     char filepath[PATH_MAX];
 
@@ -137,7 +137,7 @@ database_cache_kara(volatile sqlite3 *db, int id)
 }
 
 #define ___cache_set_from_id(what)                                                                                     \
-    PRIVATE_FUNCTION bool database_set_kara_##what##_id(volatile sqlite3 *db, int id, uint64_t what)                   \
+    PRIVATE_FUNCTION bool database_set_kara_##what##_id(lkt_db *db, int id, uint64_t what)                   \
     {                                                                                                                  \
         bool ret_code      = false;                                                                                    \
         sqlite3_stmt *stmt = NULL;                                                                                     \
@@ -158,7 +158,7 @@ database_cache_kara(volatile sqlite3 *db, int id)
     }
 
 #define ___cache_get_from_id(what)                                                                                     \
-    bool database_get_kara_##what##_id(volatile sqlite3 *db, int id, uint64_t *what)                                   \
+    bool database_get_kara_##what##_id(lkt_db *db, int id, uint64_t *what)                                   \
     {                                                                                                                  \
         bool ret_code      = false;                                                                                    \
         bool retry_once    = false;                                                                                    \
@@ -182,7 +182,7 @@ database_cache_kara(volatile sqlite3 *db, int id)
 
 /* Define get operation on the cache */
 #define ___cache_get_from_path(what)                                                                                   \
-    bool database_get_kara_##what##_path(volatile sqlite3 *db, char filepath[PATH_MAX], uint64_t *what)                \
+    bool database_get_kara_##what##_path(lkt_db *db, char filepath[PATH_MAX], uint64_t *what)                \
     {                                                                                                                  \
         int id = 0;                                                                                                    \
         if (!database_get_kara_id(db, filepath, &id)) {                                                                \
diff --git a/src/database/config.c b/src/database/config.c
index 72d4c846c9a1e71fe82532ee23b8c38786e5d47b..7887e926c224ff4b620727318f4e87dc949d3c4e 100644
--- a/src/database/config.c
+++ b/src/database/config.c
@@ -5,7 +5,7 @@
 #include <lektor/internal/dbmacro.h>
 
 bool
-database_config_set(volatile sqlite3 *db, const char *section, const char *key, const char *value)
+database_config_set(lkt_db *db, const char *section, const char *key, const char *value)
 {
     static const char *SQL_STMT = "INSERT OR REPLACE INTO"
                                   " config (section, key, value)"
@@ -34,7 +34,7 @@ error:
 }
 
 bool
-database_config_get_text(volatile sqlite3 *db, const char *section, const char *key, char *value, size_t len)
+database_config_get_text(lkt_db *db, const char *section, const char *key, char *value, size_t len)
 {
     static const char *SQL_STMT = "SELECT value"
                                   " FROM config"
@@ -58,7 +58,7 @@ error:
 }
 
 bool
-database_config_get_text_nospace(volatile sqlite3 *db, const char *section, const char *key, char *value, size_t len)
+database_config_get_text_nospace(lkt_db *db, const char *section, const char *key, char *value, size_t len)
 {
     static const char *SQL_STMT = "SELECT REPLACE(value, ' ', '')"
                                   " FROM config"
@@ -82,7 +82,7 @@ error:
 }
 
 bool
-database_config_exists(volatile sqlite3 *db, const char *section, const char *key)
+database_config_exists(lkt_db *db, const char *section, const char *key)
 {
     static const char *SQL_STMT = "SELECT value"
                                   " FROM config"
@@ -102,7 +102,7 @@ error:
 }
 
 bool
-database_config_get_int(volatile sqlite3 *db, const char *section, const char *key, int *value)
+database_config_get_int(lkt_db *db, const char *section, const char *key, int *value)
 {
     static const char *SQL_STMT = "SELECT CAST(value AS INTEGER)"
                                   " FROM config"
@@ -123,7 +123,7 @@ error:
 }
 
 bool
-database_config_queue(volatile sqlite3 *db, const char *option, int value)
+database_config_queue(lkt_db *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];
@@ -146,7 +146,7 @@ error:
 }
 
 bool
-database_validate_conf(volatile sqlite3 *db)
+database_validate_conf(lkt_db *db)
 {
     const char *section;
 #define section(_sct) section = _sct;
@@ -172,7 +172,7 @@ database_validate_conf(volatile sqlite3 *db)
 }
 
 bool
-database_config_dump(volatile sqlite3 *db, FILE *f)
+database_config_dump(lkt_db *db, FILE *f)
 {
     static const char *SQL = "SELECT section, key, value FROM config;";
     sqlite3_stmt *stmt     = 0;
@@ -196,7 +196,7 @@ error:
 }
 
 bool
-database_config_obfuscation_check(volatile sqlite3 *db, int obfuscation)
+database_config_obfuscation_check(lkt_db *db, int obfuscation)
 {
     static const char *GET_SQL = "SELECT obfuscation FROM misc WHERE id = 42;";
     static const char *SET_SQL = "UPDATE misc SET obfuscation = ? WHERE id = 42;";
diff --git a/src/database/find.c b/src/database/find.c
index 1e1808e4b447b7e883237f2a37d83a5edc31e20b..5d905a51d6f8b4786039401259d047eba8aaba1b 100644
--- a/src/database/find.c
+++ b/src/database/find.c
@@ -13,7 +13,7 @@ __check_sticker_type(const char *type)
 
 /* Private search implementation. */
 struct lkt_search {
-    volatile sqlite3 *db;
+    lkt_db *db;
     sqlite3_stmt *stmt;
     enum lkt_search_type {
         lkt_search_database,
@@ -128,7 +128,7 @@ database_search_set_name(struct lkt_search *search, const char *pltname)
 }
 
 bool
-database_search_database_init(volatile sqlite3 *db, struct lkt_search *ret)
+database_search_database_init(lkt_db *db, struct lkt_search *ret)
 {
     RETURN_UNLESS(ret, "Exit because return pointer is NULL", false);
     static const char *SQL_STMT_TEMPLATE = "WITH content AS ("
@@ -159,7 +159,7 @@ error:
 }
 
 bool
-database_search_playlist_init(volatile sqlite3 *db, struct lkt_search *ret)
+database_search_playlist_init(lkt_db *db, struct lkt_search *ret)
 {
     /* Sql queries definitions */
     char SQL_STMT[LKT_MAX_SQLITE_STATEMENT];
@@ -222,7 +222,7 @@ error:
 }
 
 bool
-database_search_listplaylist_init(volatile sqlite3 *db, struct lkt_search *ret)
+database_search_listplaylist_init(lkt_db *db, struct lkt_search *ret)
 {
     static const char *SQL = "SELECT name FROM playlist LIMIT %d OFFSET %d;";
     char SQL_STMT[LKT_MAX_SQLITE_STATEMENT];
@@ -239,7 +239,7 @@ error:
 }
 
 bool
-database_search_sticker_init(volatile sqlite3 *db, struct lkt_search *ret)
+database_search_sticker_init(lkt_db *db, struct lkt_search *ret)
 {
     if (__check_sticker_type(ret->st.type)) {
         LOG_ERROR("DB", "Type '%s' is invalid", ret->st.type);
@@ -284,7 +284,7 @@ error:
 }
 
 bool
-database_search_queue_init(volatile sqlite3 *db, struct lkt_search *ret)
+database_search_queue_init(lkt_db *db, struct lkt_search *ret)
 {
     RETURN_UNLESS(ret, "Exit because return pointer is NULL", false);
     static const char *SQL_STMT_TEMPLATE = "WITH content AS ("
@@ -371,7 +371,7 @@ end:
 }
 
 bool
-database_kara_by_id(volatile sqlite3 *db, int id, struct kara_metadata *res, char filepath[PATH_MAX])
+database_kara_by_id(lkt_db *db, int id, struct kara_metadata *res, char filepath[PATH_MAX])
 {
     static const char *SQL = "SELECT song_name, source_name, category, language, author_name, "
                              "song_type, song_number, file_path FROM kara WHERE id = ?;";
@@ -399,7 +399,7 @@ error:
 }
 
 PRIVATE_FUNCTION void
-___get_all_kara(volatile sqlite3 *db, int **ret_ids, size_t *ret_ids_len, const char *SQL_DATA, const char *SQL_COUNT)
+___get_all_kara(lkt_db *db, int **ret_ids, size_t *ret_ids_len, const char *SQL_DATA, const char *SQL_COUNT)
 {
     sqlite3_stmt *stmt = NULL;
     size_t index       = 0;
@@ -442,7 +442,7 @@ error:
 }
 
 void
-database_get_all_non_cached_kara(volatile sqlite3 *db, int **ret_ids, size_t *ret_ids_len)
+database_get_all_non_cached_kara(lkt_db *db, int **ret_ids, size_t *ret_ids_len)
 {
     static const char *SQL_DATA  = "SELECT id FROM kara WHERE cached_mtime = 0 OR cached_duration = 0;";
     static const char *SQL_COUNT = "SELECT count(id) FROM kara WHERE cached_mtime = 0 OR cached_duration = 0;";
@@ -450,7 +450,7 @@ database_get_all_non_cached_kara(volatile sqlite3 *db, int **ret_ids, size_t *re
 }
 
 void
-database_get_all_cached_kara(volatile sqlite3 *db, int **ret_ids, size_t *ret_ids_len)
+database_get_all_cached_kara(lkt_db *db, int **ret_ids, size_t *ret_ids_len)
 {
     static const char *SQL_DATA  = "SELECT kara_id FROM kara_cache;";
     static const char *SQL_COUNT = "SELECT count(kara_id) FROM kara_cache;";
diff --git a/src/database/open.c b/src/database/open.c
index 705dd1a956615d5736ce47ded589d9f9394b9f54..ff1be74c36cf8e9fc49819c815bc6bdf42aa2c59 100644
--- a/src/database/open.c
+++ b/src/database/open.c
@@ -26,7 +26,7 @@ sqlite3_hard_heap_limit64(sqlite3_int64 UNUSED limit)
 #endif
 
 struct named_db {
-    volatile sqlite3 *db;
+    lkt_db *db;
     const char *name;
 };
 static struct stack db_stack;
@@ -34,7 +34,7 @@ static int db_stack_init   = 0;
 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
 
 PRIVATE_FUNCTION void
-___dec(volatile sqlite3 *db, const char *name)
+___dec(lkt_db *db, const char *name)
 {
     char SQL[LKT_MAX_SQLITE_STATEMENT];
     safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, "UPDATE %s.misc SET opened = 0;", name);
@@ -63,7 +63,7 @@ database_close_all(void)
 }
 
 PRIVATE_FUNCTION void
-___inc(volatile sqlite3 *db, const char *name, bool check)
+___inc(lkt_db *db, const char *name, bool check)
 {
     SQLITE_EXEC(db, "UPDATE misc SET opened = (SELECT opened + 1 FROM misc);", error);
 
@@ -85,7 +85,7 @@ error:
 }
 
 bool
-database_new(volatile sqlite3 **db)
+database_new(lkt_db **db)
 {
     *db              = NULL;
     static int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_SHAREDCACHE | SQLITE_OPEN_NOFOLLOW | SQLITE_OPEN_FULLMUTEX;
@@ -113,7 +113,7 @@ err_pragma:
 }
 
 PRIVATE_FUNCTION bool
-___attach(volatile sqlite3 *db, const char *name, const char *path)
+___attach(lkt_db *db, const char *name, const char *path)
 {
     static const char SQL_ATTACH_TEMPLATE[] = "ATTACH '%s' AS '%s';";
     char SQL_ATTACH[LKT_MAX_SQLITE_STATEMENT];
@@ -128,7 +128,7 @@ err_no_attach:
 }
 
 PRIVATE_FUNCTION bool
-___detach(volatile sqlite3 *db, const char *name)
+___detach(lkt_db *db, const char *name)
 {
     static const char SQL_DETACH_TEMPLATE[] = "DETACH '%s';\n";
     char SQL_DETACH[LKT_MAX_SQLITE_STATEMENT];
@@ -143,7 +143,7 @@ err_no_detach:
 }
 
 PRIVATE_FUNCTION bool
-__check_schema(volatile sqlite3 *db)
+__check_schema(lkt_db *db)
 {
     static const char *SQL = "SELECT COUNT(name)"
                              " FROM sqlite_master"
@@ -166,7 +166,7 @@ error:
 }
 
 PRIVATE_FUNCTION bool
-___is_attached(volatile sqlite3 *db, const char *name)
+___is_attached(lkt_db *db, const char *name)
 {
     static const char *SQL_STMT = "SELECT name FROM pragma_database_list WHERE name = ?;\n";
     sqlite3_stmt *stmt          = NULL;
@@ -182,7 +182,7 @@ error:
 }
 
 PRIVATE_FUNCTION void
-___flush_cache_from_disk(volatile sqlite3 *db)
+___flush_cache_from_disk(lkt_db *db)
 {
     static const char *SQL = "INSERT INTO kara_cache (kara_id, mtime, duration, file_path, magic_error)"
                              " SELECT id, cached_mtime, cached_duration, file_path, 2"
@@ -196,7 +196,7 @@ error:
 }
 
 bool
-database_open(volatile sqlite3 *db, const char *dbpath, bool check)
+database_open(lkt_db *db, const char *dbpath, bool check)
 {
     bool retry = false;
     if (___is_sql_str_invalid(dbpath)) {
@@ -246,7 +246,7 @@ init:
 }
 
 bool
-database_attach(volatile sqlite3 *db, const char *name, const char *dbpath)
+database_attach(lkt_db *db, const char *name, const char *dbpath)
 {
     RETURN_UNLESS(strcasecmp(LKT_PROTECTED_DATABASE, name),
                   " The database " LKT_PROTECTED_DATABASE " is protected, can't attach a "
@@ -273,7 +273,7 @@ database_attach(volatile sqlite3 *db, const char *name, const char *dbpath)
 }
 
 bool
-database_detach(volatile sqlite3 *db, const char *name)
+database_detach(lkt_db *db, const char *name)
 {
     RETURN_UNLESS(strcasecmp(LKT_PROTECTED_DATABASE, name),
                   " The database " LKT_PROTECTED_DATABASE " is protected, can't detach it", false);
diff --git a/src/database/playlist.c b/src/database/playlist.c
index 3823b70b8c62865add02aa4093f9e94b073b9289..1d5809c3782bb611dcc0603a4e48b802a9675a51 100644
--- a/src/database/playlist.c
+++ b/src/database/playlist.c
@@ -5,7 +5,7 @@
 #include <lektor/internal/dbmacro.h>
 
 bool
-database_plt_touch(volatile sqlite3 *db, const char *name)
+database_plt_touch(lkt_db *db, const char *name)
 {
     static const char *SQL_STMT  = "SELECT name FROM playlist WHERE name = ?";
     static const char *SQL_TOUCH = "UPDATE playlist SET last_update = strftime('%s', 'now') WHERE name = ?";
@@ -34,7 +34,7 @@ error:
 }
 
 bool
-database_plt_create(volatile sqlite3 *db, const char *name)
+database_plt_create(lkt_db *db, const char *name)
 {
     static const char *SQL_STMT = "INSERT INTO playlist (name, last_update) "
                                   "VALUES (?, strftime('%s', 'now'));";
@@ -50,7 +50,7 @@ error:
 }
 
 bool
-database_plt_remove(volatile sqlite3 *db, const char *name)
+database_plt_remove(lkt_db *db, const char *name)
 {
     static const char *SQL_STMT = "DELETE FROM playlist WHERE name = ?;";
     sqlite3_stmt *stmt          = NULL;
@@ -65,7 +65,7 @@ error:
 }
 
 bool
-database_plt_remove_pos(volatile sqlite3 *db, const char *name, int pos)
+database_plt_remove_pos(lkt_db *db, const char *name, int pos)
 {
     static const char *SQL_STMT = "DELETE FROM kara_playlist "
                                   "WHERE playlist_id = (SELECT id FROM playlist WHERE name = ? LIMIT 1) "
@@ -83,7 +83,7 @@ error:
 }
 
 bool
-database_plt_clear(volatile sqlite3 *db, const char *name)
+database_plt_clear(lkt_db *db, const char *name)
 {
     static const char *SQL_STMT = "DELETE FROM kara_playlist "
                                   "WHERE playlist_id = (SELECT id FROM playlist WHERE name = ?);";
@@ -99,7 +99,7 @@ error:
 }
 
 bool
-database_plt_rename(volatile sqlite3 *db, const char *old_name, const char *new_name)
+database_plt_rename(lkt_db *db, const char *old_name, const char *new_name)
 {
     static const char *SQL_STMT = "UPDATE playlist SET name = ? WHERE name = ?;";
     sqlite3_stmt *stmt          = NULL;
@@ -115,7 +115,7 @@ error:
 }
 
 bool
-database_plt_export(volatile sqlite3 *db, const char *name)
+database_plt_export(lkt_db *db, const char *name)
 {
     static const char *SQL_SCHEM = "CREATE TABLE IF NOT EXISTS %s.content"
                                    "( kara_id INTEGER PRIMARY KEY NOT NULL CHECK(kara_id > 0) );";
@@ -147,7 +147,7 @@ error:
 }
 
 bool
-database_plt_import(volatile sqlite3 *db, const char *name)
+database_plt_import(lkt_db *db, const char *name)
 {
     static const char *SQL_SCHEM = "INSERT OR IGNORE INTO kara_playlist (kara_id, playlist_id)"
                                    " SELECT"
@@ -172,7 +172,7 @@ error:
 }
 
 bool
-database_plt_add_uri(volatile sqlite3 *db, const char *name, struct lkt_uri *uri)
+database_plt_add_uri(lkt_db *db, const char *name, struct lkt_uri *uri)
 {
     bool sta = false;
     sqlite3_stmt *stmt;
diff --git a/src/database/queue.c b/src/database/queue.c
index 25e05e3f2ca559f5aa7bd90fbc00aca2c36107bb..3b77910ed47ea50f3974c70c652a892c51098e5a 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -5,7 +5,7 @@
 #include <lektor/internal/dbmacro.h>
 
 #define sqlite_just_exec(func, query)                                                                                  \
-    bool func(volatile sqlite3 *db)                                                                                    \
+    bool func(lkt_db *db)                                                                                    \
     {                                                                                                                  \
         SQLITE_EXEC(db, "BEGIN TRANSACTION;" query "COMMIT;", error);                                                  \
         return true;                                                                                                   \
@@ -30,7 +30,7 @@ sqlite_just_exec(database_queue_flat, "UPDATE queue SET priority = 1;");
 #undef sqlite_just_exec
 
 PRIVATE_FUNCTION void
-__queue_resequence(volatile sqlite3 *db)
+__queue_resequence(lkt_db *db)
 {
     static const char *SQL = "UPDATE " LKT_PROTECTED_DATABASE
                              ".sqlite_sequence SET seq = (SELECT COUNT(*) FROM queue) WHERE name = 'queue';";
@@ -43,7 +43,7 @@ error:
 }
 
 bool
-database_queue_set_paused(volatile sqlite3 *db, bool paused)
+database_queue_set_paused(lkt_db *db, bool paused)
 {
     const char *SQL = paused ? "UPDATE queue_state SET paused = 1;" : "UPDATE queue_state SET paused = 0;";
     SQLITE_EXEC(db, SQL, error);
@@ -53,7 +53,7 @@ error:
 }
 
 bool
-database_queue_state(volatile sqlite3 *db, struct lkt_queue_state *res)
+database_queue_state(lkt_db *db, struct lkt_queue_state *res)
 {
     static const char *SQL_STMT = "SELECT"
                                   " volume, paused, random, repeat, single, current, duration, consume,"
@@ -90,7 +90,7 @@ error:
 }
 
 void
-database_queue_playtime(volatile sqlite3 *db, uint64_t *seconds)
+database_queue_playtime(lkt_db *db, uint64_t *seconds)
 {
     static const char *SQL = "SELECT SUM(cached_duration) "
                              "FROM kara "
@@ -106,7 +106,7 @@ error:
 }
 
 void
-database_total_playtime(volatile sqlite3 *db, uint64_t *seconds)
+database_total_playtime(lkt_db *db, uint64_t *seconds)
 {
     static const char *SQL = "SELECT SUM(cached_duration) FROM kara;";
     sqlite3_stmt *stmt     = NULL;
@@ -120,7 +120,7 @@ error:
 }
 
 bool
-database_queue_current_kara(volatile sqlite3 *db, struct kara_metadata *res, int *id)
+database_queue_current_kara(lkt_db *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"
@@ -168,7 +168,7 @@ error:
     }
 
 static bool
-__queue_reorder(volatile sqlite3 *db)
+__queue_reorder(lkt_db *db)
 {
 #define CURRENT_POS_OR_0 /* To move karas after the current */                                                         \
     "(SELECT CASE WHEN (SELECT current FROM queue_state) IS NULL THEN 0"                                               \
@@ -199,7 +199,7 @@ error:
 }
 
 static bool
-queue_add_with_col_like_str(volatile sqlite3 *db, const char *col, const char *val, int priority)
+queue_add_with_col_like_str(lkt_db *db, const char *col, const char *val, int priority)
 {
     static const char *SQL_STMT =
         /* Add correspondig karas into the queue */
@@ -241,7 +241,7 @@ error:
 }
 
 bool
-database_queue_add_plt(volatile sqlite3 *db, const char *plt_name, int priority)
+database_queue_add_plt(lkt_db *db, const char *plt_name, int priority)
 {
     static const char *SQL_STMT =
         /* Insert the playlist */
@@ -277,7 +277,7 @@ error:
 }
 
 bool
-database_queue_add_id(volatile sqlite3 *db, int id, int priority)
+database_queue_add_id(lkt_db *db, int id, int priority)
 {
     static const char *SQL_STMT = "INSERT INTO queue (kara_id, priority) VALUES (?,?);";
     sqlite3_stmt *stmt          = NULL;
@@ -302,7 +302,7 @@ error_no_stmt:
 }
 
 bool
-database_queue_add_uri(volatile sqlite3 *db, struct lkt_uri *uri, int prio)
+database_queue_add_uri(lkt_db *db, struct lkt_uri *uri, int prio)
 {
     switch (uri->type) {
     case URI_QUERY:
@@ -333,7 +333,7 @@ database_queue_add_uri(volatile sqlite3 *db, struct lkt_uri *uri, int prio)
 }
 
 bool
-database_queue_del_id(volatile sqlite3 *db, int id)
+database_queue_del_id(lkt_db *db, int id)
 {
     static const char *SQL_TEMPLATE =
         "BEGIN TRANSACTION;"
@@ -363,7 +363,7 @@ error:
 }
 
 bool
-database_queue_del_pos(volatile sqlite3 *db, int pos)
+database_queue_del_pos(lkt_db *db, int pos)
 {
     bool sta                     = false;
     sqlite3_stmt *stmt           = NULL;
@@ -431,7 +431,7 @@ error_no_rollback:
 }
 
 bool
-database_queue_next(volatile sqlite3 *db, char filepath[PATH_MAX])
+database_queue_next(lkt_db *db, char filepath[PATH_MAX])
 {
     static const char *SQL_STMT =
         "SELECT file_path, position, RANDOM()"
@@ -483,7 +483,7 @@ error:
 }
 
 bool
-database_queue_skip_current(volatile sqlite3 *db, char filepath[PATH_MAX])
+database_queue_skip_current(lkt_db *db, char filepath[PATH_MAX])
 {
     if (database_queue_next(db, filepath))
         return true;
@@ -496,7 +496,7 @@ database_queue_skip_current(volatile sqlite3 *db, char filepath[PATH_MAX])
 }
 
 bool
-database_queue_prev(volatile sqlite3 *db, char filepath[PATH_MAX])
+database_queue_prev(lkt_db *db, char filepath[PATH_MAX])
 {
     static const char *SQL_STMT = "SELECT file_path, position "
                                   "  FROM kara"
@@ -544,7 +544,7 @@ error:
 }
 
 bool
-database_queue_swap(volatile sqlite3 *db, int from, int to)
+database_queue_swap(lkt_db *db, int from, int to)
 {
     static const char *SQL_POP_ROW_1 = "SELECT position, priority, kara_id FROM queue WHERE position = ?;";
     static const char *SQL_POP_ROW_2 = "DELETE FROM queue WHERE position = ?;";
@@ -610,7 +610,7 @@ error_no_rollback:
 }
 
 bool
-database_queue_move(volatile sqlite3 *db, int from, int to)
+database_queue_move(lkt_db *db, int from, int to)
 {
     static const char *SQL_TEMPLATE_PART_1 =
         /* Clean queue_tmp */
@@ -679,7 +679,7 @@ error_no_rollback:
 }
 
 bool
-database_queue_play(volatile sqlite3 *db, int pos)
+database_queue_play(lkt_db *db, int pos)
 {
     static const char *SQL_STMT = "UPDATE queue_state SET current = ?, paused = 0"
                                   "  WHERE current <= 0 OR current IS NULL";
@@ -704,7 +704,7 @@ error:
 }
 
 bool
-database_queue_set_current_index(volatile sqlite3 *db, int idx)
+database_queue_set_current_index(lkt_db *db, int idx)
 {
     static const char *SQL_GET_TEMPLATE = "UPDATE queue_state SET current = %d;";
     char SQL_GET[LKT_MAX_SQLITE_STATEMENT];
@@ -725,7 +725,7 @@ error:
 }
 
 bool
-database_queue_get_current_file(volatile sqlite3 *db, char filepath[PATH_MAX])
+database_queue_get_current_file(lkt_db *db, char filepath[PATH_MAX])
 {
     static const char *SQL_STMT = "SELECT file_path"
                                   "  FROM kara"
@@ -759,7 +759,7 @@ error:
 }
 
 bool
-database_get_kara_path(volatile sqlite3 *db, int id, char filepath[PATH_MAX])
+database_get_kara_path(lkt_db *db, int id, char filepath[PATH_MAX])
 {
     bool ret_code          = false;
     sqlite3_stmt *stmt     = NULL;
@@ -777,7 +777,7 @@ error:
 }
 
 bool
-database_get_kara_id(volatile sqlite3 *db, char filepath[PATH_MAX], int *id)
+database_get_kara_id(lkt_db *db, char filepath[PATH_MAX], int *id)
 {
     bool ret_code          = false;
     sqlite3_stmt *stmt     = NULL;
@@ -795,7 +795,7 @@ error:
 }
 
 bool
-database_get_kara_position(volatile sqlite3 *db, int id, int *pos)
+database_get_kara_position(lkt_db *db, int id, int *pos)
 {
     bool ret_code          = false;
     sqlite3_stmt *stmt     = NULL;
@@ -817,7 +817,7 @@ error:
 }
 
 int
-database_queue_probe_id(volatile sqlite3 *db, int id)
+database_queue_probe_id(lkt_db *db, int id)
 {
     int position           = 0; /* The queue begins with the position 1 */
     sqlite3_stmt *stmt     = NULL;
@@ -832,7 +832,7 @@ error:
 }
 
 bool
-database_queue_shuffle(volatile sqlite3 *db)
+database_queue_shuffle(lkt_db *db)
 {
     const char *SQL = "BEGIN TRANSACTION;"
                       /* Create temporary queue */
@@ -876,7 +876,7 @@ error:
 }
 
 bool
-database_queue_list(volatile sqlite3 *db, size_t from, size_t to, struct lkt_callback *callback)
+database_queue_list(lkt_db *db, size_t from, size_t to, struct lkt_callback *callback)
 {
     const char *SQL_STMT =
         "WITH content AS ("
@@ -928,7 +928,7 @@ error:
 }
 
 bool
-database_queue_dump(volatile sqlite3 *db, const char *plt_name)
+database_queue_dump(lkt_db *db, const char *plt_name)
 {
     static const char *SQL = "WITH plt_id AS (SELECT playlist.id AS id FROM playlist"
                              " WHERE name COLLATE nocase = ?) "
@@ -948,7 +948,7 @@ error:
 }
 
 bool
-database_queue_seekid(volatile sqlite3 *db, int id, int *out_pos)
+database_queue_seekid(lkt_db *db, int id, int *out_pos)
 {
     static const char *SQL_STMT = "SELECT position FROM queue WHERE kara_id = ? LIMIT 1";
     int ret                     = 0;
diff --git a/src/database/stickers.c b/src/database/stickers.c
index aa4079c02d4297eeaa6665442c8a276b6ceb8c44..3271a2186cbde931c83021964d8278b66fd3311f 100644
--- a/src/database/stickers.c
+++ b/src/database/stickers.c
@@ -11,7 +11,7 @@ __check_type(const char *type)
 }
 
 bool
-database_sticker_create(volatile sqlite3 *db, const char *name)
+database_sticker_create(lkt_db *db, const char *name)
 {
     static const char *INSERT = "INSERT INTO 'stickers' (id, name)"
                                 " SELECT CASE WHEN MAX(id) IS NULL THEN 1 ELSE MAX(id) + 1 END, ?"
@@ -32,7 +32,7 @@ error:
 }
 
 bool
-database_sticker_delete(volatile sqlite3 *db, const char *name)
+database_sticker_delete(lkt_db *db, const char *name)
 {
     static const char *INSERT = "DELETE FROM 'stickers' WHERE name = ?;";
     sqlite3_stmt *stmt;
@@ -49,7 +49,7 @@ error:
 }
 
 bool
-database_sticker_set(volatile sqlite3 *db, const char *type, const char *name, int uri, int value)
+database_sticker_set(lkt_db *db, const char *type, const char *name, int uri, int value)
 {
     static const char *SQL_TEMPLATE = "INSERT OR REPLACE INTO 'stickers.%s' (id, sticker, value) "
                                       "SELECT ?, 'stickers'.id, ? "
@@ -84,7 +84,7 @@ error:
 }
 
 bool
-database_sticker_delete_specify(volatile sqlite3 *db, const char *type, int uri, const char *name)
+database_sticker_delete_specify(lkt_db *db, const char *type, int uri, const char *name)
 {
     char SQL[LKT_MAX_SQLITE_STATEMENT];
     sqlite3_stmt *stmt;
diff --git a/src/database/update.c b/src/database/update.c
index d6d8618017d8f70eb498cb98594b74ecb5550b11..09235c94716f76a475ea41112fa6b01b1c8072d4 100644
--- a/src/database/update.c
+++ b/src/database/update.c
@@ -7,7 +7,7 @@
 #include <dirent.h>
 
 PRIVATE_FUNCTION bool
-___add_kara_to_update_job(volatile sqlite3 *db, size_t id)
+___add_kara_to_update_job(lkt_db *db, size_t id)
 {
     char SQL[LKT_MAX_SQLITE_STATEMENT];
 
@@ -33,7 +33,7 @@ error:
 }
 
 PRIVATE_FUNCTION bool
-___is_id_in_database(volatile sqlite3 *db, size_t id)
+___is_id_in_database(lkt_db *db, size_t id)
 {
     static const char *SQL = "SELECT id FROM kara WHERE id = ?;";
     sqlite3_stmt *stmt     = NULL;
@@ -48,7 +48,7 @@ error:
 }
 
 PRIVATE_FUNCTION void
-___flush_cache_from_disk(volatile sqlite3 *db, const char *filename)
+___flush_cache_from_disk(lkt_db *db, const char *filename)
 {
     static const char *SQL = "INSERT OR REPLACE INTO kara_cache (kara_id, file_path)"
                              " SELECT id, file_path"
@@ -68,7 +68,7 @@ error:
 }
 
 PRIVATE_FUNCTION bool
-___database_add_kara(volatile sqlite3 *db, const char *filename)
+___database_add_kara(lkt_db *db, const char *filename)
 {
     RETURN_UNLESS(db || filename, "Invalid argument", false);
     static const char *SQL_STMT = "INSERT INTO "
@@ -155,7 +155,7 @@ error:
 }
 
 void
-database_update_set_new(volatile sqlite3 *db, int id, bool is_new)
+database_update_set_new(lkt_db *db, int id, bool is_new)
 {
     sqlite3_stmt *stmt     = NULL;
     static const char *SQL = "UPDATE kara SET is_new = ? WHERE id = ?;";
@@ -168,7 +168,7 @@ error:
 }
 
 bool
-database_update_add(volatile sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail)
+database_update_add(lkt_db *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail)
 {
     RETURN_UNLESS(db && kara_path && mdt && id, "Invalid argument", false);
     static const char *SQL_STMT = "INSERT OR REPLACE INTO kara (song_name, source_name, category, "
@@ -208,7 +208,7 @@ error:
 }
 
 bool
-database_update(volatile sqlite3 *db, const char *kara_dir, int check_timestamp)
+database_update(lkt_db *db, const char *kara_dir, int check_timestamp)
 {
     DIR *d;
     struct dirent *dir;
@@ -252,7 +252,7 @@ database_update(volatile sqlite3 *db, const char *kara_dir, int check_timestamp)
 }
 
 void
-database_deleted_kara(volatile sqlite3 *db, int **kara_id, size_t *len)
+database_deleted_kara(lkt_db *db, int **kara_id, size_t *len)
 {
     static const char *SQL = "SELECT kara.id, file_path FROM kara WHERE kara.id NOT IN"
                              "(SELECT kara_id FROM updates JOIN misc ON job = update_job);";
@@ -280,7 +280,7 @@ out:
 }
 
 void
-database_get_update(volatile sqlite3 *db, long *timestamp, long *job, int *current)
+database_get_update(lkt_db *db, long *timestamp, long *job, int *current)
 {
     sqlite3_stmt *stmt     = NULL;
     static const char *SQL = "SELECT last_update, update_job, last_update > last_end_update "
@@ -301,13 +301,13 @@ error:
 }
 
 void
-database_update_touch(volatile sqlite3 *db, int id)
+database_update_touch(lkt_db *db, int id)
 {
     ___add_kara_to_update_job(db, id);
 }
 
 void
-database_update_del(volatile sqlite3 *db, int id)
+database_update_del(lkt_db *db, int id)
 {
     static const char *SQL = "DELETE FROM kara WHERE id = ?;";
     sqlite3_stmt *stmt     = NULL;
@@ -321,7 +321,7 @@ error:
 }
 
 bool
-database_stats(volatile sqlite3 *db, int *authors, int *sources, int *karas)
+database_stats(lkt_db *db, int *authors, int *sources, int *karas)
 {
     static const char *SQL = "SELECT"
                              " (SELECT COUNT(DISTINCT author_name) FROM kara),"
@@ -344,7 +344,7 @@ error:
 }
 
 LKT_DATABASE_VERSION
-database_get_version(volatile sqlite3 *db)
+database_get_version(lkt_db *db)
 {
     static const char *SQL   = "SELECT version FROM " LKT_PROTECTED_DATABASE ".misc;";
     sqlite3_stmt *stmt       = NULL;
@@ -367,7 +367,7 @@ error:
 }
 
 #define sqlite_just_exec(func, query)                                                                                  \
-    void func(volatile sqlite3 *db)                                                                                    \
+    void func(lkt_db *db)                                                                                    \
     {                                                                                                                  \
         SQLITE_EXEC(db, query, error);                                                                                 \
     error:                                                                                                             \
diff --git a/src/database/user.c b/src/database/user.c
index 693e7755bffd0ac5909976faceb4f471c79d66e5..c6fcfb86477d46bf5269084385108c7f9322def2 100644
--- a/src/database/user.c
+++ b/src/database/user.c
@@ -5,7 +5,7 @@
 #include <lektor/internal/dbmacro.h>
 
 bool
-database_user_authentificate(volatile sqlite3 *db, const char *password)
+database_user_authentificate(lkt_db *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(volatile sqlite3 *db, const char *username, const char *password)
+database_user_add(lkt_db *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/luka.c b/src/main/luka.c
index 92926adcc857c4b65ceb92aa2f9316bb612e8bd5..552f14ad48c8cf86543bd7bc55648978a78bdba0 100644
--- a/src/main/luka.c
+++ b/src/main/luka.c
@@ -62,7 +62,7 @@ ___setup(void)
     lkt_queue_new(&__queue);
     reg_export(luka_reg);
 
-    FAIL_UNLESS(database_new((volatile sqlite3 **)&__db), "Can't init sqlite database");
+    FAIL_UNLESS(database_new((lkt_db **)&__db), "Can't init sqlite database");
     FAIL_IF(config_detect_file(path, PATH_MAX), "Can't find a config file, did you run lektord at least once?");
     FAIL_IF(config_new(__db, path), "Failed to read the config");
 
@@ -156,7 +156,7 @@ ___callback_list_row(struct lkt_state UNUSED *srv, size_t UNUSED c, int id, int
 }
 
 /* Init database search function */
-typedef bool (*___init_search_function)(volatile sqlite3 *, struct lkt_search *);
+typedef bool (*___init_search_function)(lkt_db *, struct lkt_search *);
 
 PRIVATE_FUNCTION void
 ___iter_search(___init_search_function init_function, struct lkt_search *search)
@@ -165,7 +165,7 @@ ___iter_search(___init_search_function init_function, struct lkt_search *search)
     struct lkt_search *new_search = database_search_new_from(search);
 
 redo_search_for_continuation:
-    FAIL_UNLESS(init_function((volatile sqlite3 *)__db, search), "Failed to init search for database");
+    FAIL_UNLESS(init_function((lkt_db *)__db, search), "Failed to init search for database");
 
     for (count = 0; database_search_iter(search); ++count)
         continue;
diff --git a/src/module/module_repo.c b/src/module/module_repo.c
index cf4403619de12033bdc6f824aa41b7bbb2f56691..d3276b6761e5bc01532fd998b62c45bf455c75be 100644
--- a/src/module/module_repo.c
+++ b/src/module/module_repo.c
@@ -26,7 +26,7 @@ struct kara {
     bool is_new;
     int ignored_count;
     int update_count;
-    volatile sqlite3 *db;
+    lkt_db *db;
     struct module_repo_internal *repo;
     size_t kara_dir_len;
     long id;
@@ -55,7 +55,7 @@ struct module_repo_internal {
 
     /* The database and the queue */
     struct queue *queue;
-    volatile sqlite3 *db;
+    lkt_db *db;
 
     /* Craft a filename for newly downloaded karas. Arguments:
      * - str: the destination string, the prefix, i.e. the kara_dir, is already here
@@ -449,7 +449,7 @@ ___handle_got_json_internal_callback(const char *key, const char *val, int comp,
 }
 
 PRIVATE_FUNCTION int
-___handle_got_json(volatile sqlite3 *db, struct module_repo_internal *repo, const char *json)
+___handle_got_json(lkt_db *db, struct module_repo_internal *repo, const char *json)
 {
     size_t len       = json_parse_get_count(json, 2);
     struct kara kara = {
@@ -486,7 +486,7 @@ ___handle_got_json(volatile sqlite3 *db, struct module_repo_internal *repo, cons
 }
 
 PRIVATE_FUNCTION void
-___handle_deleted_kara(volatile sqlite3 *db, struct queue *queue)
+___handle_deleted_kara(lkt_db *db, struct queue *queue)
 {
     size_t len, i;
     int *kara_ids;
@@ -726,7 +726,7 @@ module_repo_close(struct module_repo_internal *repo)
 }
 
 PRIVATE_FUNCTION bool
-module_repo_new(struct module_repo_internal *repo_, struct queue *queue, volatile sqlite3 *db)
+module_repo_new(struct module_repo_internal *repo_, struct queue *queue, lkt_db *db)
 {
     RETURN_UNLESS(repo_ && queue && db, "Invalid argument", 1);
     if (!___curl_init) {
@@ -800,7 +800,7 @@ mod_new(va_list *va)
     va_copy(copy, *va);
     repo                 = (struct module_repo_internal **)va_arg(copy, void **);
     struct queue *queue  = va_arg(copy, struct queue *);
-    volatile sqlite3 *db = va_arg(copy, volatile sqlite3 *);
+    lkt_db *db = va_arg(copy, lkt_db *);
 
     if (NULL != *repo) {
         LOG_ERROR("REPO", "Can't init two times the module");
diff --git a/src/module/module_sdl2.c b/src/module/module_sdl2.c
index 1f24b316011064f510a1f673d81c2e9007a8295e..91aa7c164b273abefeb644ce850d0a2ebd1f9957 100644
--- a/src/module/module_sdl2.c
+++ b/src/module/module_sdl2.c
@@ -8,7 +8,6 @@
 
 #include <lektor/internal/icon.xpm>
 
-#include <sqlite3.h>
 #include <sched.h>
 #include <SDL.h>
 #include <SDL_image.h>
@@ -41,7 +40,7 @@ struct module_sdl2_window {
 
     /* Things from the server */
     struct queue *queue;
-    volatile sqlite3 *db;
+    lkt_db *db;
 };
 
 /************************
@@ -57,7 +56,7 @@ static bool module_sdl2_load_file(struct module_sdl2_window *, const char *);
 static bool module_sdl2_toggle_pause(struct module_sdl2_window *);
 static void module_sdl2_free(struct module_sdl2_window *);
 static void module_sdl2_close(struct module_sdl2_window *);
-static bool module_sdl2_new(struct module_sdl2_window **, struct queue *, volatile sqlite3 *);
+static bool module_sdl2_new(struct module_sdl2_window **, struct queue *, lkt_db *);
 
 /*********************
  * Private functions *
@@ -84,7 +83,7 @@ on_mpv_render_update(void UNUSED *ctx)
 }
 
 static inline bool
-init_mpv__(mpv_handle **ctx, volatile sqlite3 *db)
+init_mpv__(mpv_handle **ctx, lkt_db *db)
 {
     *ctx = lmpv_prepare(db);
     int status;
@@ -123,7 +122,7 @@ mod_new(va_list *va)
     va_copy(copy, *va);
     win                  = (struct module_sdl2_window **)va_arg(copy, void **);
     struct queue *queue  = va_arg(copy, struct queue *);
-    volatile sqlite3 *db = va_arg(copy, volatile sqlite3 *);
+    lkt_db *db = va_arg(copy, lkt_db *);
     bool ret             = module_sdl2_new(win, queue, db);
     va_end(copy);
     return !ret;
@@ -466,7 +465,7 @@ end:
 }
 
 static bool
-module_sdl2_new(struct module_sdl2_window **win, struct queue *queue, volatile sqlite3 *db)
+module_sdl2_new(struct module_sdl2_window **win, struct queue *queue, lkt_db *db)
 {
     RETURN_UNLESS(win, "Invalid arguments", false);
     struct poller_thread_arg *arg;
diff --git a/src/module/mpv.c b/src/module/mpv.c
index af1f9d7d53c0486c5f8f41c28f703039927e8069..9180633cde25b5edc238dd355cfa0474176971d3 100644
--- a/src/module/mpv.c
+++ b/src/module/mpv.c
@@ -4,7 +4,6 @@
 
 #include <lektor/common.h>
 #include <lektor/database.h>
-#include <sqlite3.h>
 
 void
 lmpv_free(mpv_handle **ctx)
@@ -18,7 +17,7 @@ lmpv_free(mpv_handle **ctx)
 }
 
 mpv_handle *
-lmpv_prepare(volatile sqlite3 *db)
+lmpv_prepare(lkt_db *db)
 {
     mpv_handle *ctx = mpv_create();
     int status;
@@ -79,7 +78,7 @@ lmpv_observe_properties(mpv_handle *ctx)
 }
 
 mpv_handle *
-lmpv_new(unsigned long int wid, volatile sqlite3 *db)
+lmpv_new(unsigned long int wid, lkt_db *db)
 {
     mpv_handle *ctx = lmpv_prepare(db);
     int status;
diff --git a/src/module/mpv.h b/src/module/mpv.h
index f493a1c873862f107d690c35c8e0933cefc38626..ce6c0162cc9d77604d86d8937c14217776f7c3ef 100644
--- a/src/module/mpv.h
+++ b/src/module/mpv.h
@@ -4,12 +4,12 @@
 #include <lektor/common.h>
 #include <lektor/queue.h>
 #include <lektor/reg.h>
-#include <sqlite3.h>
+#include <lektor/database.h>
 
 void lmpv_free(mpv_handle **ctx);
-mpv_handle *lmpv_new(unsigned long int wid, volatile sqlite3 *db);
+mpv_handle *lmpv_new(unsigned long int wid, lkt_db *db);
 int lmpv_observe_properties(mpv_handle *ctx);
-mpv_handle *lmpv_prepare(volatile sqlite3 *db);
+mpv_handle *lmpv_prepare(lkt_db *db);
 
 int lmpv_set_volume(mpv_handle *ctx, int vol);
 int lmpv_set_position(mpv_handle *ctx, int pos);
diff --git a/src/net/listen.c b/src/net/listen.c
index f3e1fe33a9c8c9870dbcf4736fbc37dcfbc4628b..b578fb81dfc70098ca82aa5510dfcb84b99337fa 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -7,7 +7,6 @@
 #include <lektor/net.h>
 #include <lektor/reg.h>
 
-#include <sqlite3.h>
 #include <signal.h>
 #include <sched.h>
 #include <netdb.h>