--- a/src/ohreceiver.hxx
+++ b/src/ohreceiver.hxx
@@ -25,6 +25,7 @@
 #include "libupnpp/device/device.hxx"   // for UpnpService
 #include "libupnpp/soaphelp.hxx"        // for SoapIncoming, SoapOutgoing
 
+#include "ohservice.hxx"
 #include "execmd.h"
 
 using namespace UPnPP;
@@ -40,12 +41,9 @@
     OHReceiverParams() : pm(OHRP_MPD), httpport(8768) {}
 };
 
-class OHReceiver : public UPnPProvider::UpnpService {
+class OHReceiver : public OHService {
 public:
     OHReceiver(UpMpd *dev, const OHReceiverParams& parms);
-
-    virtual bool getEventData(bool all, std::vector<std::string>& names, 
-                              std::vector<std::string>& values);
 
     bool iStop();
     bool iPlay();
@@ -56,7 +54,9 @@
     void setActive(bool onoff) {
         m_active = onoff;
     }
-    
+
+protected:
+    virtual bool makestate(std::unordered_map<std::string, std::string> &st);
 private:
     int play(const SoapIncoming& sc, SoapOutgoing& data);
     int stop(const SoapIncoming& sc, SoapOutgoing& data);
@@ -65,16 +65,12 @@
     int protocolInfo(const SoapIncoming& sc, SoapOutgoing& data);
     int transportState(const SoapIncoming& sc, SoapOutgoing& data);
 
-    bool makestate(std::unordered_map<std::string, std::string> &st);
     void maybeWakeUp(bool ok);
 
-    // State variable storage (previous state)
-    std::unordered_map<std::string, std::string> m_state;
     // Current
     std::string m_uri;
     std::string m_metadata;
 
-    UpMpd *m_dev;
     bool   m_active;
     std::shared_ptr<ExecCmd> m_cmd;
     int m_httpport;