diff --git a/src/database/memory.sql b/src/database/memory.sql
index c249fdc6b7d6b5fa53bc026910aa8cba878cd908..61843fdd61a2c4e67e33dcfa62d73767eefe99fa 100644
--- a/src/database/memory.sql
+++ b/src/database/memory.sql
@@ -37,6 +37,7 @@ CREATE TABLE IF NOT EXISTS kara_cache
   ( kara_id     INTEGER             -- Valid kara id, can't foreign key as the disk is not loaded
   , mtime       INTEGER NOT NULL    -- Last modification date
   , duration    INTEGER NOT NULL    -- Duration of the kara
+  , file_path   TEXT    NOT NULL    -- Cached filepath
   );
 
 -- Used to store the content of the ini configuration file.
diff --git a/src/database/open.c b/src/database/open.c
index 8f45ff0e9e0f5deabf4c6245ed4f5ef056fad91a..ba91f34dd629f422782c7692f7658cb46af18ba3 100644
--- a/src/database/open.c
+++ b/src/database/open.c
@@ -175,8 +175,8 @@ error:
 PRIVATE_FUNCTION void
 ___flush_cache_from_disk(volatile sqlite3 *db)
 {
-    static const char *SQL = "INSERT INTO kara_cache (kara_id, mtime, duration)"
-                             " SELECT id, cached_mtime, cached_duration"
+    static const char *SQL = "INSERT INTO kara_cache (kara_id, mtime, duration, file_path)"
+                             " SELECT id, cached_mtime, cached_duration, file_path"
                              " FROM kara;";
     SQLITE_EXEC(db, SQL, error);
     LOG_INFO("DB", "Kara cache was flushed from disk");
diff --git a/src/database/queue.c b/src/database/queue.c
index 2dcdf87d03491c6e889147b1ca68957467866d49..25e05e3f2ca559f5aa7bd90fbc00aca2c36107bb 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -763,7 +763,7 @@ database_get_kara_path(volatile sqlite3 *db, int id, char filepath[PATH_MAX])
 {
     bool ret_code          = false;
     sqlite3_stmt *stmt     = NULL;
-    static const char *SQL = "SELECT file_path FROM kara WHERE id = ? AND available = 1;";
+    static const char *SQL = "SELECT file_path FROM kara_cache WHERE kara_id = ?;";
     RETURN_UNLESS(id && db, "Invalid argument", false);
     SQLITE_PREPARE(db, stmt, SQL, error);
     SQLITE_BIND_INT(db, stmt, 1, id, error);
diff --git a/src/database/update.c b/src/database/update.c
index 39f7f5627c4bea345296d2e290708a437e58d885..88c75cd97e8d0999f649b1b9c3ea9e0ed836ab50 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(volatile sqlite3 *db, size_t id)
 {
     const char *SQL = NULL;
     sqlite3_stmt *stmt;
@@ -28,7 +28,7 @@ error:
 }
 
 PRIVATE_FUNCTION bool
-__is_id_in_database(volatile sqlite3 *db, size_t id)
+___is_id_in_database(volatile sqlite3 *db, size_t id)
 {
     static const char *SQL = "SELECT id FROM kara WHERE id = ?;";
     sqlite3_stmt *stmt     = NULL;
@@ -42,8 +42,29 @@ error:
     return ret;
 }
 
+PRIVATE_FUNCTION void
+___flush_cache_from_disk(volatile sqlite3 *db, const char *filename)
+{
+    static const char *SQL =
+        "INSERT OR REPLACE INTO kara_cache (kara_id, file_path)"
+        " SELECT (id, file_path)"
+        " FROM kara"
+        " WHERE file_path = ?";
+    sqlite3_stmt *stmt = NULL;
+
+    SQLITE_PREPARE(db, stmt, SQL, error);
+    SQLITE_BIND_TEXT(db, stmt, 1, filename, error);
+    SQLITE_STEP_OK(db, stmt, error);
+    sqlite3_finalize(stmt);
+    return;
+
+error:
+    sqlite3_finalize(stmt);
+    return;
+}
+
 PRIVATE_FUNCTION bool
-__database_add_kara(volatile sqlite3 *db, const char *filename)
+___database_add_kara(volatile sqlite3 *db, const char *filename)
 {
     RETURN_UNLESS(db || filename, "Invalid argument", false);
     static const char *SQL_STMT = "INSERT INTO "
@@ -81,7 +102,7 @@ __database_add_kara(volatile sqlite3 *db, const char *filename)
     if (!id_len && STR_MATCH(&token[1], "mkv")) {
         /* Check if found id is already in use. Only do that because we are
          * populating the database here. */
-        if (__is_id_in_database(db, kara_id)) {
+        if (___is_id_in_database(db, kara_id)) {
             LOG_WARN("DB",
                      "Detected id %lu for file %s is already taken, generating a new one. "
                      "Your database may be inconsistent",
@@ -117,7 +138,8 @@ __database_add_kara(volatile sqlite3 *db, const char *filename)
     sqlite3_finalize(stmt);
     stmt = NULL;
 
-    if (__add_kara_to_update_job(db, kara_id)) {
+    ___flush_cache_from_disk(db, filename);
+    if (___add_kara_to_update_job(db, kara_id)) {
         SQLITE_EXEC(db, "COMMIT;", error);
         return true;
     }
@@ -191,7 +213,8 @@ database_update_add(volatile sqlite3 *db, const char *kara_path, struct kara_met
     // clang-format on
 
     SQLITE_STEP_DONE(db, stmt, error);
-    ret = __add_kara_to_update_job(db, id);
+    ___flush_cache_from_disk(db, kara_path);
+    ret = ___add_kara_to_update_job(db, id);
 error:
     sqlite3_finalize(stmt);
     return ret;
@@ -226,7 +249,7 @@ database_update(volatile sqlite3 *db, const char *kara_dir, int check_timestamp)
                 LOG_INFO("DB", "Skip update of kara '%s' be cause of timestamps", path);
                 continue;
             }
-            if (!__database_add_kara(db, path))
+            if (!___database_add_kara(db, path))
                 LOG_WARN("DB", "Failed to add kara with path '%s' to db", path);
             database_stamp(db);
         }
@@ -293,7 +316,7 @@ error:
 void
 database_update_touch(volatile sqlite3 *db, int id)
 {
-    __add_kara_to_update_job(db, id);
+    ___add_kara_to_update_job(db, id);
 }
 
 void