diff --git a/src/common.c b/src/common.c
index cc7dd77b7bc4b3fae7c0afd2112db61c8c9de9c0..bb330464876adaa5e3129c024891f2734482178b 100644
--- a/src/common.c
+++ b/src/common.c
@@ -138,7 +138,7 @@ get_stdin_line(const char *prompt, char *buf, size_t len)
 inline long
 get_mtime(const char *path)
 {
-    struct stat statbuf;
+    struct stat statbuf = {0};
     return (stat(path, &statbuf) == -1) ? 0 : statbuf.st_mtime;
 }
 
diff --git a/src/database/queue.c b/src/database/queue.c
index a6f9e36b0ea9d7674c666192b180d15de648f752..e7815cd29e16dc1921275399283e9531bff09bcb 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -550,12 +550,14 @@ bool
 database_get_kara_path(volatile sqlite3 *db, int id, char filepath[PATH_MAX])
 {
     sqlite3_stmt *stmt = NULL;
-    static const char *SQL = "SELECT file_path FROM kara WHERE id = ?;";
-    RETURN_UNLESS(id && db && filepath, "Invalid argument", false);
+    static const char *SQL = "SELECT file_path FROM kara WHERE id = ? AND available = 1;";
+    RETURN_UNLESS(id && db, "Invalid argument", false);
     SQLITE_PREPARE(db, stmt, SQL, error);
     SQLITE_BIND_INT(db, stmt, 1, id, error);
     SQLITE_STEP_ROW(db, stmt, error);
-    strncpy(filepath, (const char *) sqlite3_column_text(stmt, 0), PATH_MAX);
+    if (!filepath)
+        return true;
+    strncpy(filepath, sqlite3_column_chars(stmt, 0), PATH_MAX);
     filepath[PATH_MAX - 1] = '\0';
     return true;
 error:
diff --git a/src/database/update.c b/src/database/update.c
index 32448a6689229ef3fd4606eeb0e129c34841b4e1..f910b2436cd6acde69b9e24ca9687499eb0fdffe 100644
--- a/src/database/update.c
+++ b/src/database/update.c
@@ -26,7 +26,7 @@ __add_kara_to_update_job(volatile sqlite3 *db, size_t id)
     sqlite3_stmt *stmt;
     SQLITE_PREPARE(db, stmt, SQL, error);
     SQLITE_BIND_INT(db, stmt, 1, (int) id, error);
-    SQLITE_STEP_DONE(db, stmt, error);
+    sqlite3_step(stmt); /* Ignore result of that one */
     return true;
 error:
     return false;
diff --git a/src/module/repo.c b/src/module/repo.c
index f9b139114cbe82a2eee073fc2112a7aa2f5d4bcc..1647fa347143ac225d3eeec8c4d49b23bfa107df 100644
--- a/src/module/repo.c
+++ b/src/module/repo.c
@@ -10,6 +10,7 @@
 #include <unistd.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <time.h>
 
 #include <common/common.h>
 #include <mthread/mthread.h>
@@ -332,14 +333,19 @@ void
 __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo,
                   struct json_object *json)
 {
-    size_t i, len = json_object_array_length(json);
+    size_t i, len = json_object_array_length(json), update_count = 0,
+              ignored_count = 0;
     struct json_object *kara_json;
     int32_t integer, err;
     struct kara kara;
-    long filestamp = 0, timestamp = 0, db_timestamp = 0;
+    long filestamp = 0, timestamp = 0;
     char mkvpropedit[PATH_MAX], url[URL_MAX_LEN];
     int current_id;
     struct lkt_state *srv = repo->srv;
+    struct timespec time_sleep = {
+        .tv_sec  = 0,
+        .tv_nsec = 100000000L,
+    };  /* Sleep for 0.1s */
 
     RETURN_UNLESS(len > 0 && json_object_get_array(json),
                   "Json invalid or array empty", NOTHING);
@@ -349,6 +355,7 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo,
 
     LOG_INFO("REPO", "Starting to process json for repo %s", repo->name);
     for (i = 0; i < len; ++i) {
+        nanosleep(&time_sleep, NULL);   /* Sleep a bit, better for Hard drive */
         kara_json = json_object_array_get_idx(json, i);
         err = 0;
 
@@ -368,6 +375,24 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo,
         safe_snprintf(kara.filename + kara_dir_len, PATH_MAX - kara_dir_len,
                       "%d.mkv", integer);
 
+        /* Timestamp and presence verification */
+        if (!database_get_kara_path(db, kara.id, NULL))
+            goto do_it;
+        if (safe_json_get_long(kara_json, "unix_timestamp", &timestamp))
+            continue;
+        filestamp = get_mtime(kara.filename);
+        if (!(filestamp > timestamp))
+            goto do_it;
+        else {
+            ++ignored_count;
+            database_update_touch(db, kara.id);
+            database_update_set_available(db, kara.id);
+            LOG_INFO("REPO", "Ignore kara '%ld' with path '%s'",
+                     kara.id, kara.filename);
+            continue;
+        }
+do_it:
+
         /* Reads the json */
         err |= safe_json_get_string(kara_json, "song_name",   kara.mdt.song_name,   LEKTOR_TAG_MAX);
         err |= safe_json_get_string(kara_json, "source_name", kara.mdt.source_name, LEKTOR_TAG_MAX);
@@ -380,20 +405,6 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo,
             continue;
         }
 
-        /* Timestamp verification */
-        if (safe_json_get_long(kara_json, "unix_timestamp", &timestamp))
-            continue;
-        filestamp = get_mtime(kara.filename);
-        database_get_update(db, &db_timestamp, NULL, NULL);
-        if (db_timestamp >= filestamp && filestamp > timestamp &&
-            ! kara_metadata_equals(&kara.mdt, kara.filename)) {
-            database_update_touch(db, kara.id);
-            database_update_set_available(db, kara.id);
-            LOG_INFO("REPO", "Ignore kara '%ld' with path '%s'",
-                     kara.id, kara.filename);
-            continue;
-        }
-
         current_id = 0;
         database_queue_current_kara(db, NULL, &current_id);
         if (current_id == (int) kara.id) {
@@ -431,9 +442,12 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo,
         }
 
         database_stamp(db);
+        ++update_count;
         LOG_INFO("REPO", "Added kara %ld from repo %s, filepath is %s",
                  kara.id, repo->name, kara.filename);
     }
+    LOG_INFO("REPO", "Updated %ld karas and ignored %ld karas, total is %ld",
+             update_count, ignored_count, len);
 }
 
 static inline void