diff --git a/inc/lektor/database.h b/inc/lektor/database.h
index ba391483aa122e89a8a233bc3ccd330c6e50ee11..4a3d99216e0657adc39def250356ebedee9d9008 100644
--- a/inc/lektor/database.h
+++ b/inc/lektor/database.h
@@ -74,12 +74,11 @@ void database_get_all_non_cached_kara(volatile sqlite3 *db, int **ret_ids, size_
 void database_get_all_cached_kara(volatile sqlite3 *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);
-bool database_update_set_available(volatile sqlite3 *db, int id);
-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        (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);
 
 /* Control the content of the queue. */
 bool database_queue_add_uri(volatile sqlite3 *db, struct lkt_uri *uri, int priority);
diff --git a/inc/lektor/queue.h b/inc/lektor/queue.h
index b95998072152234373dc3b4fee258459fe1bfdc3..6202754be9446818ee56bd5664ffb5302fa64687 100644
--- a/inc/lektor/queue.h
+++ b/inc/lektor/queue.h
@@ -48,13 +48,15 @@ typedef enum {
     LKT_EVENT_DB_UPDATING     = (1 << 10), // size_t, `LKT_DB_UPDATING_*`
     LKT_EVENT_DB_UPDATE_TOTAL = (1 << 11), // size_t, increments udapte_total
     LKT_EVENT_DB_UPDATE_TICK  = (1 << 12), // NULL, increment the `update_current`
+    LKT_EVENT_TOUCH_KARA      = (1 << 13), // size_t, kara id
 } LKT_EVENT_TYPE;
 
 #define LKT_EVENT_PLAY                                                                                                 \
     (LKT_EVENT_PLAY_POS | LKT_EVENT_PLAY_FILE | LKT_EVENT_PLAY_NEXT | LKT_EVENT_PLAY_PREV | LKT_EVENT_PLAY_TOGGLE |    \
      LKT_EVENT_SKIP_CURRENT)
-#define LKT_EVENT_PROP   (LKT_EVENT_PROP_VOL | LKT_EVENT_PROP_DUR | LKT_EVENT_PROP_TIME)
-#define LKT_EVENT_UPDATE (LKT_EVENT_DB_UPDATING | LKT_EVENT_DB_UPDATE_TICK | LKT_EVENT_DB_UPDATE_TOTAL)
+#define LKT_EVENT_PROP (LKT_EVENT_PROP_VOL | LKT_EVENT_PROP_DUR | LKT_EVENT_PROP_TIME)
+#define LKT_EVENT_UPDATE                                                                                               \
+    (LKT_EVENT_DB_UPDATING | LKT_EVENT_DB_UPDATE_TICK | LKT_EVENT_DB_UPDATE_TOTAL | LKT_EVENT_TOUCH_KARA)
 
 typedef struct {
     unsigned int type;
diff --git a/src/database/update.c b/src/database/update.c
index bde26c4266df687cd9b478927ff808543c12a4bb..d6d8618017d8f70eb498cb98594b74ecb5550b11 100644
--- a/src/database/update.c
+++ b/src/database/update.c
@@ -9,20 +9,25 @@
 PRIVATE_FUNCTION bool
 ___add_kara_to_update_job(volatile sqlite3 *db, size_t id)
 {
-    const char *SQL = NULL;
-    sqlite3_stmt *stmt;
+    char SQL[LKT_MAX_SQLITE_STATEMENT];
+
     if (id) {
-        SQL = "INSERT INTO updates (job, kara_id) "
-              "SELECT MAX(update_job), ? FROM misc;";
-        SQLITE_PREPARE(db, stmt, SQL, error);
-        SQLITE_BIND_INT(db, stmt, 1, (int)id, error);
-    } else {
-        SQL = "INSERT INTO updates (job, kara_id) "
-              "SELECT MAX(update_job), last_insert_rowid() FROM misc;";
-        SQLITE_PREPARE(db, stmt, SQL, error);
+        static const char *SQL_TEMP = "INSERT INTO updates (job, kara_id) "
+                                      "SELECT MAX(update_job), %ld FROM misc;"
+                                      "UPDATE kara SET available = 1 WHERE id = %ld;";
+        safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMP, id, id);
     }
-    sqlite3_step(stmt); /* Ignore result of that one */
+
+    else {
+        static const char *SQL_TEMP = "INSERT INTO updates (job, kara_id) "
+                                      "SELECT MAX(update_job), last_insert_rowid() FROM misc;"
+                                      "UPDATE kara SET available = 1 WHERE id = last_insert_rowid();";
+        safe_strncpy(SQL, SQL_TEMP, LKT_MAX_SQLITE_STATEMENT);
+    }
+
+    SQLITE_EXEC(db, SQL, error);
     return true;
+
 error:
     return false;
 }
@@ -149,23 +154,6 @@ error:
     return status;
 }
 
