--- a/libupnpp/control/linnsongcast.cxx
+++ b/libupnpp/control/linnsongcast.cxx
@@ -61,11 +61,9 @@
 OHSNH senderService(DVCH dev)
 {
     OHSNH handle;
-    for (vector<UPnPServiceDesc>::const_iterator it =
-                dev->desc()->services.begin();
-            it != dev->desc()->services.end(); it++) {
-        if (OHSender::isOHSenderService(it->serviceType)) {
-            handle = OHSNH(new OHSender(*(dev->desc()), *it));
+    for (auto& service : dev->desc()->services) {
+        if (OHSender::isOHSenderService(service.serviceType)) {
+            handle = OHSNH(new OHSender(*(dev->desc()), service));
             break;
         }
     }
@@ -80,7 +78,11 @@
         reason = nm + " : can't connect or not a renderer";
         return ret;
     }
-    return senderService(dev);
+    ret = senderService(dev);
+    if (!ret) {
+        reason = nm + " : Sender service not found";
+    }
+    return ret;
 }
 
 void getSenderState(const string& nm, SenderState& st, bool live)
@@ -206,6 +208,64 @@
     }
 
     return;
+}
+
+bool setSourceIndex(const string& nm, int sourceindex) {
+    LOGDEB("setSourceIndex: nm " << nm << " index " << sourceindex << endl);
+
+    MRDH rdr = getRenderer(nm);
+    if (!rdr) {
+        LOGDEB("setSourceIndex: device " << nm << " is not renderer " << endl);
+        return false;
+    }
+    OHPRH prod = rdr->ohpr();
+    if (!prod) {
+        LOGDEB("setSourceIndex: device " << nm
+                << " has no OHProduct service " << endl);
+        return false;
+    }
+    vector<OHProduct::Source> sources;
+    if (prod->getSources(sources) || sources.size() == 0) {
+        LOGDEB("setSourceIndex: getSources failed" << endl);
+        return false;
+    }
+    if (sourceindex < 0 || sourceindex >= int(sources.size())) {
+        LOGDEB("setSourceIndex: bad index " << SoapHelp::i2s(sourceindex)
+                << endl);
+        return false;
+    }
+    int currentindex;
+    if (prod->sourceIndex(&currentindex)) {
+        LOGDEB("setSourceIndex: sourceIndex failed" << endl);
+        return false;
+    }
+    if (currentindex < 0 || currentindex >= int(sources.size())) {
+        LOGDEB("setSourceIndex: bad index " << currentindex << endl);
+        return false;
+    }
+
+    if (sourceindex != currentindex) {
+        return prod->setSourceIndex(sourceindex) == 0;
+    }
+    return true;
+}
+
+bool setSourceIndexByName(const string& rdrnm, const string& name) {
+    LOGDEB("setSourceIndexByName: rdrnm " << rdrnm << " name " << name << endl);
+
+    MRDH rdr = getRenderer(rdrnm);
+    if (!rdr) {
+        LOGDEB("setSourceIndexByName: device " << rdrnm << " is not renderer "
+                << endl);
+        return false;
+    }
+    OHPRH prod = rdr->ohpr();
+    if (!prod) {
+        LOGDEB("setSourceIndexByName: device " << rdrnm
+                << " has no OHProduct service " << endl);
+        return false;
+    }
+    return prod->setSourceIndexByName(name) == 0;
 }
 
 void listReceivers(vector<ReceiverState>& vreceivers)
@@ -318,7 +378,7 @@
     string reason;
     OHSNH sender = getSender(sendernm, reason);
     if (!sender) {
-        LOGERR(reason << endl);
+        LOGERR("setReceiversFromSender: " << reason << endl);
         return;
     }
     string uri, meta;