diff --git a/inc/lektor/database.h b/inc/lektor/database.h
index 2a3e87e1463e622184f94e7374873bc189ae35c4..4f4ef9ccb31ea9ea3cb4ff60ed3bd3549f92aae7 100644
--- a/inc/lektor/database.h
+++ b/inc/lektor/database.h
@@ -65,7 +65,7 @@ bool database_get_kara_mtime_path   (volatile sqlite3 *db, char filepath[PATH_MA
 bool database_get_kara_duration_path(volatile sqlite3 *db, char filepath[PATH_MAX], uint64_t *duration);
 void database_cache_kara            (volatile sqlite3 *db, int id);
 
-void database_get_all_kara(volatile sqlite3 *db, int **ret_ids, size_t *ret_ids_len);
+void database_get_all_non_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);
diff --git a/src/base/launch.c b/src/base/launch.c
index d8c49a72684d2165c4796f1d21233ce58d2e265c..d59d0da0220763d349f4953393074441e657b061 100644
--- a/src/base/launch.c
+++ b/src/base/launch.c
@@ -180,14 +180,20 @@ ___caching_walker(void *args)
     size_t ids_count     = 0;
     int *ids             = NULL;
 
-    database_get_all_kara(db, &ids, &ids_count);
+    database_get_all_non_cached_kara(db, &ids, &ids_count);
     if (ids == NULL || ids_count == 0) {
         LOG_ERROR("CACHING", "No kara present in the database, exit caching thread");
         return NULL;
     }
 
-    free(ids);
+    LOG_INFO("CACHE", "Begin to cache %ld karas", ids_count);
+
+    for (size_t index = 0; index < ids_count; ++index) {
+        database_cache_kara(db, ids[index]);
+    }
 
+    LOG_INFO("CACHE", "Finished caching %ld karas", ids_count);
+    free(ids);
     return NULL;
 }
 
diff --git a/src/database/find.c b/src/database/find.c
index 495fdac397219c78730cb744a5459b2f4a1be75d..7bea8d7f561f8b252adf49583c4ed249b69c8b19 100644
--- a/src/database/find.c
+++ b/src/database/find.c
@@ -399,10 +399,10 @@ error:
 }
 
 void
-database_get_all_kara(volatile sqlite3 *db, int **ret_ids, size_t *ret_ids_len)
+database_get_all_non_cached_kara(volatile sqlite3 *db, int **ret_ids, size_t *ret_ids_len)
 {
-    static const char *SQL_DATA  = "SELECT id FROM kara;";
-    static const char *SQL_COUNT = "SELECT count(id) FROM kara;";
+    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;";
     sqlite3_stmt *stmt           = NULL;
     size_t index                 = 0;