diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h
index 3329c8a48a5e26e2799d045e74eae4251f1797ed..48f2086816c66c4040f7d37433cc7fd80118fb85 100644
--- a/inc/lektor/commands.h
+++ b/inc/lektor/commands.h
@@ -32,7 +32,6 @@ bool command_add(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_M
                  enum mpd_idle_flag *watch_mask_ptr);
 bool command_addid(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX],
                    enum mpd_idle_flag *watch_mask_ptr);
-bool command_del(sqlite3 *db, struct lkt_win *win, char *pos_range, enum mpd_idle_flag *watch_mask_ptr);
 bool command_delid(sqlite3 *db, struct lkt_win *win, char *id, enum mpd_idle_flag *watch_mask_ptr);
 bool command_clear(sqlite3 *db, enum mpd_idle_flag *watch_mask_ptr);
 bool command_crop(sqlite3 *db, enum mpd_idle_flag *watch_mask_ptr);
@@ -63,10 +62,9 @@ bool command_noidle(struct lkt_state *srv, size_t c);
 
 /* Find commands */
 enum lkt_find_action {
-    LKT_FND_ACT_NONE = 0,
-    LKT_FND_ACT_RESPOND = 1,
-    LKT_FND_ACT_PRINT = 2,
-    LKT_FND_ACT_ENQUEUE = 3,
+    LKT_FND_ACT_RESPOND,
+    LKT_FND_ACT_ADD,
+    LKT_FND_ACT_INSERT,
 };
 
 /* Find and send karas in the db that match the search expression */
diff --git a/inc/lektor/database.h b/inc/lektor/database.h
index 475206c5e695c6419e26f7077487e4d6236edb19..9adae381872650f76fda5fe585fae3a52e336e97 100644
--- a/inc/lektor/database.h
+++ b/inc/lektor/database.h
@@ -73,19 +73,15 @@ bool database_queue_toggle_pause(sqlite3 *db);
 bool database_queue_play(sqlite3 *db, int pos);
 bool database_queue_stop(sqlite3 *db);
 
-/* A search callback to be called after each matched row */
-typedef bool (*database_search_callback_t)(void *args, int id, int id_len, const char *sql_row);
-
 /* List the content of the queue */
-bool database_queue_list_from(sqlite3 *db, unsigned int count, void *args,
-                              database_search_callback_t callback);
-bool database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *args,
-                             database_search_callback_t callback);
+bool database_queue_list_from(sqlite3 *db, unsigned int count, void *args, struct database_callback callback);
+bool database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *args, struct database_callback callback);
 
 /* Search the database */
-bool database_search_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret);
-bool database_search_iter(sqlite3 *db, sqlite3_stmt *item, void *args,
-                          database_search_callback_t callback, bool *need_free);
+bool database_search_database_init(sqlite3 *db, const char *col_name, const char *rgx, sqlite3_stmt **ret);
+bool database_search_plt_init(sqlite3 *db, const char *plt_name, char *col_name, char *rgx,
+                              sqlite3_stmt **ret);
+bool database_search_iter(sqlite3 *db, sqlite3_stmt *item, struct lkt_callback callback, bool *need_free);
 
 /* Next and prev operation on the queue. */
 bool database_queue_next(sqlite3 *db, char filepath[PATH_MAX]);
diff --git a/inc/lektor/defines.h b/inc/lektor/defines.h
index c6eac5cdabfa5a5119f7f8be73bd1c53f2e2603c..33f3293c2bf7c4bb5a546c3f2805e968bd9fbc55 100644
--- a/inc/lektor/defines.h
+++ b/inc/lektor/defines.h
@@ -46,3 +46,16 @@ enum mpd_idle_flag {
         MPD_IDLE_OUTPUT | MPD_IDLE_OPTIONS | MPD_IDLE_PARTITION         |
         MPD_IDLE_STICKER | MPD_IDLE_SUBSCRIPTION | MPD_IDLE_MESSAGE,
 };
