--- a/upmpd/mpdcli.cxx
+++ b/upmpd/mpdcli.cxx
@@ -37,7 +37,6 @@
     : m_conn(0), m_premutevolume(0), 
       m_host(host), m_port(port), m_password(pass)
 {
-    cerr << "MPDCli::MPDCli" << endl;
     if (!openconn()) {
         return;
     }
@@ -74,6 +73,7 @@
             return false;
         }
     }
+    mpd_run_consume(M_CONN, true);
     return true;
 }
 
@@ -84,8 +84,10 @@
         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);
-    int error = mpd_connection_get_error(M_CONN);
     if (error == MPD_ERROR_SERVER) {
         cerr << " server error: " << mpd_connection_get_server_error(M_CONN) ;
     }
@@ -113,7 +115,13 @@
     }
 
     mpd_status *mpds = 0;
-    RETRY_CMD(mpds = mpd_run_status(M_CONN));
+    mpds = mpd_run_status(M_CONN);
+    if (mpds == 0) {
+        openconn();
+        mpds = mpd_run_status(M_CONN);
+        cerr << "MPDCli::updStatus: can't get status" << endl;
+        return false;
+    }
 
     m_stat.volume = mpd_status_get_volume(mpds);
     m_stat.rept = mpd_status_get_repeat(mpds);
@@ -205,6 +213,12 @@
 {
     if (!ok()) {
         return false;
+    }
+    // Can't set volume if not active
+    if (!(m_stat.state== MpdStatus::MPDS_PLAY) &&
+        !(m_stat.state == MpdStatus::MPDS_PAUSE)) {
+        cerr << "MPDCli::setVolume: not active" << endl;
+        return true;
     }
     cerr << "setVolume: vol " << volume << " relative " << relative << endl;
     if (volume == 0) {
@@ -229,14 +243,9 @@
     else if (volume > 100)
         volume = 100;
     
-    for (int i = 0; i < 2; i++) {
-        if (mpd_run_set_volume(M_CONN, volume))
-            break;
-        if (i == 1 || !showError("MPDCli::updStatus"))
-            return false;
-    }
-
-    return updStatus();
+    RETRY_CMD(mpd_run_set_volume(M_CONN, volume));
+    m_stat.volume = volume;
+    return true;
 }
 
 int MPDCli::getVolume()
@@ -255,12 +264,16 @@
     return true;
 }
 
-bool MPDCli::play()
-{
-    cerr << "MPDCli::play" << endl;
-    if (!ok())
-        return false;
-    RETRY_CMD(mpd_run_play(M_CONN));
+bool MPDCli::play(int pos)
+{
+    cerr << "MPDCli::play(pos=" << pos << ")" << endl;
+    if (!ok())
+        return false;
+    if (pos >= 0) {
+        RETRY_CMD(mpd_run_play_pos(M_CONN, (unsigned int)pos));
+    } else {
+        RETRY_CMD(mpd_run_play(M_CONN));
+    }
     return true;
 }
 bool MPDCli::stop()
@@ -271,6 +284,15 @@
     RETRY_CMD(mpd_run_stop(M_CONN));
     return true;
 }
+bool MPDCli::seek(int seconds)
+{
+    if (!updStatus())
+        return -1;
+    cerr << "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;
@@ -328,6 +350,28 @@
         return -1;
     }
     return id;
+}
+bool MPDCli::deleteId(int id)
+{
+    cerr << "MPDCli::deleteId " << id << endl;
+    if (!ok())
+        return -1;
+
+    RETRY_CMD(mpd_run_delete_id(M_CONN, (unsigned)id));
+    return false;
+}
+bool MPDCli::statId(int id)
+{
+    cerr << "MPDCli::statId " << id << endl;
+    if (!ok())
+        return -1;
+
+    mpd_song *song = mpd_run_get_queue_song_id(M_CONN, (unsigned)id);
+    if (song) {
+        mpd_song_free(song);
+        return true;
+    }
+    return false;
 }
 int MPDCli::curpos()
 {