diff --git a/src/commands.c b/src/commands.c
index 09d10e81e0ea446ecff0eb932fc458cd78bfd69d..cc65c13ab4f96061dedccdbc0462a0bdacc9f594 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -365,60 +365,6 @@ command_crop(sqlite3 *db, enum mpd_idle_flag *watch_mask_ptr)
     return database_queue_crop(db);
 }
 
-bool
-command_del(sqlite3 *db, struct lkt_win *win, char *pos_range, enum mpd_idle_flag *watch_mask_ptr)
-{
-    (void) win;
-    long pos_lowwer, pos_upper = -1, i;
-    char *endptr;
-    bool ret = true;
-
-    if (pos_range == NULL) {
-        fprintf(stderr, " ! command_del: NULL argument\n");
-        return false;
-    }
-
-    errno = 0;
-    *watch_mask_ptr |= MPD_IDLE_PLAYLIST;
-    pos_lowwer = strtol(pos_range, &endptr, 10);
-
-    if ((errno == ERANGE && (pos_lowwer == LONG_MAX || pos_lowwer == LONG_MIN))
-        || (errno != 0 && pos_lowwer == 0)) {
-        fprintf(stderr, " ! command_del: strtol failed: %s\n", strerror(errno));
-        return false;
-    }
-
-    if (endptr == pos_range) {
-        fprintf(stderr, " ! command_del: No digit found, invalid argument\n");
-        return false;
-    }
-
-    // Second digit -> a range
-    if (*endptr != '\0') {
-        fprintf(stderr, " . command_del: two digit found in string '%s'\n", pos_range);
-        pos_range = endptr + strcspn(endptr, "0123456789");
-
-        pos_upper = strtol(pos_range, &endptr, 10);
-
-        if ((errno == ERANGE && (pos_upper == LONG_MAX || pos_upper == LONG_MIN))
-            || (errno != 0 && pos_upper == 0)) {
-            fprintf(stderr, " ! command_del: strtol failed: %s\n", strerror(errno));
-            return false;
-        }
-
-        fprintf(stderr, " . command_del: Going from %ld to %ld\n", pos_lowwer, pos_upper);
-    }
-
-    if (pos_lowwer >= pos_upper)
-        return database_queue_del_pos(db, pos_lowwer);
-    else {
-        for (i = pos_lowwer; i <= pos_upper; ++i)
-            ret &= database_queue_del_pos(db, pos_lowwer);
-
-        return ret;
-    }
-}
-
 bool
 command_delid(sqlite3 *db, struct lkt_win *win, char *id_str, enum mpd_idle_flag *watch_mask_ptr)
 {
diff --git a/src/database/queue.c b/src/database/queue.c
index e8cfe1be46fae372158d0d75d0635e415edc7ea8..b0b5e5004f920781542caa950d243cae381e8618 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -303,54 +303,23 @@ error:
     return status;
 }
 
-static bool
-queue_rm_with_sql(sqlite3 *db, const char *sql, int arg)
-{
-    bool res = false;
-    sqlite3_stmt *stmt = 0;
-    SQLITE_PREPARE(db, stmt, sql, err);
-    SQLITE_BIND_INT(db, stmt, 1, arg, err);
-    if (sqlite3_step(stmt) != SQLITE_DONE) {
-        fprintf(stderr, " ! del_kara_with_sql: Failed to delete kara: %s\n",
-                sqlite3_errmsg(db));
-        goto err;
-    }
-
-    res = true;
-err:
-    sqlite3_finalize(stmt);
-    return res;
-}
-
 bool
 database_queue_del_id(sqlite3 *db, int id)
 {
-    static const char *SQL_DEL_KARA = "DELETE FROM queue WHERE kara_id = ?;";
-    if (!queue_rm_with_sql(db, SQL_DEL_KARA, id))
-        return false;
-    SQLITE_EXEC(db, "UPDATE queue_state SET current = current - 1;", err);
-    return true;
-err:
-    return false;
-}
-
-bool
-database_queue_del_pos(sqlite3 *db, int pos)
-{
-    /* Update current if we delete a kara before it. If we delete the current,
-       also do the -1, so we can play the “old next” kara. */
-    static const char *SQL_DEL_POS =
-        "BEGIN TRANSACTION;"
-        "UPDATE queue_state SET current = current - 1 WHERE %d > current;"
-        "DELETE FROM queue WHERE position = (SELECT old_position FROM queue_ WHERE position = %d);"
-        "COMMIT TRANSACTION;";
+    static const char *SQL_TEMPLATE =
+        "WITH before (pos) AS (SELECT position FROM queue_ JOIN queue_state WHERE position < current)"
+        "UPDATE queue_state SET current = CASE"
+        " WHEN (SELECT pos FROM before) IS NULL THEN (SELECT pos FROM queue_ ORDER BY position DESC LIMIT 1)"
+        " WHEN current IS NULL THEN NULL"
+        " ELSE (SELECT pos FROM before)"
+        "END;"
+        "DELETE FROM queue WHERE kara_id = %d;";
     char SQL[LKT_MAX_SQLITE_STATEMENT];
-    snprintf(SQL, LKT_MAX_SQLITE_STATEMENT - 1, SQL_DEL_POS, pos, pos);
-    SQL[LKT_MAX_SQLITE_STATEMENT - 1] = 0;
-    SQLITE_EXEC(db, SQL, err);
+    snprintf(SQL, LKT_MAX_SQLITE_STATEMENT - 1, SQL_TEMPLATE, id);
+    SQL[LKT_MAX_SQLITE_STATEMENT - 1] = '\0';
+    SQLITE_EXEC(db, SQL, error);
     return true;
-err:
-    SQLITE_DO_ROLLBACK(db);
+error:
     return false;
 }
 
