diff --git a/src/audio/alsapluginmodel.cpp b/src/audio/alsapluginmodel.cpp
index cb3f81a5802edd4a85aa1c1517569880f5dd6f24..405e48fa7e266b1989cf117174deef7a4e47113b 100644
--- a/src/audio/alsapluginmodel.cpp
+++ b/src/audio/alsapluginmodel.cpp
@@ -20,11 +20,28 @@
 //SFLPhone
 #include "dbus/configurationmanager.h"
 
+class AlsaPluginModelPrivate : public QObject
+{
+   Q_OBJECT
+public:
+   AlsaPluginModelPrivate(Audio::AlsaPluginModel* parent);
+   QStringList m_lDeviceList;
+
+private:
+   Audio::AlsaPluginModel* q_ptr;
+};
+
+AlsaPluginModelPrivate::AlsaPluginModelPrivate(Audio::AlsaPluginModel* parent) : q_ptr(parent)
+{
+   
+}
+
 ///Constructor
-Audio::AlsaPluginModel::AlsaPluginModel(const QObject* parent) : QAbstractListModel(const_cast<QObject*>(parent))
+Audio::AlsaPluginModel::AlsaPluginModel(const QObject* parent) : QAbstractListModel(const_cast<QObject*>(parent)),
+d_ptr(new AlsaPluginModelPrivate(this))
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   m_lDeviceList = configurationManager.getAudioPluginList();
+   d_ptr->m_lDeviceList = configurationManager.getAudioPluginList();
 }
 
 ///Destructor
@@ -40,7 +57,7 @@ QVariant Audio::AlsaPluginModel::data( const QModelIndex& index, int role) const
       return QVariant();
    switch(role) {
       case Qt::DisplayRole:
-         return m_lDeviceList[index.row()];
+         return d_ptr->m_lDeviceList[index.row()];
    };
    return QVariant();
 }
@@ -50,7 +67,7 @@ int Audio::AlsaPluginModel::rowCount( const QModelIndex& parent ) const
 {
    if (parent.isValid())
       return 0;
-   return m_lDeviceList.size();
+   return d_ptr->m_lDeviceList.size();
 }
 
 ///Re-implement QAbstractListModel flags
@@ -73,7 +90,7 @@ bool Audio::AlsaPluginModel::setData( const QModelIndex& index, const QVariant &
 QModelIndex Audio::AlsaPluginModel::currentPlugin() const
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   const int idx = m_lDeviceList.indexOf(configurationManager.getCurrentAudioOutputPlugin());
+   const int idx = d_ptr->m_lDeviceList.indexOf(configurationManager.getCurrentAudioOutputPlugin());
    qDebug() << "Invalid current audio plugin";
    if (idx == -1)
       return QModelIndex();
@@ -87,7 +104,7 @@ void Audio::AlsaPluginModel::setCurrentPlugin(const QModelIndex& idx)
    if (!idx.isValid())
       return;
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   configurationManager.setAudioPlugin(m_lDeviceList[idx.row()]);
+   configurationManager.setAudioPlugin(d_ptr->m_lDeviceList[idx.row()]);
 }
 
 ///Set the current index (qcombobox compatibility shim)
@@ -100,7 +117,9 @@ void Audio::AlsaPluginModel::setCurrentPlugin(int idx)
 void Audio::AlsaPluginModel::reload()
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   m_lDeviceList = configurationManager.getAudioPluginList();
+   d_ptr->m_lDeviceList = configurationManager.getAudioPluginList();
    emit layoutChanged();
-   emit dataChanged(index(0,0),index(m_lDeviceList.size()-1,0));
-}
\ No newline at end of file
+   emit dataChanged(index(0,0),index(d_ptr->m_lDeviceList.size()-1,0));
+}
+
+#include <alsapluginmodel.moc>
diff --git a/src/audio/alsapluginmodel.h b/src/audio/alsapluginmodel.h
index ee82dd6b199c4605523f9f0de46989aad2130010..d5317595a8c512937c1096dc82cc5f41a2621a9c 100644
--- a/src/audio/alsapluginmodel.h
+++ b/src/audio/alsapluginmodel.h
@@ -26,9 +26,11 @@
 //SFLPhone
 #include "../typedefs.h"
 
