--- a/upmpd/mpdcli.cxx
+++ b/upmpd/mpdcli.cxx
@@ -27,6 +27,7 @@
 #include <mpd/player.h>
 #include <mpd/queue.h>
 
+#include "libupnpp/log.hxx"
 #include "mpdcli.hxx"
 
 using namespace std;
@@ -58,7 +59,7 @@
     }
     m_conn = mpd_connection_new(m_host.c_str(), m_port, 0);
     if (m_conn == NULL) {
-        cerr << "mpd_connection_new failed. No memory?" << endl;
+        LOGERR("mpd_connection_new failed. No memory?" << endl);
         return false;
     }
 
@@ -69,7 +70,7 @@
 
     if(!m_password.empty()) {
         if (!mpd_run_password(M_CONN, m_password.c_str())) {
-            cerr << "Password wrong" << endl;
+            LOGERR("Password wrong" << endl);
             return false;
         }
     }
@@ -80,18 +81,20 @@
 bool MPDCli::showError(const string& who)
 {
     if (!ok()) {
-        cerr << "MPDCli::showError: bad state" << endl;
+        LOGERR("MPDCli::showError: bad state" << endl);
         return false;
     }
 
     int error = mpd_connection_get_error(M_CONN);
     if (error == MPD_ERROR_SUCCESS)
         return false;
-    cerr << who << " failed: " <<  mpd_connection_get_error_message(M_CONN);
+    LOGERR(who << " failed: " <<  mpd_connection_get_error_message(M_CONN) 
+           << endl);
     if (error == MPD_ERROR_SERVER) {
-        cerr << " server error: " << mpd_connection_get_server_error(M_CONN) ;
-    }
-    cerr << endl;
+        LOGERR(who << " server error: " << 
+               mpd_connection_get_server_error(M_CONN) << endl);
+    }
+
     if (error == MPD_ERROR_CLOSED)
         if (openconn())
             return true;
@@ -110,7 +113,7 @@
 bool MPDCli::updStatus()
 {
     if (!ok()) {
-        cerr << "MPDCli::updStatus: bad state" << endl;
+        LOGERR("MPDCli::updStatus: bad state" << endl);
         return false;
     }
 
@@ -119,7 +122,7 @@
     if (mpds == 0) {
         openconn();
         mpds = mpd_run_status(M_CONN);
-        cerr << "MPDCli::updStatus: can't get status" << endl;
+        LOGERR("MPDCli::updStatus: can't get status" << endl);
         return false;
     }
 
@@ -162,7 +165,7 @@
 
 bool MPDCli::updSong(unordered_map<string, string>& tsong, int pos)
 {
-    // cerr << "MPDCli::updSong" << endl;
+    // LOGDEB("MPDCli::updSong" << endl);
     tsong.clear();
     if (!ok())
         return false;
@@ -175,7 +178,7 @@
     }
         
     if (song == 0) {
-        cerr << "mpd_run_current_song failed" << endl;
+        LOGERR("mpd_run_current_song failed" << endl);
         return false;
     }
 
@@ -209,25 +212,28 @@
     return true;
 }
 
