--- a/src/ohproduct.hxx
+++ b/src/ohproduct.hxx
@@ -23,18 +23,22 @@
 #include "libupnpp/device/device.hxx"   // for UpnpService
 #include "libupnpp/soaphelp.hxx"        // for SoapIncoming, SoapOutgoing
 
+#include "ohservice.hxx"
+
 class UpMpd;
 using namespace UPnPP;
 
-class OHProduct : public UPnPProvider::UpnpService {
+class OHProduct : public OHService {
 public:
     OHProduct(UpMpd *dev, const std::string& friendlyname);
     virtual ~OHProduct();
     
-    virtual bool getEventData(bool all, std::vector<std::string>& names, 
-                              std::vector<std::string>& values);
     int iSetSourceIndex(int index);
     int iSetSourceIndexByName(const std::string& nm);
+
+protected:
+    virtual bool makestate(std::unordered_map<std::string, std::string> &st);
+
 private:
     int manufacturer(const SoapIncoming& sc, SoapOutgoing& data);
     int model(const SoapIncoming& sc, SoapOutgoing& data);
@@ -51,10 +55,7 @@
     int sourceXMLChangeCount(const SoapIncoming& sc, SoapOutgoing& data);
 
     int iSrcNameToIndex(const std::string& nm);
-    bool makestate(std::unordered_map<std::string, std::string> &st);
     
-    std::unordered_map<std::string, std::string> m_state;
-    UpMpd *m_dev;
     std::string m_roomOrName;
     int m_sourceIndex;
     bool m_standby;