diff --git a/inc/mthread/mthread.h b/inc/mthread/mthread.h
index 2e76942fac27e11ccadcec1b954f95a8de84f264..cef1aa21e938592721d142f15b4807049d2dc529 100644
--- a/inc/mthread/mthread.h
+++ b/inc/mthread/mthread.h
@@ -48,7 +48,7 @@ typedef struct mthread_sem_s mthread_sem_t;
 
 /* Function for handling threads.  */
 
-int mthread_create(mthread_t *__threadp, const mthread_attr_t *__attr, void *(*__start_routine) (void *), void *__arg);
+int mthread_create(mthread_t *__threadp, const mthread_attr_t __attr, void *(*__start_routine) (void *), void *__arg);
 
 mthread_t mthread_self(void);
 int  mthread_equal (mthread_t __thread1, mthread_t __thread2);
diff --git a/src/mthread/mthread.c b/src/mthread/mthread.c
index 78c9dabc8e08f30220df99467c8cbe5d282729b7..560a0fc326bd78d0e3efdb4f0a5a2883f95f4fb2 100644
--- a/src/mthread/mthread.c
+++ b/src/mthread/mthread.c
@@ -290,7 +290,7 @@ mthread_init(void)
    if ATTR is NULL), and call function START_ROUTINE with given
    arguments ARG.  */
 int
-mthread_create(mthread_t *__threadp, const mthread_attr_t *__attr, void *(*__start_routine) (void *), void *__arg)
+mthread_create(mthread_t *__threadp, const mthread_attr_t __attr, void *(*__start_routine) (void *), void *__arg)
 {
     if (is_mthread_init == 0) {
         __mthread_lib_init(0);
@@ -309,9 +309,9 @@ mthread_create(mthread_t *__threadp, const mthread_attr_t *__attr, void *(*__sta
     mthread_init_thread(mctx);
 
     if (__attr) {
-        if (*__attr & ATTR_DETACHED)
+        if (__attr & ATTR_DETACHED)
             mctx->detached = DETACHED;
-        if (*__attr & ATTR_DETACHED_FREE)
+        if (__attr & ATTR_DETACHED_FREE)
             mctx->detached = DETACHED_FREE;
     }
 
diff --git a/src/repo/downloader.c b/src/repo/downloader.c
index 0ae589a7b0da445c6f5763aa6435486ba69d505e..d6ad28e13f245418d9870ca5123554719770b0f6 100644
--- a/src/repo/downloader.c
+++ b/src/repo/downloader.c
@@ -9,7 +9,7 @@
 #include <mthread/mthread.h>
 #include <lektor/macro.h>
 #include <lektor/repo.h>
-#include <lektor/thread.h>
+#include <lektor/database.h>
 
 /* Find it in the repo/curl.c file. FIXME */
 extern int
@@ -49,7 +49,13 @@ repo_download_id_async(struct lkt_repo *const repo, const size_t id)
     kara->id = id;
 
     /* Thread */
-    return mthread_create(th, NULL, __repo_download_id_async, arg);
+    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);
 }
 
 /* Get all the kara, make them unavailable */
@@ -96,7 +102,7 @@ __handle_got_json(volatile sqlite3 *db, struct lkt_repo *repo, struct json_objec
         if (safe_json_get_int32(kara_json, "song_number", &kara->mdt.song_number))
             goto err;
 
-        if (database_update_add(db, kara->filename, &kara->mdt, kara->id, false))
+        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;
     }
@@ -119,5 +125,10 @@ __repo_get_all_id_async(void *arg)
 inline int
 repo_get_allid_async(struct lkt_repo *const repo)
 {
-    return mthread_create(th, NULL, __repo_get_all_id_async, 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);
 }