diff --git a/src/commands.c b/src/commands.c
index de185efeb6a4bde288d5033a551c6d2a0a43f29b..1c5254629204d094134de368286e49adac14bd12 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -522,28 +522,42 @@ command_noidle(struct lkt_state *srv, size_t c)
 
 /* Functions for the searchadd and the search mpd commands */
 static bool
-lkt_callback_send_row(struct _client_trace_t *args, int id, int id_len, const char *sql_row)
+lkt_callback_print_row_v1(void *args, int id, int id_len, const char *sql_row)
 {
-    struct lkt_message *out = lkt_message_new();
-    out->data_len = snprintf(out->data, LKT_MESSAGE_MAX, "%*d %s\n", id_len, id, sql_row);
-    lkt_state_send(args->srv, args->c, out);
+    printf(" . from client %ld:\t%*d:%s\n", ((struct _client_trace_t *) args)->c,
+           id_len, id, sql_row);
     return true;
 }
 
 static bool
-lkt_callback_insert(struct _client_trace_t *args, int id, int id_len, const char *sql_row)
+lkt_callback_none(void *args, int id, int id_len, const char *sql_row)
 {
-    (void) sql_row;
+    (void) args;
+    (void) id;
     (void) id_len;
-    return database_queue_add_id(args->srv->db, id, 5);
+    (void) sql_row;
+    return true;
+}
+
+static bool
+lkt_callback_send_row_v1(void *_args, int id, int id_len, const char *sql_row)
+{
+    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    struct lkt_message *out;
+
+    out = lkt_message_new();
+    out->data_len = snprintf(out->data, LKT_MESSAGE_MAX, "%*d %s\n", id_len, id, sql_row);
+    lkt_state_send(args->srv, args->c, out);
+    return true;
 }
 
 static bool
-lkt_callback_add(struct _client_trace_t *args, int id, int id_len, const char *sql_row)
+lkt_callback_insert_v1(void *_args, int id, int id_len, const char *sql_row)
 {
     (void) sql_row;
     (void) id_len;
-    return database_queue_add_id(args->srv->db, id, 1);
+    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    return database_queue_add_id(args->srv->db, id, 5);
 }
 
 bool
