--- a/libupnpp/device.cxx
+++ b/libupnpp/device.cxx
@@ -171,13 +171,13 @@
         LOGDEB("UPNP_CONTROL_ACTION_REQUEST: " << act->ActionName <<
                ". Params: " << ixmlPrintDocument(act->ActionRequest) << endl);
 
-        unordered_map<string, string>::const_iterator servit = 
-            m_serviceTypes.find(act->ServiceID);
-        if (servit == m_serviceTypes.end()) {
+        unordered_map<string, UpnpService*>::const_iterator servit = 
+            m_services.find(act->ServiceID);
+        if (servit == m_services.end()) {
             LOGERR("Bad serviceID" << endl);
             return UPNP_E_INVALID_PARAM;
         }
-        const string& servicetype = servit->second;
+        const string& servicetype = servit->second->getServiceType();
 
         unordered_map<string, soapfun>::iterator callit = 
             m_calls.find(act->ActionName);
@@ -227,8 +227,15 @@
             (struct  Upnp_Subscription_Request*)evp;
         LOGDEB("UPNP_EVENT_SUBSCRIPTION_REQUEST: " << act->ServiceId << endl);
 
+        unordered_map<string, UpnpService*>::const_iterator servit = 
+            m_services.find(act->ServiceId);
+        if (servit == m_services.end()) {
+            LOGERR("Bad serviceID" << endl);
+            return UPNP_E_INVALID_PARAM;
+        }
+
         vector<string> names, values, qvalues;
-        if (!getEventData(true, act->ServiceId, names, values)) {
+        if (!servit->second->getEventData(true, names, values)) {
             break;
         }
         vector<const char *> cnames, cvalues;
@@ -254,12 +261,9 @@
     return UPNP_E_INVALID_PARAM;
 }
 
-void UpnpDevice::addServiceType(const std::string& serviceId, 
-                                const std::string& serviceType)
-{
-    //LOGDEB("UpnpDevice::addServiceType: [" << 
-    //    serviceId << "] -> [" << serviceType << endl);
-    m_serviceTypes[serviceId] = serviceType;
+void UpnpDevice::addService(UpnpService *serv, const std::string& serviceId)
+{
+    m_services[serviceId] = serv;
 }
 
 void UpnpDevice::addActionMapping(const std::string& actName, soapfun fun)
@@ -374,10 +378,11 @@
         bool all = count && ((count % nloopstofull) == 0);
         //LOGDEB("UpnpDevice::eventloop count "<<count<<" all "<<all<<endl);
 
-        for (unordered_map<string, string>::const_iterator it = 
-                 m_serviceTypes.begin(); it != m_serviceTypes.end(); it++) {
+        for (unordered_map<string, UpnpService*>::const_iterator it = 
+                 m_services.begin(); it != m_services.end(); it++) {
             vector<string> names, values;
-            if (!getEventData(all, it->first, names, values) || names.empty()) {
+            if (!it->second->getEventData(all, names, values) || 
+                names.empty()) {
                 continue;
             }
             notifyEvent(it->first, names, values);