-bool MPDCli::setVolume(int volume, bool relative)
+bool MPDCli::setVolume(int volume, bool isMute)
 {
     if (!ok()) {
         return false;
     }
-    // Can't set volume if not active
+
+    // MPD does not want to set the volume if not active.
     if (!(m_stat.state== MpdStatus::MPDS_PLAY) &&
         !(m_stat.state == MpdStatus::MPDS_PAUSE)) {
-        cerr << "MPDCli::setVolume: not active" << endl;
+        LOGINF("MPDCli::setVolume: not active" << endl);
         return true;
     }
-    cerr << "setVolume: vol " << volume << " relative " << relative << endl;
-    if (volume == 0) {
-        if (relative) {
+
+    LOGDEB("MPDCli::setVolume: vol " << volume << " isMute " << isMute << endl);
+
+    if (isMute) {
+        if (volume) {
             // Restore premute volume
-            m_stat.volume = m_premutevolume;
-            cerr << "Restoring premute" << endl;
+            LOGDEB("MPDCli::setVolume: restoring premute " << m_premutevolume 
+                   << endl);
+            volume = m_stat.volume = m_premutevolume;
         } else {
-            updStatus();
             if (m_stat.volume != 0) {
                 cerr << "Saving premute: " << m_stat.volume << endl;
                 m_premutevolume = m_stat.volume;
@@ -235,9 +241,6 @@
         }
     }
         
-    if (relative)
-        volume += m_stat.volume;
-
     if (volume < 0)
         volume = 0;
     else if (volume > 100)
@@ -250,14 +253,12 @@
 
 int MPDCli::getVolume()
 {
-    if (!updStatus())
-        return -1;
     return m_stat.volume == -1 ? 0: m_stat.volume;
 }
 
 bool MPDCli::togglePause()
 {
-    cerr << "MPDCli::togglePause" << endl;
+    LOGDEB("MPDCli::togglePause" << endl);
     if (!ok())
         return false;
     RETRY_CMD(mpd_run_toggle_pause(M_CONN));
@@ -266,7 +267,7 @@
 
 bool MPDCli::play(int pos)
 {
-    cerr << "MPDCli::play(pos=" << pos << ")" << endl;
+    LOGDEB("MPDCli::play(pos=" << pos << ")" << endl);
     if (!ok())
         return false;
     if (pos >= 0) {
@@ -274,11 +275,11 @@
     } else {
         RETRY_CMD(mpd_run_play(M_CONN));
     }
-    return true;
+    return updStatus();
 }
 bool MPDCli::stop()
 {
-    cerr << "MPDCli::stop" << endl;
+    LOGDEB("MPDCli::stop" << endl);
     if (!ok())
         return false;
     RETRY_CMD(mpd_run_stop(M_CONN));
@@ -288,14 +289,14 @@
 {
     if (!updStatus())
         return -1;
-    cerr << "MPDCli::seek: pos:"<<m_stat.songpos<<" seconds: "<< seconds<<endl;
+    LOGDEB("MPDCli::seek: pos:"<<m_stat.songpos<<" seconds: "<< seconds<<endl);
     RETRY_CMD(mpd_run_seek_pos(M_CONN, m_stat.songpos, (unsigned int)seconds));
     return true;
 }
 
 bool MPDCli::next()
 {
-    cerr << "MPDCli::next" << endl;
+    LOGDEB("MPDCli::next" << endl);
     if (!ok())
         return false;
     RETRY_CMD(mpd_run_next(M_CONN));
@@ -303,7 +304,7 @@
 }
 bool MPDCli::previous()
 {
-    cerr << "MPDCli::previous" << endl;
+    LOGDEB("MPDCli::previous" << endl);
     if (!ok())
         return false;
     RETRY_CMD(mpd_run_previous(M_CONN));
@@ -311,7 +312,7 @@
 }
 bool MPDCli::repeat(bool on)
 {
-    cerr << "MPDCli::repeat:" << on << endl;
+    LOGDEB("MPDCli::repeat:" << on << endl);
     if (!ok())
         return false;
     RETRY_CMD(mpd_run_repeat(M_CONN, on));
@@ -319,7 +320,7 @@
 }
 bool MPDCli::random(bool on)
 {
-    cerr << "MPDCli::random:" << on << endl;
+    LOGDEB("MPDCli::random:" << on << endl);
     if (!ok())
         return false;
     RETRY_CMD(mpd_run_random(M_CONN, on));
@@ -327,7 +328,7 @@
 }
 bool MPDCli::single(bool on)
 {
-    cerr << "MPDCli::single:" << on << endl;
+    LOGDEB("MPDCli::single:" << on << endl);
     if (!ok())
         return false;
     RETRY_CMD(mpd_run_single(M_CONN, on));
@@ -336,7 +337,7 @@
 
 int MPDCli::insert(const string& uri, int pos)
 {
-    cerr << "MPDCli::insert at :" << pos << " uri " << uri << endl;
+    LOGDEB("MPDCli::insert at :" << pos << " uri " << uri << endl);
     if (!ok())
         return -1;
 
@@ -353,7 +354,7 @@
 }
 bool MPDCli::deleteId(int id)
 {
-    cerr << "MPDCli::deleteId " << id << endl;
+    LOGDEB("MPDCli::deleteId " << id << endl);
     if (!ok())
         return -1;
 
@@ -362,7 +363,7 @@
 }
 bool MPDCli::statId(int id)
 {
-    cerr << "MPDCli::statId " << id << endl;
+    LOGDEB("MPDCli::statId " << id << endl);
     if (!ok())
         return -1;
 
@@ -377,7 +378,7 @@
 {
     if (!updStatus())
         return -1;
-    cerr << "MPDCli::curpos: pos: " << m_stat.songpos << " id " 
-         << m_stat.songid << endl;
+    LOGDEB("MPDCli::curpos: pos: " << m_stat.songpos << " id " 
+           << m_stat.songid << endl);
     return m_stat.songpos;
 }