--- a/src/avtransport.cxx
+++ b/src/avtransport.cxx
@@ -25,7 +25,7 @@
 #include <utility>                      // for pair
 
 #include "libupnpp/log.hxx"             // for LOGDEB, LOGDEB1, LOGERR
-#include "libupnpp/soaphelp.hxx"        // for SoapData, SoapArgs, etc
+#include "libupnpp/soaphelp.hxx"        // for SoapOutgoing, SoapIncoming, etc
 #include "libupnpp/upnpavutils.hxx"     // for upnpduration, etc
 
 #include "mpdcli.hxx"                   // for MpdStatus, MPDCli, etc
@@ -290,24 +290,19 @@
 }
 
 // http://192.168.4.4:8200/MediaItems/246.mp3
-int UpMpdAVTransport::setAVTransportURI(const SoapArgs& sc, SoapData& data, 
+int UpMpdAVTransport::setAVTransportURI(const SoapIncoming& sc, SoapOutgoing& data, 
                                         bool setnext)
 {
-    map<string, string>::const_iterator it;
-
     // pretend not to support setnext:
     //if (setnext) return UPNP_E_INVALID_PARAM;
-
-    it = setnext? sc.args.find("NextURI") : sc.args.find("CurrentURI");
-    if (it == sc.args.end() || it->second.empty()) {
-        return UPNP_E_INVALID_PARAM;
-    }
-    string uri = it->second;
+    string uri;
+    bool found = setnext? sc.get("NextURI", &uri) : sc.get("CurrentURI", &uri);
+    if (!found) {
+        return UPNP_E_INVALID_PARAM;
+    }
     string metadata;
-    it = setnext? sc.args.find("NextURIMetaData") : 
-        sc.args.find("CurrentURIMetaData");
-    if (it != sc.args.end())
-        metadata = it->second;
+    found = setnext ? sc.get("NextURIMetaData", &metadata) :
+        sc.get("CurrentURIMetaData", &metadata);
     LOGDEB("Set(next)AVTransportURI: next " << setnext <<  " uri " << uri <<
            " metadata[" << metadata << "]" << endl);
 
@@ -414,7 +409,7 @@
     return UPNP_E_SUCCESS;
 }
 
-int UpMpdAVTransport::getPositionInfo(const SoapArgs& sc, SoapData& data)
+int UpMpdAVTransport::getPositionInfo(const SoapIncoming& sc, SoapOutgoing& data)
 {
     const MpdStatus &mpds = m_dev->getMpdStatus();
     //LOGDEB("UpMpdAVTransport::getPositionInfo. State: " << mpds.state <<endl);
@@ -467,7 +462,7 @@
     return UPNP_E_SUCCESS;
 }
 
-int UpMpdAVTransport::getTransportInfo(const SoapArgs& sc, SoapData& data)
+int UpMpdAVTransport::getTransportInfo(const SoapIncoming& sc, SoapOutgoing& data)
 {
     const MpdStatus &mpds = m_dev->getMpdStatus();
     //LOGDEB("UpMpdAVTransport::getTransportInfo. State: " << mpds.state<<endl);
@@ -485,7 +480,7 @@
     return UPNP_E_SUCCESS;
 }
 
-int UpMpdAVTransport::getDeviceCapabilities(const SoapArgs& sc, SoapData& data)
+int UpMpdAVTransport::getDeviceCapabilities(const SoapIncoming& sc, SoapOutgoing& data)
 {
     data.addarg("PlayMedia", "NETWORK,HDD");
     data.addarg("RecMedia", "NOT_IMPLEMENTED");
@@ -493,7 +488,7 @@
     return UPNP_E_SUCCESS;
 }
 
-int UpMpdAVTransport::getMediaInfo(const SoapArgs& sc, SoapData& data)
+int UpMpdAVTransport::getMediaInfo(const SoapIncoming& sc, SoapOutgoing& data)
 {
     const MpdStatus &mpds = m_dev->getMpdStatus();
     LOGDEB("UpMpdAVTransport::getMediaInfo. State: " << mpds.state << endl);
@@ -540,7 +535,7 @@
     return UPNP_E_SUCCESS;
 }
 
-int UpMpdAVTransport::playcontrol(const SoapArgs& sc, SoapData& data, int what)
+int UpMpdAVTransport::playcontrol(const SoapIncoming& sc, SoapOutgoing& data, int what)
 {
     const MpdStatus &mpds = m_dev->getMpdStatus();
     LOGDEB("UpMpdAVTransport::playcontrol State: " << mpds.state <<
@@ -581,7 +576,7 @@
     return ok ? UPNP_E_SUCCESS : UPNP_E_INTERNAL_ERROR;
 }
 
-int UpMpdAVTransport::seqcontrol(const SoapArgs& sc, SoapData& data, int what)
+int UpMpdAVTransport::seqcontrol(const SoapIncoming& sc, SoapOutgoing& data, int what)
 {
     const MpdStatus &mpds = m_dev->getMpdStatus();
     LOGDEB("UpMpdAVTransport::seqcontrol State: " << mpds.state << " what "
@@ -602,15 +597,13 @@
     return ok ? UPNP_E_SUCCESS : UPNP_E_INTERNAL_ERROR;
 }
 	
-int UpMpdAVTransport::setPlayMode(const SoapArgs& sc, SoapData& data)
-{
-    map<string, string>::const_iterator it;
-		
-    it = sc.args.find("NewPlayMode");
-    if (it == sc.args.end() || it->second.empty()) {
-        return UPNP_E_INVALID_PARAM;
-    }
-    string playmode(it->second);
+int UpMpdAVTransport::setPlayMode(const SoapIncoming& sc, SoapOutgoing& data)
+{
+    string playmode;
+    if (!sc.get("NewPlayMode", &playmode)) {
+        return UPNP_E_INVALID_PARAM;
+    }
+
     bool ok;
     if (!playmode.compare("NORMAL")) {
         ok = m_dev->m_mpdcli->repeat(false) && m_dev->m_mpdcli->random(false) &&
@@ -637,7 +630,7 @@
     return ok ? UPNP_E_SUCCESS : UPNP_E_INTERNAL_ERROR;
 }
 
-int UpMpdAVTransport::getTransportSettings(const SoapArgs& sc, SoapData& data)
+int UpMpdAVTransport::getTransportSettings(const SoapIncoming& sc, SoapOutgoing& data)
 {
     const MpdStatus &mpds = m_dev->getMpdStatus();
     string playmode = mpdsToPlaymode(mpds);
@@ -646,8 +639,8 @@
     return UPNP_E_SUCCESS;
 }
 
-int UpMpdAVTransport::getCurrentTransportActions(const SoapArgs& sc, 
-                                                 SoapData& data)
+int UpMpdAVTransport::getCurrentTransportActions(const SoapIncoming& sc, 
+                                                 SoapOutgoing& data)
 {
     const MpdStatus &mpds = m_dev->getMpdStatus();
     string tactions("Next,Previous");
@@ -665,21 +658,17 @@
     return UPNP_E_SUCCESS;
 }
 
-int UpMpdAVTransport::seek(const SoapArgs& sc, SoapData& data)
-{
-    map<string, string>::const_iterator it;
-		
-    it = sc.args.find("Unit");
-    if (it == sc.args.end() || it->second.empty()) {
-        return UPNP_E_INVALID_PARAM;
-    }
-    string unit(it->second);
-
-    it = sc.args.find("Target");
-    if (it == sc.args.end() || it->second.empty()) {
-        return UPNP_E_INVALID_PARAM;
-    }
-    string target(it->second);
+int UpMpdAVTransport::seek(const SoapIncoming& sc, SoapOutgoing& data)
+{
+    string unit;
+    if (!sc.get("Unit", &unit)) {
+        return UPNP_E_INVALID_PARAM;
+    }
+    
+    string target;
+    if (!sc.get("Target", &target)) {
+        return UPNP_E_INVALID_PARAM;
+    }
 
     //LOGDEB("UpMpdAVTransport::seek: unit " << unit << " target " << target << 
     //	   " current posisition " << mpds.songelapsedms / 1000 <<