diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h
index 424e6524eaeba06889160cb8ed3f0c221f963b0c..a884de214c7e5340bdfff055bdd83afae98ca8dd 100644
--- a/inc/lektor/commands.h
+++ b/inc/lektor/commands.h
@@ -98,3 +98,8 @@ bool command_user_add(sqlite3 *db, char *argv[LKT_MESSAGE_ARGS_MAX]);
 bool command_restart(struct lkt_state *srv, size_t c);
 bool command_kill(struct lkt_state *srv, size_t c);
 bool command_rescan(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
+
+/* Sticker management */
+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 23792ffc375facddf208015c3552e3c8222d71f0..3518613e4d8b10017eb59ebad1fc43a7a62deaf0 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -1074,3 +1074,65 @@ command_user_add(sqlite3 *db, char *argv[LKT_MESSAGE_ARGS_MAX])
     return false;
     fprintf(stderr, " . command_user_add: Failed to add user %s\n", argv[0]);
 }
+
+static bool
+sticker_send_one_value(void *_args, const char *sticker, const char *type, int uri, int value)
+{
+    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    struct lkt_message *out;
+    (void) sticker;
+    (void) type;
+    (void) uri;
+
+    out = lkt_message_new();
+    out->data_len = snprintf(out->data, LKT_MESSAGE_MAX, "value: %d\n", value);
+    lkt_state_send(args->srv, args->c, out);
+    return false;
+}
+
+static bool
+sticker_send_all(void *_args, const char *sticker, const char *type, int uri, int value)
+{
+    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    struct lkt_message *out;
+
+    out = lkt_message_new();
+    out->data_len = snprintf(out->data, LKT_MESSAGE_MAX, "%s: %d\nsticker: %s\nvalue: %d\n",
+            type, uri, sticker, value);
+    lkt_state_send(args->srv, args->c, out);
+    return false;
+}
+
+bool
+command_sticker_get(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX])
+{
+    if (argv[0] == NULL || argv[1] == NULL || argv[2] == NULL || argv[3] != NULL) {
+        fprintf(stderr, " ! command_sticker_get: Invalid argument, need only 3 arguments\n");
+        return false;
+    }
+
+    int uri = atoi(argv[1]); /* FIXME: Use strtol. */
+    struct _client_trace_t args = {
+        .srv = srv,
+        .c = c,
+    };
+
+    if (!database_sticker_get(srv->db, argv[0], argv[2], uri, &args, sticker_send_one_value)) {
+        fprintf(stderr, " . command_sticker_get: Failed to get sticker '%s' for object %s(%d)\n",
+                argv[2], argv[0], uri);
+        return false;
+    }
+
+    return true;
+}
+
+// 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/database/stickers.c b/src/database/stickers.c
index 0100955c498f1f495d6be2b6db23b5354bb2ece0..1c0a4ab73247b4f9ef95fc3d627c8c08a0f1e020 100644
--- a/src/database/stickers.c
+++ b/src/database/stickers.c
@@ -113,7 +113,7 @@ database_sticker_list(sqlite3 *db, const char *type, void *args,
             uri     = sqlite3_column_int(stmt, 1);
             value   = sqlite3_column_int(stmt, 2);
             if (!call(args, sticker, type, uri, value))
-                goto error;
+                goto end_loop;
             continue;
 
         case SQLITE_DONE:
@@ -213,7 +213,7 @@ database_sticker_get(sqlite3 *db, const char *type, const char *name, int uri, v
         case SQLITE_ROW:
             value = sqlite3_column_int(stmt, 1);
             if (!call(args, name, type, uri, value))
-                goto error;
+                goto end_loop;
             continue;
 
         case SQLITE_DONE: