diff --git a/src/numbercompletionmodel.cpp b/src/numbercompletionmodel.cpp
index c93e1fdd899dfaa34b85f34fc3c6592e15573f7f..abea729380b79ec764fd21446e25301779fad814 100644
--- a/src/numbercompletionmodel.cpp
+++ b/src/numbercompletionmodel.cpp
@@ -36,29 +36,68 @@
 //Private
 #include "private/phonedirectorymodel_p.h"
 
-NumberCompletionModel::NumberCompletionModel() : QAbstractTableModel(QCoreApplication::instance()),
-   m_pCall(nullptr),m_Enabled(false),m_UseUnregisteredAccount(true)
+class NumberCompletionModelPrivate : public QObject
+{
+public:
+
+   enum class Columns {
+      CONTENT = 0,
+      NAME    = 1,
+      ACCOUNT = 2,
+      WEIGHT  = 3,
+   };
+
+   //Constructor
+   NumberCompletionModelPrivate(NumberCompletionModel* parent);
+
+   //Methods
+   void updateModel();
+
+   //Helper
+   void locateNameRange  (const QString& prefix, QSet<PhoneNumber*>& set);
+   void locateNumberRange(const QString& prefix, QSet<PhoneNumber*>& set);
+   uint getWeight(PhoneNumber* number);
+   void getRange(QMap<QString,NumberWrapper*> map, const QString& prefix, QSet<PhoneNumber*>& set) const;
+
+   //Attributes
+   QMultiMap<int,PhoneNumber*> m_hNumbers              ;
+   QString                     m_Prefix                ;
+   Call*                       m_pCall                 ;
+   bool                        m_Enabled               ;
+   bool                        m_UseUnregisteredAccount;
+
+private:
+   NumberCompletionModel* q_ptr;
+};
+
+
+NumberCompletionModelPrivate::NumberCompletionModelPrivate(NumberCompletionModel* parent) : QObject(parent), q_ptr(parent),
+m_pCall(nullptr),m_Enabled(false),m_UseUnregisteredAccount(true)
+{
+}
+
+NumberCompletionModel::NumberCompletionModel() : QAbstractTableModel(QCoreApplication::instance()), d_ptr(new NumberCompletionModelPrivate(this))
 {
    setObjectName("NumberCompletionModel");
 }
 
 NumberCompletionModel::~NumberCompletionModel()
 {
-   
+
 }
 
 QVariant NumberCompletionModel::data(const QModelIndex& index, int role ) const
 {
    if (!index.isValid()) return QVariant();
-   const QMap<int,PhoneNumber*>::iterator i = const_cast<NumberCompletionModel*>(this)->m_hNumbers.end()-1-index.row();
+   const QMap<int,PhoneNumber*>::iterator i = d_ptr->m_hNumbers.end()-1-index.row();
    const PhoneNumber* n = i.value();
    const int weight     = i.key  ();
 
    bool needAcc = (role>=100 || role == Qt::UserRole) && n->account() && n->account() != AccountModel::instance()->currentAccount()
                   && n->account()->alias() != Account::ProtocolName::IP2IP;
 
-   switch (static_cast<NumberCompletionModel::Columns>(index.column())) {
-      case NumberCompletionModel::Columns::CONTENT:
+   switch (static_cast<NumberCompletionModelPrivate::Columns>(index.column())) {
+      case NumberCompletionModelPrivate::Columns::CONTENT:
          switch (role) {
             case Qt::DisplayRole:
                return n->uri();
@@ -83,19 +122,19 @@ QVariant NumberCompletionModel::data(const QModelIndex& index, int role ) const
                break;
          };
          break;
-      case NumberCompletionModel::Columns::NAME:
+      case NumberCompletionModelPrivate::Columns::NAME:
          switch (role) {
             case Qt::DisplayRole:
                return n->primaryName();
          };
          break;
-      case NumberCompletionModel::Columns::ACCOUNT:
+      case NumberCompletionModelPrivate::Columns::ACCOUNT:
          switch (role) {
             case Qt::DisplayRole:
                return n->account()?n->account()->id():AccountModel::instance()->currentAccount()->id();
          };
          break;
-      case NumberCompletionModel::Columns::WEIGHT:
+      case NumberCompletionModelPrivate::Columns::WEIGHT:
          switch (role) {
             case Qt::DisplayRole:
                return weight;
@@ -109,7 +148,7 @@ int NumberCompletionModel::rowCount(const QModelIndex& parent ) const
 {
    if (parent.isValid())
       return 0;
-   return m_hNumbers.size();
+   return d_ptr->m_hNumbers.size();
 }
 
 int NumberCompletionModel::columnCount(const QModelIndex& parent ) const
@@ -145,47 +184,47 @@ bool NumberCompletionModel::setData(const QModelIndex& index, const QVariant &va
 //Set the current call
 void NumberCompletionModel::setCall(Call* call)
 {
-   if (m_pCall)
-      disconnect(m_pCall,SIGNAL(dialNumberChanged(QString)),this,SLOT(setPrefix(QString)));
-   m_pCall = call;
-   if (m_pCall)
-      connect(m_pCall,SIGNAL(dialNumberChanged(QString)),this,SLOT(setPrefix(QString)));
+   if (d_ptr->m_pCall)
+      disconnect(d_ptr->m_pCall,SIGNAL(dialNumberChanged(QString)),this,SLOT(setPrefix(QString)));
+   d_ptr->m_pCall = call;
+   if (d_ptr->m_pCall)
+      connect(d_ptr->m_pCall,SIGNAL(dialNumberChanged(QString)),this,SLOT(setPrefix(QString)));
    setPrefix(call?call->dialNumber():QString());
 }
 
 void NumberCompletionModel::setPrefix(const QString& str)
 {
-   m_Prefix = str;
-   const bool e = ((m_pCall && m_pCall->state() == Call::State::DIALING) || (!m_pCall)) && (!str.isEmpty());
-   if (m_Enabled != e) {
-      m_Enabled = e;
+   d_ptr->m_Prefix = str;
+   const bool e = ((d_ptr->m_pCall && d_ptr->m_pCall->state() == Call::State::DIALING) || (!d_ptr->m_pCall)) && (!str.isEmpty());
+   if (d_ptr->m_Enabled != e) {
+      d_ptr->m_Enabled = e;
       emit enabled(e);
    }
-   if (m_Enabled)
-      updateModel();
+   if (d_ptr->m_Enabled)
+      d_ptr->updateModel();
    else {
-      m_hNumbers.clear();
+      d_ptr->m_hNumbers.clear();
       emit layoutChanged();
    }
 }
 
 Call* NumberCompletionModel::call() const
 {
-   return m_pCall;
+   return d_ptr->m_pCall;
 }
 
 PhoneNumber* NumberCompletionModel::number(const QModelIndex& idx) const
 {
    if (idx.isValid()) {
-      return (const_cast<NumberCompletionModel*>(this)->m_hNumbers.end()-1-idx.row()).value();
+      return (d_ptr->m_hNumbers.end()-1-idx.row()).value();
    }
    return nullptr;
 }
 
-void NumberCompletionModel::updateModel()
+void NumberCompletionModelPrivate::updateModel()
 {
    QSet<PhoneNumber*> numbers;
-   beginResetModel();
+   q_ptr->beginResetModel();
    m_hNumbers.clear();
    if (!m_Prefix.isEmpty()) {
       locateNameRange  ( m_Prefix, numbers );
@@ -196,11 +235,11 @@ void NumberCompletionModel::updateModel()
             m_hNumbers.insert(getWeight(n),n);
       }
    }
-   endResetModel();
-   emit layoutChanged();
+   q_ptr->endResetModel();
+   emit q_ptr->layoutChanged();
 }
 
-void NumberCompletionModel::getRange(QMap<QString,NumberWrapper*> map, const QString& prefix, QSet<PhoneNumber*>& set) const
+void NumberCompletionModelPrivate::getRange(QMap<QString,NumberWrapper*> map, const QString& prefix, QSet<PhoneNumber*>& set) const
 {
    if (prefix.isEmpty())
       return;
@@ -265,17 +304,17 @@ void NumberCompletionModel::getRange(QMap<QString,NumberWrapper*> map, const QSt
    }
 }
 
-void NumberCompletionModel::locateNameRange(const QString& prefix, QSet<PhoneNumber*>& set)
+void NumberCompletionModelPrivate::locateNameRange(const QString& prefix, QSet<PhoneNumber*>& set)
 {
    getRange(PhoneDirectoryModel::instance()->d_ptr->m_lSortedNames,prefix,set);
 }
 
-void NumberCompletionModel::locateNumberRange(const QString& prefix, QSet<PhoneNumber*>& set)
+void NumberCompletionModelPrivate::locateNumberRange(const QString& prefix, QSet<PhoneNumber*>& set)
 {
    getRange(PhoneDirectoryModel::instance()->d_ptr->m_hSortedNumbers,prefix,set);
 }
 
-uint NumberCompletionModel::getWeight(PhoneNumber* number)
+uint NumberCompletionModelPrivate::getWeight(PhoneNumber* number)
 {
    Q_UNUSED(number)
    uint weight = 1;
@@ -289,15 +328,18 @@ uint NumberCompletionModel::getWeight(PhoneNumber* number)
 
 QString NumberCompletionModel::prefix() const
 {
-   return m_Prefix;
+   return d_ptr->m_Prefix;
 }
 
 void NumberCompletionModel::setUseUnregisteredAccounts(bool value)
 {
-   m_UseUnregisteredAccount = value;
+   d_ptr->m_UseUnregisteredAccount = value;
 }
 
 bool NumberCompletionModel::isUsingUnregisteredAccounts()
 {
-   return m_UseUnregisteredAccount;
+   return d_ptr->m_UseUnregisteredAccount;
 }
+
+#include <numbercompletionmodel.moc>
+
diff --git a/src/numbercompletionmodel.h b/src/numbercompletionmodel.h
index 3b7b6d855d0134e4eb5b8536baea7be2ed4b8ed4..e223c534db45f73712966647e2d9ef6c3277d54c 100644
--- a/src/numbercompletionmodel.h
+++ b/src/numbercompletionmodel.h
@@ -22,12 +22,12 @@
 #include "typedefs.h"
 #include "phonedirectorymodel.h"
 
-
+//SFLPhone
 class PhoneNumber;
 class Call;
 
-//TODO remove
-class NumberWrapper;
+//Private
+class NumberCompletionModelPrivate;
 
 class LIB_EXPORT NumberCompletionModel : public QAbstractTableModel {
    Q_OBJECT
@@ -47,12 +47,12 @@ public:
    virtual ~NumberCompletionModel();
 
    //Abstract model member
-   QVariant data(const QModelIndex& index, int role = Qt::DisplayRole ) const;
-   int rowCount(const QModelIndex& parent = QModelIndex()             ) const;
-   Qt::ItemFlags flags(const QModelIndex& index                       ) const;
-   virtual bool setData(const QModelIndex& index, const QVariant &value, int role);
-   virtual int columnCount(const QModelIndex& parent = QModelIndex()  ) const;
-   virtual QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
+   virtual QVariant      data       ( const QModelIndex& index, int role = Qt::DisplayRole                 ) const override;
+   virtual int           rowCount   ( const QModelIndex& parent = QModelIndex()                            ) const override;
+   virtual Qt::ItemFlags flags      ( const QModelIndex& index                                             ) const override;
+   virtual bool          setData    ( const QModelIndex& index, const QVariant &value, int role            )       override;
+   virtual int           columnCount( const QModelIndex& parent = QModelIndex()                            ) const override;
+   virtual QVariant      headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
 
    //Setters
    void setCall(Call* call);
@@ -64,32 +64,9 @@ public:
    bool isUsingUnregisteredAccounts();
    QString prefix() const;
 
-protected:
-   //Helper
-   void getRange(QMap<QString,NumberWrapper*> map, const QString& prefix, QSet<PhoneNumber*>& set) const;
-
 private:
-   enum class Columns {
-      CONTENT = 0,
-      NAME    = 1,
-      ACCOUNT = 2,
-      WEIGHT  = 3,
-   };
-
-   //Methods
-   void updateModel();
-
-   //Helper
-   void locateNameRange  (const QString& prefix, QSet<PhoneNumber*>& set);
-   void locateNumberRange(const QString& prefix, QSet<PhoneNumber*>& set);
-   uint getWeight(PhoneNumber* number);
-
-   //Attributes
-   QMultiMap<int,PhoneNumber*> m_hNumbers              ;
-   QString                     m_Prefix                ;
-   Call*                       m_pCall                 ;
-   bool                        m_Enabled               ;
-   bool                        m_UseUnregisteredAccount;
+   QScopedPointer<NumberCompletionModelPrivate> d_ptr;
+   Q_DECLARE_PRIVATE(NumberCompletionModel)
 
 
 public Q_SLOTS:
diff --git a/src/phonedirectorymodel.h b/src/phonedirectorymodel.h
index 3b62768ef0e7b119c771c0567df1db136260b9d5..3f1240cc1d1acf0167f5505451832fd241c5f95b 100644
--- a/src/phonedirectorymodel.h
+++ b/src/phonedirectorymodel.h
@@ -39,12 +39,13 @@ class LIB_EXPORT PhoneDirectoryModel : public QAbstractTableModel {
 
    //NumberCompletionModel need direct access to the indexes
    friend class NumberCompletionModel;
+   friend class NumberCompletionModelPrivate;
 
    //Friend unit test class
    friend class AutoCompletionTest;
 
    //Phone number need to update the indexes as they change
-   friend class PhoneNumber          ;
+   friend class PhoneNumber;
 
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"