diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h
index 9309062fc9e30febb5f1b20b026445f84ddbe1a0..9b18e0e9ca38c0781a55a07d16dae456cde2f4d7 100644
--- a/inc/lektor/commands.h
+++ b/inc/lektor/commands.h
@@ -86,6 +86,7 @@ bool command_update (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARG
 bool command_rescan (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
 
 /* Sticker management */
+bool command_sticker_create(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
 bool command_sticker_get   (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
 bool command_sticker_set   (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
 bool command_sticker_delete(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
diff --git a/src/commands.c b/src/commands.c
index 81a65c06d791970b3844117b5f8fc13e5697219d..495e0c195398ee6399ec27cef7f947382e617704 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -736,30 +736,18 @@ sticker_send(struct lkt_state *srv, size_t c, char *name, int id, int value)
     return true;
 }
 
-/*
 bool
-command_sticker_get(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX])
+command_sticker_create(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX])
 {
-    RETURN_UNLESS(argv[0] && argv[1] && argv[2] && !argv[3], "Invalid argument", false);
-    long uri;
-    char *endptr, err;
-    STRTOL(uri, argv[1], endptr, err);
-    RETURN_IF(err, "STRTOL failed", false);
-    struct lkt_search cb = {
-        .call = (void(*)(void)) sticker_send,
-        .srv = srv,
-        .c = c,
-        .name = argv[2],
-        .st_type = argv[0],
-        .st_uri = (int) uri,
-    };
-    if (!database_search_sticker_init(srv->db, &cb))
+    UNUSED(c);
+    RETURN_UNLESS(argv[0], "Invalid argument", false);
+    if (!database_sticker_create(srv->db, argv[0])) {
+        LOG_ERROR_SCT("COMMAND", "Failed to create sticker '%s'", argv[0]);
         return false;
-    while (database_search_iter(&cb))
-        continue;
+    }
+    LOG_INFO_SCT("COMMAND", "Created sticker '%s'", argv[0]);
     return true;
 }
-*/
 
 bool
 command_sticker_set(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX])
diff --git a/src/database/stickers.c b/src/database/stickers.c
index 34ca0d4a72fb44501acf05d15c9f8aa2ad565471..6f52e6eee8ea4ed773e13a59ace2d13242019ef8 100644
--- a/src/database/stickers.c
+++ b/src/database/stickers.c
@@ -11,18 +11,17 @@ bool
 database_sticker_create(volatile sqlite3 *db, const char *name)
 {
     static const char *INSERT =
-        "WITH id_max (id) AS (SELECT MAX(id) FROM 'stickers')"
         "INSERT INTO 'stickers' (id, name)"
-        " SELECT CASE WHEN id_max.id IS NULL THEN 1 ELSE id_max.id + 1 END, ?"
-        " FROM id_max"
-        "WHERE NOT EXISTS (SELECT 1 FROM 'stickers' WHERE name = ?);";
+        " SELECT CASE WHEN MAX(id) IS NULL THEN 1 ELSE MAX(id) + 1 END, ?"
+        " FROM 'stickers'"
+        "WHERE (SELECT COUNT(*) FROM 'stickers' WHERE name = ?) = 0;";
     sqlite3_stmt *stmt;
     int ret = false;
     RETURN_IF(strlen(name) == 0, "A sticker name must be at least one character long", ret);
     SQLITE_PREPARE(db, stmt, INSERT, error);
     SQLITE_BIND_TEXT(db, stmt, 1, name, error);
     SQLITE_BIND_TEXT(db, stmt, 2, name, error);
-    SQLITE_STEP_OK(db, stmt, error);
+    SQLITE_STEP_DONE(db, stmt, error);
     ret = true;
 error:
     sqlite3_finalize(stmt);
@@ -79,7 +78,7 @@ database_sticker_set(volatile sqlite3 *db, const char *type, const char *name, i
     SQLITE_BIND_INT(db, stmt, 1, uri, error);
     SQLITE_BIND_INT(db, stmt, 2, value, error);
     SQLITE_BIND_TEXT(db, stmt, 3, name, error);
-    SQLITE_STEP_OK(db, stmt, error);
+    SQLITE_STEP_DONE(db, stmt, error);
     ret = true;
 error:
     sqlite3_finalize(stmt);
diff --git a/src/net/listen.c b/src/net/listen.c
index 427a9793e9b1b91cc73f3a5ebc18d3bf98acf749..e52a2eca92223454887f725801691e89de217388 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -206,6 +206,8 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd)
                 err = ! command_sticker_set(srv, c, &cmd.args[1]);
             else if (STR_MATCH(cmd.args[0], "delete"))
                 err = ! command_sticker_delete(srv, c, &cmd.args[1]);
+            else if (STR_MATCH(cmd.args[0], "__create"))
+                err = ! command_sticker_create(srv, c, &cmd.args[1]);
         }
 
         else if (STR_MATCH(cmd.name, "help"))