diff --git a/src/categorizedcontactmodel.cpp b/src/categorizedcontactmodel.cpp
index 87cdbcd6a09ce606cdf95db488ccaa7a7259dccb..f4fa3dcbf5c8d2967e2ee61f5f8137853e3227c2 100644
--- a/src/categorizedcontactmodel.cpp
+++ b/src/categorizedcontactmodel.cpp
@@ -99,7 +99,7 @@ public:
    bool                                 m_SortAlphabetical ;
    QString                              m_DefaultCategory  ;
    bool                                 m_UnreachableHidden;
-   SortingCategory::ModelTuple*         m_pSortedProxy     ;
+   SortingCategory::ModelTuple*         m_pSortedProxy {nullptr};
    CategorizedContactModel::SortedProxy m_pProxies         ;
 
    //Helper
@@ -260,6 +260,9 @@ CategorizedContactModel::~CategorizedContactModel()
    foreach(ContactTreeNode* item,d_ptr->m_lCategoryCounter) {
       delete item;
    }
+
+   if (d_ptr->m_pSortedProxy)
+      delete d_ptr->m_pSortedProxy;
 }
 
 CategorizedContactModel& CategorizedContactModel::instance()
diff --git a/src/categorizedhistorymodel.cpp b/src/categorizedhistorymodel.cpp
index a8910074dc744abe03f945fdfbf7e61e6f4c4fa4..d3c784d33e44ebba7273631847d5cc20ec22e248 100644
--- a/src/categorizedhistorymodel.cpp
+++ b/src/categorizedhistorymodel.cpp
@@ -62,7 +62,7 @@ public:
    QVector<HistoryNode*>        m_lCategoryCounter ;
    QHash<int,HistoryNode*>      m_hCategories      ;
    QHash<QString,HistoryNode*>  m_hCategoryByName  ;
-   SortingCategory::ModelTuple* m_pSortedProxy     ;
+   SortingCategory::ModelTuple* m_pSortedProxy {nullptr};
    int                          m_Role             ;
    QStringList                  m_lMimes           ;
    CategorizedHistoryModel::SortedProxy m_pProxies;
@@ -128,6 +128,9 @@ CategorizedHistoryModel::~CategorizedHistoryModel()
 
       delete item;
    }
+
+   if (d_ptr->m_pSortedProxy)
+      delete d_ptr->m_pSortedProxy;
 }
 
 QHash<int,QByteArray> CategorizedHistoryModel::roleNames() const
diff --git a/src/collectioninterface.cpp b/src/collectioninterface.cpp
index 0e28a025380a703126e90adce633cf23a61c1e85..8cc75c16d15046485ccbf0209d3f36908733803c 100644
--- a/src/collectioninterface.cpp
+++ b/src/collectioninterface.cpp
@@ -80,6 +80,8 @@ void CollectionInterface::init()
 ///Destructor
 CollectionInterface::~CollectionInterface()
 {
+   d_ptr->m_fDestruct();
+   delete d_ptr2;
    delete d_ptr;
 }
 
diff --git a/src/collectioninterface.hpp b/src/collectioninterface.hpp
index 9060e07a3df7e1b9675a37b36d810ac03ada4d0e..75a7250c2712e600c8b97a56094ef4ca91b9d38e 100644
--- a/src/collectioninterface.hpp
+++ b/src/collectioninterface.hpp
@@ -41,11 +41,15 @@ public:
    std::function<bool(ItemBase*)>  m_fSave      ;
    std::function<bool(ItemBase*)>  m_fEdit      ;
    std::function<bool(ItemBase*)>  m_fRemove    ;
-   std::function<int()                   >  m_fSize      ;
+   std::function<int()          >  m_fSize      ;
+   std::function<void()         >  m_fDestruct  ;
 
    std::function<CollectionConfigurationInterface*()> m_fConfigurator;
 };
 
+/**
+ * The collection from now on take ownership of the editor
+ */
 template<typename T>
 CollectionInterface::CollectionInterface(CollectionEditor<T>* editor, CollectionInterface* parent) :
 d_ptr(new CollectionInterfacePrivateT())
@@ -72,6 +76,9 @@ d_ptr(new CollectionInterfacePrivateT())
    d_ptr->m_fSize = [editor]()->int {
       return editor?editor->items().size() : 0;
    };