+
+enum lkt_callback_type {
+    callback_database,
+    callback_queue,
+    callback_playlist,
+};
+
+struct lkt_callback {
+    void **args;
+    enum lkt_callback_type type;
+    int (*call)(void **args, int id, int id_len, const char *sql_row);
+};
+
diff --git a/src/commands.c b/src/commands.c
index 743d2f25d1d65674ad6f8609288404f83872512a..de185efeb6a4bde288d5033a551c6d2a0a43f29b 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -522,42 +522,28 @@ command_noidle(struct lkt_state *srv, size_t c)
 
 /* Functions for the searchadd and the search mpd commands */
 static bool
-lkt_callback_print_row_v1(void *args, int id, int id_len, const char *sql_row)
+lkt_callback_send_row(struct _client_trace_t *args, int id, int id_len, const char *sql_row)
 {
-    printf(" . from client %ld:\t%*d:%s\n", ((struct _client_trace_t *) args)->c,
-           id_len, id, 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);
     return true;
 }
 
 static bool
-lkt_callback_none(void *args, int id, int id_len, const char *sql_row)
+lkt_callback_insert(struct _client_trace_t *args, int id, int id_len, const char *sql_row)
 {
-    (void) args;
-    (void) id;
-    (void) id_len;
     (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;
+    (void) id_len;
+    return database_queue_add_id(args->srv->db, id, 5);
 }
 
 static bool
-lkt_callback_insert_v1(void *_args, int id, int id_len, const char *sql_row)
+lkt_callback_add(struct _client_trace_t *args, int id, int id_len, const char *sql_row)
 {
     (void) sql_row;
     (void) id_len;
-    struct _client_trace_t *args = (struct _client_trace_t *) _args;
-    return database_queue_add_id(args->srv->db, id, 5);
+    return database_queue_add_id(args->srv->db, id, 1);
 }
 
 bool
@@ -569,9 +555,13 @@ 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;
+    struct _client_trace_t args = {
+        .srv = srv,
+        .c = c,
+    };
     struct lkt_message *not_found_msg;
-    database_search_callback_t callback;
+    struct database_callback callback = { .type = database_callback_db };
+
 
     // Check args //
     if (cmd_args == NULL || cmd_args[0] == NULL) {
@@ -582,23 +572,19 @@ command_find(struct lkt_state *srv,
     // Select callback //
     switch (action) {
     case LKT_FND_ACT_RESPOND:
-        callback = lkt_callback_send_row_v1;
-        args.srv = srv;
-        args.c = c;
+        callback.call = lkt_callback_send_row;
         break;
-    case LKT_FND_ACT_PRINT:
-        callback = lkt_callback_print_row_v1;
+    case LKT_FND_ACT_INSERT:
+        callback.call = lkt_callback_add;
+        srv->mpd_idle_events |= MPD_IDLE_PLAYLIST;
         break;
-    case LKT_FND_ACT_ENQUEUE:
-        callback = lkt_callback_insert_v1;
+    case LKT_FND_ACT_INSERT:
+        callback.call = lkt_callback_insert;
         srv->mpd_idle_events |= MPD_IDLE_PLAYLIST;
-        args.srv = srv;
-        args.c = c;
         break;
-    case LKT_FND_ACT_NONE:
     default:
-        callback = lkt_callback_none;
-        break;
+        fprintf(stderr, " ! command_find: Find action not implemented\n");
+        return false;
     }
 
     // Select the right column //
@@ -637,7 +623,7 @@ command_find(struct lkt_state *srv,
     }
 
     // Make the search langand do the right action //
-    if (!database_search_init(srv->db, col_name, rgx, &stmt)) {
+    if (!database_search_database_init(srv->db, col_name, rgx, &stmt)) {
         fprintf(stderr, " ! command_find: Failed to init the search\n");
         return false;
     }
@@ -932,9 +918,11 @@ command_queue_list(struct lkt_state *srv, size_t c,
     unsigned int from, to, tmp_switch;
     long val;
     char *endptr, *str;
-    struct _client_trace_t callback_args = {
-        .srv = srv,
-        .c = c,
+    void ** call_args = { &srv, c };
+    struct lkt_callback callback = {
+        .args = call_args,
+        .type = callback_queue,
+        .call = lkt_callback_send_row,
     };
 
     if (!args || !args[0] || strlen(args[0]) == 0) {
@@ -999,13 +987,11 @@ 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_v1);
+    return database_queue_list_from(srv->db, count, &callback_args, lkt_callback_send_row);
 
     /* 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_v1);
+    return database_queue_list_abs(srv->db, from, to, &callback_args, lkt_callback_send_row);
 }
 
 bool
diff --git a/src/database/find.c b/src/database/find.c
index f9c8a62d20e01b826b0a36f23dc5b21e2c8fa043..1b6dbbe96cb52ff39d11e323876aaa7fb10d2702 100644
--- a/src/database/find.c
+++ b/src/database/find.c
@@ -8,7 +8,7 @@
 #include <string.h>
 
 bool
-database_search_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret)
+database_search_database_init(sqlite3 *db, const char *col_name, const char *rgx, sqlite3_stmt **ret)
 {
     if (ret == NULL) {
         fprintf(stderr, " ! database_search_init: Exit because return pointer is NULL\n");
@@ -34,12 +34,13 @@ error:
     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(sqlite3 *db,
-                     sqlite3_stmt *item,
-                     void *args,
-                     database_search_callback_t callback,
-                     bool *need_free)
+database_search_iter(sqlite3 *db, sqlite3_stmt *item, struct lkt_callback callback, bool *need_free)
 {
     const char *sql_row;
     int id, code, id_len;
@@ -53,17 +54,25 @@ database_search_iter(sqlite3 *db,
     }
 
     if (code == SQLITE_DONE)
-        goto error_or_done;
+        goto done;
+
+    if (code != SQLITE_ROW)
+        goto error;
 
-    if (code == SQLITE_ROW) {
+    switch (callback.type) {
+    case callback_database:
         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);
+        return callback.call(callback.args, id, id_len, sql_row);
+
+    default:
+        break;
     }
 
+error:
     fprintf(stderr, " ! database_search_iter: sqlite3_step failed: %s\n", sqlite3_errmsg(db));
-error_or_done:
+done:
     sqlite3_finalize(item);
     *need_free = false;
     return false;
diff --git a/src/database/queue.c b/src/database/queue.c
index 1ec0e4292ae8c8821db2cfc6cddfdbd6335fbf54..7ac22dd3a7ad0ec995a09a006ae8a3ae120e1635 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;"
+        "DELETE FROM queue WHERE kara_id = %d LIMIT 1;"
         "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_search_callback_t callback)
+                        struct database_callback callback)
 {
     const char *SQL_STMT =
         "WITH content AS ("
@@ -702,7 +702,7 @@ database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *a
             id = sqlite3_column_int(stmt, 0);
             row = (const char *) sqlite3_column_text(stmt, 1);
             id_len = sqlite3_column_int(stmt, 2);
-            if (callback(args, id, id_len, row))
+            if (callback.call(args, id, id_len, row))
                 continue;
             else
                 break;
@@ -724,7 +724,7 @@ error:
 
 bool
 database_queue_list_from(sqlite3 *db, unsigned int count, void *args,
-                         database_search_callback_t callback)
+                         struct database_callback callback)
 {
     const char *SQL_TEMPLATE =
         "WITH content AS ("
@@ -755,7 +755,7 @@ database_queue_list_from(sqlite3 *db, unsigned int count, void *args,
             id = sqlite3_column_int(stmt, 0);
             row = (const char *) sqlite3_column_text(stmt, 1);
             id_len = sqlite3_column_int(stmt, 2);
-            if (callback(args, id, id_len, row))
+            if (callback.call(args, id, id_len, row))
                 continue;
             else
                 break;
diff --git a/src/net/listen.c b/src/net/listen.c
index 58b2743261ccb31c37f0f414f2e9868858abd834..d2730be6cd85ef6dfd39ad3e7fdcf1250dfba296 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -246,7 +246,7 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
             goto end_no_send_status;
         } else if (!strcmp(cmd.name, "searchadd") ||
                    !strcmp(cmd.name, "findadd"))
-            err = !command_find(srv, c, cmd.args, LKT_FND_ACT_ENQUEUE);
+            err = !command_find(srv, c, cmd.args, LKT_FND_ACT_RESPOND);
         else if (!strcmp(cmd.name, "search") ||
                  !strcmp(cmd.name, "find"))
             err = !command_find(srv, c, cmd.args, LKT_FND_ACT_RESPOND);