diff --git a/src/Makefile.in b/src/Makefile.in
index bc304b14ed3c39d296197bd53a93fb23a4fb7eb2..18ece2c3259d64550ea12728db9b17dbc4817360 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1717,6 +1717,7 @@ database/disk.c: database/disk.sql
 	@echo '__attribute__((unused)) unsigned char ___src_database_disk_sql[] = { ' > $@
 	@$(XXD) -i < $< >> $@
 	@echo ', 0x00 };' >> $@
+
 database/memory.c: database/memory.sql
 	$(XXD_GEN)
 	@echo '__attribute__((unused)) unsigned char ___src_database_memory_sql[] = { ' > $@
diff --git a/src/database/cache.c b/src/database/cache.c
index 73f5e743fc61352cb8c34634199e8fa144655cea..0aa526b816cec1173efcdfaf3542fd54eeb667dd 100644
--- a/src/database/cache.c
+++ b/src/database/cache.c
@@ -72,10 +72,16 @@ database_cache_kara(volatile sqlite3 *db, int id)
     {                                                                                                                  \
         bool ret_code      = false;                                                                                    \
         sqlite3_stmt *stmt = NULL;                                                                                     \
+        /* Update the disk cache */                                                                                    \
         SQLITE_PREPARE(db, stmt, "UPDATE kara SET cached_" #what " = ? WHERE id = ?;", error);                         \
         SQLITE_BIND_INT(db, stmt, 1, what, error);                                                                     \
         SQLITE_BIND_INT(db, stmt, 2, id, error);                                                                       \
         SQLITE_STEP_OK(db, stmt, error);                                                                               \
+        /* Update the memory cache */                                                                                  \
+        SQLITE_PREPARE(db, stmt, "UPDATE kara_cache SET " #what " = ? WHERE kara_id = ?;", error);                     \
+        SQLITE_BIND_INT(db, stmt, 1, what, error);                                                                     \
+        SQLITE_BIND_INT(db, stmt, 2, id, error);                                                                       \
+        SQLITE_STEP_OK(db, stmt, error);                                                                               \
         ret_code = true;                                                                                               \
     error:                                                                                                             \
         sqlite3_finalize(stmt);                                                                                        \
@@ -90,7 +96,7 @@ database_cache_kara(volatile sqlite3 *db, int id)
         sqlite3_stmt *stmt = NULL;                                                                                     \
     retry:                                                                                                             \
         *what = 0;                                                                                                     \
-        SQLITE_PREPARE(db, stmt, "SELECT cached_" #what " FROM kara WHERE id = ?;", error);                            \
+        SQLITE_PREPARE(db, stmt, "SELECT " #what " FROM kara_cache WHERE kara_id = ?;", error);                        \
         SQLITE_BIND_INT(db, stmt, 1, id, error);                                                                       \
         SQLITE_STEP_ROW(db, stmt, error);                                                                              \
         *what = sqlite3_column_int64(stmt, 0);                                                                         \
diff --git a/src/database/memory.sql b/src/database/memory.sql
index fe2e6a414e4adf227f85d7a62d1a04db6ec4f774..c249fdc6b7d6b5fa53bc026910aa8cba878cd908 100644
--- a/src/database/memory.sql
+++ b/src/database/memory.sql
@@ -11,33 +11,38 @@
 -- - `duration` the total duration of the playing kara
 
 CREATE TABLE IF NOT EXISTS queue_state
-  ( id         INTEGER PRIMARY KEY DEFAULT 42 CHECK(id = 42)
-  , volume     INTEGER NOT NULL DEFAULT 100 CHECK(0 <= volume AND volume <= 100)
-  , paused     INTEGER NOT NULL DEFAULT 1
-  , random     INTEGER NOT NULL DEFAULT 0
-  , repeat     INTEGER NOT NULL DEFAULT 0
-  , single     INTEGER NOT NULL DEFAULT 0
-  , consume    INTEGER NOT NULL DEFAULT 0
-  , current    INTEGER CHECK(current > 0)
-  , duration   INTEGER CHECK(duration >= 0)
-  , elapsed    INTEGER CHECK(elapsed >= 0)
+  ( id          INTEGER PRIMARY KEY DEFAULT 42 CHECK(id = 42)
+  , volume      INTEGER NOT NULL DEFAULT 100 CHECK(0 <= volume AND volume <= 100)
+  , paused      INTEGER NOT NULL DEFAULT 1
+  , random      INTEGER NOT NULL DEFAULT 0
+  , repeat      INTEGER NOT NULL DEFAULT 0
+  , single      INTEGER NOT NULL DEFAULT 0
+  , consume     INTEGER NOT NULL DEFAULT 0
+  , current     INTEGER CHECK(current > 0)
+  , duration    INTEGER CHECK(duration >= 0)
+  , elapsed     INTEGER CHECK(elapsed >= 0)
   );
 
 INSERT INTO queue_state (id) VALUES (42);
 
-
 -- Temporary queue table used when reordering the queue (for inserts)
 CREATE TABLE IF NOT EXISTS queue_tmp
-   ( position INTEGER PRIMARY KEY AUTOINCREMENT CHECK(position > 0)
-   , kara_id  INTEGER
-   , priority INTEGER NOT NULL DEFAULT 1 CHECK(priority > 0 AND priority < 6)
+   ( position   INTEGER PRIMARY KEY AUTOINCREMENT CHECK(position > 0)
+   , kara_id    INTEGER
+   , priority   INTEGER NOT NULL DEFAULT 1 CHECK(priority > 0 AND priority < 6)
    );
 
+-- Memory replica of the kara cache
+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
+  );
 
 -- Used to store the content of the ini configuration file.
 CREATE TABLE IF NOT EXISTS config
-  ( section    TEXT NOT NULL
-  , key        TEXT NOT NULL
-  , value      TEXT
+  ( section     TEXT NOT NULL
+  , key         TEXT NOT NULL
+  , value       TEXT
   , PRIMARY KEY (section, key)
   ) WITHOUT ROWID;
diff --git a/src/database/open.c b/src/database/open.c
index 3722eaeeea0c48ac3a4bb01a880c8a8da3d6fbd6..8f45ff0e9e0f5deabf4c6245ed4f5ef056fad91a 100644
--- a/src/database/open.c
+++ b/src/database/open.c
@@ -172,6 +172,20 @@ error:
     return ret;
 }
 
+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"
+                             " FROM kara;";
+    SQLITE_EXEC(db, SQL, error);
+    LOG_INFO("DB", "Kara cache was flushed from disk");
+    return;
+error:
+    LOG_ERROR("DB", "Failed to flush kara cache from disk");
+    return;
+}
+
 bool
 database_open(volatile sqlite3 *db, const char *dbpath, bool check)
 {
@@ -197,6 +211,7 @@ retry:
 
     case LKT_DATABASE_VERSION_MK_7_1:
         LOG_INFO("DB", "Opening database, version is 'mk-7.1'");
+        ___flush_cache_from_disk(db);
         break;
     }
     return true;