diff --git a/inc/lektor/database.h b/inc/lektor/database.h
index c749eaf48f78650b4175610230fa95ee08e245ca..559becbb9e7999e4b6c993aa96e3469ebdd9e4f3 100644
--- a/inc/lektor/database.h
+++ b/inc/lektor/database.h
@@ -84,8 +84,6 @@ struct lkt_search {
         lkt_search_playlist,
         lkt_search_queue,
         lkt_search_sticker,
-
-        lkt_add_queue,
     } type;
 
     void (*init)(void);     /* Called at the end of the init phase          */
diff --git a/src/commands.c b/src/commands.c
index 17503ee4ecce8bd68a98f5e17b365084e4e4e4a1..387b7ecebf56796ffd7791db884477f8d16fb040 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -398,11 +398,14 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo
 {
     char rgx[PATH_MAX], *col_name, *mpd_tag;
     int count;
+    struct lkt_uri uri;
     struct lkt_search search = {
         .srv = srv,
         .c = c,
+        .qu_uri = &uri,
         .continuation = continuation,
         .msg_count = lkt_remaining_msg(srv, c) - 3, /* Reserve slots for OK/ACK and continue: */
+        .init = NULL,
     };
 
     /* Check args */
@@ -421,7 +424,6 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo
     case LKT_FND_ACT_ENQUEUE:
         search.call = (void(*)(void)) lkt_callback_send_row_v2;
         search.init = (void(*)(void)) database_queue_add_uri;
-        search.type = lkt_add_queue;
         search.qu_priority = 5;
         srv->mpd_idle_events |= MPD_IDLE_PLAYLIST;
         break;
@@ -429,7 +431,6 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo
         search.call = (void(*)(void)) lkt_callback_send_row_v2;
         search.init = (void(*)(void)) database_queue_add_uri;
         search.qu_priority = 1;
-        search.type = lkt_add_queue;
         srv->mpd_idle_events |= MPD_IDLE_PLAYLIST;
         break;
     default:
@@ -439,25 +440,26 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo
     /* Select the right column */
 
     mpd_tag = cmd_args[0];
-    if (!strcasecmp("any", mpd_tag) || !strcasecmp("all", mpd_tag) || !strcasecmp("query", mpd_tag))
+    if (!strcasecmp("any", mpd_tag) || !strcasecmp("all", mpd_tag) || !strcasecmp("query", mpd_tag) ||
+        !strcasecmp("source", mpd_tag) || !strcasecmp("title", mpd_tag)) {
+        uri.type = uri_query;
         col_name = LKT_DATABASE_KARA_COLUMNT_ANY;
-    else if (!strcasecmp("author", mpd_tag))
+    } else if (!strcasecmp("author", mpd_tag)) {
+        uri.type = uri_author;
         col_name = LKT_DATABASE_NAME_KAUTHOR;
-    else if (!strcasecmp("source", mpd_tag))
-        col_name = LKT_DATABASE_NAME_KNAME;
-    else if (!strcasecmp("title", mpd_tag))
-        col_name = LKT_DATABASE_NAME_KTITLE;
-    else if (!strcasecmp("category", mpd_tag) || !strcasecmp("cat", mpd_tag))
+    } else if (!strcasecmp("category", mpd_tag) || !strcasecmp("cat", mpd_tag)) {
+        uri.type = uri_category;
         col_name = LKT_DATABASE_NAME_KCAT;
-    else if (!strcasecmp("type", mpd_tag))
+    } else if (!strcasecmp("type", mpd_tag)) {
+        uri.type = uri_type;
         col_name = LKT_DATABASE_NAME_KTYPE;
-    else if (!strcasecmp("language", mpd_tag) || !strcasecmp("lang", mpd_tag))
+    } else if (!strcasecmp("language", mpd_tag) || !strcasecmp("lang", mpd_tag)) {
+        uri.type = uri_language;
         col_name = LKT_DATABASE_NAME_KLANG;
-    else if (!strcasecmp("date", mpd_tag))
-        col_name = LKT_DATABASE_NAME_KAUTHOR_YEAR;
-    else if (!strcasecmp("id", mpd_tag))
+    } else if (!strcasecmp("id", mpd_tag)) {
+        uri.type = uri_id;
         col_name = LKT_DATABASE_NAME_KID;
-    else
+    } else
         return false;
 
     /* Get the regex */
@@ -470,6 +472,7 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo
         if (cmd_args[i + 1])
             strncat(rgx, " ", PATH_MAX - 1);
     }
