diff --git a/NEWS b/NEWS
index 761bad5c2..0c092b2cb 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,7 @@
 ver 0.21 (not yet released)
 * configuration
   - add "include" directive, allows including config files
+  - incremental "metadata_to_use" setting
 * protocol
   - "tagtypes" can be used to hide tags
   - "find" and "search" can sort
diff --git a/doc/mpdconf.example b/doc/mpdconf.example
index 4684c7c37..e3a7b024c 100644
--- a/doc/mpdconf.example
+++ b/doc/mpdconf.example
@@ -111,6 +111,10 @@
 # found in the user manual.
 #metadata_to_use	"artist,album,title,track,name,genre,date,composer,performer,disc"
 #
+# This example just enables the "comment" tag without disabling all
+# the other supported tags:
+#metadata_to_use "+comment"
+#
 # This setting enables automatic update of MPD's database when files in 
 # music_directory are changed.
 #
diff --git a/doc/user.rst b/doc/user.rst
index bb8e52be5..6292ddf54 100644
--- a/doc/user.rst
+++ b/doc/user.rst
@@ -494,7 +494,16 @@ Other Settings
        setting can reduce the database size and :program:`MPD`'s
        memory usage by omitting unused tags. By default, all tags but
        comment are enabled. The special value "none" disables all
-       tags. Section :ref:`tags` contains a list of supported tags.
+       tags.
+
+       If the setting starts with ``+`` or ``-``, then the following
+       tags will be added or remoted to/from the current set of tags.
+       This example just enables the "comment" tag without disabling all
+       the other supported tags
+
+         metadata_to_use "+comment"
+
+       Section :ref:`tags` contains a list of supported tags.
 
 The State File
 ~~~~~~~~~~~~~~
diff --git a/src/tag/Config.cxx b/src/tag/Config.cxx
index 94899df14..29967dde9 100644
--- a/src/tag/Config.cxx
+++ b/src/tag/Config.cxx
@@ -34,19 +34,36 @@ TagLoadConfig(const ConfigData &config)
 	if (value == nullptr)
 		return;
 
-	global_tag_mask = TagMask::None();
-
-	if (StringEqualsCaseASCII(value, "none"))
+	if (StringEqualsCaseASCII(value, "none")) {
+		global_tag_mask = TagMask::None();
 		return;
+	}
+
+	bool plus = true;
+
+	if (*value != '+' && *value != '-')
+		/* no "+-": not incremental */
+		global_tag_mask = TagMask::None();
 
 	for (const auto &i : SplitString(value, ',')) {
 		const char *name = i.c_str();
 
+		if (*name == '+') {
+			plus = true;
+			++name;
+		} else if (*name == '-') {
+			plus = false;
+			++name;
+		}
+
 		const auto type = tag_name_parse_i(name);
 		if (type == TAG_NUM_OF_ITEM_TYPES)
 			throw FormatRuntimeError("error parsing metadata item \"%s\"",
 						 name);
 
-		global_tag_mask |= type;
+		if (plus)
+			global_tag_mask.Set(type);
+		else
+			global_tag_mask.Unset(type);
 	}
 }