diff --git a/src/Makefile.am b/src/Makefile.am
index 034f84146a9b39abee0ebbf0ccbbb74006d99c7f..58ad65b6b3dde7f38955f4d2d05734807d515947 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -34,7 +34,7 @@ endif
 
 ## Lib lektor
 # Base sources
-liblektor_la_SOURCES  = base/bufferfd.c base/cmd.c base/common.c base/config.c
+liblektor_la_SOURCES  = base/bufferfd.c base/cmd.c base/common.c base/config.c base/json.c
 liblektor_la_SOURCES += base/reg.c base/uri.c base/commands.c base/stack.c
 
 # Database sources
diff --git a/src/Makefile.in b/src/Makefile.in
index c9a9252f11ec24ae60cf46099b18326b8af7d524..87ccd656127a86e30744679035b041c265aa3c5b 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -148,7 +148,7 @@ LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
 @LKT_STATIC_MODULE_TRUE@liblektor_la_DEPENDENCIES = liblktmodsdl.la \
 @LKT_STATIC_MODULE_TRUE@	liblktmodrepo.la
 am__liblektor_la_SOURCES_DIST = base/bufferfd.c base/cmd.c \
-	base/common.c base/config.c base/reg.c base/uri.c \
+	base/common.c base/config.c base/json.c base/reg.c base/uri.c \
 	base/commands.c base/stack.c database/disk.c database/memory.c \
 	database/open.c database/playlist.c database/queue.c \
 	database/stickers.c database/update.c database/user.c \
@@ -159,10 +159,11 @@ am__dirstamp = $(am__leading_dot)dirstamp
 @LKT_STATIC_MODULE_TRUE@am__objects_1 = module/liblektor_la-thread.lo
 am_liblektor_la_OBJECTS = base/liblektor_la-bufferfd.lo \
 	base/liblektor_la-cmd.lo base/liblektor_la-common.lo \
-	base/liblektor_la-config.lo base/liblektor_la-reg.lo \
-	base/liblektor_la-uri.lo base/liblektor_la-commands.lo \
-	base/liblektor_la-stack.lo database/liblektor_la-disk.lo \
-	database/liblektor_la-memory.lo database/liblektor_la-open.lo \
+	base/liblektor_la-config.lo base/liblektor_la-json.lo \
+	base/liblektor_la-reg.lo base/liblektor_la-uri.lo \
+	base/liblektor_la-commands.lo base/liblektor_la-stack.lo \
+	database/liblektor_la-disk.lo database/liblektor_la-memory.lo \
+	database/liblektor_la-open.lo \
 	database/liblektor_la-playlist.lo \
 	database/liblektor_la-queue.lo \
 	database/liblektor_la-stickers.lo \
@@ -236,6 +237,7 @@ am__depfiles_remade = base/$(DEPDIR)/cmd.Po base/$(DEPDIR)/common.Po \
 	base/$(DEPDIR)/liblektor_la-commands.Plo \
 	base/$(DEPDIR)/liblektor_la-common.Plo \
 	base/$(DEPDIR)/liblektor_la-config.Plo \
+	base/$(DEPDIR)/liblektor_la-json.Plo \
 	base/$(DEPDIR)/liblektor_la-reg.Plo \
 	base/$(DEPDIR)/liblektor_la-stack.Plo \
 	base/$(DEPDIR)/liblektor_la-uri.Plo \
@@ -468,12 +470,13 @@ liblktmodsdl_la_LIBADD = -lSDL2 -lmpv
 
 # Net sources
 liblektor_la_SOURCES = base/bufferfd.c base/cmd.c base/common.c \
-	base/config.c base/reg.c base/uri.c base/commands.c \
-	base/stack.c database/disk.c database/memory.c database/open.c \
-	database/playlist.c database/queue.c database/stickers.c \
-	database/update.c database/user.c database/config.c \
-	database/find.c mkv/mkv.c mkv/utils.c mkv/write.c \
-	net/command.c net/listen.c net/message.c $(am__append_8)
+	base/config.c base/json.c base/reg.c base/uri.c \
+	base/commands.c base/stack.c database/disk.c database/memory.c \
+	database/open.c database/playlist.c database/queue.c \
+	database/stickers.c database/update.c database/user.c \
+	database/config.c database/find.c mkv/mkv.c mkv/utils.c \
+	mkv/write.c net/command.c net/listen.c net/message.c \
+	$(am__append_8)
 
 # Liblektor configuration
 liblektor_la_CFLAGS = -fPIC
@@ -645,6 +648,8 @@ base/liblektor_la-common.lo: base/$(am__dirstamp) \
 	base/$(DEPDIR)/$(am__dirstamp)
 base/liblektor_la-config.lo: base/$(am__dirstamp) \
 	base/$(DEPDIR)/$(am__dirstamp)
+base/liblektor_la-json.lo: base/$(am__dirstamp) \
+	base/$(DEPDIR)/$(am__dirstamp)
 base/liblektor_la-reg.lo: base/$(am__dirstamp) \
 	base/$(DEPDIR)/$(am__dirstamp)
 base/liblektor_la-uri.lo: base/$(am__dirstamp) \
@@ -775,6 +780,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-commands.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-common.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-config.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-json.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-reg.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-stack.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-uri.Plo@am__quote@ # am--include-marker
@@ -860,6 +866,13 @@ base/liblektor_la-config.lo: base/config.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblektor_la_CFLAGS) $(CFLAGS) -c -o base/liblektor_la-config.lo `test -f 'base/config.c' || echo '$(srcdir)/'`base/config.c
 