+class AlsaPluginModelPrivate;
+
 namespace Audio {
 
-class LIB_EXPORT AlsaPluginModel    : public QAbstractListModel {
+class LIB_EXPORT AlsaPluginModel : public QAbstractListModel {
    Q_OBJECT
 public:
    explicit AlsaPluginModel(const QObject* parent);
@@ -51,7 +53,8 @@ public:
    void reload();
 
 private:
-   QStringList m_lDeviceList;
+   QScopedPointer<AlsaPluginModelPrivate> d_ptr;
+   Q_DECLARE_PRIVATE(AlsaPluginModel)
 };
 
 }
diff --git a/src/audio/codecmodel.cpp b/src/audio/codecmodel.cpp
index 7a51ddbeb14ce44a03a08668abe7d28fec78de7c..e1a3db25f5e4155580e5d1bbff7d22ed1a003026 100644
--- a/src/audio/codecmodel.cpp
+++ b/src/audio/codecmodel.cpp
@@ -25,10 +25,41 @@
 #include "account.h"
 #include "dbus/configurationmanager.h"
 
+class CodecModelPrivate : public QObject
+{
+   Q_OBJECT
+public:
+   CodecModelPrivate(Audio::CodecModel* parent);
+   ///@struct AudioCodecData store audio codec information
+   struct AudioCodecData {
+      int              id        ;
+      QString          name      ;
+      QString          bitrate   ;
+      QString          samplerate;
+   };
+
+   //Attributes
+   QList<AudioCodecData*> m_lAudioCodecs  ;
+   QMap<int,bool>         m_lEnabledCodecs;
+   Account*               m_pAccount      ;
+
+   //Helpers
+   bool findCodec(int id);
+
+private:
+   Audio::CodecModel* q_ptr;
+};
+
+CodecModelPrivate::CodecModelPrivate(Audio::CodecModel* parent) : q_ptr(parent)
+{
+   
+}
+
 ///Constructor
 Audio::CodecModel::CodecModel(Account* account) :
-QAbstractListModel(account?(QObject*)account:(QObject*)QCoreApplication::instance()),m_pAccount(account)
+QAbstractListModel(account?(QObject*)account:(QObject*)QCoreApplication::instance()), d_ptr(new CodecModelPrivate(this))
 {
+   d_ptr->m_pAccount = account;
    setObjectName("CodecModel: "+(account?account->id():"Unknown"));
    QHash<int, QByteArray> roles = roleNames();
    roles.insert(Audio::CodecModel::Role::ID        ,QByteArray("id"));
@@ -40,9 +71,9 @@ QAbstractListModel(account?(QObject*)account:(QObject*)QCoreApplication::instanc
 
 Audio::CodecModel::~CodecModel()
 {
-   while (m_lAudioCodecs.size()) {
-      AudioCodecData* c = m_lAudioCodecs[0];
-      m_lAudioCodecs.removeAt(0);
+   while (d_ptr->m_lAudioCodecs.size()) {
+      CodecModelPrivate::AudioCodecData* c = d_ptr->m_lAudioCodecs[0];
+      d_ptr->m_lAudioCodecs.removeAt(0);
       delete c;
    }
 }
@@ -50,22 +81,22 @@ Audio::CodecModel::~CodecModel()
 ///Model data
 QVariant Audio::CodecModel::data(const QModelIndex& idx, int role) const {
    if(idx.column() == 0      && role == Qt::DisplayRole                   ) {
-      return QVariant(m_lAudioCodecs[idx.row()]->name);
+      return QVariant(d_ptr->m_lAudioCodecs[idx.row()]->name);
    }
    else if(idx.column() == 0 && role == Qt::CheckStateRole                ) {
-      return QVariant(m_lEnabledCodecs[m_lAudioCodecs[idx.row()]->id] ? Qt::Checked : Qt::Unchecked);
+      return QVariant(d_ptr->m_lEnabledCodecs[d_ptr->m_lAudioCodecs[idx.row()]->id] ? Qt::Checked : Qt::Unchecked);
    }
    else if (idx.column() == 0 && role == Audio::CodecModel::Role::NAME       ) {
-      return m_lAudioCodecs[idx.row()]->name;
+      return d_ptr->m_lAudioCodecs[idx.row()]->name;
    }
    else if (idx.column() == 0 && role == Audio::CodecModel::Role::BITRATE    ) {
-      return m_lAudioCodecs[idx.row()]->bitrate;
+      return d_ptr->m_lAudioCodecs[idx.row()]->bitrate;
    }
    else if (idx.column() == 0 && role == Audio::CodecModel::Role::SAMPLERATE ) {
-      return m_lAudioCodecs[idx.row()]->samplerate;
+      return d_ptr->m_lAudioCodecs[idx.row()]->samplerate;
    }
    else if (idx.column() == 0 && role == Audio::CodecModel::Role::ID         ) {
-      return m_lAudioCodecs[idx.row()]->id;
+      return d_ptr->m_lAudioCodecs[idx.row()]->id;
    }
    return QVariant();
 }
@@ -73,7 +104,7 @@ QVariant Audio::CodecModel::data(const QModelIndex& idx, int role) const {
 ///Number of audio codecs
 int Audio::CodecModel::rowCount(const QModelIndex& par) const {
    Q_UNUSED(par)
-   return m_lAudioCodecs.size();
+   return d_ptr->m_lAudioCodecs.size();
 }
 
 ///Model flags
@@ -86,27 +117,27 @@ Qt::ItemFlags Audio::CodecModel::flags(const QModelIndex& idx) const {
 ///Set audio codec data
 bool Audio::CodecModel::setData( const QModelIndex& idx, const QVariant &value, int role) {
    if (idx.column() == 0 && role == Audio::CodecModel::NAME) {
-      m_lAudioCodecs[idx.row()]->name = value.toString();
+      d_ptr->m_lAudioCodecs[idx.row()]->name = value.toString();
       emit dataChanged(idx, idx);
       return true;
    }
    else if (idx.column() == 0 && role == Audio::CodecModel::BITRATE) {
-      m_lAudioCodecs[idx.row()]->bitrate = value.toString();
+      d_ptr->m_lAudioCodecs[idx.row()]->bitrate = value.toString();
       emit dataChanged(idx, idx);
       return true;
    }
    else if(idx.column() == 0 && role == Qt::CheckStateRole) {
-      m_lEnabledCodecs[m_lAudioCodecs[idx.row()]->id] = value.toBool();
+      d_ptr->m_lEnabledCodecs[d_ptr->m_lAudioCodecs[idx.row()]->id] = value.toBool();
       emit dataChanged(idx, idx);
       return true;
    }
    else if (idx.column() == 0 && role == Audio::CodecModel::SAMPLERATE) {
-      m_lAudioCodecs[idx.row()]->samplerate = value.toString();
+      d_ptr->m_lAudioCodecs[idx.row()]->samplerate = value.toString();
       emit dataChanged(idx, idx);
       return true;
    }
    else if (idx.column() == 0 && role == Audio::CodecModel::ID) {
-      m_lAudioCodecs[idx.row()]->id = value.toInt();
+      d_ptr->m_lAudioCodecs[idx.row()]->id = value.toInt();
       emit dataChanged(idx, idx);
       return true;
    }
@@ -115,18 +146,18 @@ bool Audio::CodecModel::setData( const QModelIndex& idx, const QVariant &value,
 
 ///Add a new audio codec
 QModelIndex Audio::CodecModel::add() {
-   m_lAudioCodecs << new AudioCodecData;
-   emit dataChanged(index(m_lAudioCodecs.size()-1,0), index(m_lAudioCodecs.size()-1,0));
-   return index(m_lAudioCodecs.size()-1,0);
+   d_ptr->m_lAudioCodecs << new CodecModelPrivate::AudioCodecData;
+   emit dataChanged(index(d_ptr->m_lAudioCodecs.size()-1,0), index(d_ptr->m_lAudioCodecs.size()-1,0));
+   return index(d_ptr->m_lAudioCodecs.size()-1,0);
 }
 
 ///Remove audio codec at 'idx'
 void Audio::CodecModel::remove(const QModelIndex& idx) {
    if (idx.isValid()) {
-      AudioCodecData* d = m_lAudioCodecs[idx.row()];
-      m_lAudioCodecs.removeAt(idx.row());
+      CodecModelPrivate::AudioCodecData* d = d_ptr->m_lAudioCodecs[idx.row()];
+      d_ptr->m_lAudioCodecs.removeAt(idx.row());
       delete d;
-      emit dataChanged(idx, index(m_lAudioCodecs.size()-1,0));
+      emit dataChanged(idx, index(d_ptr->m_lAudioCodecs.size()-1,0));
    }
    else {
       qDebug() << "Failed to remove an invalid audio codec";
@@ -136,22 +167,22 @@ void Audio::CodecModel::remove(const QModelIndex& idx) {
 ///Remove everything
 void Audio::CodecModel::clear()
 {
-   while(m_lAudioCodecs.size()) {
-      AudioCodecData* d = m_lAudioCodecs[0];
-      m_lAudioCodecs.removeAt(0);
+   while(d_ptr->m_lAudioCodecs.size()) {
+      CodecModelPrivate::AudioCodecData* d = d_ptr->m_lAudioCodecs[0];
+      d_ptr->m_lAudioCodecs.removeAt(0);
       delete d;
    }
-   m_lAudioCodecs.clear  ();
-   m_lEnabledCodecs.clear();
+   d_ptr->m_lAudioCodecs.clear  ();
+   d_ptr->m_lEnabledCodecs.clear();
 }
 
 ///Increase codec priority
 bool Audio::CodecModel::moveUp(const QModelIndex& idx)
 {
    if(idx.row() > 0 && idx.row() <= rowCount()) {
-      AudioCodecData* data2 = m_lAudioCodecs[idx.row()];
-      m_lAudioCodecs.removeAt(idx.row());
-      m_lAudioCodecs.insert(idx.row() - 1, data2);
+      CodecModelPrivate::AudioCodecData* data2 = d_ptr->m_lAudioCodecs[idx.row()];
+      d_ptr->m_lAudioCodecs.removeAt(idx.row());
+      d_ptr->m_lAudioCodecs.insert(idx.row() - 1, data2);
       emit dataChanged(index(idx.row() - 1, 0, QModelIndex()), index(idx.row(), 0, QModelIndex()));
       return true;
    }
@@ -162,9 +193,9 @@ bool Audio::CodecModel::moveUp(const QModelIndex& idx)
 bool Audio::CodecModel::moveDown(const QModelIndex& idx)
 {
    if(idx.row() >= 0 && idx.row() < rowCount()) {
-      AudioCodecData* data2 = m_lAudioCodecs[idx.row()];
-      m_lAudioCodecs.removeAt(idx.row());
-      m_lAudioCodecs.insert(idx.row() + 1, data2);
+      CodecModelPrivate::AudioCodecData* data2 = d_ptr->m_lAudioCodecs[idx.row()];
+      d_ptr->m_lAudioCodecs.removeAt(idx.row());
+      d_ptr->m_lAudioCodecs.insert(idx.row() + 1, data2);
       emit dataChanged(index(idx.row(), 0, QModelIndex()), index(idx.row() + 1, 0, QModelIndex()));
       return true;
    }
@@ -176,13 +207,13 @@ void Audio::CodecModel::reload()
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
    QVector<int> codecIdList = configurationManager.getAudioCodecList();
-   if (!m_pAccount->isNew()) {
-      QVector<int> activeCodecList = configurationManager.getActiveAudioCodecList(m_pAccount->id());
+   if (!d_ptr->m_pAccount->isNew()) {
+      QVector<int> activeCodecList = configurationManager.getActiveAudioCodecList(d_ptr->m_pAccount->id());
       QStringList tmpNameList;
 
       foreach (const int aCodec, activeCodecList) {
-         if (!findCodec(aCodec)) {
-            QStringList codec = configurationManager.getAudioCodecDetails(aCodec);
+         if (!d_ptr->findCodec(aCodec)) {
+            const QStringList codec = configurationManager.getAudioCodecDetails(aCodec);
             QModelIndex idx = add();
             setData(idx,codec[0]     ,Audio::CodecModel::Role::NAME       );
             setData(idx,codec[1]     ,Audio::CodecModel::Role::SAMPLERATE );
@@ -196,7 +227,7 @@ void Audio::CodecModel::reload()
    }
 
    foreach (const int aCodec, codecIdList) {
-      if (!findCodec(aCodec)) {
+      if (!d_ptr->findCodec(aCodec)) {
          const QStringList codec = configurationManager.getAudioCodecDetails(aCodec);
          QModelIndex idx = add();
          setData(idx,codec[0],Audio::CodecModel::Role::NAME       );
@@ -220,15 +251,17 @@ void Audio::CodecModel::save()
    }
 
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   configurationManager.setActiveAudioCodecList(_codecList, m_pAccount->id());
+   configurationManager.setActiveAudioCodecList(_codecList, d_ptr->m_pAccount->id());
 }
 
 ///Check is a codec is already in the list
-bool Audio::CodecModel::findCodec(int id)
+bool CodecModelPrivate::findCodec(int id)
 {
-   foreach(AudioCodecData* data, m_lAudioCodecs) {
+   foreach(const AudioCodecData* data, m_lAudioCodecs) {
       if (data->id == id)
          return true;
    }
    return false;
 }
+
+#include <codecmodel.moc>
diff --git a/src/audio/codecmodel.h b/src/audio/codecmodel.h
index 212c24fd39ffcd91671b9f640e69152314117c3b..30dd42979dab8e2b70e30ef58e86867cd6ae7c9a 100644
--- a/src/audio/codecmodel.h
+++ b/src/audio/codecmodel.h
@@ -27,6 +27,7 @@
 #include "../typedefs.h"
 
 class Account;
+class CodecModelPrivate;
 
 namespace Audio {
 
@@ -66,21 +67,8 @@ public:
    Q_INVOKABLE void save     (                        );
 
 private:
-   ///@struct AudioCodecData store audio codec information
-   struct AudioCodecData {
-      int              id        ;
-      QString          name      ;
-      QString          bitrate   ;
-      QString          samplerate;
-   };
-
-   //Attributes
-   QList<AudioCodecData*> m_lAudioCodecs  ;
-   QMap<int,bool>         m_lEnabledCodecs;
-   Account*               m_pAccount      ;
-
-   //Helpers
-   bool findCodec(int id);
+   QScopedPointer<CodecModelPrivate> d_ptr;
+   Q_DECLARE_PRIVATE(CodecModel)
 };
 
 }
diff --git a/src/audio/inputdevicemodel.cpp b/src/audio/inputdevicemodel.cpp
index 6715a90bf67c27ba42c94abccd037acee602f862..065b629c14c186ae69450fc65af30c7b446dc0ef 100644
--- a/src/audio/inputdevicemodel.cpp
+++ b/src/audio/inputdevicemodel.cpp
@@ -21,11 +21,28 @@
 #include "dbus/configurationmanager.h"
 #include "settings.h"
 
+class InputDeviceModelPrivate : public QObject
+{
+   Q_OBJECT
+public:
+   InputDeviceModelPrivate(Audio::InputDeviceModel* parent);
+   QStringList m_lDeviceList;
+
+private:
+   Audio::InputDeviceModel* q_ptr;
+};
+
+InputDeviceModelPrivate::InputDeviceModelPrivate(Audio::InputDeviceModel* parent) : q_ptr(parent)
+{
+   
+}
+
 ///Constructor
-Audio::InputDeviceModel::InputDeviceModel(const QObject* parent) : QAbstractListModel(const_cast<QObject*>(parent))
+Audio::InputDeviceModel::InputDeviceModel(const QObject* parent) : QAbstractListModel(const_cast<QObject*>(parent)),
+d_ptr(new InputDeviceModelPrivate(this))
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   m_lDeviceList = configurationManager.getAudioInputDeviceList  ();
+   d_ptr->m_lDeviceList = configurationManager.getAudioInputDeviceList  ();
 }
 
 ///Destructor
@@ -41,7 +58,7 @@ QVariant Audio::InputDeviceModel::data( const QModelIndex& index, int role) cons
       return QVariant();
    switch(role) {
       case Qt::DisplayRole:
-         return m_lDeviceList[index.row()];
+         return d_ptr->m_lDeviceList[index.row()];
    };
    return QVariant();
 }
@@ -51,7 +68,7 @@ int Audio::InputDeviceModel::rowCount( const QModelIndex& parent ) const
 {
    if (parent.isValid())
       return 0;
-   return m_lDeviceList.size();
+   return d_ptr->m_lDeviceList.size();
 }
 
 ///Re-implement QAbstractListModel flags
@@ -76,7 +93,7 @@ QModelIndex Audio::InputDeviceModel::currentDevice() const
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
    const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex();
    const int idx = currentDevices[static_cast<int>(Settings::DeviceIndex::INPUT)].toInt();
-   if (idx >= m_lDeviceList.size())
+   if (idx >= d_ptr->m_lDeviceList.size())
       return QModelIndex();
    return index(idx,0);
 }
@@ -100,7 +117,9 @@ void Audio::InputDeviceModel::setCurrentDevice(int idx)
 void Audio::InputDeviceModel::reload()
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   m_lDeviceList = configurationManager.getAudioInputDeviceList  ();
+   d_ptr->m_lDeviceList = configurationManager.getAudioInputDeviceList  ();
    emit layoutChanged();
-   emit dataChanged(index(0,0),index(m_lDeviceList.size()-1,0));
-}
\ No newline at end of file
+   emit dataChanged(index(0,0),index(d_ptr->m_lDeviceList.size()-1,0));
+}
+
+#include <inputdevicemodel.moc>
diff --git a/src/audio/inputdevicemodel.h b/src/audio/inputdevicemodel.h
index 18c96127d4ea1fc51367c60cb4e8cc7099d9fd2b..44d009feb58c4624d089e9c4327015c703a992b3 100644
--- a/src/audio/inputdevicemodel.h
+++ b/src/audio/inputdevicemodel.h
@@ -26,6 +26,8 @@
 //SFLPhone
 #include "../typedefs.h"
 
+class InputDeviceModelPrivate;
+
 namespace Audio {
 
 class LIB_EXPORT InputDeviceModel   : public QAbstractListModel {
@@ -51,7 +53,8 @@ public:
    void reload();
 
 private:
-   QStringList m_lDeviceList;
+   QScopedPointer<InputDeviceModelPrivate> d_ptr;
+   Q_DECLARE_PRIVATE(InputDeviceModel)
 };
 
 }
diff --git a/src/audio/managermodel.cpp b/src/audio/managermodel.cpp
index 0f360bf4c1ed3e91c8f44f01e3edaff9b4e40381..07507d9032f9f2beb932039247612bb9edfc3890 100644
--- a/src/audio/managermodel.cpp
+++ b/src/audio/managermodel.cpp
@@ -21,23 +21,48 @@
 #include "dbus/configurationmanager.h"
 #include "settings.h"
 
+class ManagerModelPrivate : public QObject
+{
+   Q_OBJECT
+public:
+   ManagerModelPrivate(Audio::ManagerModel* parent);
+   class ManagerName {
+   public:
+      constexpr static const char* PULSEAUDIO = "pulseaudio";
+      constexpr static const char* ALSA       = "alsa"      ;
+      constexpr static const char* JACK       = "jack"      ;
+   };
+
+   QStringList m_lDeviceList;
+   QList<Audio::ManagerModel::Manager> m_lSupportedManagers;
+
+private:
+   Audio::ManagerModel* q_ptr;
+};
+
+ManagerModelPrivate::ManagerModelPrivate(Audio::ManagerModel* parent) : q_ptr(parent)
+{
+   
+}
+
 ///Constructor
-Audio::ManagerModel::ManagerModel(const QObject* parent) : QAbstractListModel(const_cast<QObject*>(parent))
+Audio::ManagerModel::ManagerModel(const QObject* parent) : QAbstractListModel(const_cast<QObject*>(parent)),
+d_ptr(new ManagerModelPrivate(this))
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
    const QStringList managers = configurationManager.getSupportedAudioManagers();
    foreach(const QString& m,managers) {
-      if (m == ManagerName::PULSEAUDIO) {
-         m_lSupportedManagers << Manager::PULSE;
-         m_lDeviceList << "Pulse Audio";
+      if (m == ManagerModelPrivate::ManagerName::PULSEAUDIO) {
+         d_ptr->m_lSupportedManagers << Manager::PULSE;
+         d_ptr->m_lDeviceList << "Pulse Audio";
       }
-      else if (m == ManagerName::ALSA) {
-         m_lSupportedManagers << Manager::ALSA;
-         m_lDeviceList<< "ALSA";
+      else if (m == ManagerModelPrivate::ManagerName::ALSA) {
+         d_ptr->m_lSupportedManagers << Manager::ALSA;
+         d_ptr->m_lDeviceList<< "ALSA";
       }
-      else if (m == ManagerName::JACK) {
-         m_lSupportedManagers << Manager::JACK;
-         m_lDeviceList<< "Jack";
+      else if (m == ManagerModelPrivate::ManagerName::JACK) {
+         d_ptr->m_lSupportedManagers << Manager::JACK;
+         d_ptr->m_lDeviceList<< "Jack";
       }
       else
          qDebug() << "Unsupported audio manager" << m;
@@ -47,7 +72,7 @@ Audio::ManagerModel::ManagerModel(const QObject* parent) : QAbstractListModel(co
 ///Destructor
 Audio::ManagerModel::~ManagerModel()
 {
-   m_lDeviceList.clear();
+   d_ptr->m_lDeviceList.clear();
 }
 
 ///Re-implement QAbstractListModel data
@@ -57,7 +82,7 @@ QVariant Audio::ManagerModel::data( const QModelIndex& index, int role) const
       return QVariant();
    switch(role) {
       case Qt::DisplayRole:
-         return m_lDeviceList[index.row()];
+         return d_ptr->m_lDeviceList[index.row()];
    };
    return QVariant();
 }
@@ -67,7 +92,7 @@ int Audio::ManagerModel::rowCount( const QModelIndex& parent ) const
 {
    if (parent.isValid())
       return 0;
-   return m_lDeviceList.size();
+   return d_ptr->m_lDeviceList.size();
 }
 
 ///Re-implement QAbstractListModel flags
@@ -94,18 +119,18 @@ QModelIndex Audio::ManagerModel::currentManagerIndex() const
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
    const QString manager = configurationManager.getAudioManager();
-      if (manager == ManagerName::PULSEAUDIO)
+      if (manager == ManagerModelPrivate::ManagerName::PULSEAUDIO)
          return index((int)Manager::PULSE,0);
-      else if (manager == ManagerName::ALSA)
+      else if (manager == ManagerModelPrivate::ManagerName::ALSA)
          return index((int)Manager::ALSA,0);
-      else if (manager == ManagerName::JACK)
+      else if (manager == ManagerModelPrivate::ManagerName::JACK)
          return index((int)Manager::JACK,0);
       return QModelIndex();
 }
 
 Audio::ManagerModel::Manager Audio::ManagerModel::currentManager() const
 {
-   return m_lSupportedManagers[currentManagerIndex().row()];
+   return d_ptr->m_lSupportedManagers[currentManagerIndex().row()];
 }
 
 ///Set current audio manager
@@ -116,17 +141,17 @@ bool Audio::ManagerModel::setCurrentManager(const QModelIndex& idx)
 
    bool ret = true;
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   switch (m_lSupportedManagers[idx.row()]) {
+   switch (d_ptr->m_lSupportedManagers[idx.row()]) {
       case Manager::PULSE:
-         ret = configurationManager.setAudioManager(ManagerName::PULSEAUDIO);
+         ret = configurationManager.setAudioManager(ManagerModelPrivate::ManagerName::PULSEAUDIO);
          Audio::Settings::instance()->reload();
          break;
       case Manager::ALSA:
-         ret = configurationManager.setAudioManager(ManagerName::ALSA);
+         ret = configurationManager.setAudioManager(ManagerModelPrivate::ManagerName::ALSA);
          Audio::Settings::instance()->reload();
          break;
       case Manager::JACK:
-         ret = configurationManager.setAudioManager(ManagerName::JACK);
+         ret = configurationManager.setAudioManager(ManagerModelPrivate::ManagerName::JACK);
          Audio::Settings::instance()->reload();
          break;
    };
@@ -143,4 +168,6 @@ bool Audio::ManagerModel::setCurrentManager(const QModelIndex& idx)
 bool Audio::ManagerModel::setCurrentManager(int idx)
 {
    return setCurrentManager(index(idx,0));
-}
\ No newline at end of file
+}
+
+#include <managermodel.moc>
diff --git a/src/audio/managermodel.h b/src/audio/managermodel.h
index 444f5f43f8a6063bdd36d1abc0f05621db085c9f..0271a41764a7078f1eaecdc8a3a505481e27e180 100644
--- a/src/audio/managermodel.h
+++ b/src/audio/managermodel.h
@@ -26,6 +26,8 @@
 //SFLPhone
 #include "../typedefs.h"
 
+class ManagerModelPrivate;
+
 namespace Audio {
 
 class LIB_EXPORT ManagerModel   : public QAbstractListModel {
@@ -62,15 +64,8 @@ Q_SIGNALS:
    void currentManagerChanged(const QModelIndex&);
 
 private:
-   class ManagerName {
-   public:
-      constexpr static const char* PULSEAUDIO = "pulseaudio";
-      constexpr static const char* ALSA       = "alsa"      ;
-      constexpr static const char* JACK       = "jack"      ;
-   };
-
-   QStringList m_lDeviceList;
-   QList<Manager> m_lSupportedManagers;
+   QScopedPointer<ManagerModelPrivate> d_ptr;
+   Q_DECLARE_PRIVATE(ManagerModel)
 };
 
 }
diff --git a/src/audio/outputdevicemodel.cpp b/src/audio/outputdevicemodel.cpp
index 83c1179804f76b0c1d68005c18a54fb0c0adafb1..4d61cdcdb2d11eb3c622df7fd432e5c1c442f055 100644
--- a/src/audio/outputdevicemodel.cpp
+++ b/src/audio/outputdevicemodel.cpp
@@ -21,11 +21,29 @@
 #include "dbus/configurationmanager.h"
 #include "settings.h"
 
+class OutputDeviceModelPrivate : public QObject
+{
+   Q_OBJECT
+public:
+   OutputDeviceModelPrivate(Audio::OutputDeviceModel* parent);
+   QStringList m_lDeviceList;
+
+private:
+   Audio::OutputDeviceModel* q_ptr;
+};
+
+
+OutputDeviceModelPrivate::OutputDeviceModelPrivate(Audio::OutputDeviceModel* parent) : q_ptr(parent)
+{
+   
+}
+
 ///Constructor
-Audio::OutputDeviceModel::OutputDeviceModel(const QObject* parent) : QAbstractListModel(const_cast<QObject*>(parent))
+Audio::OutputDeviceModel::OutputDeviceModel(const QObject* parent) : QAbstractListModel(const_cast<QObject*>(parent)),
+d_ptr(new OutputDeviceModelPrivate(this))
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   m_lDeviceList = configurationManager.getAudioOutputDeviceList();
+   d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList();
 }
 
 ///Destructor
@@ -41,7 +59,7 @@ QVariant Audio::OutputDeviceModel::data( const QModelIndex& index, int role) con
       return QVariant();
    switch(role) {
       case Qt::DisplayRole:
-         return m_lDeviceList[index.row()];
+         return d_ptr->m_lDeviceList[index.row()];
    };
    return QVariant();
 }
@@ -51,7 +69,7 @@ int Audio::OutputDeviceModel::rowCount( const QModelIndex& parent ) const
 {
    if (parent.isValid())
       return 0;
-   return m_lDeviceList.size();
+   return d_ptr->m_lDeviceList.size();
 }
 
 ///Re-implement QAbstractListModel flags
@@ -77,7 +95,7 @@ QModelIndex Audio::OutputDeviceModel::currentDevice() const
    const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex();
    const int         idx            = currentDevices[static_cast<int>(Audio::Settings::DeviceIndex::OUTPUT)].toInt();
 
-   if (idx >= m_lDeviceList.size())
+   if (idx >= d_ptr->m_lDeviceList.size())
       return QModelIndex();
    return index(idx,0);
 }
@@ -101,7 +119,9 @@ void Audio::OutputDeviceModel::setCurrentDevice(int idx)
 void Audio::OutputDeviceModel::reload()
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   m_lDeviceList = configurationManager.getAudioOutputDeviceList();
+   d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList();
    emit layoutChanged();
-   emit dataChanged(index(0,0),index(m_lDeviceList.size()-1,0));
-}
\ No newline at end of file
+   emit dataChanged(index(0,0),index(d_ptr->m_lDeviceList.size()-1,0));
+}
+
+#include <outputdevicemodel.moc>
diff --git a/src/audio/outputdevicemodel.h b/src/audio/outputdevicemodel.h
index 0aa5fea82dd442221b7aaf5b518041010f4e7737..211fc3f9fc1dfc53eb1ee951c40249ebe65c112b 100644
--- a/src/audio/outputdevicemodel.h
+++ b/src/audio/outputdevicemodel.h
@@ -26,6 +26,8 @@
 //SFLPhone
 #include "../typedefs.h"
 
+class OutputDeviceModelPrivate;
+
 namespace Audio {
 
 class LIB_EXPORT OutputDeviceModel  : public QAbstractListModel {
@@ -51,7 +53,8 @@ public:
    void reload();
 
 private:
-   QStringList m_lDeviceList;
+   QScopedPointer<OutputDeviceModelPrivate> d_ptr;
+   Q_DECLARE_PRIVATE(OutputDeviceModel)
 };
 
 }
diff --git a/src/audio/ringtonedevicemodel.cpp b/src/audio/ringtonedevicemodel.cpp
index 462cf260ae847787223ab8bc5c85e5d5bce09500..fa2b57cec0e90457397c9c38576ab35dfb574fe6 100644
--- a/src/audio/ringtonedevicemodel.cpp
+++ b/src/audio/ringtonedevicemodel.cpp
@@ -21,11 +21,28 @@
 #include "dbus/configurationmanager.h"
 #include "settings.h"
 
+class RingtoneDeviceModelPrivate : public QObject
+{
+   Q_OBJECT
+public:
+   RingtoneDeviceModelPrivate(Audio::RingtoneDeviceModel* parent);
+   QStringList m_lDeviceList;
+
+private:
+   Audio::RingtoneDeviceModel* q_ptr;
+};
+
+RingtoneDeviceModelPrivate::RingtoneDeviceModelPrivate(Audio::RingtoneDeviceModel* parent) : q_ptr(parent)
+{
+   
+}
+
 ///Constructor
-Audio::RingtoneDeviceModel::RingtoneDeviceModel(const QObject* parent) : QAbstractListModel(const_cast<QObject*>(parent))
+Audio::RingtoneDeviceModel::RingtoneDeviceModel(const QObject* parent) : QAbstractListModel(const_cast<QObject*>(parent)),
+d_ptr(new RingtoneDeviceModelPrivate(this))
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   m_lDeviceList = configurationManager.getAudioOutputDeviceList();
+   d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList();
 }
 
 ///Destructor
@@ -41,7 +58,7 @@ QVariant Audio::RingtoneDeviceModel::data( const QModelIndex& index, int role) c
       return QVariant();
    switch(role) {
       case Qt::DisplayRole:
-         return m_lDeviceList[index.row()];
+         return d_ptr->m_lDeviceList[index.row()];
    };
    return QVariant();
 }
@@ -51,7 +68,7 @@ int Audio::RingtoneDeviceModel::rowCount( const QModelIndex& parent ) const
 {
    if (parent.isValid())
       return 0;
-   return m_lDeviceList.size();
+   return d_ptr->m_lDeviceList.size();
 }
 
 ///Re-implement QAbstractListModel flags
@@ -76,7 +93,7 @@ QModelIndex Audio::RingtoneDeviceModel::currentDevice() const
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
    const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex();
    const int         idx            = currentDevices[static_cast<int>(Audio::Settings::DeviceIndex::RINGTONE)].toInt();
-   if (idx >= m_lDeviceList.size())
+   if (idx >= d_ptr->m_lDeviceList.size())
       return QModelIndex();
    return index(idx,0);
 }
@@ -100,7 +117,9 @@ void Audio::RingtoneDeviceModel::setCurrentDevice(int idx)
 void Audio::RingtoneDeviceModel::reload()
 {
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   m_lDeviceList = configurationManager.getAudioOutputDeviceList();
+   d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList();
    emit layoutChanged();
-   emit dataChanged(index(0,0),index(m_lDeviceList.size()-1,0));
+   emit dataChanged(index(0,0),index(d_ptr->m_lDeviceList.size()-1,0));
 }
+
+#include <ringtonedevicemodel.moc>
diff --git a/src/audio/ringtonedevicemodel.h b/src/audio/ringtonedevicemodel.h
index c79d65afed90fb5b9dd4273b00e0b28c701ac3c0..63c0cf2cd200ed55c8d72605f68c86687cf911a1 100644
--- a/src/audio/ringtonedevicemodel.h
+++ b/src/audio/ringtonedevicemodel.h
@@ -26,6 +26,8 @@
 //SFLPhone
 #include "../typedefs.h"
 
+class RingtoneDeviceModelPrivate;
+
 namespace Audio {
 
 class LIB_EXPORT RingtoneDeviceModel: public QAbstractListModel {
@@ -51,7 +53,8 @@ public:
    void reload();
 
 private:
-   QStringList m_lDeviceList;
+   QScopedPointer<RingtoneDeviceModelPrivate> d_ptr;
+   Q_DECLARE_PRIVATE(RingtoneDeviceModel)
 };
 
 }
diff --git a/src/audio/settings.cpp b/src/audio/settings.cpp
index 9a55702de3e84d78372baf5efec89ded88109598..f6db76d7c1b438416b3dd42cfa021b480d5c4a93 100644
--- a/src/audio/settings.cpp
+++ b/src/audio/settings.cpp
@@ -26,27 +26,55 @@
 #include "outputdevicemodel.h"
 #include "inputdevicemodel.h"
 
+namespace Audio {
+class SettingsPrivate : public QObject
+{
+   Q_OBJECT
+public:
+   SettingsPrivate(Audio::Settings* parent);
+
+   //Attributes
+   mutable Audio::AlsaPluginModel*     m_pAlsaPluginModel    ;
+   mutable Audio::InputDeviceModel*    m_pInputDeviceModel   ;
+   mutable Audio::OutputDeviceModel*   m_pOutputDeviceModel  ;
+   mutable Audio::ManagerModel*        m_pAudioManagerModel  ;
+   mutable Audio::RingtoneDeviceModel* m_pRingtoneDeviceModel;
+   bool                 m_EnableRoomTone      ;
+
+private Q_SLOTS:
+   void slotVolumeChanged(const QString& str, double volume);
+
+private:
+   Audio::Settings* q_ptr;
+};
+}
+
 Audio::Settings* Audio::Settings::m_spInstance = nullptr;
 
-///Constructor
-Audio::Settings::Settings() : QObject(),m_EnableRoomTone(false),
+Audio::SettingsPrivate::SettingsPrivate(Audio::Settings* parent) : q_ptr(parent),m_EnableRoomTone(false),
  m_pAlsaPluginModel  (nullptr), m_pInputDeviceModel   (nullptr),
  m_pAudioManagerModel(nullptr), m_pRingtoneDeviceModel(nullptr),
  m_pOutputDeviceModel(nullptr)
 {
-   m_pRingtoneDeviceModel = new RingtoneDeviceModel (this);
+
+}
+
+///Constructor
+Audio::Settings::Settings() : QObject(), d_ptr(new Audio::SettingsPrivate(this))
+{
+   d_ptr->m_pRingtoneDeviceModel = new RingtoneDeviceModel (this);
    ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
-   connect(&configurationManager,SIGNAL(volumeChanged(QString,double)),this,SLOT(slotVolumeChanged(QString,double)));
+   connect(&configurationManager,SIGNAL(volumeChanged(QString,double)),d_ptr.data(),SLOT(slotVolumeChanged(QString,double)));
 }
 
 ///Destructor
 Audio::Settings::~Settings()
 {
-   delete m_pAlsaPluginModel    ;
-   delete m_pInputDeviceModel   ;
-   delete m_pOutputDeviceModel  ;
-   delete m_pAudioManagerModel  ;
-   delete m_pRingtoneDeviceModel;
+   delete d_ptr->m_pAlsaPluginModel    ;
+   delete d_ptr->m_pInputDeviceModel   ;
+   delete d_ptr->m_pOutputDeviceModel  ;
+   delete d_ptr->m_pAudioManagerModel  ;
+   delete d_ptr->m_pRingtoneDeviceModel;
 }
 
 ///Singleton
@@ -61,58 +89,58 @@ Audio::Settings* Audio::Settings::instance()
 ///Return plugin model (alsa only for the time being)
 Audio::AlsaPluginModel* Audio::Settings::alsaPluginModel() const
 {
-   if (!m_pAlsaPluginModel)
-      m_pAlsaPluginModel = new Audio::AlsaPluginModel(this);
-   return m_pAlsaPluginModel;
+   if (!d_ptr->m_pAlsaPluginModel)
+      d_ptr->m_pAlsaPluginModel = new Audio::AlsaPluginModel(this);
+   return d_ptr->m_pAlsaPluginModel;
 }
 
 
 ///Return the input device model
 Audio::InputDeviceModel* Audio::Settings::inputDeviceModel() const
 {
-   if (!m_pInputDeviceModel)
-      m_pInputDeviceModel = new Audio::InputDeviceModel(this);
-   return m_pInputDeviceModel;
+   if (!d_ptr->m_pInputDeviceModel)
+      d_ptr->m_pInputDeviceModel = new Audio::InputDeviceModel(this);
+   return d_ptr->m_pInputDeviceModel;
 }
 
 ///Return the output device model
 Audio::OutputDeviceModel* Audio::Settings::outputDeviceModel() const
 {
-   if (!m_pOutputDeviceModel)
-      m_pOutputDeviceModel   = new Audio::OutputDeviceModel(this);
-   return m_pOutputDeviceModel;
+   if (!d_ptr->m_pOutputDeviceModel)
+      d_ptr->m_pOutputDeviceModel   = new Audio::OutputDeviceModel(this);
+   return d_ptr->m_pOutputDeviceModel;
 }
 
 ///Return audio manager
 Audio::ManagerModel* Audio::Settings::managerModel() const
 {
-   if (!m_pAudioManagerModel)
-      m_pAudioManagerModel = new Audio::ManagerModel(this);
-   return m_pAudioManagerModel;
+   if (!d_ptr->m_pAudioManagerModel)
+      d_ptr->m_pAudioManagerModel = new Audio::ManagerModel(this);
+   return d_ptr->m_pAudioManagerModel;
 }
 
 ///Return the ringtone device model
 Audio::RingtoneDeviceModel* Audio::Settings::ringtoneDeviceModel() const
 {
-   if (!m_pRingtoneDeviceModel)
-      m_pRingtoneDeviceModel = new Audio::RingtoneDeviceModel (this);
-   return m_pRingtoneDeviceModel;
+   if (!d_ptr->m_pRingtoneDeviceModel)
+      d_ptr->m_pRingtoneDeviceModel = new Audio::RingtoneDeviceModel (this);
+   return d_ptr->m_pRingtoneDeviceModel;
 }
 
 ///Is the room tone (globally) enabled
 bool Audio::Settings::isRoomToneEnabled()
 {
-   return m_EnableRoomTone;
+   return d_ptr->m_EnableRoomTone;
 }
 
 ///Reload everything
 void Audio::Settings::reload()
 {
-   m_pAlsaPluginModel->reload();
-   m_pInputDeviceModel->reload();
-   m_pOutputDeviceModel->reload();
+   d_ptr->m_pAlsaPluginModel->reload();
+   d_ptr->m_pInputDeviceModel->reload();
+   d_ptr->m_pOutputDeviceModel->reload();
 //    m_pAudioManagerModel->reload();
-   m_pRingtoneDeviceModel->reload();
+   d_ptr->m_pRingtoneDeviceModel->reload();
 }
 
 ///Play room tone
@@ -134,7 +162,7 @@ void Audio::Settings::stopRoomTone() const
 ///Set if the roomtone is (globally) enabled
 void Audio::Settings::setEnableRoomTone(bool enable)
 {
-   m_EnableRoomTone = enable;
+   d_ptr->m_EnableRoomTone = enable;
 }
 
 ///Enable noise suppress code, may make things worst
@@ -244,13 +272,14 @@ bool Audio::Settings::areDTMFMuted() const
 }
 
 ///Called when the volume change for external reasons
-void Audio::Settings::slotVolumeChanged(const QString& str, double volume)
+void Audio::SettingsPrivate::slotVolumeChanged(const QString& str, double volume)
 {
    if (str == Audio::Settings::DeviceKey::CAPTURE)
-      emit captureVolumeChanged(static_cast<int>(volume*100));
+      emit q_ptr->captureVolumeChanged(static_cast<int>(volume*100));
    else if (str == Audio::Settings::DeviceKey::PLAYBACK)
-      emit playbackVolumeChanged(static_cast<int>(volume*100));
+      emit q_ptr->playbackVolumeChanged(static_cast<int>(volume*100));
    else
       qDebug() << "Unknown audio device" << str;
 }
 
+#include <settings.moc>
diff --git a/src/audio/settings.h b/src/audio/settings.h
index be36ce4a06a453f024c5c9fe5b8aa92d2303a36d..5e5a0ff1546bdeb337bd937536fd2b785359dd14 100644
--- a/src/audio/settings.h
+++ b/src/audio/settings.h
@@ -23,6 +23,7 @@
 //SFLPhone
 #include "../typedefs.h"
 
+
 namespace Audio {
 
 class AlsaPluginModel    ;
@@ -31,6 +32,8 @@ class OutputDeviceModel  ;
 class ManagerModel       ;
 class RingtoneDeviceModel;
 
+class SettingsPrivate;
+
 /**
  * This class group all ComboBox models used by audio settings dialogs
  */
@@ -100,20 +103,11 @@ Q_SIGNALS:
    void captureVolumeChanged(int);
    void DTMFMutedChanged(bool);
 
-private Q_SLOTS:
-   void slotVolumeChanged(const QString& str, double volume);
-
 private:
    //Constructor
    explicit Settings();
-
-   //Attributes
-   mutable AlsaPluginModel*     m_pAlsaPluginModel    ;
-   mutable InputDeviceModel*    m_pInputDeviceModel   ;
-   mutable OutputDeviceModel*   m_pOutputDeviceModel  ;
-   mutable ManagerModel*        m_pAudioManagerModel  ;
-   mutable RingtoneDeviceModel* m_pRingtoneDeviceModel;
-   bool                 m_EnableRoomTone      ;
+   QScopedPointer<SettingsPrivate> d_ptr;
+   Q_DECLARE_PRIVATE(Settings)
 
    //Singleton
    static Settings* m_spInstance;