--- a/libupnpp/control/cdirectory.hxx
+++ b/libupnpp/control/cdirectory.hxx
@@ -21,26 +21,19 @@
 #include "libupnpp/config.h"
 
 #include <unordered_map>
-#include <set>                          // for set
-#include <string>                       // for string
-#include <vector>                       // for vector
+#include <set>
+#include <string>
+#include <vector>
 
-#include "libupnpp/control/service.hxx"  // for Service
+#include "libupnpp/control/service.hxx"
+
 
 namespace UPnPClient {
-class ContentDirectory;    // lines 30-30
-}
-namespace UPnPClient {
+
+class ContentDirectory;
 class UPnPDeviceDesc;
-}
-namespace UPnPClient {
 class UPnPDirContent;
-}
-namespace UPnPClient {
 class UPnPServiceDesc;
-}
-
-namespace UPnPClient {
 
 typedef std::shared_ptr<ContentDirectory> CDSH;
 
@@ -64,12 +57,11 @@
 public:
 
     /** Construct by copying data from device and service objects. */
-    ContentDirectory(const UPnPDeviceDesc& device,
-                     const UPnPServiceDesc& service);
-    virtual ~ContentDirectory();
+    ContentDirectory(const UPnPDeviceDesc& dev, const UPnPServiceDesc& srv);
+    virtual ~ContentDirectory() {}
 
     /** An empty one */
-    ContentDirectory() : m_rdreqcnt(200), m_serviceKind(CDSKIND_UNKNOWN) {}
+    ContentDirectory() {}
 
     enum ServiceKind {CDSKIND_UNKNOWN, CDSKIND_BUBBLE, CDSKIND_MEDIATOMB,
                       CDSKIND_MINIDLNA, CDSKIND_MINIM, CDSKIND_TWONKY
@@ -81,6 +73,7 @@
 
     /** Test service type from discovery message */
     static bool isCDService(const std::string& st);
+    virtual bool serviceTypeMatch(const std::string& tp);
 
     /** Retrieve the directory services currently seen on the network */
     static bool getServices(std::vector<CDSH>&);
@@ -156,12 +149,14 @@
     int getSearchCapabilities(std::set<std::string>& result);
 
 protected:
+    virtual bool serviceInit(const UPnPDeviceDesc& device,
+                             const UPnPServiceDesc& service);
     /* My service type string */
     static const std::string SType;
 
 private:
-    int m_rdreqcnt; // Slice size to use when reading
-    ServiceKind m_serviceKind;
+    int m_rdreqcnt{200}; // Slice size to use when reading
+    ServiceKind m_serviceKind{CDSKIND_UNKNOWN};
 
     void evtCallback(const std::unordered_map<std::string, std::string>&);
     void registerCallback();