diff --git a/src/database/queue.c b/src/database/queue.c
index 29d275d8caf4a9a4b4d389dcb55004ec905139c4..579d087e3600b53c99c5afc3d2ed25859bf91f1d 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -251,17 +251,20 @@ database_queue_add_uri(volatile sqlite3 *db, struct lkt_uri *uri, int priority)
 bool
 database_queue_del_id(volatile sqlite3 *db, int id)
 {
-    /* FIXME: Can't pop if its the last kara */
-#define POS_OF_ID "(SELECT position FROM queue WHERE kara_id = %d)"
     static const char *SQL_TEMPLATE =
         "BEGIN TRANSACTION;"
-        "WITH before(pos) AS (SELECT position FROM queue JOIN queue_state WHERE position < current ORDER BY position DESC LIMIT 1) "
-        "UPDATE queue_state SET current = CASE WHEN current IS NULL THEN NULL ELSE (SELECT pos FROM before) END WHERE current > " POS_OF_ID ";"
-        "UPDATE OR REPLACE queue SET position = position - 1 WHERE position > " POS_OF_ID ";"
+        "CREATE TEMPORARY TABLE queue_tmp (position INTEGER, kara_id INTEGER, priority INTEGER);"
+        /* Move the current 'pointer' */
+        "UPDATE queue_state SET current = (SELECT current - IFNULL(COUNT(position), 0) FROM queue JOIN queue_state ON position <= current AND kara_id = %d);"
+        "DELETE FROM queue WHERE kara_id = %d;"                                                 /* Delete any kara with the specified id */
+        "INSERT INTO queue_tmp(priority, position, kara_id) SELECT priority, position, kara_id FROM queue ORDER BY position ASC;"
+        "DELETE FROM queue;"
+        "INSERT INTO queue(priority, position, kara_id) SELECT priority, ROW_NUMBER() OVER(ORDER BY position ASC), kara_id FROM queue_tmp;"
+        "UPDATE sqlite_sequence SET seq = (SELECT COUNT(*) FROM queue) WHERE name = 'queue';"   /* Update the sqlite_sequence            */
+        "DROP TABLE queue_tmp;"                                                                 /* Erase queue_tmp                       */
         "COMMIT;";
-#undef POS_OF_ID
     char SQL[LKT_MAX_SQLITE_STATEMENT];
-    safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE, id, id, id, id);
+    safe_snprintf(SQL, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE, id, id);
     SQLITE_EXEC(db, SQL, error);
     return true;
 error: