diff --git a/inc/lektor/macro.h b/inc/lektor/macro.h
index 3ac78e56235110244f9fe2ee620bb38c82e95e04..5403ef8ce96f0ebf4efc9bc18e87c0aa8b056eec 100644
--- a/inc/lektor/macro.h
+++ b/inc/lektor/macro.h
@@ -28,6 +28,9 @@
         goto error;                                                     \
     }
 
+#define SQLITE_DO_ROLLBACK(db)                                          \
+    sqlite3_exec(db, "ROLLBACK TRANSACTION;\n", NULL, NULL, NULL);
+
 #ifndef MAX
 #define MAX(a, b) ((a) < (b) ? (b) : (a))
 #endif /* MAX */
diff --git a/src/commands.c b/src/commands.c
index 2282c9bb041d216aabab8ceaf51ea43681a0bb48..09d10e81e0ea446ecff0eb932fc458cd78bfd69d 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -388,9 +388,14 @@ command_del(sqlite3 *db, struct lkt_win *win, char *pos_range, enum mpd_idle_fla
         return false;
     }
 
-    // Second digit -> a range
     if (endptr == pos_range) {
-        fprintf(stderr, " . command_del: to digit found in string '%s'\n", 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);
@@ -400,13 +405,15 @@ command_del(sqlite3 *db, struct lkt_win *win, char *pos_range, enum mpd_idle_fla
             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, i);
+            ret &= database_queue_del_pos(db, pos_lowwer);
 
         return ret;
     }
diff --git a/src/database/queue.c b/src/database/queue.c
index e51b1ab2f2f9afe8539cda97880baa46c42f5eaf..e8cfe1be46fae372158d0d75d0635e415edc7ea8 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -337,18 +337,20 @@ err:
 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 =
-        "DELETE FROM queue"
-        "  WHERE position = "
-        "    ( SELECT old_position"
-        "      FROM queue_"
-        "      WHERE position = ?"
-        "    );";
-    if (!queue_rm_with_sql(db, SQL_DEL_POS, pos))
-        return false;
-    SQLITE_EXEC(db, "UPDATE queue_state SET current = current - 1;", err);
+        "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;";
+    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);
     return true;
 err:
+    SQLITE_DO_ROLLBACK(db);
     return false;
 }
 
@@ -591,8 +593,8 @@ database_queue_get_current_file(sqlite3 *db, char filepath[PATH_MAX])
     static const char *SQL_STMT =
         "SELECT file_path"
         "  FROM kara"
-        "  JOIN queue ON kara.id = queue.kara_id"
-        "  JOIN queue_state ON queue.position = queue_state.current";
+        "  JOIN queue_ ON kara.id = queue_.kara_id"
+        "  JOIN queue_state ON queue_.position = queue_state.current";
     bool status = false;
     int code = SQLITE_OK;
     sqlite3_stmt *stmt = NULL;