diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h
index 48f2086816c66c4040f7d37433cc7fd80118fb85..3329c8a48a5e26e2799d045e74eae4251f1797ed 100644
--- a/inc/lektor/commands.h
+++ b/inc/lektor/commands.h
@@ -32,6 +32,7 @@ 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);
@@ -62,9 +63,10 @@ bool command_noidle(struct lkt_state *srv, size_t c);
 
 /* Find commands */
 enum lkt_find_action {
-    LKT_FND_ACT_RESPOND,
-    LKT_FND_ACT_ADD,
-    LKT_FND_ACT_INSERT,
+    LKT_FND_ACT_NONE = 0,
+    LKT_FND_ACT_RESPOND = 1,
+    LKT_FND_ACT_PRINT = 2,
+    LKT_FND_ACT_ENQUEUE = 3,
 };
 
 /* 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 a706a57058177dfa4402dcfc74ae8e07aa38327a..475206c5e695c6419e26f7077487e4d6236edb19 100644
--- a/inc/lektor/database.h
+++ b/inc/lektor/database.h
@@ -73,26 +73,19 @@ bool database_queue_toggle_pause(sqlite3 *db);
 bool database_queue_play(sqlite3 *db, int pos);
 bool database_queue_stop(sqlite3 *db);
 
-typedef bool (*database_callback)(void *args, int id, int id_len, const char *sql_row);
+/* 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_callback callback);
-bool database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *args, database_callback callback);
+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);
 
 /* Search the database */
-struct lkt_search_iterator {
-    enum lkt_search_iterator_type {
-        lkt_search_iterator_database,
-        lkt_search_iterator_queue,
-        lkt_search_iterator_playlist,
-    } type;
-    sqlite3_stmt *iter;
-    sqlite3 *db;
-};
-bool database_search_database_init(sqlite3 *db, const char *col_name, const char *rgx, struct lkt_search_iterator *ret);
-bool database_search_plt_init(sqlite3 *db, const char *plt_name, char *col_name, char *rgx,
-                              struct lkt_search_iterator *ret);
-bool database_search_iter(struct lkt_search_iterator *item, void **ret, size_t *len);
+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);
 
 /* 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 33f3293c2bf7c4bb5a546c3f2805e968bd9fbc55..c6eac5cdabfa5a5119f7f8be73bd1c53f2e2603c 100644
--- a/inc/lektor/defines.h
+++ b/inc/lektor/defines.h
@@ -46,16 +46,3 @@ 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);
-};
-