diff --git a/src/main/lkt.c b/src/main/lkt.c
index 0734beed15433e080e92beec33a04b256620ff3c..d6b2e83ef9c689697c8c4d79e111a9737aefe2c7 100644
--- a/src/main/lkt.c
+++ b/src/main/lkt.c
@@ -48,7 +48,7 @@ help(void)
         "    status:        get the status of lektor.\n"
         "    current:       get the currently playing song.\n"
         "    add <query>:   add a kara to the playlist with a query.\n"
-        "    delete <arg>:  delete the id or a range of ids from the queue.\n"
+        "    delete <id>:   delete the id from the queue.\n"
         "    clear:         clear the queue of lektor.\n"
         "    prev:          play previous kara in the queue.\n"
         "    next:          play the next kara in the queue.\n"
@@ -485,37 +485,14 @@ delete__(struct lkt_cmd_args *args)
     if (args->argc != 1)
         fail("Invalid argument, need onlt one argument");
 
-    static const char *cmd_range__ = "delete %s\nclose\n";
-    static const char *cmd_id__    = "deleteid %d\nclose\n";
-    int dumy1 = 0, dumy2 = 0;;
+    static const char *cmd_id__ = "deleteid %d\nclose\n";
+    int dumy = 0;
     FILE *sock = lkt_connect();
-    char buff[3], dumy3;
+    char buff[3];
 
-    /* Is this a range? matches only `int:int` */
-    sscanf(args->argv[0], "%d:%d", &dumy1, &dumy2);
-    if (dumy1 != 0 && dumy2 != 0) {
-        write_socket_format(sock, cmd_range__, args->argv[0]);
-        goto check;
-    }
-
-    /* Ranges, matches `:int`. */
-    sscanf(args->argv[0], ":%d", &dumy1);
-    if (args->argv[0][0] == ':' && dumy1 != 0) {
-        write_socket_format(sock, cmd_range__, args->argv[0]);
-        goto check;
-    }
-
-    /* Ranges, matches `int:`. */
-    sscanf(args->argv[0], "%d%c", &dumy1, &dumy3);
-    if (dumy1 != 0 && dumy3 == ':') {
-        write_socket_format(sock, cmd_range__, args->argv[0]);
-        goto check;
-    }
-
-    /* Or only an id? */
-    sscanf(args->argv[0], "%d", &dumy1);
-    if (dumy1 != 0) {
-        write_socket_format(sock, cmd_id__, dumy1);
+    sscanf(args->argv[0], "%d", &dumy);
+    if (dumy != 0) {
+        write_socket_format(sock, cmd_id__, dumy);
         goto check;
     }
 
diff --git a/src/net/listen.c b/src/net/listen.c
index b2705dfad7df5e5f9adf02125f798617334e3139..58b2743261ccb31c37f0f414f2e9868858abd834 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -211,9 +211,6 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
         else if (!strcmp(cmd.name, "deleteid"))
             err = ! (cmd.args[0] != NULL &&
                      command_delid(srv->db, &srv->win, cmd.args[0], &srv->mpd_idle_events));
-        else if (!strcmp(cmd.name, "delete"))
-            err = ! (cmd.args[0] != NULL &&
-                     command_del(srv->db, &srv->win, cmd.args[0], &srv->mpd_idle_events));
 
         else if (!strcmp(cmd.name, "playlistclear"))
             err = ! command_plt_clear(srv->db, cmd.args, &srv->mpd_idle_events);