+    uri.value = rgx;
 
     /* Make the search langand do the right action */
 
diff --git a/src/database/find.c b/src/database/find.c
index cc20524ee86382eac3c8f2b6caaa7cc587e6c507..63753ac6ae6b339efb69644c0e9ccc2e2c637f71 100644
--- a/src/database/find.c
+++ b/src/database/find.c
@@ -8,21 +8,6 @@
 #include <stdio.h>
 #include <string.h>
 
-static inline bool
-__init_search(volatile sqlite3 *db, struct lkt_search *ret)
-{
-    bool sta = false;
-    switch (ret->type) {
-    case lkt_add_queue:
-        sta = ((lkt_search_init_add_func) ret->init)(db, ret->qu_uri, ret->qu_priority);
-        ret->type = lkt_search_queue;
-    default:
-        LOG_WARN_SCT("DB", "Init for type %d is not implemented", ret->type);
-        return false;
-    }
-    return sta;
-}
-
 bool
 database_search_database_init(volatile sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret)
 {
@@ -34,10 +19,12 @@ database_search_database_init(volatile sqlite3 *db, char *col_name, char *rgx, s
         "SELECT id, any_col, (SELECT MAX(len) FROM content)"
         "FROM content LIMIT %d OFFSET %d;";
     char SQL_STMT[LKT_MAX_SQLITE_STATEMENT];
+    ret->type = lkt_search_database;
 
     /* Init */
-    if (! ret->continuation && ret->init && ! __init_search(db, ret)) {
-        LOG_ERROR_SCT("DB", "%s", "Failed to init search query, called to init func failed");
+    if (! ret->continuation && ret->init &&
+        ! ((lkt_search_init_add_func) ret->init)(db, ret->qu_uri, ret->qu_priority)) {
+        LOG_ERROR_SCT("DB", "%s", "Failed to init search query, init func failed");
         return false;
     }
 
@@ -101,9 +88,11 @@ database_search_queue_init(volatile sqlite3 *db, char *col_name, char *rgx, stru
         "SELECT id, any_col, (SELECT MAX(len) FROM content)"
         "FROM content LIMIT %d OFFSET %d;";
     char SQL_STMT[LKT_MAX_SQLITE_STATEMENT];
+    ret->type = lkt_search_queue;
 
     /* Init */
-    if (! ret->continuation && ret->init && ! __init_search(db, ret)) {
+    if (! ret->continuation && ret->init &&
+        ! ((lkt_search_init_add_func) ret->init)(db, ret->qu_uri, ret->qu_priority)) {
         LOG_ERROR_SCT("DB", "%s", "Failed to init search query, called to init func failed");
         return false;
     }
diff --git a/src/net/listen.c b/src/net/listen.c
index 23d4fddf2cb64900788e5dbca88b132ba662518b..1d842149aa773ad54723c3a4f25bdf5a62c17c90 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -253,12 +253,10 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
         else if (!strcmp(cmd.name, "idle")) {
             err = !command_idle(srv, c, &cmd);
             goto end_no_send_status;
-        } else if (!strcmp(cmd.name, "searchadd") ||
-                   !strcmp(cmd.name, "findadd"))
-            err = ! command_find(srv, c, cmd.args, cmd.cont, LKT_FND_ACT_ADD);
-        else if (!strcmp(cmd.name, "search") ||
-                 !strcmp(cmd.name, "find"))
+        } else if (!strcmp(cmd.name, "search") || !strcmp(cmd.name, "find"))
             err = ! command_find(srv, c, cmd.args, cmd.cont, LKT_FND_ACT_RESPOND);
+        else if (!strcmp(cmd.name, "searchadd") || !strcmp(cmd.name, "findadd"))
+            err = ! command_find(srv, c, cmd.args, cmd.cont, LKT_FND_ACT_ADD);
         else if (!strcmp(cmd.name, "__insert"))
             err = ! command_find(srv, c, cmd.args, cmd.cont, LKT_FND_ACT_ENQUEUE);
         else