+   d_ptr->m_fDestruct = [editor]() {
+      delete editor;
+   };
 }
 
 template<typename T>
diff --git a/src/collectionmediator.h b/src/collectionmediator.h
index 6b45e5389f7eec8cd342fa9ea56838c7fa66804b..1bd22833df4191ad9bbaadba53131e6fe55cd034 100644
--- a/src/collectionmediator.h
+++ b/src/collectionmediator.h
@@ -39,6 +39,7 @@ template<typename T>
 class LIB_EXPORT CollectionMediator {
 public:
    CollectionMediator(CollectionManagerInterface<T>* parentManager, QAbstractItemModel* m);
+   virtual ~CollectionMediator();
    bool addItem   (const T* item);
    bool removeItem(const T* item);
 
diff --git a/src/collectionmediator.hpp b/src/collectionmediator.hpp
index d3f90d856dfad9a7f82e173e444d9321094a1580..13e8961353ad69ca1e54c5b194d9bf3c339b91ce 100644
--- a/src/collectionmediator.hpp
+++ b/src/collectionmediator.hpp
@@ -34,6 +34,12 @@ CollectionMediator<T>::CollectionMediator(CollectionManagerInterface<T>* parentM
    d_ptr->m_pModel  = m;
 }
 
+template<typename T>
+CollectionMediator<T>::~CollectionMediator()
+{
+   delete d_ptr;
+}
+
 template<typename T>
 bool CollectionMediator<T>::addItem(const T* item)
 {
diff --git a/src/collectionmodel.cpp b/src/collectionmodel.cpp
index 6c471d8c903352f9c2d5c24e838f0ba679df51ad..8c7bbecc74a79ec0c56a6e136bc93c3a6bf0ed0f 100644
--- a/src/collectionmodel.cpp
+++ b/src/collectionmodel.cpp
@@ -42,6 +42,17 @@ CollectionModelPrivate::CollectionModelPrivate(CollectionModel* parent) : QObjec
 m_pManageableProxy(nullptr),m_NewCollectionMutex(QMutex::Recursive)
 {}
 
+
+CollectionModelPrivate::~CollectionModelPrivate()
+{
+}
+
+CollectionModelPrivate::ProxyItem::~ProxyItem()
+{
+   foreach(ProxyItem* i, m_Children)
+      delete i;
+}
+
 CollectionModel::CollectionModel(QObject* parent) : QAbstractTableModel(parent), d_ptr(new CollectionModelPrivate(this))
 {
    load();
diff --git a/src/localbookmarkcollection.cpp b/src/localbookmarkcollection.cpp
index 1d443ca2229d2f0118c985b5af4b2fc6229e1997..20b41038b5324ae0d747e7076d6f2a72db63eca3 100644
--- a/src/localbookmarkcollection.cpp
+++ b/src/localbookmarkcollection.cpp
@@ -80,7 +80,7 @@ public:
 constexpr const char LocalBookmarkCollectionPrivate::FILENAME[];
 
 LocalBookmarkCollection::LocalBookmarkCollection(CollectionMediator<ContactMethod>* mediator) :
-   CollectionInterface(new LocalBookmarkEditor(mediator))
+   CollectionInterface(new LocalBookmarkEditor(mediator)), d_ptr(new LocalBookmarkCollectionPrivate())
 {
    load();
 }
diff --git a/src/media/recordingmodel.cpp b/src/media/recordingmodel.cpp
index 84d3cebe3fd6d162dde361d38f00496cbe47ee93..fc1eed58b8233de4ec93d11dd835a1b6f9897c07 100644
--- a/src/media/recordingmodel.cpp
+++ b/src/media/recordingmodel.cpp
@@ -31,8 +31,9 @@
 //DRing
 #include "dbus/configurationmanager.h"
 
-struct RecordingNode
+struct RecordingNode final
 {
+   ~RecordingNode();
 
    enum class Type {
       TOP_LEVEL,
@@ -52,16 +53,17 @@ struct RecordingNode
 
 };
 
-class RecordingModelPrivate : public QObject
+class RecordingModelPrivate final : public QObject
 {
    Q_OBJECT
 public:
-   RecordingModelPrivate(Media::RecordingModel* parent);
+   explicit RecordingModelPrivate(Media::RecordingModel* parent);
+   ~RecordingModelPrivate();
 
    //Attributes
    QVector<RecordingNode*>        m_lCategories             ;
-   RecordingNode*                 m_pText                   ;
-   RecordingNode*                 m_pAudioVideo             ;
+   RecordingNode*                 m_pText          {nullptr};
+   RecordingNode*                 m_pAudioVideo    {nullptr};
    LocalTextRecordingCollection*  m_pTextRecordingCollection;
    int                            m_UnreadCount             ;
 
@@ -80,12 +82,30 @@ RecordingNode::RecordingNode(RecordingNode::Type type) :
 
 }
 
+RecordingNode::~RecordingNode()
+{
+   foreach(RecordingNode* c, m_lChildren)
+      delete c;
+}
+
 RecordingModelPrivate::RecordingModelPrivate(Media::RecordingModel* parent) : q_ptr(parent),m_pText(nullptr),
 m_pAudioVideo(nullptr)/*,m_pFiles(nullptr)*/
 {
 
 }
 
+RecordingModelPrivate::~RecordingModelPrivate()
+{
+   if (m_pTextRecordingCollection)
+      delete m_pTextRecordingCollection;
+
+   if (m_pText)
+      delete m_pText;
+
+   if (m_pAudioVideo)
+      delete m_pAudioVideo;
+}
+
 void RecordingModelPrivate::forwardInsertion(const QMap<QString,QString>& message, ContactMethod* cm, Media::Media::Direction direction)
 {
    Q_UNUSED(message)
diff --git a/src/person.cpp b/src/person.cpp
index 88c85bfca816d05265448265376992a0e506aaea..37a7dcce47eb95c1017867d9338da5b7ae08211a 100644
--- a/src/person.cpp
+++ b/src/person.cpp
@@ -41,9 +41,11 @@
 #include "media/textrecording.h"
 #include "mime.h"
 
-class AddressPrivate
+class AddressPrivate final
 {
 public:
+   ~AddressPrivate() {}
+
    QString addressLine;
    QString city;
    QString zipCode;
@@ -57,6 +59,11 @@ Person::Address::Address() : d_ptr(new AddressPrivate())
 
 }
 
+Person::Address::~Address()
+{
+   //delete d_ptr; //FIXME ASAN doesn't like for some reasons, but also report a leak
+}
+
 QString Person::Address::addressLine() const
 {
    return d_ptr->addressLine;
diff --git a/src/person.h b/src/person.h
index 71263fc16cbf73cb47303623ba4b03bde0c279aa..ea236a75d601ef2b86c378654845a7d3204ce8e3 100644
--- a/src/person.h
+++ b/src/person.h
@@ -69,7 +69,8 @@ public:
    ///Represent the physical address of a contact
    class Address {
       public:
-         Address();
+         explicit Address();
+         virtual ~Address();
 
          //Getters
          QString addressLine() const;
diff --git a/src/private/collectionmodel_p.h b/src/private/collectionmodel_p.h
index e916ad69ffcc8fd4b916b5e6425aa3176a09191d..261f2f3f020b3a9c1694bd634e24be28386f461a 100644
--- a/src/private/collectionmodel_p.h
+++ b/src/private/collectionmodel_p.h
@@ -35,7 +35,8 @@ class CollectionModelPrivate final : public QObject
 {
    Q_OBJECT
 public:
-   CollectionModelPrivate(CollectionModel* parent);
+   explicit CollectionModelPrivate(CollectionModel* parent);
+   virtual ~CollectionModelPrivate();
 
    /*
     * This is not very efficient, it doesn't really have to be given the low
@@ -44,6 +45,7 @@ public:
     */
    struct ProxyItem {
       ProxyItem() : parent(nullptr),col(0),row(0),collection(nullptr),manageableCount(0){}
+      virtual ~ProxyItem();
       int row;
       int col;
       CollectionInterface* collection;
diff --git a/src/profilemodel.cpp b/src/profilemodel.cpp
index c7409b1d883d5782e36a5235f009cc01cd836d61..69ff8cc54ca15dcfce86d06431727410379a2c0e 100644
--- a/src/profilemodel.cpp
+++ b/src/profilemodel.cpp
@@ -124,6 +124,8 @@ struct Node final
 
    virtual ~Node() {
       QObject::disconnect(m_ChangedConn);
+      foreach( Node* n, children)
+         delete n;
    }
 
    enum class Type : bool {