diff --git a/doc/protocol.xml b/doc/protocol.xml
index 953012b12..3379fc568 100644
--- a/doc/protocol.xml
+++ b/doc/protocol.xml
@@ -1273,6 +1273,24 @@ OK
             </para>
           </listitem>
         </varlistentry>
+        <varlistentry id="command_sticker_delete">
+          <term>
+            <cmdsynopsis>
+              <command>sticker</command>
+              <arg choice="plain">delete</arg>
+              <arg choice="req"><replaceable>TYPE</replaceable></arg>
+              <arg choice="req"><replaceable>URI</replaceable></arg>
+              <arg choice="opt"><replaceable>NAME</replaceable></arg>
+            </cmdsynopsis>
+          </term>
+          <listitem>
+            <para>
+              Deletes a sticker value from the specified object.  If
+              you do not specify a sticker name, all sticker values
+              are deleted.
+            </para>
+          </listitem>
+        </varlistentry>
         <varlistentry id="command_sticker_list">
           <term>
             <cmdsynopsis>
diff --git a/src/command.c b/src/command.c
index 1290a34e7..d30b63594 100644
--- a/src/command.c
+++ b/src/command.c
@@ -1588,6 +1588,28 @@ handle_sticker_song(struct client *client, int argc, char *argv[])
 			return COMMAND_RETURN_ERROR;
 		}
 
+		return COMMAND_RETURN_OK;
+	} else if ((argc == 4 || argc == 5) &&
+		   strcmp(argv[1], "delete") == 0) {
+		struct song *song;
+		bool ret;
+
+		song = db_get_song(argv[3]);
+		if (song == NULL) {
+			command_error(client, ACK_ERROR_NO_EXIST,
+				      "no such song");
+			return COMMAND_RETURN_ERROR;
+		}
+
+		ret = argc == 4
+			? sticker_song_delete(song)
+			: sticker_song_delete_value(song, argv[4]);
+		if (!ret) {
+			command_error(client, ACK_ERROR_SYSTEM,
+				      "no such sticker");
+			return COMMAND_RETURN_ERROR;
+		}
+
 		return COMMAND_RETURN_OK;
 	} else if (argc == 5 && strcmp(argv[1], "find") == 0) {
 		/* "sticker find song a/directory name" */