+base/liblektor_la-json.lo: base/json.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblektor_la_CFLAGS) $(CFLAGS) -MT base/liblektor_la-json.lo -MD -MP -MF base/$(DEPDIR)/liblektor_la-json.Tpo -c -o base/liblektor_la-json.lo `test -f 'base/json.c' || echo '$(srcdir)/'`base/json.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) base/$(DEPDIR)/liblektor_la-json.Tpo base/$(DEPDIR)/liblektor_la-json.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='base/json.c' object='base/liblektor_la-json.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblektor_la_CFLAGS) $(CFLAGS) -c -o base/liblektor_la-json.lo `test -f 'base/json.c' || echo '$(srcdir)/'`base/json.c
+
 base/liblektor_la-reg.lo: base/reg.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblektor_la_CFLAGS) $(CFLAGS) -MT base/liblektor_la-reg.lo -MD -MP -MF base/$(DEPDIR)/liblektor_la-reg.Tpo -c -o base/liblektor_la-reg.lo `test -f 'base/reg.c' || echo '$(srcdir)/'`base/reg.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) base/$(DEPDIR)/liblektor_la-reg.Tpo base/$(DEPDIR)/liblektor_la-reg.Plo
@@ -1196,6 +1209,7 @@ distclean: distclean-am
 	-rm -f base/$(DEPDIR)/liblektor_la-commands.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-common.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-config.Plo
+	-rm -f base/$(DEPDIR)/liblektor_la-json.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-reg.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-stack.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-uri.Plo
@@ -1274,6 +1288,7 @@ maintainer-clean: maintainer-clean-am
 	-rm -f base/$(DEPDIR)/liblektor_la-commands.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-common.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-config.Plo
+	-rm -f base/$(DEPDIR)/liblektor_la-json.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-reg.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-stack.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-uri.Plo
diff --git a/src/base/json.c b/src/base/json.c
index 0ce5c380f6e850a468b831c6a9b0d881b86086db..5b321937b94bade15bbe3c2b361db24d8ec91375 100644
--- a/src/base/json.c
+++ b/src/base/json.c
@@ -139,7 +139,7 @@ json_parse(const char *str, int asked_level, json_parse_callback call, void *use
 }
 
 int
-json_parse_get_count(const char *str, int level)
+json_parse_get_count(const char *str, int asked_level)
 {
     int level    = 0;
     int ret_len  = 0;
@@ -166,9 +166,6 @@ json_parse_get_count(const char *str, int level)
             __SKIP_NEXT_JSON(str, len);
             __SKIP_JSON(str);
             __SKIP_NEXT_JSON(str, len);
-
-            if (asked_level == level)
-                call(key, val, 0, user);
         }
 
         if (level <= 0)
diff --git a/src/module/module_repo.c b/src/module/module_repo.c
index 67c19a67183d304cc1918027edf8b12b353ad32d..7528a12305202dad297e975aa31f38453ebac4af 100644
--- a/src/module/module_repo.c
+++ b/src/module/module_repo.c
@@ -569,12 +569,26 @@ __handle_fav_list(struct module_repo_internal *repo, char *fav, size_t fav_size)
         },
     };
 
-    size_t len = json_parse_get_count(json, 1);
     json_parse(json, 1, __handle_fav_list_internal, (void *) &uri);
     LOG_INFO("REPO", "Finished importing fav list '%s' as '%s'", fav_origin, fav);
     free(json);
 }
 
+static void
+__worker_import_favorites_internal(const char UNUSED *key, const char *val, int comp, void *user)
+{
+    if (comp) {
+        /* Already processed, only want one line of JSON */
+        return;
+    }
+
+    struct module_repo_internal *repo = (struct module_repo_internal *) user;
+    char fav[LKT_LINE_MAX];
+    safe_strncpy(fav, val, LKT_LINE_MAX);
+    /* TODO: Add a way to use the workers to do this for each fav list */
+    __handle_fav_list(repo, fav, LKT_LINE_MAX);
+}
+
 static void *
 __worker_import_favorites(void *__repo)
 {
@@ -584,31 +598,17 @@ __worker_import_favorites(void *__repo)
     repo->updating &= REPO_UPDATE_FAV;
     GOTO_IF(pthread_mutex_unlock(&(repo->mtx)), "Failed to unlock", end_no_lock);
 
-    struct json_object *json, *item_json = NULL;
+    char *json;
     LOG_INFO("REPO", "Download favorite lists from %s (%s)", repo->name, repo->get_fav_json);
     if (__json_dl(repo->get_fav_json, &json)) {
         LOG_ERROR("REPO", "Failed to get json, possibly no internet connexion or repo is down");
         pthread_exit(NULL);
     }
     LOG_INFO("REPO", "Finished to dl favorite lists");
+    size_t len = json_parse_get_count(json, 1);
+    json_parse(json, 1, __worker_import_favorites_internal, (void *) repo);
 
-    size_t len = json_object_array_length(json), i;
-    char fav_name[LKT_LINE_MAX];
-    for (i = 0; i < len; ++i) {
-        item_json = json_object_array_get_idx(json, i);
-        if (item_json == NULL) {
-            LOG_ERROR("REPO", "There is no item with index %ld in fav list", i);
-            continue;
-        }
-        GOTO_IF(__safe_json_get_string(item_json, "pseudo", fav_name, LKT_LINE_MAX),
-                "Field 'pseudo' not found in json item", error);
-
-        /* TODO: Add a way to use the workers to do this for each fav list */
-        __handle_fav_list(repo, fav_name, LKT_LINE_MAX);
-    }
-
-error:
-    json_object_put(json);
+    free(json);
     LOG_INFO("REPO", "Finished to deal with %ld favorite lists", len);
 
     GOTO_IF(pthread_mutex_lock(&(repo->mtx)), "Failed to lock", end_no_lock);