diff --git a/src/database/playlist.c b/src/database/playlist.c
index a4b9b26c71516502a54e74277a9fd2ea12841cd2..d882ef0b125af1b09eafa29d6c65789d4bb68529 100644
--- a/src/database/playlist.c
+++ b/src/database/playlist.c
@@ -163,38 +163,15 @@ database_plt_add_uri(volatile sqlite3 *db, const char *name,
                      struct lkt_uri *uri)
 {
     static const char *SQL =
-        "WITH plt_id(id) AS (SELECT playlist.id AS id FROM playlist"
-        " WHERE name COLLATE nocase = ?) "
-        "INSERT INTO kara_playlist (kara_id, playlist_id) "
-        "SELECT plt_id.id, kara.id "
-        "  FROM kara, plt_id "
-        "  WHERE kara.%s LIKE ? "
-        "  ORDER BY RANDOM();";
+        "INSERT OR REPLACE INTO kara_playlist (kara_id, playlist_id) "
+        "SELECT"
+        " kara.id,"
+        " (SELECT playlist.id FROM playlist WHERE name = ? COLLATE NOCASE)"
+        "FROM kara WHERE kara.%s LIKE ?;";
     char SQL_STMT[LKT_MAX_SQLITE_STATEMENT], sta = false;
-    const char *column;
     sqlite3_stmt *stmt;
 
-    switch (uri->type) {
-    case uri_type:
-        column = LKT_DB_TYPE;
-        break;
-    case uri_author:
-        column = LKT_DB_AUTHOR;
-        break;
-    case uri_category:
-        column = LKT_DB_CAT;
-        break;
-    case uri_language:
-        column = LKT_DB_LANG;
-        break;
-    case uri_query:
-        column = LKT_DB_ALL;
-        break;
-    default:
-        return false;
-    }
-
-    safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL, column);
+    safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL, uri->column_name);
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
     SQLITE_BIND_TEXT(db, stmt, 1, name, error);
     SQLITE_BIND_TEXT(db, stmt, 2, (char *) uri->value, error);
diff --git a/src/database/queue.c b/src/database/queue.c
index 92d82e63b59c3e80a1a30828716d045993e21578..9762414cc190ac529b71ceaa860eea0cff1c9277 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -119,8 +119,10 @@ error:
     if (prio > 1) {                                             \
         if (__queue_reorder(db)) {                              \
             LOG_INFO("DB", "%s", "Queue has been reordered");   \
-        } else                                                  \
+        } else {                                                \
+            LOG_INFO("DB", "%s", "Failed to reorder");          \
             goto error;                                         \
+        }                                                       \
     }
 
 static bool
@@ -131,7 +133,7 @@ __queue_reorder(volatile sqlite3 *db)
     " ELSE (SELECT current FROM queue_state) END AS val LIMIT 1)"
     static const char *SQL_REORDER =
         /* Create temporary tables */
-        "CREATE TEMPORARY TABLE queue_tmp"
+        "CREATE TEMPORARY TABLE queue_tmp IF NOT EXISTS"
         " ( position INTEGER PRIMARY KEY AUTOINCREMENT CHECK(position > 0)"
         " , kara_id INTEGER"
         " , priority INTEGER NOT NULL DEFAULT 1 CHECK(priority > 0 AND priority < 6)"
@@ -146,7 +148,7 @@ __queue_reorder(volatile sqlite3 *db)
         " SELECT position + " CURRENT_POS_OR_0 ", kara_id, priority"
         " FROM queue_tmp;"
         /* Drop temporary tables */
-        "DROP TABLE queue_tmp;"
+        "DELETE FROM queue_tmp;"
         "DELETE FROM sqlite_sequence WHERE name = 'queue_tmp';";
 #undef CURRENT_POS_OR_0
     SQLITE_EXEC(db, SQL_REORDER, error);
@@ -274,7 +276,7 @@ database_queue_add_uri(volatile sqlite3 *db, struct lkt_uri *uri, int prio)
     case uri_author:
         return queue_add_with_col_like_str(db, LKT_DB_AUTHOR, uri->value, prio);
     case uri_playlist:
-        return database_queue_add_plt(db, (char *) uri->value, prio);
+        return database_queue_add_plt(db, uri->value, prio);
     default:
         LOG_WARN("DB", "Add to queue for uri of type %d is not"
                  " implemented", uri->type);
diff --git a/src/main/lkt.c b/src/main/lkt.c
index 3999db0fd3f3a3ff3d08e2e6f397be5acbbe2372..9c53b2f685b0923251bbc09bb3455bb5b8b256e3 100644
--- a/src/main/lkt.c
+++ b/src/main/lkt.c
@@ -733,7 +733,17 @@ plt_add__(struct lkt_cmd_args *args)
     FILE *sock = lkt_connect();
     fail_if(args->argc < 3,                 "Invalid argument, need at least three arguments: plt add <plt> <query>");
     fail_if(!lkt_valid_type(args->argv[1]), "Invalid argument, type for the query is invalid");
-    send_cmd_with_uri(sock, "playlistadd", args->argc, args->argv);
+
+    int i;
+    char buf[LKT_MESSAGE_MAX] = {0};
+    for (i = 2; i < args->argc - 1; ++i) {
+        strncat(buf, args->argv[i], LKT_MESSAGE_MAX - 1);
+        strncat(buf, " ", LKT_MESSAGE_MAX - 1);
+    }
+    strncat(buf, args->argv[i], LKT_MESSAGE_MAX - 1);
+    strncat(buf, "\n", LKT_MESSAGE_MAX - 1);
+    write_socket(sock, "playlistadd %s %s://%s", args->argv[0], args->argv[1], buf);
+
     exit_with_status(sock, buff);
 }
 
diff --git a/src/uri.c b/src/uri.c
index eaf64887a11c1a402e42baec6da808fee1191add..fd46447148178714dac4a0864d0adabcd8fd6c6a 100644
--- a/src/uri.c
+++ b/src/uri.c
@@ -29,7 +29,7 @@ __prefix(char *str, struct lkt_uri *ret)
     } else if (STR_NMATCH(str, "playlist", 8)) {
         ret->column_name = NULL;
         ret->type = uri_playlist;
-        val = str + 3;
+        val = str + 8;
     } else if (STR_NMATCH(str, "type", 4)) {
         ret->column_name = LKT_DB_TYPE;
         ret->type = uri_type;