--- a/application.cpp
+++ b/application.cpp
@@ -26,6 +26,7 @@
 #include <QMessageBox>
 #include <QDir>
 #include <QDesktopWidget>
+#include <QFileDialog>
 
 #include "libupnpp/upnpplib.hxx"
 #include "libupnpp/log.hxx"
@@ -61,6 +62,7 @@
 #include "upqo/ohtime_qo.h"
 #include "upqo/ohvolume_qo.h"
 #include "upqo/renderingcontrol_qo.h"
+#include "utils/writedescription.h"
 
 using namespace std;
 using namespace UPnPClient;
@@ -672,6 +674,8 @@
 // volume and time mostly.
 void Application::renderer_connections()
 {
+    CONNECT(m->m_player, sig_dumpDescription(),
+            this, writeDescription());
     // Use either ohtime or avt for time updates
     if (m->m_ohtmo) {
         CONNECT(m->m_ohtmo, secsInSongChanged(quint32),
@@ -733,3 +737,29 @@
     CONNECT(m->m_cdb, sig_sort_order(), this, onDirSortOrder());
     CONNECT(m->m_player, sig_sortprefs(), m->m_cdb, onSortprefs());
 }
+
+void Application::writeDescription()
+{
+    if (!superdir || !m || !m->m_rdr) {
+        return;
+    }
+
+    string deviceXML;
+    unordered_map<string, string> srvsXML;
+    const string& devname(m->m_rdr->desc()->UDN);
+    if (!superdir->getDescriptionDocuments(devname,
+                                           deviceXML, srvsXML)) {
+        qDebug() << "Could not retrieve description documents";
+        return;
+    }
+    QString dir = QFileDialog::getExistingDirectory(
+        m->m_player,
+        tr("Directory for description files"));
+    if (dir.isEmpty()) {
+        return;
+    }
+    if (!writeDescriptionFiles(qs2utf8s(dir), devname, deviceXML, srvsXML)) {
+        QMessageBox::warning(0, "Upplay",
+                             tr("Could not write description files."));
+    }
+}