diff --git a/Makefile.am b/Makefile.am
index 1b7236b1e..543e53a5c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2261,7 +2261,9 @@ developer_DATA = $(wildcard doc/developer/*.html)
 
 DOCBOOK_HTML = $(patsubst %.xml,%/index.html,$(DOCBOOK_FILES))
 
-$(DOCBOOK_HTML): %/index.html: %.xml
+DOCBOOK_INCLUDES = $(wildcard $(srcdir)/doc/include/*.xml)
+
+$(DOCBOOK_HTML): %/index.html: %.xml $(DOCBOOK_INCLUDES)
 	$(XMLTO) -o $(@D) --stringparam chunker.output.encoding=utf-8 html --stringparam use.id.as.filename=1 $<
 
 doc/api/html/index.html: doc/doxygen.conf
diff --git a/NEWS b/NEWS
index cbf689761..99e0e5db6 100644
--- a/NEWS
+++ b/NEWS
@@ -52,11 +52,14 @@ ver 0.20 (not yet released)
 * update
   - apply .mpdignore matches to subdirectories
 
-ver 0.19.15 (not yet released)
+ver 0.19.15 (2016/04/30)
 * decoder
   - ffmpeg: support FFmpeg 3.0
   - ffmpeg: use as fallback instead of "mad" if no plugin matches
+  - opus: support bigger OpusTags packets
 * fix more build failures on non-glibc builds due to constexpr Mutex
+* fix build failure due to missing include
+* fix unit test on Alpha
 
 ver 0.19.14 (2016/03/18)
 * decoder
diff --git a/doc/developer.xml b/doc/developer.xml
index aa3cc62c0..074c7f36d 100644
--- a/doc/developer.xml
+++ b/doc/developer.xml
@@ -1,6 +1,7 @@
 <?xml version='1.0' encoding="utf-8"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-               "docbook/dtd/xml/4.2/docbookx.dtd">
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+                      "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
 <book>
   <title>The Music Player Daemon - Developer's Manual</title>
 
diff --git a/doc/include/tags.xml b/doc/include/tags.xml
new file mode 100644
index 000000000..554b43a82
--- /dev/null
+++ b/doc/include/tags.xml
@@ -0,0 +1,154 @@
+<?xml version='1.0' encoding="utf-8"?>
+<!DOCTYPE itemizedlist PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+                              "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
+<itemizedlist>
+  <listitem>
+    <para>
+      <varname>artist</varname>: the artist name.  Its meaning is not
+      well-defined; see <varname>composer</varname> and
+      <varname>performer</varname> for more specific tags.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>artistsort</varname>: same as
+      <varname>artist</varname>, but for sorting.  This usually omits
+      prefixes such as "The".
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>album</varname>: the album name.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>albumsort</varname>: same as <varname>album</varname>,
+      but for sorting.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>albumartist</varname>: on multi-artist albums, this is
+      the artist name which shall be used for the whole album.  The
+      exact meaning of this tag is not well-defined.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>albumartistsort</varname>: same as
+      <varname>albumartist</varname>, but for sorting.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>title</varname>: the song title.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>track</varname>: the track number within the album.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>name</varname>: a name for this song.  This is not the
+      song title.  The exact meaning of this tag is not well-defined.
+      It is often used by badly configured internet radio stations
+      with broken tags to squeeze both the artist name and the song
+      title in one tag.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>genre</varname>: the music genre.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>date</varname>: the song's release date.  This is
+      usually a 4-digit year.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>composer</varname>: the artist who composed the song.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>performer</varname>: the artist who performed the song.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>comment</varname>: a human-readable comment about this
+      song.  The exact meaning of this tag is not well-defined.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>disc</varname>: the disc number in a multi-disc album.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>musicbrainz_artistid</varname>: the artist id in the
+      <ulink
+      url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
+      database.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>musicbrainz_albumid</varname>: the album id in the
+      <ulink
+      url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
+      database.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>musicbrainz_albumartistid</varname>: the album artist
+      id in the <ulink
+      url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
+      database.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>musicbrainz_trackid</varname>: the track id in the
+      <ulink
+      url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
+      database.
+    </para>
+  </listitem>
+
+  <listitem>
+    <para>
+      <varname>musicbrainz_releasetrackid</varname>: the release track
+      id in the <ulink
+      url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
+      database.
+    </para>
+  </listitem>
+</itemizedlist>
diff --git a/doc/mpd.conf.5 b/doc/mpd.conf.5
index a3a366895..bfec4cd1a 100644
--- a/doc/mpd.conf.5
+++ b/doc/mpd.conf.5
@@ -168,18 +168,6 @@ MP3 playback.
 This specifies whether relative or absolute paths for song filenames are used
 when saving playlists.  The default is "no".
 .TP
-.B metadata_to_use <tags>
-This specifies the tag types that will be scanned for and made available to
-clients.  Note that you must recreate (not update) your database for changes to
-this parameter to take effect.  Possible values are artist, album, title,
-track, name, genre, date, composer, performer, comment, disc,
-musicbrainz_artistid, musicbrainz_albumid, musicbrainz_albumartistid,
-musicbrainz_releasetrackid, musicbrainz_trackid.  Multiple tags may be specified
-as a comma separated list.
-An example value is "artist,album,title,track".  The special value "none" may
-be used alone to disable all metadata.  The default is to use all known tag
-types except for comments and those starting with "musicbrainz".
-.TP
 .B auto_update <yes or no>
 This specifies the whether to support automatic update of music database when
 files are changed in music_directory. The default is to disable autoupdate
diff --git a/doc/mpdconf.example b/doc/mpdconf.example
index 87d3021fb..4c5d6796a 100644
--- a/doc/mpdconf.example
+++ b/doc/mpdconf.example
@@ -116,7 +116,7 @@
 #
 # This setting defines a list of tag types that will be extracted during the
 # audio file discovery process. The complete list of possible values can be
-# found in the mpd.conf man page.
+# found in the user manual.
 #metadata_to_use	"artist,album,title,track,name,genre,date,composer,performer,disc"
 #
 # This setting enables automatic update of MPD's database when files in 
diff --git a/doc/protocol.xml b/doc/protocol.xml
index db9f47e3f..7959acd36 100644
--- a/doc/protocol.xml
+++ b/doc/protocol.xml
@@ -1,6 +1,7 @@
 <?xml version='1.0' encoding="utf-8"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-               "docbook/dtd/xml/4.2/docbookx.dtd">
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+                      "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
 <book>
   <title>The Music Player Daemon protocol</title>
 
@@ -201,6 +202,25 @@
         omitted, then the maximum possible value is assumed.
       </para>
     </section>
+
+    <section id="tags">
+      <title>Tags</title>
+
+      <para>
+        The following tags are supported by
+        <application>MPD</application>:
+      </para>
+
+      <xi:include href="include/tags.xml"
+                  xmlns:xi="http://www.w3.org/2001/XInclude"/>
+
+      <para>
+        There can be multiple values for some of these tags.  For
+        example, <application>MPD</application> may return multiple
+        lines with a <varname>performer</varname> tag.  A tag value is
+        a UTF-8 string.
+      </para>
+    </section>
   </chapter>
 
   <chapter id="recipes">
diff --git a/doc/user.xml b/doc/user.xml
index 1e308c5d8..2556f6c2d 100644
--- a/doc/user.xml
+++ b/doc/user.xml
@@ -1,6 +1,7 @@
 <?xml version='1.0' encoding="utf-8"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
-               "docbook/dtd/xml/4.2/docbookx.dtd">
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+                      "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
 <book>
   <title>The Music Player Daemon - User's Manual</title>
 
@@ -779,6 +780,33 @@ systemctl start mpd.socket</programlisting>
     <section id="config_other">
       <title>Other Settings</title>
 
+      <informaltable>
+        <tgroup cols="2">
+          <thead>
+            <row>
+              <entry>Setting</entry>
+              <entry>Description</entry>
+            </row>
+          </thead>
+          <tbody>
+            <row>
+              <entry>
+                <varname>metadata_to_use</varname>
+                <parameter>TAG1,TAG2,...</parameter>
+              </entry>
+              <entry>
+                Use only the specified tags, and ignore the others.
+                This setting can reduce the database size and
+                <application>MPD</application>'s memory usage by
+                omitting unused tags.  By default, all tags but
+                <varname>comment</varname> are enabled.  The special
+                value "none" disables all tags.
+              </entry>
+            </row>
+          </tbody>
+        </tgroup>
+      </informaltable>
+
       <section>
         <title>The State File</title>
 
@@ -1134,6 +1162,19 @@ database {
       </para>
     </section>
 
+    <section id="tags">
+      <title>Metadata</title>
+
+      <para>
+        When scanning or playing a song,
+        <application>MPD</application> parses its metadata.  The
+        following tags are supported:
+      </para>
+
+      <xi:include href="include/tags.xml"
+                  xmlns:xi="http://www.w3.org/2001/XInclude"/>
+    </section>
+
     <section id="queue">
       <title>The queue</title>
 
diff --git a/src/decoder/DecoderBuffer.hxx b/src/decoder/DecoderBuffer.hxx
index fd6191acb..1ff4f8387 100644
--- a/src/decoder/DecoderBuffer.hxx
+++ b/src/decoder/DecoderBuffer.hxx
@@ -25,6 +25,7 @@
 #include "util/ConstBuffer.hxx"
 
 #include <stddef.h>
+#include <stdint.h>
 
 struct Decoder;
 class InputStream;
diff --git a/src/decoder/plugins/OpusDecoderPlugin.cxx b/src/decoder/plugins/OpusDecoderPlugin.cxx
index 7d91cf72e..df16eae37 100644
--- a/src/decoder/plugins/OpusDecoderPlugin.cxx
+++ b/src/decoder/plugins/OpusDecoderPlugin.cxx
@@ -440,13 +440,15 @@ mpd_opus_scan_stream(InputStream &is,
 	if (!oy.ExpectFirstPage(os))
 		return false;
 
-	/* read at most two more pages */
-	unsigned remaining_pages = 2;
+	/* read at most 64 more pages */
+	unsigned remaining_pages = 64;
+
+	unsigned remaining_packets = 4;
 
 	bool result = false;
 
 	ogg_packet packet;
-	while (true) {
+	while (remaining_packets > 0) {
 		int r = ogg_stream_packetout(&os, &packet);
 		if (r < 0) {
 			result = false;
@@ -465,6 +467,8 @@ mpd_opus_scan_stream(InputStream &is,
 			continue;
 		}
 
+		--remaining_packets;
+
 		if (packet.b_o_s) {
 			if (!IsOpusHead(packet))
 				break;
diff --git a/src/encoder/plugins/WaveEncoderPlugin.cxx b/src/encoder/plugins/WaveEncoderPlugin.cxx
index cf6cd3c54..4311bf96c 100644
--- a/src/encoder/plugins/WaveEncoderPlugin.cxx
+++ b/src/encoder/plugins/WaveEncoderPlugin.cxx
@@ -27,6 +27,8 @@
 #include <assert.h>
 #include <string.h>
 
+static constexpr uint16_t WAVE_FORMAT_PCM = 1;
+
 struct WaveEncoder {
 	Encoder encoder;
 	unsigned bits;
@@ -64,15 +66,15 @@ fill_wave_header(struct wave_header *header, int channels, int bits,
 	header->id_fmt = ToLE32(0x20746d66);
 	header->id_data = ToLE32(0x61746164);
 
-        /* wave format */
-	header->format = ToLE16(1); // PCM_FORMAT
+	/* wave format */
+	header->format = ToLE16(WAVE_FORMAT_PCM);
 	header->channels = ToLE16(channels);
 	header->bits = ToLE16(bits);
 	header->freq = ToLE32(freq);
 	header->blocksize = ToLE16(block_size);
 	header->byterate = ToLE32(freq * block_size);
 
-        /* chunk sizes (fake data length) */
+	/* chunk sizes (fake data length) */
 	header->fmt_size = ToLE32(16);
 	header->data_size = ToLE32(data_size);
 	header->riff_size = ToLE32(4 + (8 + 16) + (8 + data_size));
diff --git a/test/test_byte_reverse.cxx b/test/test_byte_reverse.cxx
index 86d29c32d..ca4380fc8 100644
--- a/test/test_byte_reverse.cxx
+++ b/test/test_byte_reverse.cxx
@@ -49,9 +49,9 @@ CPPUNIT_TEST_SUITE_REGISTRATION(ByteReverseTest);
 void
 ByteReverseTest::TestByteReverse2()
 {
-	static const char src[] = "123456";
+	static const char src[] gcc_alignas(uint16_t, 2) = "123456";
 	static const char result[] = "214365";
-	static uint8_t dest[ARRAY_SIZE(src)];
+	static uint8_t dest[ARRAY_SIZE(src)] gcc_alignas(uint16_t, 2);
 
 	reverse_bytes(dest, (const uint8_t *)src,
 		      (const uint8_t *)(src + ARRAY_SIZE(src) - 1), 2);
@@ -73,9 +73,9 @@ ByteReverseTest::TestByteReverse3()
 void
 ByteReverseTest::TestByteReverse4()
 {
-	static const char src[] = "12345678";
+	static const char src[] gcc_alignas(uint32_t, 4) = "12345678";
 	static const char result[] = "43218765";
-	static uint8_t dest[ARRAY_SIZE(src)];
+	static uint8_t dest[ARRAY_SIZE(src)] gcc_alignas(uint32_t, 4);
 
 	reverse_bytes(dest, (const uint8_t *)src,
 		      (const uint8_t *)(src + ARRAY_SIZE(src) - 1), 4);