-bool
-database_update_set_available(volatile sqlite3 *db, int id)
-{
-    static const char *SQL_STMT = "UPDATE kara SET available = 1 WHERE id = ?;";
-    sqlite3_stmt *stmt;
-    SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-    SQLITE_BIND_INT(db, stmt, 1, id, error);
-    if (sqlite3_step(stmt) != SQLITE_DONE)
-        goto error;
-    sqlite3_finalize(stmt);
-    return true;
-error:
-    sqlite3_finalize(stmt);
-    LOG_ERROR("DB", "Failed to set kara %d available", id);
-    return false;
-}
-
 void
 database_update_set_new(volatile sqlite3 *db, int id, bool is_new)
 {
diff --git a/src/module/module_repo.c b/src/module/module_repo.c
index f41d6acb1b18d27df1b30d848177089c8c8eccb3..b432daf0ecb089f1ef772dfe5258c6a139f1187c 100644
--- a/src/module/module_repo.c
+++ b/src/module/module_repo.c
@@ -350,12 +350,7 @@ ___handle_got_json_dl(struct kara *kara, int current_id)
     }
 
     database_update_set_new(kara->db, kara->id, kara->is_new);
-
-    if (!database_update_set_available(kara->db, kara->id)) {
-        LOG_WARN("REPO", "Could not set kara %ld available", kara->id);
-        return;
-    }
-
+    lkt_queue_send(kara->repo->queue, LKT_EVENT_TOUCH_KARA, (void *)(size_t)kara->id);
     database_stamp(kara->db);
     ++(kara->update_count);
     LOG_INFO("REPO", "Added kara %ld from repo %s, filepath is %s", kara->id, kara->repo->name, kara->filename);
@@ -436,8 +431,7 @@ ___handle_got_json_internal_callback(const char *key, const char *val, int comp,
             /* Don't burn the disk */
             ___sleep();
 
-            database_update_touch(kara->db, kara->id);
-            database_update_set_available(kara->db, kara->id);
+            lkt_queue_send(kara->repo->queue, LKT_EVENT_TOUCH_KARA, (void *)(size_t)kara->id);
             lkt_queue_send(kara->repo->queue, LKT_EVENT_DB_UPDATE_TICK, NULL);
             LOG_DEBUG("REPO", "Ignore kara %ld", kara->id);
             return 0;
diff --git a/src/net/listen.c b/src/net/listen.c
index 6969f5944a19354e286624c8165d2f292facd57a..1f6ec34d9f37eb308a1a5fc2d24d2ec47a14f739 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -864,7 +864,8 @@ redo:
         free(string);
     })
 
-    __CASE(DB_UPDATE_TOTAL, { srv->update_total += (size_t)evt.attr; })
+    __CASE(TOUCH_KARA,      { database_update_touch(srv->db, (size_t)evt.attr);       })
+    __CASE(DB_UPDATE_TOTAL, { srv->update_total += (size_t)evt.attr;                  })
     __CASE(DB_UPDATING,     { srv->is_updating   = (((uint8_t)(size_t)evt.attr) > 0); })
     __CASE(DB_UPDATE_TICK, {
         if (srv->update_current != ((size_t)-1))