@@ -555,13 +569,9 @@ command_find(struct lkt_state *srv,
     sqlite3_stmt *stmt;
     char rgx[PATH_MAX], *col_name, *mpd_tag;
     bool once, free_stmt;
-    struct _client_trace_t args = {
-        .srv = srv,
-        .c = c,
-    };
+    struct _client_trace_t args;
     struct lkt_message *not_found_msg;
-    struct database_callback callback = { .type = database_callback_db };
-
+    database_search_callback_t callback;
 
     // Check args //
     if (cmd_args == NULL || cmd_args[0] == NULL) {
@@ -572,19 +582,23 @@ command_find(struct lkt_state *srv,
     // Select callback //
     switch (action) {
     case LKT_FND_ACT_RESPOND:
-        callback.call = lkt_callback_send_row;
+        callback = lkt_callback_send_row_v1;
+        args.srv = srv;
+        args.c = c;
         break;
-    case LKT_FND_ACT_INSERT:
-        callback.call = lkt_callback_add;
-        srv->mpd_idle_events |= MPD_IDLE_PLAYLIST;
+    case LKT_FND_ACT_PRINT:
+        callback = lkt_callback_print_row_v1;
         break;
-    case LKT_FND_ACT_INSERT:
-        callback.call = lkt_callback_insert;
+    case LKT_FND_ACT_ENQUEUE:
+        callback = lkt_callback_insert_v1;
         srv->mpd_idle_events |= MPD_IDLE_PLAYLIST;
+        args.srv = srv;
+        args.c = c;
         break;
+    case LKT_FND_ACT_NONE:
     default:
-        fprintf(stderr, " ! command_find: Find action not implemented\n");
-        return false;
+        callback = lkt_callback_none;
+        break;
     }
 
     // Select the right column //
@@ -594,7 +608,7 @@ command_find(struct lkt_state *srv,
         !strcasecmp("all", mpd_tag) ||
         !strcasecmp("a", mpd_tag))
         col_name = LKT_DATABASE_KARA_COLUMNT_ANY;
-    else if (!strcasecmp("author", mpd_tag) || !(strcasecmp("auth", mpd_tag)))
+    else if (!strcasecmp("author", mpd_tag))
         col_name = LKT_DATABASE_NAME_KAUTHOR;
     else if (!strcasecmp("source", mpd_tag))
         col_name = LKT_DATABASE_NAME_KNAME;
@@ -623,7 +637,7 @@ command_find(struct lkt_state *srv,
     }
 
     // Make the search langand do the right action //
-    if (!database_search_database_init(srv->db, col_name, rgx, &stmt)) {
+    if (!database_search_init(srv->db, col_name, rgx, &stmt)) {
         fprintf(stderr, " ! command_find: Failed to init the search\n");
         return false;
     }
@@ -642,7 +656,6 @@ no_rgx:
                                            LKT_MESSAGE_MAX,
                                            "No kara found with regex\n");
         lkt_state_send(srv, c, not_found_msg);
-        return false;
     }
 
     return true;
@@ -918,11 +931,9 @@ command_queue_list(struct lkt_state *srv, size_t c,
     unsigned int from, to, tmp_switch;
     long val;
     char *endptr, *str;
-    void ** call_args = { &srv, c };
-    struct lkt_callback callback = {
-        .args = call_args,
-        .type = callback_queue,
-        .call = lkt_callback_send_row,
+    struct _client_trace_t callback_args = {
+        .srv = srv,
+        .c = c,
     };
 
     if (!args || !args[0] || strlen(args[0]) == 0) {
@@ -987,11 +998,13 @@ command_queue_list(struct lkt_state *srv, size_t c,
     /* The command is used in its relative forme, display elements from the
        current one. */
 is_relative:
-    return database_queue_list_from(srv->db, count, &callback_args, lkt_callback_send_row);
+    return database_queue_list_from(srv->db, count, &callback_args,
+                                    lkt_callback_send_row_v1);
 
     /* The command is used with a range specifier. */
 is_absolute:
-    return database_queue_list_abs(srv->db, from, to, &callback_args, lkt_callback_send_row);
+    return database_queue_list_abs(srv->db, from, to, &callback_args,
+                                   lkt_callback_send_row_v1);
 }
 
 bool
diff --git a/src/database/find.c b/src/database/find.c
index 7a64e07632694580f734fbc7c3e487156a03b699..f9c8a62d20e01b826b0a36f23dc5b21e2c8fa043 100644
--- a/src/database/find.c
+++ b/src/database/find.c
@@ -8,7 +8,7 @@
 #include <string.h>
 
 bool
-database_search_database_init(sqlite3 *db, const char *col_name, const char *rgx, struct lkt_search_iterator *ret)
+database_search_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret)
 {
     if (ret == NULL) {
         fprintf(stderr, " ! database_search_init: Exit because return pointer is NULL\n");
@@ -25,28 +25,27 @@ database_search_database_init(sqlite3 *db, const char *col_name, const char *rgx
 
     snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT_TEMPLATE, col_name);
     SQL_STMT[LKT_MAX_SQLITE_STATEMENT - 1] = 0;
-    SQLITE_PREPARE(db, ret->iter, SQL_STMT, error);
-    SQLITE_BIND_TEXT(db, ret->iter, 1, rgx, error);
+    SQLITE_PREPARE(db, *ret, SQL_STMT, error);
+    SQLITE_BIND_TEXT(db, *ret, 1, rgx, error);
     return true;
 error:
-    sqlite3_finalize(ret->iter);
+    sqlite3_finalize(*ret);
+    *ret = NULL;
     return false;
 }
 
-//bool
-//database_search_plt_init(sqlite3 *db, const char *plt_name, char *col_name, char *rgx, sqlite3_stmt **ret)
-//{
-//}
-
 bool
-database_search_iter(struct lkt_search_iterator *item, void **ret, size_t *len)
+database_search_iter(sqlite3 *db,
+                     sqlite3_stmt *item,
+                     void *args,
+                     database_search_callback_t callback,
+                     bool *need_free)
 {
-    int code;
-
-    if (*len < 3)
-        goto to_small;
+    const char *sql_row;
+    int id, code, id_len;
 
-    code = sqlite3_step(item->iter);
+    *need_free = true;
+    code = sqlite3_step(item);
 
     if (item == NULL) {
         fprintf(stderr, " * database_search_iter: Exit function because the sqlite3_stmt* is NULL\n");
@@ -54,31 +53,18 @@ database_search_iter(struct lkt_search_iterator *item, void **ret, size_t *len)
     }
 
     if (code == SQLITE_DONE)
-        goto done;
-
-    if (code != SQLITE_ROW)
-        goto error;
-
-    switch (item->type) {
-    case callback_database:
-        * (int *) ret[0] = sqlite3_column_int(item->iter, 0);
-        ret[1] = (char *) sqlite3_column_text(item->iter, 1);
-        * (int *) ret[2] = sqlite3_column_int(item->iter, 2);
-        return true;
+        goto error_or_done;
 
-    default:
-        break;
+    if (code == SQLITE_ROW) {
+        id = sqlite3_column_int(item, 0);
+        sql_row = (const char *) sqlite3_column_text(item, 1);
+        id_len = sqlite3_column_int(item, 2);
+        return callback(args, id, id_len, sql_row);
     }
 
-to_small:
-    fprintf(stderr, " . database_search_iter: length of ret is to small, should be at least 3\n");
-    return false;
-error:
-    fprintf(stderr, " ! database_search_iter: sqlite3_step failed: %s\n", sqlite3_errmsg(item->db));
-    sqlite3_finalize(item->iter);
-    return false;
-done:
-    sqlite3_finalize(item->iter);
-    *len = 0;
+    fprintf(stderr, " ! database_search_iter: sqlite3_step failed: %s\n", sqlite3_errmsg(db));
+error_or_done:
+    sqlite3_finalize(item);
+    *need_free = false;
     return false;
 }
diff --git a/src/database/queue.c b/src/database/queue.c
index d68b24a14a2b8a7e4d8560756f37c66b9771dd9b..1ec0e4292ae8c8821db2cfc6cddfdbd6335fbf54 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -320,7 +320,7 @@ database_queue_del_id(sqlite3 *db, int id)
         " WHEN current IS NULL THEN NULL"
         " ELSE (SELECT pos FROM before) "
         "END WHERE current > (SELECT position FROM queue_ WHERE kara_id = %d);"
-        "DELETE FROM queue WHERE kara_id = %d LIMIT 1;"
+        "DELETE FROM queue WHERE kara_id = %d;"
         "COMMIT TRANSACTION;";
     char SQL[LKT_MAX_SQLITE_STATEMENT];
     snprintf(SQL, LKT_MAX_SQLITE_STATEMENT - 1, SQL_TEMPLATE, id, id, id);
@@ -674,7 +674,7 @@ error:
 
 bool
 database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *args,
-                        database_callback callback)
+                        database_search_callback_t callback)
 {
     const char *SQL_STMT =
         "WITH content AS ("
@@ -724,7 +724,7 @@ error:
 
 bool
 database_queue_list_from(sqlite3 *db, unsigned int count, void *args,
-                         database_callback callback)
+                         database_search_callback_t callback)
 {
     const char *SQL_TEMPLATE =
         "WITH content AS ("