diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h
index a884de214c7e5340bdfff055bdd83afae98ca8dd..3329c8a48a5e26e2799d045e74eae4251f1797ed 100644
--- a/inc/lektor/commands.h
+++ b/inc/lektor/commands.h
@@ -103,3 +103,4 @@ bool command_rescan(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS
 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]);
+bool command_sticker_list(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]);
diff --git a/src/commands.c b/src/commands.c
index a58f3d8be2c4806da6a49f4607bf2c3c8ce27ec6..b90846618522348ba60047a0c1fac6228938c1f2 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -21,6 +21,15 @@
 #define SELF_EXECUTABLE_FREEBSD "/proc/curproc/file"
 #define SELF_EXECUTABLE_SOLARIS "/proc/self/path/a.out"
 
+struct _client_trace_t {
+    struct lkt_state *srv;
+    size_t c;
+    int uri;
+    const char *name;
+    int value;
+    bool is_ok;
+};
+
 inline bool
 command_restart(struct lkt_state *srv, size_t c)
 {
@@ -549,11 +558,6 @@ command_noidle(struct lkt_state *srv, size_t c)
 }
 
 /* Functions for the searchadd and the search mpd commands */
-struct _client_trace_t {
-    struct lkt_state *srv;
-    size_t c;
-};
-
 static bool
 lkt_callback_print_row_v1(void *args, int id, int id_len, const char *sql_row)
 {
@@ -1098,9 +1102,68 @@ sticker_send_all(void *_args, const char *sticker, const char *type, int uri, in
 
     out = lkt_message_new();
     out->data_len = snprintf(out->data, LKT_MESSAGE_MAX, "%s: %d\nsticker: %s\nvalue: %d\n",
-            type, uri, sticker, value);
+                             type, uri, sticker, value);
     lkt_state_send(args->srv, args->c, out);
-    return false;
+    return true;
+}
+
+static bool
+sticker_send_check_uri(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) type;
+
+    if (uri == args->uri) {
+        out = lkt_message_new();
+        out->data_len = snprintf(out->data, LKT_MESSAGE_MAX, "%s: %d\n", sticker, value);
+        lkt_state_send(args->srv, args->c, out);
+    }
+
+    return true;
+}
+
+static bool
+sticker_send_value_check_uri_name(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) type;
+
+    if (uri == args->uri || !strcasecmp(sticker, args->name)) {
+        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 true;
+}
+
+static bool
+sticker_check_is_present_eq(void *_args, const char *sticker, const char *type, int uri, int value)
+{
+    (void) type;
+    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    args->is_ok |= (uri == args->uri) && !strcasecmp(sticker, args->name) && (value == args->value);
+    return true;
+}
+
+static bool
+sticker_check_is_present_lt(void *_args, const char *sticker, const char *type, int uri, int value)
+{
+    (void) type;
+    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    args->is_ok |= (uri == args->uri) && !strcasecmp(sticker, args->name) && (value < args->value);
+    return true;
+}
+
+static bool
+sticker_check_is_present_gt(void *_args, const char *sticker, const char *type, int uri, int value)
+{
+    (void) type;
+    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    args->is_ok |= (uri == args->uri) && !strcasecmp(sticker, args->name) && (value > args->value);
+    return true;
 }
 
 bool
@@ -1134,6 +1197,7 @@ command_sticker_set(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS
         return false;
     }
 
+    (void) c;
     int uri = atoi(argv[1]);    /* FIXME: Use strtol. */
     int value = atoi(argv[4]);  /* FIXME: Use strtol. */
 
@@ -1147,7 +1211,69 @@ command_sticker_set(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS
 }
 
 bool
-command_sticker_delete(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX])
+command_sticker_list(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX])
 {
+    struct _client_trace_t args = {
+        .srv = srv,
+        .c = c,
+    };
+
+    /* Simple list {type} {uri} command */
+    if (argv[0] != NULL && argv[1] != NULL && argv[2] == NULL)
+        goto simple_list_command;
+
+    /* list {type} {uri} {name} command */
+    else if (argv[0] != NULL && argv[1] != NULL &&
+             argv[2] != NULL && argv[3] == NULL)
+        goto list_stickers_in_uri;
+
+    /* list {type} {uri} {name} `op` {value} command */
+    else if (argv[0] != NULL && argv[1] != NULL &&
+             argv[2] != NULL && argv[3] != NULL &&
+             argv[4] != NULL && argv[5] == NULL)
+        goto list_stickers_check_value;
+
+    /* Just list all stickers */
+    else if ( (argv[0] != NULL && argv[1] == NULL) || argv[0] == NULL )
+        goto just_list_all;
+
+    else
+        goto unknown;
+
+just_list_all:
+    return database_sticker_list(srv->db, argv[0], &args, sticker_send_all);
+
+simple_list_command:
+    args.uri = atoi(argv[1]);   /* FIXME: Use strtol. */
+    return database_sticker_list(srv->db, argv[0], &args, sticker_send_check_uri);
+
+list_stickers_in_uri:
+    args.uri  = atoi(argv[1]);  /* FIXME: Use strtol. */
+    args.name = argv[2];
+    return database_sticker_list(srv->db, argv[0], &args, sticker_send_value_check_uri_name);
+    return false;
+
+list_stickers_check_value:
+    args.uri   = atoi(argv[1]); /* FIXME: Use strtol. */
+    args.value = atoi(argv[4]); /* FIXME: Use strtol. */
+    args.name  = argv[2];
+    switch (argv[3][0]) {
+    case '=':
+        return database_sticker_list(srv->db, argv[0], &args, sticker_check_is_present_eq);
+    case '<':
+        return database_sticker_list(srv->db, argv[0], &args, sticker_check_is_present_lt);
+    case '>':
+        return database_sticker_list(srv->db, argv[0], &args, sticker_check_is_present_gt);
+    default:
+        return 0;
+    }
+
+unknown:
+    fprintf(stderr, " . command_sticker_list: Specified command is invalid or unknown\n");
+    return false;
 }
 
+// bool
+// command_sticker_delete(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX])
+// {
+// }
diff --git a/src/net/listen.c b/src/net/listen.c
index 049cf75e93610c3cf20cdd397c723de2afc452bf..c8df599b0b13750b2f2cbba5ceb10252db8eec99 100644
--- a/src/net/listen.c
+++ b/src/net/listen.c
@@ -647,8 +647,7 @@ handle_idle_events(struct lkt_state *srv)
 }
 
 enum mpd_idle_flag *
-lkt_client_get_mask(struct lkt_state *srv, size_t c)
-{
+lkt_client_get_mask(struct lkt_state *srv, size_t c) {
     return &(srv->clients[c - 1].mpd_idle_watch);
 }