diff --git a/meson.build b/meson.build
index 45634813e7ad37bb8dea6a94deb18c0cd9f73082..a66ecdeb6b38a614941cfa7559d2bb005c210640 100644
--- a/meson.build
+++ b/meson.build
@@ -88,7 +88,7 @@ mthread_deps = [ declare_dependency( link_with: static_library( 'mthread'
 lib = static_library( meson.project_name()
                     , files(core_sources)
                     , include_directories : includes
-                    , dependencies : [ core_deps, libdl, common_deps ]
+                    , dependencies : [ core_deps, libdl, common_deps, mthread_deps ]
                     )
 
 bin_deps = [ declare_dependency( link_with: lib, include_directories: includes) ]
@@ -96,7 +96,7 @@ bin_deps = [ declare_dependency( link_with: lib, include_directories: includes)
 srv = executable( meson.project_name() + 'd'
                 , files('src/main/server.c')
                 , include_directories : includes
-                , dependencies : [ bin_deps, mthread_deps ]
+                , dependencies : [ bin_deps ]
                 , install : true
                 )
 
@@ -104,7 +104,7 @@ srv = executable( meson.project_name() + 'd'
 metadata = executable( 'lktadm'
                      , files('src/main/lktadm.c', 'src/cmd.c')
                      , include_directories : includes
-                     , dependencies : [ bin_deps, mthread_deps ]
+                     , dependencies : [ bin_deps ]
                      , install : true
                      )
 
@@ -120,7 +120,7 @@ if dep_x11.found() and dep_mpv.found()
   lib_mod_x11 = shared_library ( '_module_x11'
                                , files(['src/module/module_x11.c', 'src/module/mpv.c'])
                                , include_directories : includes
-                               , dependencies : [ dep_x11, dep_mpv, mthread_deps ]
+                               , dependencies : [ dep_x11, dep_mpv ]
                                , link_with : lib
                                , install : true
                                , install_dir : 'lib/lektor'
@@ -132,7 +132,7 @@ if dep_sdl.found() and dep_mpv.found()
   lib_mod_sdl = shared_library ( '_module_sdl2'
                                , files(['src/module/module_sdl2.c', 'src/module/mpv.c'])
                                , include_directories : includes
-                               , dependencies : [ dep_sdl, dep_mpv, mthread_deps ]
+                               , dependencies : [ dep_sdl, dep_mpv ]
                                , link_with : lib
                                , install : true
                                , install_dir : 'lib/lektor'
diff --git a/src/database/update.c b/src/database/update.c
index a3b641a6c5a0cbb6a3c711fe4d04c3cb02a22be3..2f1f89aacec1a9e65c43ce4114be2b28e0196fc4 100644
--- a/src/database/update.c
+++ b/src/database/update.c
@@ -21,8 +21,7 @@ database_add_kara(sqlite3 *db, const char *filename)
         "kara (song_name, source_name, category, song_type, language, file_path, is_new, author_name, author_year, song_number)"
         "SELECT ?, ?, ?, ?, ?, ?, ?, ?, strftime('%s','now'), ?";
     sqlite3_stmt *stmt = NULL;
-    bool status = false;
-    int code = SQLITE_OK;
+    int code = SQLITE_OK, status = false;
     struct kara_metadata data;
     time_t the_time = time(NULL);
     struct tm *the_local_time = localtime(&the_time);
@@ -37,15 +36,15 @@ database_add_kara(sqlite3 *db, const char *filename)
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
 
-    if ((sqlite3_bind_text(stmt, 1, data.song_name, -1, 0) != SQLITE_OK)    ||
+    if ((sqlite3_bind_text(stmt, 1, data.song_name,   -1, 0) != SQLITE_OK)  ||
         (sqlite3_bind_text(stmt, 2, data.source_name, -1, 0) != SQLITE_OK)  ||
-        (sqlite3_bind_text(stmt, 3, data.category, -1, 0) != SQLITE_OK)     ||
-        (sqlite3_bind_text(stmt, 4, data.song_type, -1, 0) != SQLITE_OK)    ||
-        (sqlite3_bind_text(stmt, 5, data.language, -1, 0) != SQLITE_OK)     ||
-        (sqlite3_bind_text(stmt, 6, filename, -1, 0) != SQLITE_OK)          ||
-        (sqlite3_bind_int(stmt, 7, 0) != SQLITE_OK)                         ||
+        (sqlite3_bind_text(stmt, 3, data.category,    -1, 0) != SQLITE_OK)  ||
+        (sqlite3_bind_text(stmt, 4, data.song_type,   -1, 0) != SQLITE_OK)  ||
+        (sqlite3_bind_text(stmt, 5, data.language,    -1, 0) != SQLITE_OK)  ||
+        (sqlite3_bind_text(stmt, 6, filename,         -1, 0) != SQLITE_OK)  ||
+        (sqlite3_bind_int (stmt, 7, 0)                       != SQLITE_OK)  ||
         (sqlite3_bind_text(stmt, 8, data.author_name, -1, 0) != SQLITE_OK)  ||
-        (sqlite3_bind_int(stmt,  9, data.song_number) != SQLITE_OK)
+        (sqlite3_bind_int (stmt, 9, data.song_number)        != SQLITE_OK)
        ) {
         LOG_ERROR_SCT("DB", "Failed to bind for kara %s: %s", filename, sqlite3_errmsg(db));
         goto error;
@@ -67,8 +66,7 @@ database_update_add(sqlite3 *db, const char *kara_path, struct kara_metadata *md
         "kara (song_name, source_name, category, song_type, language, file_path, is_new, author_name, author_year, song_number, id, available)"
         "SELECT ?, ?, ?, ?, ?, ?, ?, ?, strftime('%s','now'), ?, ?, ?";
     sqlite3_stmt *stmt = NULL;
-    int code = SQLITE_OK;
-    bool ret = false;
+    int code = SQLITE_OK, ret = false;
     time_t the_time = time(NULL);
     struct tm *the_local_time = localtime(&the_time);
     char year[10];
@@ -79,17 +77,17 @@ database_update_add(sqlite3 *db, const char *kara_path, struct kara_metadata *md
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
 
-    if ((sqlite3_bind_text(stmt, 1, mdt->song_name, -1, 0) != SQLITE_OK)    ||
-        (sqlite3_bind_text(stmt, 2, mdt->source_name, -1, 0) != SQLITE_OK)  ||
-        (sqlite3_bind_text(stmt, 3, mdt->category, -1, 0) != SQLITE_OK)     ||
-        (sqlite3_bind_text(stmt, 4, mdt->song_type, -1, 0) != SQLITE_OK)    ||
-        (sqlite3_bind_text(stmt, 5, mdt->language, -1, 0) != SQLITE_OK)     ||
-        (sqlite3_bind_text(stmt, 6, kara_path, -1, 0) != SQLITE_OK)         ||
-        (sqlite3_bind_int(stmt, 7, 0) != SQLITE_OK) /* TODO */              ||  /* No new kara added (TODO). */
-        (sqlite3_bind_text(stmt, 8, mdt->author_name, -1, 0) != SQLITE_OK)  ||
-        (sqlite3_bind_int(stmt,  9, mdt->song_number) != SQLITE_OK)         ||
-        (sqlite3_bind_int(stmt, 10, id) != SQLITE_OK)                       ||
-        (sqlite3_bind_int(stmt, 11, avail) != SQLITE_OK)
+    if ((sqlite3_bind_text(stmt,  1, mdt->song_name,   -1, 0) != SQLITE_OK) ||
+        (sqlite3_bind_text(stmt,  2, mdt->source_name, -1, 0) != SQLITE_OK) ||
+        (sqlite3_bind_text(stmt,  3, mdt->category,    -1, 0) != SQLITE_OK) ||
+        (sqlite3_bind_text(stmt,  4, mdt->song_type,   -1, 0) != SQLITE_OK) ||
+        (sqlite3_bind_text(stmt,  5, mdt->language,    -1, 0) != SQLITE_OK) ||
+        (sqlite3_bind_text(stmt,  6, kara_path,        -1, 0) != SQLITE_OK) ||
+        (sqlite3_bind_int (stmt,  7, 0) != SQLITE_OK) /* TODO */            ||  /* No new kara added (TODO). */
+        (sqlite3_bind_text(stmt,  8, mdt->author_name, -1, 0) != SQLITE_OK) ||
+        (sqlite3_bind_int (stmt,  9, mdt->song_number)        != SQLITE_OK) ||
+        (sqlite3_bind_int (stmt, 10, id)                      != SQLITE_OK) ||
+        (sqlite3_bind_int (stmt, 11, avail)                   != SQLITE_OK)
        ) {
         LOG_ERROR_SCT("DB", "Failed to bind argument for kara %s: %s", kara_path, sqlite3_errmsg(db));
         goto error;
diff --git a/src/mthread/mthread.c b/src/mthread/mthread.c
index 560a0fc326bd78d0e3efdb4f0a5a2883f95f4fb2..561a779a0674e356bc535f02615f4201c91c54f2 100644
--- a/src/mthread/mthread.c
+++ b/src/mthread/mthread.c
@@ -20,6 +20,11 @@ __mthread_clear_keys(mthread_t *thread)
     unsigned int i;
     struct keys_list *keys = &(*thread)->keys;
 
+    if (!keys) {
+        keys->first_avail = 0;
+        return;
+    }
+
     for (i = 0; i < keys->first_avail; ++i)
         mthread_key_delete(keys->list[i]);
 
@@ -260,8 +265,6 @@ mthread_start_thread(void *arg)
     if (mctx->detached) {
         LOG_INFO_SCT("THREAD", "Thread %p (vp: %d) was detached, join it", arg, vp->rank);
         mthread_join(mctx, NULL);
-        if (mctx->detached == DETACHED_FREE)
-            free(mctx);
     }
     vp = mthread_get_vp();
     __mthread_yield(vp);
@@ -320,7 +323,9 @@ mthread_create(mthread_t *__threadp, const mthread_attr_t __attr, void *(*__star
     mctx->__start_routine = __start_routine;
     mthread_mctx_set(mctx, mthread_start_thread, stack, MTHREAD_DEFAULT_STACK, mctx);
     mthread_insert_last(mctx, &(vp->ready_list));
-    *__threadp = mctx;
+
+    if (__threadp)
+        *__threadp = mctx;
 
     return 0;
 }
diff --git a/src/net/downloader.c b/src/net/downloader.c
index 9ac71ea22e967e16cb5090009da7bfd929f0fb2e..8b02cda6a199fcb11b74ae9f91f519711b205d62 100644
--- a/src/net/downloader.c
+++ b/src/net/downloader.c
@@ -108,7 +108,6 @@ safe_json_get_int32(struct json_object *json, const char *key, int32_t *ret)
     RETURN_UNLESS(json_object_object_get_ex(json, key, &field), "Key not found", 1);
     errno = 0;
     *ret = json_object_get_int(field);
-    RETURN_IF(errno = EINVAL, "Invalid 32bit integer", 1);
     RETURN_IF(*ret == INT32_MAX || *ret == INT32_MIN, "Out of bound 32bit integer", 1);
     return 0;
 }
@@ -332,13 +331,7 @@ repo_download_id_async(struct lkt_repo *const repo, const size_t id)
     kara->id = id;
 
     /* Thread */
-    mthread_t *th = calloc(1, sizeof(mthread_t));
-    if (!th) {
-        free(arg);
-        LOG_ERROR_SCT("REPO", "%s", "Out of memory");
-        return 1;
-    }
-    return mthread_create(th, ATTR_DETACHED_FREE, __repo_download_id_async, arg);
+    return mthread_create(NULL, ATTR_DETACHED, __repo_download_id_async, arg);
 }
 
 /* Get all the kara, make them unavailable */
@@ -353,6 +346,7 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo, struct json_objec
     int err;
     RETURN_UNLESS(len > 0 && json_object_get_array(json), "Json invalid or array empty", NOTHING);
 
+    LOG_INFO_SCT("REPO", "Starting to process json for repo %s", repo->name);
     for (i = 0; i < len; ++i) {
         kara_json = json_object_array_get_idx(json, i);
         kara = calloc(1, sizeof(struct kara));
@@ -370,7 +364,7 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo, struct json_objec
             strncat(kara->filename, "/", PATH_MAX - 1);
             kara->filename[++kara_dir_len] = 0;
         }
-        integer = snprintf(kara->filename + kara_dir_len, PATH_MAX - kara_dir_len, "%d", integer);
+        snprintf(kara->filename + kara_dir_len, PATH_MAX - kara_dir_len, "%d.mkv", integer);
         kara->filename[PATH_MAX - 1] = 0;
         LOG_INFO("Crafted filename is '%s'", kara->filename);
 
@@ -387,7 +381,7 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo, struct json_objec
 
         if (database_update_add((sqlite3 *) db, kara->filename, &kara->mdt, kara->id, false))
             LOG_ERROR_SCT("REPO", "Could not add unavailable kara %ld to db", kara->id);
-        goto err;
+        LOG_INFO_SCT("REPO", "Added kara %ld from repo %s, filepath is %s", kara->id, repo->name, kara->filename);
     }
 
 err:
@@ -399,8 +393,11 @@ __repo_get_all_id_async(void *arg)
 {
     struct json_object *json;
     struct lkt_repo *const repo = arg;
+    LOG_INFO_SCT("REPO", "Download kara list from %s (%s), directory is %s",
+                 repo->name, repo->base_url, repo->kara_dir);
     repo_get_alljson_sync(repo, &json);
     __handle_got_json(repo->db, repo, json);
+    LOG_INFO_SCT("REPO", "%s", "Finished to download and insert kara list");
     json_object_put(json);
     return NULL;
 }
@@ -408,10 +405,5 @@ __repo_get_all_id_async(void *arg)
 inline int
 repo_get_allid_async(struct lkt_repo *const repo)
 {
-    mthread_t *th = calloc(1, sizeof(mthread_t));
-    if (!th) {
-        LOG_ERROR_SCT("REPO", "%s", "Out of memory");
-        return 1;
-    }
-    return mthread_create(th, ATTR_DETACHED_FREE, __repo_get_all_id_async, repo);
+    return mthread_create(NULL, ATTR_DETACHED, __repo_get_all_id_async, repo);
 }