diff --git a/CMakeLists.txt b/CMakeLists.txt
index 937e8d301a2f8f105d7f016e392813e52a1e95cc..5f8b2430b6d3b9570409997af822757c935539ca 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -167,7 +167,7 @@ SET( libringclient_LIB_SRCS
   src/call.cpp
   src/uri.cpp
   src/account.cpp
-  src/contact.cpp
+  src/person.cpp
   src/phonenumber.cpp
   src/numbercategory.cpp
   src/collectionextensioninterface.cpp
@@ -198,7 +198,7 @@ SET( libringclient_LIB_SRCS
   src/ringtonemodel.cpp
   src/lastusednumbermodel.cpp
   src/securityvalidationmodel.cpp
-  src/contactmodel.cpp
+  src/personmodel.cpp
   src/collectionmodel.cpp
   src/networkinterfacemodel.cpp
   src/certificatemodel.cpp
@@ -220,7 +220,7 @@ SET( libringclient_LIB_SRCS
 
 
   #Data backends
-  src/transitionalcontactbackend.cpp
+  src/transitionalpersonbackend.cpp
   src/collectioninterface.cpp
   src/collectioneditor.cpp
 
@@ -256,7 +256,7 @@ SET( libringclient_LIB_HDRS
   src/call.h
   src/callmodel.h
   src/historymodel.h
-  src/contact.h
+  src/person.h
   src/collectioninterface.h
   src/collectioninterface.hpp
   src/bookmarkmodel.h
@@ -279,8 +279,8 @@ SET( libringclient_LIB_HDRS
   src/lastusednumbermodel.h
   src/securityvalidationmodel.h
   src/certificate.h
-  src/contactmodel.h
-  src/transitionalcontactbackend.h
+  src/personmodel.h
+  src/transitionalpersonbackend.h
   src/collectionmodel.h
   src/hookmanager.h
   src/uri.h
diff --git a/src/bookmarkmodel.cpp b/src/bookmarkmodel.cpp
index 681064e937ed27c356a12a0216bc5a7e1c2f6f8f..7d017274f4d28475c0dffdc26813666903159898 100644
--- a/src/bookmarkmodel.cpp
+++ b/src/bookmarkmodel.cpp
@@ -28,7 +28,7 @@
 #include "phonenumber.h"
 #include "callmodel.h"
 #include "call.h"
-#include "contact.h"
+#include "person.h"
 #include "uri.h"
 #include "mime.h"
 #include "collectioneditor.h"
@@ -60,9 +60,6 @@ public:
    QHash<QString,BookmarkTopLevelItem*> m_hCategories      ;
    QStringList                          m_lMimes           ;
 
-   //Getters
-   QModelIndex getContactIndex(Contact* ct) const;
-
    //Helpers
    QVariant commonCallInfo(NumberTreeBackend* call, int role = Qt::DisplayRole) const;
    QString category(NumberTreeBackend* number) const;
diff --git a/src/bookmarkmodel.h b/src/bookmarkmodel.h
index bd6d23277f02d52d31d1799fc4f3b0acdf92f032..10e1506e92553e22f1e7fa6809500fdf73ffc531 100644
--- a/src/bookmarkmodel.h
+++ b/src/bookmarkmodel.h
@@ -28,9 +28,9 @@
 #include "collectioninterface.h"
 #include "typedefs.h"
 #include "phonenumber.h"
-// #include "contact.h"
+// #include "person.h"
 // #include "call.h"
-class ContactBackend;
+class PersonBackend;
 class NumberTreeBackend;
 
 class BookmarkModelPrivate;
diff --git a/src/call.cpp b/src/call.cpp
index 8dc38882d7a49d62e08cb34650bc6537b0213239..6cc6131a397bc0126252582d478d7a194a19b747 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -32,7 +32,7 @@
 #include "dbus/callmanager.h"
 
 #include "collectioninterface.h"
-#include "contact.h"
+#include "person.h"
 #include "uri.h"
 #include "account.h"
 #include "accountmodel.h"
@@ -47,7 +47,7 @@
 #include "video/renderer.h"
 #include "tlsmethodmodel.h"
 #include "audio/settings.h"
-#include "contactmodel.h"
+#include "personmodel.h"
 #include "imconversationmanager.h"
 
 //Track where state changes are performed on finished (over, error, failed) calls
@@ -407,9 +407,9 @@ Call* Call::buildHistoryCall(const QMap<QString,QString>& hc)
 //    const QString& contactUsed    = hc[ Call::HistoryMapFields::CONTACT_USED ]; //TODO
    const QString& contactUid     = hc[ Call::HistoryMapFields::CONTACT_UID  ];
 
-   Contact* ct = nullptr;
+   Person* ct = nullptr;
    if (!hc[ Call::HistoryMapFields::CONTACT_UID].isEmpty())
-      ct = ContactModel::instance()->getPlaceHolder(contactUid.toAscii());
+      ct = PersonModel::instance()->getPlaceHolder(contactUid.toAscii());
 
    Account*      acc       = AccountModel::instance()->getById(accId);
    PhoneNumber*  nb        = PhoneDirectoryModel::instance()->getNumber(number,ct,acc);
@@ -1252,7 +1252,7 @@ void CallPrivate::call()
       //Warning: m_pDialNumber can become nullptr when linking directly
       callManager.placeCall(m_Account->id(), m_CallId, m_pDialNumber->uri());
 
-      if (ContactModel::instance()->hasBackends()) {
+      if (PersonModel::instance()->hasBackends()) {
          if (q_ptr->peerPhoneNumber()->contact())
             m_PeerName = q_ptr->peerPhoneNumber()->contact()->formattedName();
       }
@@ -1602,7 +1602,7 @@ void CallPrivate::initTimer()
 ///Common source for model data roles
 QVariant Call::roleData(int role) const
 {
-   const Contact* ct = peerPhoneNumber()?peerPhoneNumber()->contact():nullptr;
+   const Person* ct = peerPhoneNumber()?peerPhoneNumber()->contact():nullptr;
    switch (role) {
       case Call::Role::Name:
       case Qt::DisplayRole:
diff --git a/src/call.h b/src/call.h
index 32574d7baf5668fdec516509e7cef2cd5fabf0b9..83fa377d3551326a587c3a7eb9444c733a68cb21 100644
--- a/src/call.h
+++ b/src/call.h
@@ -72,7 +72,7 @@ public:
 
    ///Model roles
    enum Role {
-      Name               = 100, /*!< The peer name from SIP or Contacts */
+      Name               = 100, /*!< The peer name from SIP or Persons */
       Number             = 101, /*!< The peer URI / phone number (as text) */
       Direction2         = 102, /*!<  */
       Date               = 103, /*!< The date when the call started */
diff --git a/src/callmodel.cpp b/src/callmodel.cpp
index ece56a156220e9c2771e26dc834346f1b4aa2244..5ca120e3d4261ceebdc7de1ac9afcd55cf164ffc 100644
--- a/src/callmodel.cpp
+++ b/src/callmodel.cpp
@@ -39,7 +39,7 @@
 #include "dbus/videomanager.h"
 #include "historymodel.h"
 #include "visitors/phonenumberselector.h"
-#include "contactmodel.h"
+#include "personmodel.h"
 
 //Other
 #include <unistd.h>
@@ -930,12 +930,12 @@ bool CallModel::dropMimeData(const QMimeData* mimedata, Qt::DropAction action, i
       createConferenceFromCall(newCall,target);
    }
    else if (mimedata->hasFormat(RingMimes::CONTACT)) {
-      const QByteArray encodedContact = mimedata->data(RingMimes::CONTACT);
+      const QByteArray encodedPerson = mimedata->data(RingMimes::CONTACT);
       Call* target = getCall(targetIdx);
-      qDebug() << "Contact" << encodedContact << "on call" << target;
+      qDebug() << "Contact" << encodedPerson << "on call" << target;
       if (PhoneNumberSelector::defaultVisitor()) {
          const PhoneNumber* number = PhoneNumberSelector::defaultVisitor()->getNumber(
-         ContactModel::instance()->getContactByUid(encodedContact));
+         PersonModel::instance()->getPersonByUid(encodedPerson));
          if (!number->uri().isEmpty()) {
             Call* newCall = dialingCall();
             newCall->setDialNumber(number);
@@ -943,7 +943,7 @@ bool CallModel::dropMimeData(const QMimeData* mimedata, Qt::DropAction action, i
             createConferenceFromCall(newCall,target);
          }
          else {
-            qDebug() << "Contact not found";
+            qDebug() << "Person not found";
          }
       }
       else
diff --git a/src/collectioneditor.hpp b/src/collectioneditor.hpp
index 8516c96c08283f7d1a87f8bb639f40c4bdb0eac0..9c379bf146fe4b1c447cd1b815ab8caff1168f13 100644
--- a/src/collectioneditor.hpp
+++ b/src/collectioneditor.hpp
@@ -22,7 +22,7 @@
 template<typename T>
 CollectionEditor<T>::CollectionEditor(CollectionMediator<T>* m) : CollectionEditorBase(m->model()), m_pMediator(m)
 {
-
+   Q_ASSERT(m);
 }
 
 template<typename T>
diff --git a/src/collectioninterface.cpp b/src/collectioninterface.cpp
index 931d72afbac84bb6aa80d4e8a5454a3f85cca3be..f6a8ba2e02387fa14b4d070e821167f8b01c48cf 100644
--- a/src/collectioninterface.cpp
+++ b/src/collectioninterface.cpp
@@ -21,7 +21,7 @@
 #include "collectioninterface.h"
 
 //Ring library
-#include "contact.h"
+#include "person.h"
 #include "call.h"
 #include "phonenumber.h"
 #include "collectioneditor.h"
diff --git a/src/collectioninterface.h b/src/collectioninterface.h
index c18a3172d2e9f6e6637df4888e2fc9ccd0299039..2c8af924842c718c29a0ea619133fe0d07777cbd 100644
--- a/src/collectioninterface.h
+++ b/src/collectioninterface.h
@@ -39,8 +39,8 @@ template<typename T> class ItemBase;
  *
  * The class need to be extended with a template constructor:
  *
- * MyBackend::MyBackend<Contact>(CollectionMediator<Contact>* mediator, CollectionInterface* parent = nullptr) :
- *    CollectionMediator<Contact*>(mediator,parent) {}
+ * MyBackend::MyBackend<Person>(CollectionMediator<Person>* mediator, CollectionInterface* parent = nullptr) :
+ *    CollectionMediator<Person>(mediator,parent) {}
  *
  * Each backends also need to implement that constructor or they wont load.
  */
diff --git a/src/collectionmanagerinterface.h b/src/collectionmanagerinterface.h
index 53b9974a1997e664f6787e9dd30f13dc645dca15..8744b94e9a23c1ea30fc415c4bd04f66ec161276 100644
--- a/src/collectionmanagerinterface.h
+++ b/src/collectionmanagerinterface.h
@@ -51,13 +51,13 @@ class CollectionManagerInterfacePrivate;
  * All implementation should define their item backend type in the
  * class declaration like:
  *
- * template <typename T > using CollectionMediator = CollectionMediator<Contact>;
+ * template <typename T > using CollectionMediator = CollectionMediator<Person>;
  *
  * And individual backends should extend that alias. For example:
  *
- * class MyContactSourceBackend : public CollectionInterface {
+ * class MyPersonSourceBackend : public CollectionInterface {
  *     public:
- *        MyContactSourceBackend(CollectionInterfaceMediator* mediator)
+ *        MyPersonSourceBackend(CollectionInterfaceMediator* mediator)
  * };
  *
  * The mediator is used to bridge the model and the item backends. The mediator
diff --git a/src/collectionmodel.cpp b/src/collectionmodel.cpp
index 54148867eb3bfac27be35915fb6194d240d89855..dbaee48aca064ba7793ca50ca23b529846ccf604 100644
--- a/src/collectionmodel.cpp
+++ b/src/collectionmodel.cpp
@@ -57,7 +57,7 @@ CollectionModelPrivate::CollectionModelPrivate(CollectionModel* parent) : QObjec
 
 CollectionModel::CollectionModel(QObject* parent) : QAbstractTableModel(parent), d_ptr(new CollectionModelPrivate(this))
 {
-   connect(ContactModel::instance(),SIGNAL(newBackendAdded(CollectionInterface*)),d_ptr.data(),SLOT(slotUpdate()));
+   connect(PersonModel::instance(),SIGNAL(newBackendAdded(CollectionInterface*)),d_ptr.data(),SLOT(slotUpdate()));
    load();
 }
 
@@ -113,8 +113,8 @@ int CollectionModel::rowCount (const QModelIndex& parent) const
       static bool init = false; //FIXME this doesn't allow dynamic backends
       static int result = 0;
       if (!init) {
-         for(int i=0;i<ContactModel::instance()->backends().size();i++)
-            result += ContactModel::instance()->backends()[i]->parent()==nullptr?1:0;
+         for(int i=0;i<PersonModel::instance()->backends().size();i++)
+            result += PersonModel::instance()->backends()[i]->parent()==nullptr?1:0;
          init = true;
       }
       return result;
@@ -205,11 +205,11 @@ QModelIndex CollectionModel::index( int row, int column, const QModelIndex& pare
          item = d_ptr->m_lTopLevelBackends[row];
       else {
 
-         if (row >= ContactModel::instance()->backends().size())
+         if (row >= PersonModel::instance()->backends().size())
             return QModelIndex();
 
          item = new CollectionModelPrivate::ProxyItem();
-         item->backend = ContactModel::instance()->backends()[row];
+         item->backend = PersonModel::instance()->backends()[row];
          d_ptr->m_lTopLevelBackends << item;
       }
       item->row = row;
diff --git a/src/collectionmodel.h b/src/collectionmodel.h
index ca4c26dd5776f8d72615c0f4cec0edcf3a116805..1c871ff6de23686b273fad206062c329533a4fae 100644
--- a/src/collectionmodel.h
+++ b/src/collectionmodel.h
@@ -19,12 +19,12 @@
 #define COLLECTION_MODEL_H
 
 #include "typedefs.h"
-#include "contact.h"
+#include "person.h"
 
 #include <QtCore/QAbstractItemModel>
 
 #include "collectionmanagerinterface.h"
-#include "contactmodel.h"
+#include "personmodel.h"
 #include "collectioninterface.h"
 
 //Ring
diff --git a/src/contactproxymodel.cpp b/src/contactproxymodel.cpp
index b25dc5b16f515b0e3c38f83aa13fae848e22108c..51a08f5d7ee1a5e4673a97a6333b79bf0500b33b 100644
--- a/src/contactproxymodel.cpp
+++ b/src/contactproxymodel.cpp
@@ -29,10 +29,10 @@
 #include "phonenumber.h"
 #include "phonedirectorymodel.h"
 #include "historytimecategorymodel.h"
-#include "contact.h"
+#include "person.h"
 #include "uri.h"
 #include "mime.h"
-#include "contactmodel.h"
+#include "personmodel.h"
 
 class ContactTreeNode;
 
@@ -69,9 +69,9 @@ class ContactTopLevelItem : public CategorizedCompositeNode {
 
 class ContactTreeNode : public CategorizedCompositeNode {
 public:
-   ContactTreeNode(Contact* ct, ContactProxyModel* parent);
+   ContactTreeNode(Person* ct, ContactProxyModel* parent);
    virtual ~ContactTreeNode();
-   Contact* m_pContact;
+   Person* m_pContact;
    ContactTopLevelItem* m_pParent3;
    uint m_Index;
    virtual QObject* getSelf() const override;
@@ -85,10 +85,10 @@ public:
    ContactProxyModelPrivate(ContactProxyModel* parent);
 
    //Helpers
-   QString category(const Contact* ct) const;
+   QString category(const Person* ct) const;
 
    //Attributes
-   QHash<Contact*, time_t>      m_hContactByDate   ;
+   QHash<Person*, time_t>      m_hContactByDate   ;
    QVector<ContactTopLevelItem*>       m_lCategoryCounter ;
    QHash<QString,ContactTopLevelItem*> m_hCategories      ;
    int                          m_Role             ;
@@ -103,7 +103,7 @@ private:
 
 public Q_SLOTS:
    void reloadCategories();
-   void slotContactAdded(Contact* c);
+   void slotContactAdded(Person* c);
 };
 
 ContactTopLevelItem::~ContactTopLevelItem() {
@@ -119,7 +119,7 @@ QObject* ContactTopLevelItem::getSelf() const
    return nullptr;
 }
 
-ContactTreeNode::ContactTreeNode(Contact* ct, ContactProxyModel* parent) : CategorizedCompositeNode(CategorizedCompositeNode::Type::CONTACT),
+ContactTreeNode::ContactTreeNode(Person* ct, ContactProxyModel* parent) : CategorizedCompositeNode(CategorizedCompositeNode::Type::CONTACT),
    m_pContact(ct),m_pParent3(nullptr),m_Index(-1)
 {
    m_pBinder = new ContactTreeBinder(parent,this);
@@ -193,18 +193,18 @@ ContactProxyModel::ContactProxyModel(int role, bool showAll) : QAbstractItemMode
    d_ptr->m_ShowAll = showAll;
    d_ptr->m_lCategoryCounter.reserve(32);
    d_ptr->m_lMimes << RingMimes::PLAIN_TEXT << RingMimes::PHONENUMBER;
-   connect(ContactModel::instance(),SIGNAL(reloaded()),d_ptr.data(),SLOT(reloadCategories()));
-   connect(ContactModel::instance(),SIGNAL(newContactAdded(Contact*)),d_ptr.data(),SLOT(slotContactAdded(Contact*)));
+   connect(PersonModel::instance(),SIGNAL(reloaded()),d_ptr.data(),SLOT(reloadCategories()));
+   connect(PersonModel::instance(),SIGNAL(newContactAdded(Person*)),d_ptr.data(),SLOT(slotContactAdded(Person*)));
    QHash<int, QByteArray> roles = roleNames();
-   roles.insert(ContactModel::Role::Organization      ,QByteArray("organization")     );
-   roles.insert(ContactModel::Role::Group             ,QByteArray("group")            );
-   roles.insert(ContactModel::Role::Department        ,QByteArray("department")       );
-   roles.insert(ContactModel::Role::PreferredEmail    ,QByteArray("preferredEmail")   );
-   roles.insert(ContactModel::Role::FormattedLastUsed ,QByteArray("formattedLastUsed"));
-   roles.insert(ContactModel::Role::IndexedLastUsed   ,QByteArray("indexedLastUsed")  );
-   roles.insert(ContactModel::Role::DatedLastUsed     ,QByteArray("datedLastUsed")    );
-   roles.insert(ContactModel::Role::Filter            ,QByteArray("filter")           );
-   roles.insert(ContactModel::Role::DropState         ,QByteArray("dropState")        );
+   roles.insert(PersonModel::Role::Organization      ,QByteArray("organization")     );
+   roles.insert(PersonModel::Role::Group             ,QByteArray("group")            );
+   roles.insert(PersonModel::Role::Department        ,QByteArray("department")       );
+   roles.insert(PersonModel::Role::PreferredEmail    ,QByteArray("preferredEmail")   );
+   roles.insert(PersonModel::Role::FormattedLastUsed ,QByteArray("formattedLastUsed"));
+   roles.insert(PersonModel::Role::IndexedLastUsed   ,QByteArray("indexedLastUsed")  );
+   roles.insert(PersonModel::Role::DatedLastUsed     ,QByteArray("datedLastUsed")    );
+   roles.insert(PersonModel::Role::Filter            ,QByteArray("filter")           );
+   roles.insert(PersonModel::Role::DropState         ,QByteArray("dropState")        );
    setRoleNames(roles);
 }
 
@@ -242,11 +242,11 @@ void ContactProxyModelPrivate::reloadCategories()
    }
    q_ptr->endRemoveRows();
    m_lCategoryCounter.clear();
-   foreach(const Contact* cont, ContactModel::instance()->contacts()) {
+   foreach(const Person* cont, PersonModel::instance()->contacts()) {
       if (cont) {
          const QString val = category(cont);
          ContactTopLevelItem* item = getContactTopLevelItem(val);
-         ContactTreeNode* contactNode = new ContactTreeNode(const_cast<Contact*>(cont),q_ptr);
+         ContactTreeNode* contactNode = new ContactTreeNode(const_cast<Person*>(cont),q_ptr);
          contactNode->m_pParent3 = item;
          contactNode->m_Index = item->m_lChildren.size();
          item->m_lChildren << contactNode;
@@ -256,7 +256,7 @@ void ContactProxyModelPrivate::reloadCategories()
    emit q_ptr->layoutChanged();
 }
 
-void ContactProxyModelPrivate::slotContactAdded(Contact* c)
+void ContactProxyModelPrivate::slotContactAdded(Person* c)
 {
    if (!c) return;
    const QString val = category(c);
@@ -275,7 +275,7 @@ bool ContactProxyModel::setData( const QModelIndex& index, const QVariant &value
 {
    if (index.isValid() && index.parent().isValid()) {
       CategorizedCompositeNode* modelItem = (CategorizedCompositeNode*)index.internalPointer();
-      if (role == ContactModel::Role::DropState) {
+      if (role == PersonModel::Role::DropState) {
          modelItem->setDropState(value.toInt());
          emit dataChanged(index, index);
          return true;
@@ -295,38 +295,38 @@ QVariant ContactProxyModel::data( const QModelIndex& index, int role) const
       switch (role) {
          case Qt::DisplayRole:
             return static_cast<const ContactTopLevelItem*>(modelItem)->m_Name;
-         case ContactModel::Role::IndexedLastUsed:
-            return index.child(0,0).data(ContactModel::Role::IndexedLastUsed);
-         case ContactModel::Role::Active:
+         case PersonModel::Role::IndexedLastUsed:
+            return index.child(0,0).data(PersonModel::Role::IndexedLastUsed);
+         case PersonModel::Role::Active:
             return true;
          default:
             break;
       }
       break;
    case CategorizedCompositeNode::Type::CONTACT:{
-      const Contact* c = static_cast<Contact*>(modelItem->getSelf());
+      const Person* c = static_cast<Person*>(modelItem->getSelf());
       switch (role) {
          case Qt::DisplayRole:
             return QVariant(c->formattedName());
-         case ContactModel::Role::Organization:
+         case PersonModel::Role::Organization:
             return QVariant(c->organization());
-         case ContactModel::Role::Group:
+         case PersonModel::Role::Group:
             return QVariant(c->group());
-         case ContactModel::Role::Department:
+         case PersonModel::Role::Department:
             return QVariant(c->department());
-         case ContactModel::Role::PreferredEmail:
+         case PersonModel::Role::PreferredEmail:
             return QVariant(c->preferredEmail());
-         case ContactModel::Role::DropState:
+         case PersonModel::Role::DropState:
             return QVariant(modelItem->dropState());
-         case ContactModel::Role::FormattedLastUsed:
+         case PersonModel::Role::FormattedLastUsed:
             return QVariant(HistoryTimeCategoryModel::timeToHistoryCategory(c->phoneNumbers().lastUsedTimeStamp()));
-         case ContactModel::Role::IndexedLastUsed:
+         case PersonModel::Role::IndexedLastUsed:
             return QVariant((int)HistoryTimeCategoryModel::timeToHistoryConst(c->phoneNumbers().lastUsedTimeStamp()));
-         case ContactModel::Role::Active:
+         case PersonModel::Role::Active:
             return c->isActive();
-         case ContactModel::Role::DatedLastUsed:
+         case PersonModel::Role::DatedLastUsed:
             return QVariant(QDateTime::fromTime_t( c->phoneNumbers().lastUsedTimeStamp()));
-         case ContactModel::Role::Filter:
+         case PersonModel::Role::Filter:
             return c->filterString();
          default:
             break;
@@ -338,7 +338,7 @@ QVariant ContactProxyModel::data( const QModelIndex& index, int role) const
    case CategorizedCompositeNode::Type::BOOKMARK:
    default:
       switch (role) {
-         case ContactModel::Role::Active:
+         case PersonModel::Role::Active:
             return true;
       }
       break;
@@ -366,7 +366,7 @@ bool ContactProxyModel::dropMimeData(const QMimeData *data, Qt::DropAction actio
          CategorizedCompositeNode* modelItem = (CategorizedCompositeNode*)targetIdx.internalPointer();
          switch (modelItem->type()) {
             case CategorizedCompositeNode::Type::CONTACT: {
-               const Contact* ct = static_cast<Contact*>(modelItem->getSelf());
+               const Person* ct = static_cast<Person*>(modelItem->getSelf());
                if (ct) {
                   switch(ct->phoneNumbers().size()) {
                      case 0: //Do nothing when there is no phone numbers
@@ -381,7 +381,7 @@ bool ContactProxyModel::dropMimeData(const QMimeData *data, Qt::DropAction actio
                }
             } break;
             case CategorizedCompositeNode::Type::NUMBER: {
-               const Contact::PhoneNumbers nbs = *static_cast<Contact::PhoneNumbers*>(modelItem);
+               const Person::PhoneNumbers nbs = *static_cast<Person::PhoneNumbers*>(modelItem);
                const PhoneNumber*          nb  = nbs[row];
                if (nb) {
                   call->setTransferNumber(nb->uri());
@@ -408,7 +408,7 @@ int ContactProxyModel::rowCount( const QModelIndex& parent ) const
       case CategorizedCompositeNode::Type::TOP_LEVEL:
          return static_cast<const ContactTopLevelItem*>(parentNode)->m_lChildren.size();
       case CategorizedCompositeNode::Type::CONTACT: {
-         const Contact* ct = static_cast<Contact*>(parentNode->getSelf());
+         const Person* ct = static_cast<Person*>(parentNode->getSelf());
          const int size = ct->phoneNumbers().size();
          //Do not return the number if there is only one, it will be drawn part of the contact
          return size==1?0:size;
@@ -471,9 +471,9 @@ QModelIndex ContactProxyModel::index( int row, int column, const QModelIndex& pa
             break;
          case CategorizedCompositeNode::Type::CONTACT: {
             const ContactTreeNode* ctn = (ContactTreeNode*)parentNode;
-            const Contact*          ct = (Contact*)ctn->getSelf()    ;
+            const Person*          ct = (Person*)ctn->getSelf()    ;
             if (ct->phoneNumbers().size()>row) {
-               const_cast<Contact::PhoneNumbers*>(&ct->phoneNumbers())->setParentNode((CategorizedCompositeNode*)ctn);
+               const_cast<Person::PhoneNumbers*>(&ct->phoneNumbers())->setParentNode((CategorizedCompositeNode*)ctn);
                return createIndex(row,column,(void*)&ct->phoneNumbers());
             }
          }
@@ -505,7 +505,7 @@ QMimeData* ContactProxyModel::mimeData(const QModelIndexList &indexes) const
          switch(modelItem->type()) {
             case CategorizedCompositeNode::Type::CONTACT: {
                //Contact
-               const Contact* ct = static_cast<Contact*>(modelItem->getSelf());
+               const Person* ct = static_cast<Person*>(modelItem->getSelf());
                if (ct) {
                   if (ct->phoneNumbers().size() == 1) {
                      mimeData->setData(RingMimes::PHONENUMBER , ct->phoneNumbers()[0]->toHash().toUtf8());
@@ -517,7 +517,7 @@ QMimeData* ContactProxyModel::mimeData(const QModelIndexList &indexes) const
             case CategorizedCompositeNode::Type::NUMBER: {
                //Phone number
                const QString text = data(index, Qt::DisplayRole).toString();
-               const Contact::PhoneNumbers nbs = *static_cast<Contact::PhoneNumbers*>(index.internalPointer());
+               const Person::PhoneNumbers nbs = *static_cast<Person::PhoneNumbers*>(index.internalPointer());
                const PhoneNumber*          nb  = nbs[index.row()];
                mimeData->setData(RingMimes::PLAIN_TEXT , text.toUtf8());
                mimeData->setData(RingMimes::PHONENUMBER, nb->toHash().toUtf8());
@@ -549,30 +549,30 @@ int ContactProxyModel::acceptedPayloadTypes()
  ****************************************************************************/
 
 
-QString ContactProxyModelPrivate::category(const Contact* ct) const {
+QString ContactProxyModelPrivate::category(const Person* ct) const {
    if (!ct)
       return QString();
    QString cat;
    switch (m_Role) {
-      case ContactModel::Role::Organization:
+      case PersonModel::Role::Organization:
          cat = ct->organization();
          break;
-      case ContactModel::Role::Group:
+      case PersonModel::Role::Group:
          cat = ct->group();
          break;
-      case ContactModel::Role::Department:
+      case PersonModel::Role::Department:
          cat = ct->department();
          break;
-      case ContactModel::Role::PreferredEmail:
+      case PersonModel::Role::PreferredEmail:
          cat = ct->preferredEmail();
          break;
-      case ContactModel::Role::FormattedLastUsed:
+      case PersonModel::Role::FormattedLastUsed:
          cat = HistoryTimeCategoryModel::timeToHistoryCategory(ct->phoneNumbers().lastUsedTimeStamp());
          break;
-      case ContactModel::Role::IndexedLastUsed:
+      case PersonModel::Role::IndexedLastUsed:
          cat = QString::number((int)HistoryTimeCategoryModel::timeToHistoryConst(ct->phoneNumbers().lastUsedTimeStamp()));
          break;
-      case ContactModel::Role::DatedLastUsed:
+      case PersonModel::Role::DatedLastUsed:
          cat = QDateTime::fromTime_t(ct->phoneNumbers().lastUsedTimeStamp()).toString();
          break;
       default:
diff --git a/src/contactproxymodel.h b/src/contactproxymodel.h
index 70af7d0c49135f71b694d834f90f360865754ded..a33bc18fd25353d0a0b427b56cc81fcae2c51dfa 100644
--- a/src/contactproxymodel.h
+++ b/src/contactproxymodel.h
@@ -24,8 +24,8 @@
 
 //Ring
 #include "typedefs.h"
-#include "contact.h"
-class ContactModel;
+#include "person.h"
+class PersonModel;
 class ContactTreeNode;
 class TopLevelItem;
 class ContactTreeBinder;
@@ -38,7 +38,7 @@ class LIB_EXPORT ContactProxyModel :  public QAbstractItemModel
    Q_OBJECT
    #pragma GCC diagnostic pop
 public:
-   friend class ContactModel;
+   friend class PersonModel;
    friend class ContactTreeNode;
    friend class ContactTreeBinder;
    explicit ContactProxyModel(int role = Qt::DisplayRole, bool showAll = false);
diff --git a/src/extensions/presencecollectionextension.cpp b/src/extensions/presencecollectionextension.cpp
index d529fe02101d64ac6f3121ef2492264540bcb0d5..066597595b0985cb8e857cea458fe750e161f482 100644
--- a/src/extensions/presencecollectionextension.cpp
+++ b/src/extensions/presencecollectionextension.cpp
@@ -18,7 +18,7 @@
 #include "presencecollectionextension.h"
 #include "collectioninterface.h"
 #include "phonenumber.h"
-#include "contact.h"
+#include "person.h"
 #include "presencestatusmodel.h"
 
 PresenceCollectionExtension::PresenceCollectionExtension(QObject* parent) :
@@ -51,7 +51,7 @@ bool PresenceCollectionExtension::setData(CollectionInterface* backend, const QM
    if (index.isValid() && role == Qt::CheckStateRole) {
       switch(value.toInt()){
          case Qt::Checked:
-            foreach(Contact* c, backend->items<Contact>()) {
+            foreach(Person* c, backend->items<Person>()) {
                foreach(PhoneNumber* n,c->phoneNumbers()) {
                   n->setTracked(true);
                }
@@ -60,7 +60,7 @@ bool PresenceCollectionExtension::setData(CollectionInterface* backend, const QM
             emit dataChanged(index);
             break;
          case Qt::Unchecked:
-            foreach(Contact* c, backend->items<Contact>()) {
+            foreach(Person* c, backend->items<Person>()) {
                foreach(PhoneNumber* n,c->phoneNumbers()) {
                   n->setTracked(false);
                }
diff --git a/src/historymodel.cpp b/src/historymodel.cpp
index 5955d61d0a63827b1c572a6d505d398e5a11e2b8..aca3c2f9c06446da8695dd00e86391bf3d81351b 100644
--- a/src/historymodel.cpp
+++ b/src/historymodel.cpp
@@ -29,7 +29,7 @@
 #include "dbus/callmanager.h"
 #include "dbus/configurationmanager.h"
 #include "call.h"
-#include "contact.h"
+#include "person.h"
 #include "phonenumber.h"
 #include "callmodel.h"
 #include "collectioneditor.h"
@@ -292,9 +292,9 @@ void HistoryModel::add(Call* call)
       return;
    }
 
-//    if (!m_HaveContactModel && call->contactBackend()) {
+//    if (!m_HavePersonModel && call->contactBackend()) {
 //       connect(((QObject*)call->contactBackend()),SIGNAL(collectionChanged()),this,SLOT(reloadCategories()));
-//       m_HaveContactModel = true;
+//       m_HavePersonModel = true;
 //    }//TODO implement reordering
 
    emit newHistoryCall(call);
@@ -570,7 +570,7 @@ bool HistoryModel::dropMimeData(const QMimeData *mime, Qt::DropAction action, in
    Q_UNUSED(action)
    setData(parentIdx,-1,Call::Role::DropState);
    QByteArray encodedPhoneNumber = mime->data( RingMimes::PHONENUMBER );
-   QByteArray encodedContact     = mime->data( RingMimes::CONTACT     );
+   QByteArray encodedPerson     = mime->data( RingMimes::CONTACT     );
 
    if (parentIdx.isValid() && mime->hasFormat( RingMimes::CALLID)) {
       QByteArray encodedCallId      = mime->data( RingMimes::CALLID      );
diff --git a/src/instantmessagingmodel.cpp b/src/instantmessagingmodel.cpp
index fd8415ba75390a07312bbb45ed5fdcf03c68a13c..518dccc6ac1bd1571b9961c1d2db0c2686304880 100644
--- a/src/instantmessagingmodel.cpp
+++ b/src/instantmessagingmodel.cpp
@@ -20,7 +20,7 @@
 #include "callmodel.h"
 #include "dbus/callmanager.h"
 #include "call.h"
-#include "contact.h"
+#include "person.h"
 #include "phonenumber.h"
 #include "private/instantmessagingmodel_p.h"
 
@@ -73,7 +73,7 @@ QVariant InstantMessagingModel::data( const QModelIndex& idx, int role) const
          case InstantMessagingModel::Role::IMAGE: {
             if (d_ptr->m_lImages.find(idx) != d_ptr->m_lImages.end())
                return d_ptr->m_lImages[idx];
-            const Contact* c = d_ptr->m_pCall->peerPhoneNumber()->contact();
+            const Person* c = d_ptr->m_pCall->peerPhoneNumber()->contact();
             if (c && c->photo().isValid()) {
                return c->photo();
             }
diff --git a/src/itembase.hpp b/src/itembase.hpp
index 2acb06b8183304f72aad09fcc1874c221c2e4c47..e3fafe165a6956909ea3202ab131fe2dd12b01dc 100644
--- a/src/itembase.hpp
+++ b/src/itembase.hpp
@@ -23,6 +23,7 @@
 class ItemBasePrivate
 {
 public:
+   ItemBasePrivate() : m_pBackend(nullptr){}
    CollectionInterface* m_pBackend;
 };
 
diff --git a/src/contact.cpp b/src/person.cpp
similarity index 72%
rename from src/contact.cpp
rename to src/person.cpp
index e5718240d719c6e64b5c34364e585aefc10ed72b..f757709026640421dbd9063183cda475908d7894 100644
--- a/src/contact.cpp
+++ b/src/person.cpp
@@ -18,12 +18,12 @@
  ***************************************************************************/
 
 //Parent
-#include "contact.h"
+#include "person.h"
 
 //Ring library
 #include "phonenumber.h"
 #include "collectioninterface.h"
-#include "transitionalcontactbackend.h"
+#include "transitionalpersonbackend.h"
 #include "account.h"
 #include "vcardutils.h"
 #include "numbercategorymodel.h"
@@ -42,75 +42,75 @@ public:
    QString type;
 };
 
-Contact::Address::Address() : d_ptr(new AddressPrivate())
+Person::Address::Address() : d_ptr(new AddressPrivate())
 {
 
 }
 
-QString Contact::Address::addressLine() const
+QString Person::Address::addressLine() const
 {
    return d_ptr->addressLine;
 }
 
-QString Contact::Address::city() const
+QString Person::Address::city() const
 {
    return d_ptr->city;
 }
 
-QString Contact::Address::zipCode() const
+QString Person::Address::zipCode() const
 {
    return d_ptr->zipCode;
 }
 
-QString Contact::Address::state() const
+QString Person::Address::state() const
 {
    return d_ptr->state;
 }
 
-QString Contact::Address::country() const
+QString Person::Address::country() const
 {
    return d_ptr->country;
 }
 
-QString Contact::Address::type() const
+QString Person::Address::type() const
 {
    return d_ptr->type;
 }
 
-void Contact::Address::setAddressLine(const QString& value)
+void Person::Address::setAddressLine(const QString& value)
 {
    d_ptr->addressLine = value;
 }
 
-void Contact::Address::setCity(const QString& value)
+void Person::Address::setCity(const QString& value)
 {
    d_ptr->city = value;
 }
 
-void Contact::Address::setZipCode(const QString& value)
+void Person::Address::setZipCode(const QString& value)
 {
    d_ptr->zipCode = value;
 }
 
-void Contact::Address::setState(const QString& value)
+void Person::Address::setState(const QString& value)
 {
    d_ptr->state = value;
 }
 
-void Contact::Address::setCountry(const QString& value)
+void Person::Address::setCountry(const QString& value)
 {
    d_ptr->country = value;
 }
 
-void Contact::Address::setType(const QString& value)
+void Person::Address::setType(const QString& value)
 {
    d_ptr->type = value;
 }
 
-class ContactPrivate {
+class PersonPrivate {
 public:
-   ContactPrivate(Contact* contact);
-   ~ContactPrivate();
+   PersonPrivate(Person* contact);
+   ~PersonPrivate();
    QString                  m_FirstName        ;
    QString                  m_SecondName       ;
    QString                  m_NickName         ;
@@ -122,10 +122,10 @@ public:
    QString                  m_Group            ;
    QString                  m_Department       ;
    bool                     m_DisplayPhoto     ;
-   Contact::PhoneNumbers    m_Numbers          ;
+   Person::PhoneNumbers    m_Numbers          ;
    bool                     m_Active           ;
    bool                     m_isPlaceHolder    ;
-   QList<Contact::Address*> m_lAddresses       ;
+   QList<Person::Address*> m_lAddresses       ;
    QHash<QString, QString>  m_lCustomAttributes;
 
    //Cache
@@ -134,7 +134,7 @@ public:
    QString filterString();
 
    //Helper code to help handle multiple parents
-   QList<Contact*> m_lParents;
+   QList<Person*> m_lParents;
 
    //As a single D-Pointer can have multiple parent (when merged), all emit need
    //to use a proxy to make sure everybody is notified
@@ -145,7 +145,7 @@ public:
    void phoneNumberCountAboutToChange(int,int);
 };
 
-QString ContactPrivate::filterString()
+QString PersonPrivate::filterString()
 {
    if (m_CachedFilterString.size())
       return m_CachedFilterString;
@@ -165,77 +165,77 @@ QString ContactPrivate::filterString()
    return m_CachedFilterString;
 }
 
-void ContactPrivate::changed()
+void PersonPrivate::changed()
 {
    m_CachedFilterString.clear();
-   foreach (Contact* c,m_lParents) {
+   foreach (Person* c,m_lParents) {
       emit c->changed();
    }
 }
 
-void ContactPrivate::presenceChanged( PhoneNumber* n )
+void PersonPrivate::presenceChanged( PhoneNumber* n )
 {
-   foreach (Contact* c,m_lParents) {
+   foreach (Person* c,m_lParents) {
       emit c->presenceChanged(n);
    }
 }
 
-void ContactPrivate::statusChanged  ( bool s )
+void PersonPrivate::statusChanged  ( bool s )
 {
-   foreach (Contact* c,m_lParents) {
+   foreach (Person* c,m_lParents) {
       emit c->statusChanged(s);
    }
 }
 
-void ContactPrivate::phoneNumberCountChanged(int n,int o)
+void PersonPrivate::phoneNumberCountChanged(int n,int o)
 {
-   foreach (Contact* c,m_lParents) {
+   foreach (Person* c,m_lParents) {
       emit c->phoneNumberCountChanged(n,o);
    }
 }
 
-void ContactPrivate::phoneNumberCountAboutToChange(int n,int o)
+void PersonPrivate::phoneNumberCountAboutToChange(int n,int o)
 {
-   foreach (Contact* c,m_lParents) {
+   foreach (Person* c,m_lParents) {
       emit c->phoneNumberCountAboutToChange(n,o);
    }
 }
 
-ContactPrivate::ContactPrivate(Contact* contact) :
+PersonPrivate::PersonPrivate(Person* contact) :
    m_Numbers(contact),m_DisplayPhoto(false),m_Active(true)
 {
 }
 
-ContactPrivate::~ContactPrivate()
+PersonPrivate::~PersonPrivate()
 {
 }
 
-Contact::PhoneNumbers::PhoneNumbers(Contact* parent) : QVector<PhoneNumber*>(),CategorizedCompositeNode(CategorizedCompositeNode::Type::NUMBER),
+Person::PhoneNumbers::PhoneNumbers(Person* parent) : QVector<PhoneNumber*>(),CategorizedCompositeNode(CategorizedCompositeNode::Type::NUMBER),
     m_pParent2(parent)
 {
 }
 
-Contact::PhoneNumbers::PhoneNumbers(Contact* parent, const QVector<PhoneNumber*>& list)
+Person::PhoneNumbers::PhoneNumbers(Person* parent, const QVector<PhoneNumber*>& list)
 : QVector<PhoneNumber*>(list),CategorizedCompositeNode(CategorizedCompositeNode::Type::NUMBER),m_pParent2(parent)
 {
 }
 
-Contact* Contact::PhoneNumbers::contact() const
+Person* Person::PhoneNumbers::contact() const
 {
    return m_pParent2;
 }
 
 ///Constructor
-Contact::Contact(CollectionInterface* parent): ItemBase<QObject>(parent!=nullptr?((QAbstractItemModel*)parent->model()):((QAbstractItemModel*)TransitionalContactBackend::instance())),
-   d_ptr(new ContactPrivate(this))
+Person::Person(CollectionInterface* parent): ItemBase<QObject>(parent?parent->model():TransitionalPersonBackend::instance()->model()),
+   d_ptr(new PersonPrivate(this))
 {
-   setBackend(parent?parent:TransitionalContactBackend::instance());
+   setBackend(parent?parent:TransitionalPersonBackend::instance());
    d_ptr->m_isPlaceHolder = false;
    d_ptr->m_lParents << this;
 }
 
 ///Destructor
-Contact::~Contact()
+Person::~Person()
 {
    //Unregister itself from the D-Pointer list
    d_ptr->m_lParents.removeAll(this);
@@ -246,72 +246,72 @@ Contact::~Contact()
 }
 
 ///Get the phone number list
-const Contact::PhoneNumbers& Contact::phoneNumbers() const
+const Person::PhoneNumbers& Person::phoneNumbers() const
 {
    return d_ptr->m_Numbers;
 }
 
 ///Get the nickname
-const QString& Contact::nickName() const
+const QString& Person::nickName() const
 {
    return d_ptr->m_NickName;
 }
 
 ///Get the firstname
-const QString& Contact::firstName() const
+const QString& Person::firstName() const
 {
    return d_ptr->m_FirstName;
 }
 
 ///Get the second/family name
-const QString& Contact::secondName() const
+const QString& Person::secondName() const
 {
    return d_ptr->m_SecondName;
 }
 
 ///Get the photo
-const QVariant Contact::photo() const
+const QVariant Person::photo() const
 {
    return d_ptr->m_vPhoto;
 }
 
 ///Get the formatted name
-const QString& Contact::formattedName() const
+const QString& Person::formattedName() const
 {
    return d_ptr->m_FormattedName;
 }
 
 ///Get the organisation
-const QString& Contact::organization()  const
+const QString& Person::organization()  const
 {
    return d_ptr->m_Organization;
 }
 
 ///Get the preferred email
-const QString& Contact::preferredEmail()  const
+const QString& Person::preferredEmail()  const
 {
    return d_ptr->m_PreferredEmail;
 }
 
 ///Get the unique identifier (used for drag and drop) 
-const QByteArray& Contact::uid() const
+const QByteArray& Person::uid() const
 {
    return d_ptr->m_Uid;
 }
 
 ///Get the group
-const QString& Contact::group() const
+const QString& Person::group() const
 {
    return d_ptr->m_Group;
 }
 
-const QString& Contact::department() const
+const QString& Person::department() const
 {
    return d_ptr->m_Department;
 }
 
 ///Set the phone number (type and number)
-void Contact::setPhoneNumbers(PhoneNumbers numbers)
+void Person::setPhoneNumbers(PhoneNumbers numbers)
 {
    const int oldCount(d_ptr->m_Numbers.size()),newCount(numbers.size());
    foreach(PhoneNumber* n, d_ptr->m_Numbers)
@@ -327,14 +327,14 @@ void Contact::setPhoneNumbers(PhoneNumbers numbers)
 }
 
 ///Set the nickname
-void Contact::setNickName(const QString& name)
+void Person::setNickName(const QString& name)
 {
    d_ptr->m_NickName = name;
    d_ptr->changed();
 }
 
 ///Set the first name
-void Contact::setFirstName(const QString& name)
+void Person::setFirstName(const QString& name)
 {
    d_ptr->m_FirstName = name;
    setObjectName(formattedName());
@@ -342,7 +342,7 @@ void Contact::setFirstName(const QString& name)
 }
 
 ///Set the family name
-void Contact::setFamilyName(const QString& name)
+void Person::setFamilyName(const QString& name)
 {
    d_ptr->m_SecondName = name;
    setObjectName(formattedName());
@@ -350,56 +350,56 @@ void Contact::setFamilyName(const QString& name)
 }
 
 ///Set the Photo/Avatar
-void Contact::setPhoto(const QVariant& photo)
+void Person::setPhoto(const QVariant& photo)
 {
    d_ptr->m_vPhoto = photo;
    d_ptr->changed();
 }
 
 ///Set the formatted name (display name)
-void Contact::setFormattedName(const QString& name)
+void Person::setFormattedName(const QString& name)
 {
    d_ptr->m_FormattedName = name;
    d_ptr->changed();
 }
 
 ///Set the organisation / business
-void Contact::setOrganization(const QString& name)
+void Person::setOrganization(const QString& name)
 {
    d_ptr->m_Organization = name;
    d_ptr->changed();
 }
 
 ///Set the default email
-void Contact::setPreferredEmail(const QString& name)
+void Person::setPreferredEmail(const QString& name)
 {
    d_ptr->m_PreferredEmail = name;
    d_ptr->changed();
 }
 
 ///Set UID
-void Contact::setUid(const QByteArray& id)
+void Person::setUid(const QByteArray& id)
 {
    d_ptr->m_Uid = id;
    d_ptr->changed();
 }
 
 ///Set Group
-void Contact::setGroup(const QString& name)
+void Person::setGroup(const QString& name)
 {
    d_ptr->m_Group = name;
    d_ptr->changed();
 }
 
 ///Set department
-void Contact::setDepartment(const QString& name)
+void Person::setDepartment(const QString& name)
 {
    d_ptr->m_Department = name;
    d_ptr->changed();
 }
 
 ///If the contact have been deleted or not yet fully created
-void Contact::setActive( bool active)
+void Person::setActive( bool active)
 {
    d_ptr->m_Active = active;
    d_ptr->statusChanged(d_ptr->m_Active);
@@ -407,7 +407,7 @@ void Contact::setActive( bool active)
 }
 
 ///Return if one of the PhoneNumber is present
-bool Contact::isPresent() const
+bool Person::isPresent() const
 {
    foreach(const PhoneNumber* n,d_ptr->m_Numbers) {
       if (n->isPresent())
@@ -417,7 +417,7 @@ bool Contact::isPresent() const
 }
 
 ///Return if one of the PhoneNumber is tracked
-bool Contact::isTracked() const
+bool Person::isTracked() const
 {
    foreach(const PhoneNumber* n,d_ptr->m_Numbers) {
       if (n->isTracked())
@@ -427,13 +427,13 @@ bool Contact::isTracked() const
 }
 
 ///Have this contact been deleted or doesn't exist yet
-bool Contact::isActive() const
+bool Person::isActive() const
 {
    return d_ptr->m_Active;
 }
 
 ///Return if one of the PhoneNumber support presence
-bool Contact::supportPresence() const
+bool Person::supportPresence() const
 {
    foreach(const PhoneNumber* n,d_ptr->m_Numbers) {
       if (n->supportPresence())
@@ -443,11 +443,11 @@ bool Contact::supportPresence() const
 }
 
 
-QObject* Contact::PhoneNumbers::getSelf() const {
+QObject* Person::PhoneNumbers::getSelf() const {
    return m_pParent2;
 }
 
-time_t Contact::PhoneNumbers::lastUsedTimeStamp() const
+time_t Person::PhoneNumbers::lastUsedTimeStamp() const
 {
    time_t t = 0;
    for (int i=0;i<size();i++) {
@@ -458,19 +458,19 @@ time_t Contact::PhoneNumbers::lastUsedTimeStamp() const
 }
 
 ///Recomputing the filter string is heavy, cache it
-QString Contact::filterString() const
+QString Person::filterString() const
 {
    return d_ptr->filterString();
 }
 
 ///Callback when one of the phone number presence change
-void Contact::slotPresenceChanged()
+void Person::slotPresenceChanged()
 {
    d_ptr->changed();
 }
 
 ///Create a placeholder contact, it will eventually be replaced when the real one is loaded
-ContactPlaceHolder::ContactPlaceHolder(const QByteArray& uid)
+PersonPlaceHolder::PersonPlaceHolder(const QByteArray& uid)
 {
    setUid(uid);
    d_ptr->m_isPlaceHolder = true;
@@ -481,12 +481,12 @@ ContactPlaceHolder::ContactPlaceHolder(const QByteArray& uid)
  *
  * Once loaded, those pointers need to be upgraded to the real contact.
  */
-bool ContactPlaceHolder::merge(Contact* contact)
+bool PersonPlaceHolder::merge(Person* contact)
 {
    if ((!contact) || ((*contact) == this))
       return false;
 
-   ContactPrivate* currentD = d_ptr;
+   PersonPrivate* currentD = d_ptr;
    replaceDPointer(contact);
    currentD->m_lParents.removeAll(this);
    if (!currentD->m_lParents.size())
@@ -494,7 +494,7 @@ bool ContactPlaceHolder::merge(Contact* contact)
    return true;
 }
 
-void Contact::replaceDPointer(Contact* c)
+void Person::replaceDPointer(Person* c)
 {
    this->d_ptr = c->d_ptr;
    d_ptr->m_lParents << this;
@@ -502,29 +502,29 @@ void Contact::replaceDPointer(Contact* c)
    emit rebased(c);
 }
 
-bool Contact::operator==(const Contact* other) const
+bool Person::operator==(const Person* other) const
 {
    return other && this->d_ptr == other->d_ptr;
 }
 
-bool Contact::operator==(const Contact& other) const
+bool Person::operator==(const Person& other) const
 {
    return &other && this->d_ptr == other.d_ptr;
 }
 
 ///Add a new address to this contact
-void Contact::addAddress(Contact::Address* addr)
+void Person::addAddress(Person::Address* addr)
 {
    d_ptr->m_lAddresses << addr;
 }
 
 ///Add custom fields for contact profiles
-void Contact::addCustomField(const QString& key, const QString& value)
+void Person::addCustomField(const QString& key, const QString& value)
 {
    d_ptr->m_lCustomAttributes.insert(key, value);
 }
 
-const QByteArray Contact::toVCard(QList<Account*> accounts) const
+const QByteArray Person::toVCard(QList<Account*> accounts) const
 {
    //serializing here
    VCardUtils* maker = new VCardUtils();
diff --git a/src/contact.h b/src/person.h
similarity index 88%
rename from src/contact.h
rename to src/person.h
index c59ccefbcae6b310e6a46aec756bcb57dc0d6a29..9136e61dd3a4ac45bcc620ed7fc97dbb13702796 100644
--- a/src/contact.h
+++ b/src/person.h
@@ -27,7 +27,7 @@
 
 //Ring
 class PhoneNumber;
-class ContactPrivate;
+class PersonPrivate;
 class AddressPrivate;
 class Account;
 class CollectionInterface;
@@ -35,15 +35,15 @@ class CollectionInterface;
 #include "typedefs.h"
 #include "categorizedcompositenode.h"
 
-///Contact: Abstract version of a contact
-class LIB_EXPORT Contact : public ItemBase<QObject>
+///Person: Abstract version of a contact
+class LIB_EXPORT Person : public ItemBase<QObject>
 {
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
    Q_OBJECT
    #pragma GCC diagnostic pop
 public:
-   friend class ContactPrivate;
+   friend class PersonPrivate;
 
    ///Represent the physical address of a contact
    class Address {
@@ -74,12 +74,12 @@ public:
    class  PhoneNumbers : public QVector<PhoneNumber*>, public CategorizedCompositeNode { //TODO private
    public:
       virtual QObject* getSelf() const __attribute__ ((const));
-      explicit PhoneNumbers(Contact* parent);
-      PhoneNumbers(Contact* parent, const QVector<PhoneNumber*>& list);
-      Contact* contact() const;
+      explicit PhoneNumbers(Person* parent);
+      PhoneNumbers(Person* parent, const QVector<PhoneNumber*>& list);
+      Person* contact() const;
       time_t lastUsedTimeStamp() const;
    private:
-      Contact* m_pParent2       ;
+      Person* m_pParent2       ;
    };
 
    //Properties
@@ -102,14 +102,14 @@ public:
    Q_INVOKABLE const QByteArray toVCard(QList<Account*> accounts) const;
 
 protected:
-   //The D-Pointer can be shared if a PlaceHolderContact is merged with a real one
-   ContactPrivate* d_ptr;
-   void replaceDPointer(Contact* other);
+   //The D-Pointer can be shared if a PlaceHolderPerson is merged with a real one
+   PersonPrivate* d_ptr;
+   void replaceDPointer(Person* other);
 
 public:
    //Constructors & Destructors
-   explicit Contact(CollectionInterface* parent = nullptr);
-   virtual ~Contact();
+   explicit Person(CollectionInterface* parent = nullptr);
+   virtual ~Person();
 
    //Getters
    const PhoneNumbers& phoneNumbers() const;
@@ -148,8 +148,8 @@ public:
    void setActive         ( bool              active );
 
    //Operator
-   bool operator==(const Contact* other) const;
-   bool operator==(const Contact& other) const;
+   bool operator==(const Person* other) const;
+   bool operator==(const Person& other) const;
 
 private Q_SLOTS:
    void slotPresenceChanged(); //TODO remove
@@ -160,21 +160,21 @@ Q_SIGNALS:
    void changed        (              );
    void phoneNumberCountChanged(int,int);
    void phoneNumberCountAboutToChange(int,int);
-   void rebased        ( Contact*     );
+   void rebased        ( Person*     );
 
 protected:
    //Presence secret methods
    void updatePresenceInformations(const QString& uri, bool status, const QString& message);
 };
 
-class LIB_EXPORT ContactPlaceHolder : public Contact {
+class LIB_EXPORT PersonPlaceHolder : public Person {
    Q_OBJECT
 public:
-   explicit ContactPlaceHolder(const QByteArray& uid);
-   bool merge(Contact* contact);
+   explicit PersonPlaceHolder(const QByteArray& uid);
+   bool merge(Person* contact);
 };
 
 
-Q_DECLARE_METATYPE(Contact*)
+Q_DECLARE_METATYPE(Person*)
 
 #endif
diff --git a/src/contactmodel.cpp b/src/personmodel.cpp
similarity index 61%
rename from src/contactmodel.cpp
rename to src/personmodel.cpp
index 4bac97fb3bdde897bd97dec719365867a09252f8..17d24d2f512a0967b135cdec073c6ad5a2d897ef 100644
--- a/src/contactmodel.cpp
+++ b/src/personmodel.cpp
@@ -17,10 +17,10 @@
  ***************************************************************************/
 
 //Parent
-#include "contactmodel.h"
+#include "personmodel.h"
 
 //Ring library
-#include "contact.h"
+#include "person.h"
 #include "call.h"
 #include "uri.h"
 #include "phonenumber.h"
@@ -34,57 +34,57 @@
 #include <QtCore/QDebug>
 #include <QtCore/QCoreApplication>
 
-ContactModel* ContactModel::m_spInstance = nullptr;
+PersonModel* PersonModel::m_spInstance = nullptr;
 
 
-class ContactModelPrivate : public QObject
+class PersonModelPrivate : public QObject
 {
    Q_OBJECT
 public:
-   ContactModelPrivate(ContactModel* parent);
+   PersonModelPrivate(PersonModel* parent);
 
    //Attributes
 //    QVector<CollectionInterface*> m_lBackends;
    CommonCollectionModel* m_pBackendModel;
-   QHash<QByteArray,ContactPlaceHolder*> m_hPlaceholders;
+   QHash<QByteArray,PersonPlaceHolder*> m_hPlaceholders;
 
    //Indexes
-   QHash<QByteArray,Contact*> m_hContactsByUid;
-   QVector<Contact*> m_lContacts;
+   QHash<QByteArray,Person*> m_hPersonsByUid;
+   QVector<Person*> m_lPersons;
 
 private:
-   ContactModel* q_ptr;
+   PersonModel* q_ptr;
 
 private Q_SLOTS:
    void slotReloaded();
-//    void slotContactAdded(Contact* c);
+//    void slotPersonAdded(Person* c);
 };
 
-ContactModelPrivate::ContactModelPrivate(ContactModel* parent) : QObject(parent), q_ptr(parent),
+PersonModelPrivate::PersonModelPrivate(PersonModel* parent) : QObject(parent), q_ptr(parent),
 m_pBackendModel(nullptr)
 {
    
 }
 
 ///Constructor
-ContactModel::ContactModel(QObject* par) : QAbstractItemModel(par?par:QCoreApplication::instance()), d_ptr(new ContactModelPrivate(this))
+PersonModel::PersonModel(QObject* par) : QAbstractItemModel(par?par:QCoreApplication::instance()), d_ptr(new PersonModelPrivate(this))
 {
 }
 
 ///Destructor
-ContactModel::~ContactModel()
+PersonModel::~PersonModel()
 {
-   d_ptr->m_hContactsByUid.clear();
-   while (d_ptr->m_lContacts.size()) {
-      Contact* c = d_ptr->m_lContacts[0];
-      d_ptr->m_lContacts.remove(0);
+   d_ptr->m_hPersonsByUid.clear();
+   while (d_ptr->m_lPersons.size()) {
+      Person* c = d_ptr->m_lPersons[0];
+      d_ptr->m_lPersons.remove(0);
       delete c;
    }
 }
 
-ContactModel* ContactModel::instance() {
+PersonModel* PersonModel::instance() {
    if (!m_spInstance)
-      m_spInstance = new ContactModel(QCoreApplication::instance());
+      m_spInstance = new PersonModel(QCoreApplication::instance());
    return m_spInstance;
 }
 
@@ -95,7 +95,7 @@ ContactModel* ContactModel::instance() {
  ****************************************************************************/
 
 
-bool ContactModel::setData( const QModelIndex& idx, const QVariant &value, int role)
+bool PersonModel::setData( const QModelIndex& idx, const QVariant &value, int role)
 {
    Q_UNUSED(idx)
    Q_UNUSED(value)
@@ -103,38 +103,38 @@ bool ContactModel::setData( const QModelIndex& idx, const QVariant &value, int r
    return false;
 }
 
-QVariant ContactModel::data( const QModelIndex& idx, int role) const
+QVariant PersonModel::data( const QModelIndex& idx, int role) const
 {
    if (!idx.isValid())
       return QVariant();
    if (!idx.parent().isValid() && (role == Qt::DisplayRole || role == Qt::EditRole)) {
-      const Contact* c = d_ptr->m_lContacts[idx.row()];
+      const Person* c = d_ptr->m_lPersons[idx.row()];
       if (c)
          return QVariant(c->formattedName());
    }
    else if (idx.parent().isValid() && (role == Qt::DisplayRole || role == Qt::EditRole)) {
-      const Contact* c = d_ptr->m_lContacts[idx.parent().row()];
+      const Person* c = d_ptr->m_lPersons[idx.parent().row()];
       if (c)
          return QVariant(c->phoneNumbers()[idx.row()]->uri());
    }
    return QVariant();
 }
 
-QVariant ContactModel::headerData(int section, Qt::Orientation orientation, int role) const
+QVariant PersonModel::headerData(int section, Qt::Orientation orientation, int role) const
 {
    Q_UNUSED(section)
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
-      return QVariant(tr("Contacts"));
+      return QVariant(tr("Persons"));
    return QVariant();
 }
 
-int ContactModel::rowCount( const QModelIndex& par ) const
+int PersonModel::rowCount( const QModelIndex& par ) const
 {
    if (!par.isValid()) {
-      return d_ptr->m_lContacts.size();
+      return d_ptr->m_lPersons.size();
    }
-   else if (!par.parent().isValid() && par.row() < d_ptr->m_lContacts.size()) {
-      const Contact* c = d_ptr->m_lContacts[par.row()];
+   else if (!par.parent().isValid() && par.row() < d_ptr->m_lPersons.size()) {
+      const Person* c = d_ptr->m_lPersons[par.row()];
       if (c) {
          const int size = c->phoneNumbers().size();
          return size==1?0:size;
@@ -143,40 +143,40 @@ int ContactModel::rowCount( const QModelIndex& par ) const
    return 0;
 }
 
-Qt::ItemFlags ContactModel::flags( const QModelIndex& idx ) const
+Qt::ItemFlags PersonModel::flags( const QModelIndex& idx ) const
 {
    if (!idx.isValid())
       return Qt::NoItemFlags;
    return Qt::ItemIsEnabled | ((idx.parent().isValid())?Qt::ItemIsSelectable:Qt::ItemIsEnabled);
 }
 
-int ContactModel::columnCount ( const QModelIndex& par) const
+int PersonModel::columnCount ( const QModelIndex& par) const
 {
    Q_UNUSED(par)
    return 1;
 }
 
-QModelIndex ContactModel::parent( const QModelIndex& idx) const
+QModelIndex PersonModel::parent( const QModelIndex& idx) const
 {
    if (!idx.isValid())
       return QModelIndex();
    CategorizedCompositeNode* modelItem = (CategorizedCompositeNode*)idx.internalPointer();
    if (modelItem && modelItem->type() == CategorizedCompositeNode::Type::NUMBER) {
-      int idx2 = d_ptr->m_lContacts.indexOf(((Contact::PhoneNumbers*)modelItem)->contact());
+      int idx2 = d_ptr->m_lPersons.indexOf(((Person::PhoneNumbers*)modelItem)->contact());
       if (idx2 != -1) {
-         return ContactModel::index(idx2,0,QModelIndex());
+         return PersonModel::index(idx2,0,QModelIndex());
       }
    }
    return QModelIndex();
 }
 
-QModelIndex ContactModel::index( int row, int column, const QModelIndex& par) const
+QModelIndex PersonModel::index( int row, int column, const QModelIndex& par) const
 {
-   if (!par.isValid() && d_ptr->m_lContacts.size() > row) {
-      return createIndex(row,column,d_ptr->m_lContacts[row]);
+   if (!par.isValid() && d_ptr->m_lPersons.size() > row) {
+      return createIndex(row,column,d_ptr->m_lPersons[row]);
    }
-   else if (par.isValid() && d_ptr->m_lContacts[par.row()]->phoneNumbers().size() > row) {
-      return createIndex(row,column,(CategorizedCompositeNode*)(&(d_ptr->m_lContacts[par.row()]->phoneNumbers())));
+   else if (par.isValid() && d_ptr->m_lPersons[par.row()]->phoneNumbers().size() > row) {
+      return createIndex(row,column,(CategorizedCompositeNode*)(&(d_ptr->m_lPersons[par.row()]->phoneNumbers())));
    }
    return QModelIndex();
 }
@@ -189,18 +189,18 @@ QModelIndex ContactModel::index( int row, int column, const QModelIndex& par) co
 
 
 ///Find contact by UID
-Contact* ContactModel::getContactByUid(const QByteArray& uid)
+Person* PersonModel::getPersonByUid(const QByteArray& uid)
 {
-   return d_ptr->m_hContactsByUid[uid];
+   return d_ptr->m_hPersonsByUid[uid];
 }
 
 /**
  * Create a temporary contact or return the existing one for an UID
  * This temporary contact should eventually be merged into the real one
  */
-Contact* ContactModel::getPlaceHolder(const QByteArray& uid )
+Person* PersonModel::getPlaceHolder(const QByteArray& uid )
 {
-   Contact* ct = d_ptr->m_hContactsByUid[uid];
+   Person* ct = d_ptr->m_hPersonsByUid[uid];
 
    //Do not create a placeholder if the real deal exist
    if (ct) {
@@ -212,65 +212,65 @@ Contact* ContactModel::getPlaceHolder(const QByteArray& uid )
    if (ct)
       return ct;
 
-   ContactPlaceHolder* ct2 = new ContactPlaceHolder(uid);
+   PersonPlaceHolder* ct2 = new PersonPlaceHolder(uid);
 
    d_ptr->m_hPlaceholders[ct2->uid()] = ct2;
    return ct2;
 }
 
 ///Return if there is backends
-// bool ContactModel::hasBackends() const
+// bool PersonModel::hasBackends() const
 // {
 //    return d_ptr->m_lBackends.size();
 // }
 
 
-// const QVector<CollectionInterface*> ContactModel::enabledBackends() const
+// const QVector<CollectionInterface*> PersonModel::enabledBackends() const
 // {
 //    return d_ptr->m_lBackends;
 // }
 
-// bool ContactModel::hasEnabledBackends() const
+// bool PersonModel::hasEnabledBackends() const
 // {
 //    return d_ptr->m_lBackends.size()>0;
 // }
 
-// CommonCollectionModel* ContactModel::backendModel() const
+// CommonCollectionModel* PersonModel::backendModel() const
 // {
 //    if (!d_ptr->m_pBackendModel) {
-//       d_ptr->m_pBackendModel = new CommonCollectionModel(const_cast<ContactModel*>(this));
+//       d_ptr->m_pBackendModel = new CommonCollectionModel(const_cast<PersonModel*>(this));
 //    }
 //    return d_ptr->m_pBackendModel; //TODO
 // }
 
-// QString ContactModel::backendCategoryName() const
+// QString PersonModel::backendCategoryName() const
 // {
-//    return tr("Contacts");
+//    return tr("Persons");
 // }
 
-void ContactModel::backendAddedCallback(CollectionInterface* backend)
+void PersonModel::backendAddedCallback(CollectionInterface* backend)
 {
    Q_UNUSED(backend)
 }
 
-// const QVector<CollectionInterface*> ContactModel::backends() const
+// const QVector<CollectionInterface*> PersonModel::backends() const
 // {
 //    return d_ptr->m_lBackends;
 // }
 
-bool ContactModel::addItemCallback(Contact* item)
+bool PersonModel::addItemCallback(Person* item)
 {
-   addContact(item);
+   addPerson(item);
    return true;
 }
 
-bool ContactModel::removeItemCallback(Contact* item)
+bool PersonModel::removeItemCallback(Person* item)
 {
    Q_UNUSED(item)
    return false;
 }
 
-// bool ContactModel::enableBackend(CollectionInterface* backend, bool enabled)
+// bool PersonModel::enableBackend(CollectionInterface* backend, bool enabled)
 // {
 //    Q_UNUSED(backend)
 //    Q_UNUSED(enabled)
@@ -278,17 +278,17 @@ bool ContactModel::removeItemCallback(Contact* item)
 //    return false;
 // }
 
-bool ContactModel::addContact(Contact* c)
+bool PersonModel::addPerson(Person* c)
 {
    if (!c)
       return false;
-   beginInsertRows(QModelIndex(),d_ptr->m_lContacts.size()-1,d_ptr->m_lContacts.size());
-   d_ptr->m_lContacts << c;
-   d_ptr->m_hContactsByUid[c->uid()] = c;
+   beginInsertRows(QModelIndex(),d_ptr->m_lPersons.size()-1,d_ptr->m_lPersons.size());
+   d_ptr->m_lPersons << c;
+   d_ptr->m_hPersonsByUid[c->uid()] = c;
 
    //Deprecate the placeholder
    if (d_ptr->m_hPlaceholders.contains(c->uid())) {
-      ContactPlaceHolder* c2 = d_ptr->m_hPlaceholders[c->uid()];
+      PersonPlaceHolder* c2 = d_ptr->m_hPlaceholders[c->uid()];
       if (c2) {
          c2->merge(c);
          d_ptr->m_hPlaceholders[c->uid()] = nullptr;
@@ -296,36 +296,36 @@ bool ContactModel::addContact(Contact* c)
    }
    endInsertRows();
    emit layoutChanged();
-   emit newContactAdded(c);
+   emit newPersonAdded(c);
    return true;
 }
 
 
-void ContactModel::disableContact(Contact* c)
+void PersonModel::disablePerson(Person* c)
 {
    if (c)
       c->setActive(false);
 }
 
-const ContactList ContactModel::contacts() const
+const PersonList PersonModel::contacts() const
 {
-   return d_ptr->m_lContacts;
+   return d_ptr->m_lPersons;
 }
 
-// void ContactModel::addBackend(CollectionInterface* backend, LoadOptions options)
+// void PersonModel::addBackend(CollectionInterface* backend, LoadOptions options)
 // {
 //    d_ptr->m_lBackends << backend;
 //    connect(backend,SIGNAL(reloaded()),d_ptr.data(),SLOT(slotReloaded()));
-//    connect(backend,SIGNAL(newContactAdded(Contact*)),d_ptr.data(),SLOT(slotContactAdded(Contact*)));
+//    connect(backend,SIGNAL(newPersonAdded(Person*)),d_ptr.data(),SLOT(slotPersonAdded(Person*)));
 //    if (options & LoadOptions::FORCE_ENABLED || ItemModelStateSerializationVisitor::instance()->isChecked(backend))
 //       backend->load();
 //    emit newBackendAdded(backend);
 // }
 
-bool ContactModel::addNewContact(Contact* c, CollectionInterface* backend)
+bool PersonModel::addNewPerson(Person* c, CollectionInterface* backend)
 {
    Q_UNUSED(backend);
-   return backends()[0]->editor<Contact>()->addNew(c);
+   return backends()[0]->editor<Person>()->addNew(c);
 }
 
 
@@ -335,10 +335,10 @@ bool ContactModel::addNewContact(Contact* c, CollectionInterface* backend)
  *                                                                           *
  ****************************************************************************/
 
-void ContactModelPrivate::slotReloaded()
+void PersonModelPrivate::slotReloaded()
 {
    emit q_ptr->reloaded();
 }
 
 
-#include <contactmodel.moc>
+#include <personmodel.moc>
diff --git a/src/contactmodel.h b/src/personmodel.h
similarity index 79%
rename from src/contactmodel.h
rename to src/personmodel.h
index b846ad4ef285d281c8b6740fe6dc95a0d37d05e0..91d55e1e874936a2132af95dd50936a1a2369e73 100644
--- a/src/contactmodel.h
+++ b/src/personmodel.h
@@ -25,21 +25,21 @@
 #include <QtCore/QAbstractItemModel>
 
 #include "typedefs.h"
-#include "contact.h"
+#include "person.h"
 #include "collectionmanagerinterface.h"
 
 //Ring
-class Contact;
+class Person;
 class Account;
 class CollectionInterface;
-class ContactModelPrivate;
+class PersonModelPrivate;
 
 //Typedef
-typedef QVector<Contact*> ContactList;
+typedef QVector<Person*> PersonList;
 
-///ContactModel: Allow different way to handle contact without poluting the library
-class LIB_EXPORT ContactModel :
-   public QAbstractItemModel, public CollectionManagerInterface<Contact> {
+///PersonModel: Allow different way to handle contact without poluting the library
+class LIB_EXPORT PersonModel :
+   public QAbstractItemModel, public CollectionManagerInterface<Person> {
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
    Q_OBJECT
@@ -58,20 +58,20 @@ public:
       DropState         = 300, //State for drag and drop
    };
 
-   template <typename T > using ItemMediator = CollectionMediator<Contact>;
+   template <typename T > using ItemMediator = CollectionMediator<Person>;
 
 
-   explicit ContactModel(QObject* parent = nullptr);
-   virtual ~ContactModel();
+   explicit PersonModel(QObject* parent = nullptr);
+   virtual ~PersonModel();
 
    //Mutator
-   bool addContact(Contact* c);
-   void disableContact(Contact* c);
+   bool addPerson(Person* c);
+   void disablePerson(Person* c);
 
    //Getters
-   Contact* getContactByUid   ( const QByteArray& uid );
-   Contact* getPlaceHolder(const QByteArray& uid );
-   const ContactList contacts() const;
+   Person* getPersonByUid   ( const QByteArray& uid );
+   Person* getPlaceHolder(const QByteArray& uid );
+   const PersonList contacts() const;
 
    //Model implementation
    virtual bool          setData     ( const QModelIndex& index, const QVariant &value, int role   ) override;
@@ -84,26 +84,26 @@ public:
    virtual QVariant      headerData  ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
 
    //Singleton
-   static ContactModel* instance();
+   static PersonModel* instance();
 
 private:
-   QScopedPointer<ContactModelPrivate> d_ptr;
-   Q_DECLARE_PRIVATE(ContactModel)
+   QScopedPointer<PersonModelPrivate> d_ptr;
+   Q_DECLARE_PRIVATE(PersonModel)
 
    //Singleton
-   static ContactModel* m_spInstance;
+   static PersonModel* m_spInstance;
 
    //Backend interface
    virtual void backendAddedCallback(CollectionInterface* backend) override;
-   virtual bool addItemCallback(Contact* item) override;
-   virtual bool removeItemCallback(Contact* item) override;
+   virtual bool addItemCallback(Person* item) override;
+   virtual bool removeItemCallback(Person* item) override;
 
 public Q_SLOTS:
-   bool addNewContact(Contact* c, CollectionInterface* backend = nullptr);
+   bool addNewPerson(Person* c, CollectionInterface* backend = nullptr);
 
 Q_SIGNALS:
    void reloaded();
-   void newContactAdded(Contact* c);
+   void newPersonAdded(Person* c);
    void newBackendAdded(CollectionInterface* backend);
 };
 
diff --git a/src/phonedirectorymodel.cpp b/src/phonedirectorymodel.cpp
index eab72037b866c0b326c665f00bbd6aabd59a6ab7..71899632bfa26d39e693efcb5cf431bc7bbe50f7 100644
--- a/src/phonedirectorymodel.cpp
+++ b/src/phonedirectorymodel.cpp
@@ -25,14 +25,14 @@
 #include "call.h"
 #include "uri.h"
 #include "account.h"
-#include "contact.h"
+#include "person.h"
 #include "accountmodel.h"
 #include "numbercategory.h"
 #include "numbercategorymodel.h"
 #include "collectioninterface.h"
 #include "dbus/presencemanager.h"
 #include "visitors/pixmapmanipulationvisitor.h"
-#include "contactmodel.h"
+#include "personmodel.h"
 
 //Private
 #include "private/phonedirectorymodel_p.h"
@@ -286,7 +286,7 @@ QVariant PhoneDirectoryModel::headerData(int section, Qt::Orientation orientatio
 {
    Q_UNUSED(section)
    Q_UNUSED(orientation)
-   static const QString headers[] = {tr("URI"), tr("Type"), tr("Contact"), tr("Account"), tr("State"), tr("Call count"), tr("Week count"),
+   static const QString headers[] = {tr("URI"), tr("Type"), tr("Person"), tr("Account"), tr("State"), tr("Call count"), tr("Week count"),
    tr("Trimester count"), tr("Have Called"), tr("Last used"), tr("Name_count"),tr("Total (in seconds)"), tr("Popularity_index"), tr("Bookmarked"), tr("Tracked"), tr("Present"),
    tr("Presence message"), tr("Uid") };
    if (role == Qt::DisplayRole) return headers[section];
@@ -339,7 +339,7 @@ PhoneNumber* PhoneDirectoryModel::getNumber(const QString& uri, Account* account
 }
 
 ///Add new information to existing numbers and try to merge
-PhoneNumber* PhoneDirectoryModelPrivate::fillDetails(NumberWrapper* wrap, const URI& strippedUri, Account* account, Contact* contact, const QString& type)
+PhoneNumber* PhoneDirectoryModelPrivate::fillDetails(NumberWrapper* wrap, const URI& strippedUri, Account* account, Person* contact, const QString& type)
 {
    //TODO pick the best URI
    //TODO the account hostname change corner case
@@ -350,7 +350,7 @@ PhoneNumber* PhoneDirectoryModelPrivate::fillDetails(NumberWrapper* wrap, const
          //BEGIN Check if contact can be set
 
          //Check if the contact is compatible
-         const bool hasCompatibleContact = contact && (
+         const bool hasCompatiblePerson = contact && (
                (!number->contact())
             || (
                   (number->contact()->uid() == contact->uid())
@@ -359,7 +359,7 @@ PhoneNumber* PhoneDirectoryModelPrivate::fillDetails(NumberWrapper* wrap, const
          );
 
          //Check if the URI match
-         const bool hasCompatibleURI =  hasCompatibleContact && (number->uri().hasHostname()?(
+         const bool hasCompatibleURI =  hasCompatiblePerson && (number->uri().hasHostname()?(
                /* Has hostname */
                    strippedUri == number->uri()
                    /* Something with an hostname can be used with IP2IP */ //TODO support DHT here
@@ -385,7 +385,7 @@ PhoneNumber* PhoneDirectoryModelPrivate::fillDetails(NumberWrapper* wrap, const
 
          //If everything match, set the contact
          if (hasCompatibleAccount)
-            number->setContact(contact);
+            number->setPerson(contact);
          //END Check if the contact can be set
 
 
@@ -446,7 +446,7 @@ PhoneNumber* PhoneDirectoryModel::getNumber(const QString& uri, const QString& t
 }
 
 ///Create a number when a more information is available duplicated ones
-PhoneNumber* PhoneDirectoryModel::getNumber(const QString& uri, Contact* contact, Account* account, const QString& type)
+PhoneNumber* PhoneDirectoryModel::getNumber(const QString& uri, Person* contact, Account* account, const QString& type)
 {
    //Remove extra data such as "<sip:" from the main URI
    const URI strippedUri(uri);
@@ -489,7 +489,7 @@ PhoneNumber* PhoneDirectoryModel::getNumber(const QString& uri, Contact* contact
          foreach(PhoneNumber* number, wrap3->numbers) {
             if (number->account() == account) {
                if (contact && ((!number->contact()) || (contact->uid() == number->contact()->uid())))
-                  number->setContact(contact); //TODO Check all cases from fillDetails()
+                  number->setPerson(contact); //TODO Check all cases from fillDetails()
                //TODO add alternate URI
                confirmedCandidate3 = number;
                break;
@@ -525,7 +525,7 @@ PhoneNumber* PhoneDirectoryModel::getNumber(const QString& uri, Contact* contact
             //Assume this is valid until a smarter solution is implemented to merge both
             //For a short time, a placeholder contact and a contact can coexist, drop the placeholder
             if (contact && (!number->contact() || (contact->uid() == number->contact()->uid())))
-               number->setContact(contact);
+               number->setPerson(contact);
 
             return number;
          }
@@ -537,7 +537,7 @@ PhoneNumber* PhoneDirectoryModel::getNumber(const QString& uri, Contact* contact
    number->setAccount(account);
    number->setIndex( d_ptr->m_lNumbers.size());
    if (contact)
-      number->setContact(contact);
+      number->setPerson(contact);
    d_ptr->m_lNumbers << number;
    connect(number,SIGNAL(callAdded(Call*)),d_ptr.data(),SLOT(slotCallAdded(Call*)));
    connect(number,SIGNAL(changed()),d_ptr.data(),SLOT(slotChanged()));
@@ -576,7 +576,7 @@ PhoneNumber* PhoneDirectoryModel::fromHash(const QString& hash)
    if (fields.size() == 3) {
       const QString uri = fields[0];
       Account* account = AccountModel::instance()->getById(fields[1].toAscii());
-      Contact* contact = ContactModel::instance()->getContactByUid(fields[2].toUtf8());
+      Person* contact = PersonModel::instance()->getPersonByUid(fields[2].toUtf8());
       return getNumber(uri,contact,account);
    }
    else if (fields.size() == 1) {
diff --git a/src/phonedirectorymodel.h b/src/phonedirectorymodel.h
index ada0013b276d9aa725232b293c52307a769b92e5..7d80be0f8cc849edbcb13e29c64f5f4600b47f99 100644
--- a/src/phonedirectorymodel.h
+++ b/src/phonedirectorymodel.h
@@ -26,7 +26,7 @@
 //Ring
 #include "uri.h"
 class PhoneNumber         ;
-class Contact             ;
+class Person              ;
 class Account             ;
 class Call                ;
 class TemporaryPhoneNumber;
@@ -70,7 +70,7 @@ public:
    //Factory
    Q_INVOKABLE PhoneNumber* getNumber(const QString& uri, const QString& type = QString());
    Q_INVOKABLE PhoneNumber* getNumber(const QString& uri, Account* account, const QString& type = QString());
-   Q_INVOKABLE PhoneNumber* getNumber(const QString& uri, Contact* contact, Account* account = nullptr, const QString& type = QString());
+   Q_INVOKABLE PhoneNumber* getNumber(const QString& uri, Person* contact, Account* account = nullptr, const QString& type = QString());
    Q_INVOKABLE PhoneNumber* fromHash (const QString& hash);
    Q_INVOKABLE PhoneNumber* fromTemporary(const TemporaryPhoneNumber* number);
 
diff --git a/src/phonenumber.cpp b/src/phonenumber.cpp
index 032901ed7bd8c6b95655b4c9226cfd123ea4f3d5..d3d60ed82818798867d02f1aebf96a865fad2935 100644
--- a/src/phonenumber.cpp
+++ b/src/phonenumber.cpp
@@ -17,7 +17,7 @@
  ***************************************************************************/
 #include "phonenumber.h"
 #include "phonedirectorymodel.h"
-#include "contact.h"
+#include "person.h"
 #include "account.h"
 #include "call.h"
 #include "dbus/presencemanager.h"
@@ -38,7 +38,7 @@ public:
    bool               m_Present          ;
    QString            m_PresentMessage   ;
    bool               m_Tracked          ;
-   Contact*           m_pContact         ;
+   Person*           m_pPerson         ;
    Account*           m_pAccount         ;
    time_t             m_LastUsed         ;
    QList<Call*>       m_lCalls           ;
@@ -125,7 +125,7 @@ const PhoneNumber* PhoneNumber::BLANK()
 
 PhoneNumberPrivate::PhoneNumberPrivate(const URI& uri, NumberCategory* cat, PhoneNumber::Type st) :
    m_Uri(uri),m_pCategory(cat),m_Tracked(false),m_Present(false),m_LastUsed(0),
-   m_Type(st),m_PopularityIndex(-1),m_pContact(nullptr),m_pAccount(nullptr),
+   m_Type(st),m_PopularityIndex(-1),m_pPerson(nullptr),m_pAccount(nullptr),
    m_LastWeekCount(0),m_LastTrimCount(0),m_HaveCalled(false),m_IsBookmark(false),m_TotalSeconds(0),
    m_Index(-1)
 {}
@@ -197,9 +197,9 @@ Account* PhoneNumber::account() const
 }
 
 ///Return this number associated contact, if any
-Contact* PhoneNumber::contact() const
+Person* PhoneNumber::contact() const
 {
-   return d_ptr->m_pContact;
+   return d_ptr->m_pPerson;
 }
 
 ///Return when this number was last used
@@ -218,14 +218,14 @@ void PhoneNumber::setAccount(Account* account)
 }
 
 ///Set this number contact
-void PhoneNumber::setContact(Contact* contact)
+void PhoneNumber::setPerson(Person* contact)
 {
-   d_ptr->m_pContact = contact;
+   d_ptr->m_pPerson = contact;
    if (contact && d_ptr->m_Type != PhoneNumber::Type::TEMPORARY) {
       PhoneDirectoryModel::instance()->d_ptr->indexNumber(this,d_ptr->m_hNames.keys()+QStringList(contact->formattedName()));
       d_ptr->m_PrimaryName_cache = contact->formattedName();
       d_ptr->primaryNameChanged(d_ptr->m_PrimaryName_cache);
-      connect(contact,SIGNAL(rebased(Contact*)),this,SLOT(contactRebased(Contact*)));
+      connect(contact,SIGNAL(rebased(Person*)),this,SLOT(contactRebased(Person*)));
    }
    d_ptr->changed();
 }
@@ -467,9 +467,9 @@ void PhoneNumber::incrementAlternativeName(const QString& name)
    const bool needReIndexing = !d_ptr->m_hNames[name];
    d_ptr->m_hNames[name]++;
    if (needReIndexing && d_ptr->m_Type != PhoneNumber::Type::TEMPORARY) {
-      PhoneDirectoryModel::instance()->d_ptr->indexNumber(this,d_ptr->m_hNames.keys()+(d_ptr->m_pContact?(QStringList(d_ptr->m_pContact->formattedName())):QStringList()));
+      PhoneDirectoryModel::instance()->d_ptr->indexNumber(this,d_ptr->m_hNames.keys()+(d_ptr->m_pPerson?(QStringList(d_ptr->m_pPerson->formattedName())):QStringList()));
       //Invalid m_PrimaryName_cache
-      if (!d_ptr->m_pContact)
+      if (!d_ptr->m_pPerson)
          d_ptr->m_PrimaryName_cache.clear();
    }
 }
@@ -484,7 +484,7 @@ void PhoneNumber::accountDestroyed(QObject* o)
  * When the PhoneNumber contact is merged with another one, the phone number
  * data might be replaced, like the preferred name.
  */
-void PhoneNumber::contactRebased(Contact* other)
+void PhoneNumber::contactRebased(Person* other)
 {
    d_ptr->m_PrimaryName_cache = other->formattedName();
    d_ptr->primaryNameChanged(d_ptr->m_PrimaryName_cache);
@@ -577,7 +577,7 @@ TemporaryPhoneNumber::TemporaryPhoneNumber(const PhoneNumber* number) :
    PhoneNumber(QString(),NumberCategoryModel::other(),PhoneNumber::Type::TEMPORARY)
 {
    if (number) {
-      setContact(number->contact());
+      setPerson(number->contact());
       setAccount(number->account());
    }
 }
diff --git a/src/phonenumber.h b/src/phonenumber.h
index ee65eab506b596cb2aab873cc7a2af1573ca0f18..0c42567ccc4ffee0bcec3f4d83c4f6b34f831a36 100644
--- a/src/phonenumber.h
+++ b/src/phonenumber.h
@@ -31,7 +31,7 @@
 //Ring
 #include "uri.h"
 class Account;
-class Contact;
+class Person;
 class Call;
 class PhoneNumberPrivate;
 class TemporaryPhoneNumber;
@@ -48,7 +48,7 @@ public:
 
    //Properties
    Q_PROPERTY(Account*      account          READ account           WRITE setAccount              )
-   Q_PROPERTY(Contact*      contact          READ contact           WRITE setContact              )
+   Q_PROPERTY(Person*      contact          READ contact           WRITE setPerson              )
    Q_PROPERTY(int           lastUsed         READ lastUsed                                        )
    Q_PROPERTY(QString       uri              READ uri                                             )
    Q_PROPERTY(int           callCount        READ callCount                                       )
@@ -87,7 +87,7 @@ public:
    bool               isPresent       () const;
    QString            presenceMessage () const;
    Account*           account         () const;
-   Contact*           contact         () const;
+   Person*           contact         () const;
    time_t             lastUsed        () const;
    PhoneNumber::Type  type            () const;
    int                callCount       () const;
@@ -106,7 +106,7 @@ public:
 
    //Setters
    Q_INVOKABLE void setAccount(Account*       account);
-   Q_INVOKABLE void setContact(Contact*       contact);
+   Q_INVOKABLE void setPerson(Person*       contact);
    Q_INVOKABLE void setTracked(bool           track  );
    void             setCategory(NumberCategory* cat  );
    void             setBookmarked(bool bookmarked    );
@@ -162,7 +162,7 @@ private:
 
 private Q_SLOTS:
    void accountDestroyed(QObject* o);
-   void contactRebased(Contact* other);
+   void contactRebased(Person* other);
 
 Q_SIGNALS:
    ///A new call have used this PhoneNumber
diff --git a/src/private/phonedirectorymodel_p.h b/src/private/phonedirectorymodel_p.h
index 0435c9306528f22e58fc8393cd5c2ca21d8b1f72..c9764c9aa1f19a13e767e03c3c412a4e5f49ed95 100644
--- a/src/private/phonedirectorymodel_p.h
+++ b/src/private/phonedirectorymodel_p.h
@@ -62,7 +62,7 @@ public:
    //Helpers
    void indexNumber(PhoneNumber* number, const QStringList& names   );
    void setAccount (PhoneNumber* number,       Account*     account );
-   PhoneNumber* fillDetails(NumberWrapper* wrap, const URI& strippedUri, Account* account, Contact* contact, const QString& type);
+   PhoneNumber* fillDetails(NumberWrapper* wrap, const URI& strippedUri, Account* account, Person* contact, const QString& type);
 
    //Attributes
    QVector<PhoneNumber*>         m_lNumbers         ;
diff --git a/src/profilemodel.cpp b/src/profilemodel.cpp
index 4bc85b5b5b2a6d9f829ee300972cc7d71a029e91..6d5d6d100cf2fde76c03eec34bc584d76391a1f4 100644
--- a/src/profilemodel.cpp
+++ b/src/profilemodel.cpp
@@ -28,9 +28,9 @@
 #include "accountmodel.h"
 #include "collectioninterface.h"
 #include "collectioneditor.h"
-#include "contactmodel.h"
+#include "personmodel.h"
 #include "callmodel.h"
-#include "contact.h"
+#include "person.h"
 #include "visitors/profilepersistervisitor.h"
 #include "visitors/pixmapmanipulationvisitor.h"
 #include "vcardutils.h"
@@ -40,11 +40,11 @@
 class QObject;
 
 //SFLPhone
-class Contact;
+class Person;
 class Account;
 struct Node;
 
-typedef void (VCardMapper:: *mapToProperty)(Contact*, const QByteArray&);
+typedef void (VCardMapper:: *mapToProperty)(Person*, const QByteArray&);
 
 struct VCardMapper {
 
@@ -58,42 +58,42 @@ struct VCardMapper {
       m_hHash[VCardUtils::Property::ORGANIZATION] = &VCardMapper::setOrganization;
    }
 
-   void setFormattedName(Contact* c, const QByteArray& fn) {
+   void setFormattedName(Person* c, const QByteArray& fn) {
       c->setFormattedName(QString::fromUtf8(fn));
    }
 
-   void setNames(Contact* c, const QByteArray& fn) {
+   void setNames(Person* c, const QByteArray& fn) {
       QList<QByteArray> splitted = fn.split(';');
       c->setFamilyName(splitted[0].trimmed());
       c->setFirstName(splitted[1].trimmed());
    }
 
-   void setUid(Contact* c, const QByteArray& fn) {
+   void setUid(Person* c, const QByteArray& fn) {
       c->setUid(fn);
    }
 
-   void setEmail(Contact* c, const QByteArray& fn) {
+   void setEmail(Person* c, const QByteArray& fn) {
       c->setPreferredEmail(fn);
    }
 
-   void setOrganization(Contact* c, const QByteArray& fn) {
+   void setOrganization(Person* c, const QByteArray& fn) {
       c->setOrganization(QString::fromUtf8(fn));
    }
 
-   void setPhoto(Contact* c, const QByteArray& fn) {
+   void setPhoto(Person* c, const QByteArray& fn) {
       qDebug() << fn;
       QVariant photo = PixmapManipulationVisitor::instance()->profilePhoto(fn);
       c->setPhoto(photo);
    }
 
-   void addPhoneNumber(Contact* c, const QString& key, const QByteArray& fn) {
+   void addPhoneNumber(Person* c, const QString& key, const QByteArray& fn) {
       Q_UNUSED(c)
       Q_UNUSED(key)
       qDebug() << fn;
    }
 
-   void addAddress(Contact* c, const QString& key, const QByteArray& fn) {
-      Contact::Address* addr = new Contact::Address();
+   void addAddress(Person* c, const QString& key, const QByteArray& fn) {
+      Person::Address* addr = new Person::Address();
       QList<QByteArray> fields = fn.split(VCardUtils::Delimiter::SEPARATOR_TOKEN[0]);
 
       addr->setType        (key.split(VCardUtils::Delimiter::SEPARATOR_TOKEN)[1] );
@@ -106,7 +106,7 @@ struct VCardMapper {
       c->addAddress(addr);
    }
 
-   bool metacall(Contact* c, const QByteArray& key, const QByteArray& value) {
+   bool metacall(Person* c, const QByteArray& key, const QByteArray& value) {
       if (!m_hHash[key]) {
          if(key.contains(VCardUtils::Property::PHOTO)) {
             //key must contain additionnal attributes, we don't need them right now (ENCODING, TYPE...)
@@ -132,16 +132,16 @@ struct VCardMapper {
 };
 static VCardMapper* vc_mapper = new VCardMapper;
 
-class ProfileEditor : public CollectionEditor<Contact>
+class ProfileEditor : public CollectionEditor<Person>
 {
 public:
-   ProfileEditor(CollectionMediator<Contact>* m) : CollectionEditor<Contact>(m) {};
+   ProfileEditor(CollectionMediator<Person>* m) : CollectionEditor<Person>(m) {};
    ~ProfileEditor();
-   virtual bool save       ( const Contact* item ) override;
-   virtual bool append     ( const Contact* item ) override;
-   virtual bool remove     ( Contact*       item ) override;
-   virtual bool edit       ( Contact*       item ) override;
-   virtual bool addNew     ( Contact*       item ) override;
+   virtual bool save       ( const Person* item ) override;
+   virtual bool append     ( const Person* item ) override;
+   virtual bool remove     ( Person*       item ) override;
+   virtual bool edit       ( Person*       item ) override;
+   virtual bool addNew     ( Person*       item ) override;
 
    Node* getProfileById(const QByteArray& id);
    QList<Account*> getAccountsForProfile(const QString& id);
@@ -149,7 +149,7 @@ public:
    QHash<QByteArray,Node*> m_hProfileByAccountId;
 
 private:
-   virtual QVector<Contact*> items() const override;
+   virtual QVector<Person*> items() const override;
 };
 
 ///ProfileContentBackend: Implement a backend for Profiles
@@ -174,7 +174,7 @@ public:
    //Attributes
    bool m_needSaving;
 
-   QList<Contact*> m_bSaveBuffer;
+   QList<Person*> m_bSaveBuffer;
    bool saveAll();
 
    Node* m_pDefault;
@@ -184,9 +184,6 @@ public:
    void  setupDefaultProfile();
    void  addAccount(Node* parent, Account* acc);
 
-private:
-   ProfileModel* m_pParent;
-
 public Q_SLOTS:
    void contactChanged();
    void save();
@@ -205,11 +202,11 @@ struct Node {
    QVector<Node*>  children;
    Type            type;
    Account*        account;
-   Contact*        contact;
+   Person*        contact;
    int             m_Index;
 };
 
-bool ProfileEditor::save(const Contact* contact)
+bool ProfileEditor::save(const Person* contact)
 {
    QDir profilesDir = ProfilePersisterVisitor::instance()->getProfilesDir();
    qDebug() << "Saving vcf in:" << profilesDir.absolutePath()+"/"+contact->uid()+".vcf";
@@ -231,25 +228,25 @@ ProfileEditor::~ProfileEditor()
    }
 }
 
-bool ProfileEditor::append(const Contact* item)
+bool ProfileEditor::append(const Person* item)
 {
    Q_UNUSED(item)
    return false;
 }
 
-bool ProfileEditor::remove(Contact* item)
+bool ProfileEditor::remove(Person* item)
 {
    Q_UNUSED(item)
    return false;
 }
 
-bool ProfileEditor::edit( Contact* contact)
+bool ProfileEditor::edit( Person* contact)
 {
    qDebug() << "Attempt to edit a profile contact" << contact->uid();
    return false;
 }
 
-bool ProfileEditor::addNew( Contact* contact)
+bool ProfileEditor::addNew( Person* contact)
 {
    qDebug() << "Creating new profile" << contact->uid();
    save(contact);
@@ -257,9 +254,9 @@ bool ProfileEditor::addNew( Contact* contact)
    return true;
 }
 
-QVector<Contact*> ProfileEditor::items() const
+QVector<Person*> ProfileEditor::items() const
 {
-   return QVector<Contact*>();
+   return QVector<Person*>();
 }
 
 
@@ -268,9 +265,9 @@ ProfileModel* ProfileModel::m_spInstance = nullptr;
 
 template<typename T>
 ProfileContentBackend::ProfileContentBackend(CollectionMediator<T>* mediator) :
-  CollectionInterface(new ProfileEditor(mediator),nullptr), m_pDefault(nullptr),m_pParent(ProfileModel::instance())
+  CollectionInterface(new ProfileEditor(mediator),nullptr), m_pDefault(nullptr)
 {
-   m_pEditor = static_cast<ProfileEditor*>(editor<Contact>());
+   m_pEditor = static_cast<ProfileEditor*>(editor<Person>());
 }
 
 QString ProfileContentBackend::name () const
@@ -309,13 +306,13 @@ QByteArray  ProfileContentBackend::id() const
    return "Profile_backend";
 }
 
-// bool ProfileContentBackend::edit( Contact* contact )
+// bool ProfileContentBackend::edit( Person* contact )
 // {
 //    qDebug() << "Attempt to edit a profile contact" << contact->uid();
 //    return false;
 // }
 
-// bool ProfileContentBackend::addNew( Contact* contact )
+// bool ProfileContentBackend::addNew( Person* contact )
 // {
 //    qDebug() << "Creating new profile" << contact->uid();
 //    save(contact);
@@ -323,13 +320,13 @@ QByteArray  ProfileContentBackend::id() const
 //    return true;
 // }
 
-// bool ProfileContentBackend::remove( Contact* c )
+// bool ProfileContentBackend::remove( Person* c )
 // {
 //    Q_UNUSED(c)
 //    return false;
 // }
 
-// bool ProfileContentBackend::append(const Contact* item)
+// bool ProfileContentBackend::append(const Person* item)
 // {
 //    Q_UNUSED(item)
 //    return false;
@@ -369,7 +366,7 @@ void ProfileContentBackend::setupDefaultProfile()
 
    if (orphans.size() && (!m_pDefault)) {
       qDebug() << "No profile found, creating one";
-      Contact* profile = new Contact(this);
+      Person* profile = new Person(this);
       profile->setFormattedName(tr("Default"));
 
       m_pDefault          = new Node           ;
@@ -377,10 +374,10 @@ void ProfileContentBackend::setupDefaultProfile()
       m_pDefault->contact = profile            ;
       m_pDefault->m_Index = m_pEditor->m_lProfiles.size() ;
 
-      m_pParent->beginInsertRows(QModelIndex(), m_pEditor->m_lProfiles.size(), m_pEditor->m_lProfiles.size());
+      ProfileModel::instance()->beginInsertRows(QModelIndex(), m_pEditor->m_lProfiles.size(), m_pEditor->m_lProfiles.size());
       m_pEditor->m_lProfiles << m_pDefault;
-      m_pParent->endInsertRows();
-      ContactModel::instance()->addContact(profile);
+      ProfileModel::instance()->endInsertRows();
+      PersonModel::instance()->addPerson(profile);
    }
 
    foreach(Account* a, orphans) {
@@ -398,9 +395,9 @@ void ProfileContentBackend::addAccount(Node* parent, Account* acc)
    account_pro->account = acc;
    account_pro->m_Index = parent->children.size();
 
-   m_pParent->beginInsertRows(m_pParent->index(parent->m_Index,0), parent->children.size(), parent->children.size());
+   ProfileModel::instance()->beginInsertRows(ProfileModel::instance()->index(parent->m_Index,0), parent->children.size(), parent->children.size());
    parent->children << account_pro;
-   m_pParent->endInsertRows();
+   ProfileModel::instance()->endInsertRows();
    m_pEditor->m_hProfileByAccountId[acc->id()] = account_pro;
 }
 
@@ -426,7 +423,7 @@ bool ProfileContentBackend::load()
             continue;
          }
 
-         Contact* profile = new Contact(this);
+         Person* profile = new Person(this);
 
          Node* pro    = new Node           ;
          pro->type    = Node::Type::PROFILE;
@@ -461,12 +458,12 @@ bool ProfileContentBackend::load()
             }
          }
 
-         m_pParent->beginInsertRows(QModelIndex(), m_pEditor->m_lProfiles.size(), m_pEditor->m_lProfiles.size());
+         ProfileModel::instance()->beginInsertRows(QModelIndex(), m_pEditor->m_lProfiles.size(), m_pEditor->m_lProfiles.size());
          m_pEditor->m_lProfiles << pro;
-         m_pParent->endInsertRows();
+         ProfileModel::instance()->endInsertRows();
 
          connect(profile, SIGNAL(changed()), this, SLOT(contactChanged()));
-         ContactModel::instance()->addContact(profile);
+         PersonModel::instance()->addPerson(profile);
       }
 
       //Ring need a profile for all account
@@ -484,7 +481,7 @@ bool ProfileContentBackend::reload()
    return false;
 }
 
-// bool ProfileContentBackend::save(const Contact* contact)
+// bool ProfileContentBackend::save(const Person* contact)
 // {
 //    QDir profilesDir = ProfilePersisterVisitor::instance()->getProfilesDir();
 //    qDebug() << "Saving vcf in:" << profilesDir.absolutePath()+"/"+contact->uid()+".vcf";
@@ -500,7 +497,7 @@ bool ProfileContentBackend::reload()
 bool ProfileContentBackend::saveAll()
 {
    for(Node* pro : m_pEditor->m_lProfiles) {
-      editor<Contact>()->save(pro->contact);
+      editor<Person>()->save(pro->contact);
    }
    return true;
 }
@@ -518,16 +515,16 @@ ProfileContentBackend::SupportedFeatures ProfileContentBackend::supportedFeature
       //TODO ^^ Remove that one once debugging is done
 }
 
-// bool ProfileContentBackend::addPhoneNumber( Contact* contact , PhoneNumber* number)
+// bool ProfileContentBackend::addPhoneNumber( Person* contact , PhoneNumber* number)
 // {
 //    Q_UNUSED(contact)
 //    Q_UNUSED(number)
 //    return false;
 // }
 
-// QList<Contact*> ProfileContentBackend::items() const
+// QList<Person*> ProfileContentBackend::items() const
 // {
-//    QList<Contact*> contacts;
+//    QList<Person*> contacts;
 //    for (int var = 0; var < m_pEditor->m_lProfiles.size(); ++var) {
 //       contacts << m_pEditor->m_lProfiles[var]->contact;
 //    }
@@ -558,7 +555,7 @@ Node* ProfileEditor::getProfileById(const QByteArray& id)
 
 void ProfileContentBackend::contactChanged()
 {
-   Contact* c = qobject_cast<Contact*>(sender());
+   Person* c = qobject_cast<Person*>(sender());
    qDebug() << c->formattedName();
    qDebug() << "contactChanged!";
 
@@ -572,9 +569,9 @@ void ProfileContentBackend::contactChanged()
 
 void ProfileContentBackend::save()
 {
-   for (Contact* item : m_bSaveBuffer) {
+   for (Person* item : m_bSaveBuffer) {
       qDebug() << "saving:" << item->formattedName();
-      editor<Contact>()->save(item);
+      editor<Person>()->save(item);
    }
 
    m_bSaveBuffer.clear();
@@ -627,7 +624,7 @@ ProfileModel::ProfileModel(QObject* parent) : QAbstractItemModel(parent), d_ptr(
    d_ptr->m_lMimes << RingMimes::PLAIN_TEXT << RingMimes::HTML_TEXT << RingMimes::ACCOUNT << RingMimes::PROFILE;
 
    //Creating the profile contact backend
-   d_ptr->m_pProfileBackend = static_cast<ProfileContentBackend*>(ContactModel::instance()->addBackend<ProfileContentBackend>(LoadOptions::FORCE_ENABLED));
+   d_ptr->m_pProfileBackend = static_cast<ProfileContentBackend*>(PersonModel::instance()->addBackend<ProfileContentBackend>(LoadOptions::FORCE_ENABLED));
 
    //Once LibRingClient is ready, start listening
    QTimer::singleShot(0,d_ptr,SLOT(slotDelayedInit()));
@@ -681,7 +678,7 @@ QVariant ProfileModel::data(const QModelIndex& index, int role ) const
    else {
       switch (role) {
          case Qt::DisplayRole:
-            return d_ptr->m_pProfileBackend->items<Contact>()[index.row()]->formattedName();
+            return d_ptr->m_pProfileBackend->items<Person>()[index.row()]->formattedName();
       };
    }
    return QVariant();
@@ -693,7 +690,7 @@ int ProfileModel::rowCount(const QModelIndex& parent ) const
       Node* account_node = static_cast<Node*>(parent.internalPointer());
       return (account_node->account)?0:account_node->children.size();
    }
-   return d_ptr->m_pProfileBackend->items<Contact>().size();
+   return d_ptr->m_pProfileBackend->items<Person>().size();
 }
 
 int ProfileModel::columnCount(const QModelIndex& parent ) const
@@ -894,7 +891,7 @@ QVariant ProfileModel::headerData(int section, Qt::Orientation orientation, int
    return QVariant();
 }
 
-// bool ProfileModel::addNewProfile(Contact* c, CollectionInterface* backend)
+// bool ProfileModel::addNewProfile(Person* c, CollectionInterface* backend)
 // {
 //    Q_UNUSED(backend);
 //    return d_ptr->m_pProfileBackend->addNew(c);
diff --git a/src/profilemodel.h b/src/profilemodel.h
index 09f22658ab392011f9bf067c7a2f01ee33a6edd4..48fbc1ab47e3609e1f8112e8e232200c8686ce81 100644
--- a/src/profilemodel.h
+++ b/src/profilemodel.h
@@ -19,7 +19,7 @@
 #define PROFILEMODEL_H
 
 #include "typedefs.h"
-#include "contact.h"
+#include "person.h"
 #include "account.h"
 #include <QStringList>
 #include <QSharedPointer>
@@ -66,7 +66,7 @@ private:
    static ProfileModel* m_spInstance;
 
 public Q_SLOTS:
-//    bool addNewProfile(Contact* c, CollectionInterface* backend = nullptr);
+//    bool addNewProfile(Person* c, CollectionInterface* backend = nullptr);
 //    bool createProfile(const QString& name);
 };
 
diff --git a/src/transitionalcontactbackend.cpp b/src/transitionalpersonbackend.cpp
similarity index 50%
rename from src/transitionalcontactbackend.cpp
rename to src/transitionalpersonbackend.cpp
index 21effa062db61b5303529d3bc6fa1915e6a731dd..7f540eb215628d3ff9ae1077b6eb27243c412630 100644
--- a/src/transitionalcontactbackend.cpp
+++ b/src/transitionalpersonbackend.cpp
@@ -15,152 +15,152 @@
  *   You should have received a copy of the GNU General Public License      *
  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
  ***************************************************************************/
-#include "transitionalcontactbackend.h"
-#include <contactmodel.h>
+#include "transitionalpersonbackend.h"
+#include <personmodel.h>
 
 #include <collectioneditor.h>
 
-class TransitionalContactBackendPrivate
+class TransitionalPersonBackendPrivate
 {
 
 };
 
-class TransitionalContactEditor : public CollectionEditor<Contact>
+class TransitionalPersonEditor : public CollectionEditor<Person>
 {
 public:
-   TransitionalContactEditor(CollectionMediator<Contact>* m) : CollectionEditor<Contact>(m) {}
-   virtual bool save       ( const Contact* item ) override;
-   virtual bool append     ( const Contact* item ) override;
-   virtual bool remove     ( Contact*       item ) override;
-   virtual bool edit       ( Contact*       item ) override;
-   virtual bool addNew     ( Contact*       item ) override;
+   TransitionalPersonEditor(CollectionMediator<Person>* m) : CollectionEditor<Person>(m) {}
+   virtual bool save       ( const Person* item ) override;
+   virtual bool append     ( const Person* item ) override;
+   virtual bool remove     ( Person*       item ) override;
+   virtual bool edit       ( Person*       item ) override;
+   virtual bool addNew     ( Person*       item ) override;
 
 private:
-   virtual QVector<Contact*> items() const override;
+   virtual QVector<Person*> items() const override;
 };
 
-bool TransitionalContactEditor::save(const Contact* item)
+bool TransitionalPersonEditor::save(const Person* item)
 {
    Q_UNUSED(item)
    return false;
 }
 
-bool TransitionalContactEditor::append(const Contact* item)
+bool TransitionalPersonEditor::append(const Person* item)
 {
    Q_UNUSED(item)
    return false;
 }
 
-bool TransitionalContactEditor::remove(Contact* item)
+bool TransitionalPersonEditor::remove(Person* item)
 {
    Q_UNUSED(item)
    return false;
 }
 
-bool TransitionalContactEditor::edit( Contact* item)
+bool TransitionalPersonEditor::edit( Person* item)
 {
    Q_UNUSED(item)
    return false;
 }
 
-bool TransitionalContactEditor::addNew( Contact* item)
+bool TransitionalPersonEditor::addNew( Person* item)
 {
    Q_UNUSED(item)
    return false;
 }
 
-QVector<Contact*> TransitionalContactEditor::items() const
+QVector<Person*> TransitionalPersonEditor::items() const
 {
-   return QVector<Contact*>();
+   return QVector<Person*>();
 }
 
-CollectionInterface* TransitionalContactBackend::m_spInstance = nullptr;
+CollectionInterface* TransitionalPersonBackend::m_spInstance = nullptr;
 
-CollectionInterface* TransitionalContactBackend::instance()
+CollectionInterface* TransitionalPersonBackend::instance()
 {
    if (!m_spInstance) {
-      m_spInstance = ContactModel::instance()->addBackend<TransitionalContactBackend>();
+      m_spInstance = PersonModel::instance()->addBackend<TransitionalPersonBackend>();
    }
    return m_spInstance;
 }
 
-TransitionalContactBackend::~TransitionalContactBackend()
+TransitionalPersonBackend::~TransitionalPersonBackend()
 {
 }
 
 template<typename T>
-TransitionalContactBackend::TransitionalContactBackend(CollectionMediator<T>* mediator) :
-CollectionInterface(new TransitionalContactEditor(mediator), nullptr)
+TransitionalPersonBackend::TransitionalPersonBackend(CollectionMediator<T>* mediator) :
+CollectionInterface(new TransitionalPersonEditor(mediator), nullptr)
 {
 }
 
-bool TransitionalContactBackend::load()
+bool TransitionalPersonBackend::load()
 {
    return false;
 }
 
-bool TransitionalContactBackend::reload()
+bool TransitionalPersonBackend::reload()
 {
    return false;
 }
 
-// bool TransitionalContactBackend::append(const Contact* item)
+// bool TransitionalPersonBackend::append(const Person* item)
 // {
 //    Q_UNUSED(item)
 //    return false;
 // }
 
-// bool TransitionalContactBackend::save(const Contact* contact)
+// bool TransitionalPersonBackend::save(const Person* contact)
 // {
 //    Q_UNUSED(contact)
 //    return false;
 // }
 
 ///Edit 'contact', the implementation may be a GUI or somehting else
-// bool TransitionalContactBackend::edit( Contact* contact)
+// bool TransitionalPersonBackend::edit( Person* contact)
 // {
 //    Q_UNUSED(contact)
 //    return false;
 // }
 
 ///Add a new contact to the backend
-// bool TransitionalContactBackend::addNew( Contact* contact)
+// bool TransitionalPersonBackend::addNew( Person* contact)
 // {
 //    Q_UNUSED(contact)
 //    return false;
 // }
 
-bool TransitionalContactBackend::isEnabled() const
+bool TransitionalPersonBackend::isEnabled() const
 {
    return false;
 }
 
-CollectionInterface::SupportedFeatures TransitionalContactBackend::supportedFeatures() const
+CollectionInterface::SupportedFeatures TransitionalPersonBackend::supportedFeatures() const
 {
    return CollectionInterface::SupportedFeatures::NONE;
 }
 
-QString TransitionalContactBackend::name () const
+QString TransitionalPersonBackend::name () const
 {
    return QObject::tr("Transitional contact backend");
 }
 
-QString TransitionalContactBackend::category () const
+QString TransitionalPersonBackend::category () const
 {
    return QObject::tr("Contact");
 }
 
-QVariant TransitionalContactBackend::icon() const
+QVariant TransitionalPersonBackend::icon() const
 {
    return QVariant();
 }
 
-QByteArray TransitionalContactBackend::id() const
+QByteArray TransitionalPersonBackend::id() const
 {
    return  "trcb";
 }
 
-// QList<Contact*> TransitionalContactBackend::items() const
+// QList<Person*> TransitionalPersonBackend::items() const
 // {
-//    return QList<Contact*>();
+//    return QList<Person*>();
 // }
diff --git a/src/transitionalcontactbackend.h b/src/transitionalpersonbackend.h
similarity index 90%
rename from src/transitionalcontactbackend.h
rename to src/transitionalpersonbackend.h
index 46d9e856c025469b428ad2edb6ae858f63193251..3f854011526679c1a75e0e513d6a8455166f2bc6 100644
--- a/src/transitionalcontactbackend.h
+++ b/src/transitionalpersonbackend.h
@@ -22,7 +22,7 @@
 
 #include "typedefs.h"
 
-class TransitionalContactBackendPrivate;
+class TransitionalPersonBackendPrivate;
 
 /**
  * A temporary contact backend until concrete ones are loaded
@@ -41,13 +41,13 @@ class TransitionalContactBackendPrivate;
  * be used when contacts are created locally, but a "real" backend have
  * yet to be selected.
  */
-class LIB_EXPORT TransitionalContactBackend : public CollectionInterface {
+class LIB_EXPORT TransitionalPersonBackend : public CollectionInterface {
 public:
    template<typename T>
-   explicit TransitionalContactBackend(CollectionMediator<T>* mediator);
+   explicit TransitionalPersonBackend(CollectionMediator<T>* mediator);
    static CollectionInterface* m_spInstance;
 
-   virtual ~TransitionalContactBackend();
+   virtual ~TransitionalPersonBackend();
 
    //Getters
    virtual QByteArray      id       () const override;
@@ -66,7 +66,7 @@ public:
 
 private:
 
-   const QScopedPointer<TransitionalContactBackendPrivate> d_ptr;
+   const QScopedPointer<TransitionalPersonBackendPrivate> d_ptr;
 };
 
 #endif
diff --git a/src/vcardutils.cpp b/src/vcardutils.cpp
index a45b0759eb9036c92652a65d35ecf020a3c0ded0..a1c8743c6efdf73aaddd7222cd64eba7ffb8e5dc 100644
--- a/src/vcardutils.cpp
+++ b/src/vcardutils.cpp
@@ -66,7 +66,7 @@ void VCardUtils::addEmail(const QString& type, const QString& email)
    addProperty(QString("%1%2%3%4").arg(Property::EMAIL).arg(Delimiter::SEPARATOR_TOKEN).arg("TYPE=").arg(type), email);
 }
 
-void VCardUtils::addAddress(const Contact::Address* addr)
+void VCardUtils::addAddress(const Person::Address* addr)
 {
    QString prop = QString("%1%2%3").arg(Property::ADDRESS)
          .arg(Delimiter::SEPARATOR_TOKEN)
diff --git a/src/vcardutils.h b/src/vcardutils.h
index 52d1b32236eed57604722e5926a0d840f373f136..0612eef51d34b9d242cadaee0e1bfeba2960147a 100644
--- a/src/vcardutils.h
+++ b/src/vcardutils.h
@@ -21,7 +21,7 @@
 
 #include "typedefs.h"
 #include <QStringList>
-#include "contact.h"
+#include "person.h"
 
 class LIB_EXPORT VCardUtils
 {
@@ -73,7 +73,7 @@ public:
    void addProperty(const char* prop, const QString& value);
    void addProperty(const QString& prop, const QString& value);
    void addEmail(const QString& type, const QString& num);
-   void addAddress(const Contact::Address* addr);
+   void addAddress(const Person::Address* addr);
    void addPhoneNumber(const QString& type, const QString& num);
    void addPhoto(const QByteArray img);
    const QByteArray endVCard();
diff --git a/src/visitors/phonenumberselector.h b/src/visitors/phonenumberselector.h
index a580c45aef943ab3d75698d1785106c6c3cbdc48..a9d5e4bc3eeb4abc985fce9419f26e2b00ee6b8a 100644
--- a/src/visitors/phonenumberselector.h
+++ b/src/visitors/phonenumberselector.h
@@ -20,16 +20,16 @@
 #define PHONENUMBERSELECTOR_H
 
 #include "../typedefs.h"
-#include "../contact.h"
+#include "../person.h"
 
 class PhoneNumber;
-class Contact;
+class Person;
 
 ///Common point visitor for UI specific contact dialog
 class LIB_EXPORT PhoneNumberSelector {
 public:
    virtual ~PhoneNumberSelector() {}
-   virtual PhoneNumber* getNumber(const Contact* nb) = 0;
+   virtual PhoneNumber* getNumber(const Person* nb) = 0;
    static PhoneNumberSelector* defaultVisitor();
 protected:
    static void setDefaultVisitor(PhoneNumberSelector* v);
diff --git a/src/visitors/pixmapmanipulationvisitor.cpp b/src/visitors/pixmapmanipulationvisitor.cpp
index 879d1ce1a10246dd76ccb4389537e88a612887a5..98f64976fb69c89f32032f3da149f423466efae2 100644
--- a/src/visitors/pixmapmanipulationvisitor.cpp
+++ b/src/visitors/pixmapmanipulationvisitor.cpp
@@ -25,7 +25,7 @@ PixmapManipulationVisitor::PixmapManipulationVisitor() {
    m_spInstance = this;
 }
 
-QVariant PixmapManipulationVisitor::contactPhoto(Contact* c, const QSize& size, bool displayPresence)
+QVariant PixmapManipulationVisitor::contactPhoto(Person* c, const QSize& size, bool displayPresence)
 {
    Q_UNUSED(c)
    Q_UNUSED(size)
diff --git a/src/visitors/pixmapmanipulationvisitor.h b/src/visitors/pixmapmanipulationvisitor.h
index 5cb67e16164125694071f4b7e91916a70cda0849..968bf422ed9a0f328863bfbbeaeee8334fd54ae9 100644
--- a/src/visitors/pixmapmanipulationvisitor.h
+++ b/src/visitors/pixmapmanipulationvisitor.h
@@ -24,7 +24,7 @@
 #include <QtCore/QModelIndex>
 
 //Ring
-class Contact    ;
+class Person    ;
 class PhoneNumber;
 class Call       ;
 
@@ -42,7 +42,7 @@ class LIB_EXPORT PixmapManipulationVisitor {
 public:
    PixmapManipulationVisitor();
    virtual ~PixmapManipulationVisitor() {}
-   virtual QVariant contactPhoto(Contact* c, const QSize& size, bool displayPresence = true);
+   virtual QVariant contactPhoto(Person* c, const QSize& size, bool displayPresence = true);
    virtual QVariant callPhoto(Call* c, const QSize& size, bool displayPresence = true);
    virtual QVariant callPhoto(const PhoneNumber* n, const QSize& size, bool displayPresence = true);
    virtual QVariant numberCategoryIcon(const QVariant& p, const QSize& size, bool displayPresence = false, bool isPresent = false);
diff --git a/src/visitors/profilepersistervisitor.cpp b/src/visitors/profilepersistervisitor.cpp
index 6221b13beccbbc3bcceee52b922a43445b222479..1fc9c18c57d9b727959546717ecc2667fa4d3b1e 100644
--- a/src/visitors/profilepersistervisitor.cpp
+++ b/src/visitors/profilepersistervisitor.cpp
@@ -36,7 +36,7 @@ bool ProfilePersisterVisitor::load()
    return false;
 }
 
-bool ProfilePersisterVisitor::save(const Contact* c)
+bool ProfilePersisterVisitor::save(const Person* c)
 {
    Q_UNUSED(c)
    return false;
diff --git a/src/visitors/profilepersistervisitor.h b/src/visitors/profilepersistervisitor.h
index 6d38d9af10dc6fe65e26411dff784588f455387e..e95258317a7f30e25a5750bdc7d0e75892181227 100644
--- a/src/visitors/profilepersistervisitor.h
+++ b/src/visitors/profilepersistervisitor.h
@@ -27,13 +27,13 @@
 #include <QDir>
 
 //SFLPhone
-class Contact;
+class Person;
 
 class LIB_EXPORT ProfilePersisterVisitor {
 public:
    virtual ~ProfilePersisterVisitor() {}
    virtual bool load();
-   virtual bool save(const Contact* c);
+   virtual bool save(const Person* c);
    virtual QDir getProfilesDir();
 
    //Singleton