diff --git a/src/audio/inputdevicemodel.cpp b/src/audio/inputdevicemodel.cpp
index 96b72546f877fce7bae34fa7dabef781ed0ccd09..f9b7a4f06d506c12aec69505e55a1709f6cc1701 100644
--- a/src/audio/inputdevicemodel.cpp
+++ b/src/audio/inputdevicemodel.cpp
@@ -31,6 +31,7 @@ public:
    InputDeviceModelPrivate(Audio::InputDeviceModel* parent);
    QStringList m_lDeviceList;
    mutable QItemSelectionModel* m_pSelectionModel;
+   QModelIndex currentDevice() const;
 
 private:
    Audio::InputDeviceModel* q_ptr;
@@ -62,6 +63,7 @@ d_ptr(new InputDeviceModelPrivate(this))
 {
    ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
    d_ptr->m_lDeviceList = configurationManager.getAudioInputDeviceList  ();
+   connect(&configurationManager, SIGNAL(audioDeviceEvent()), this, SLOT(reload()));
 }
 
 ///Destructor
@@ -123,10 +125,21 @@ QItemSelectionModel* Audio::InputDeviceModel::selectionModel() const
    return d_ptr->m_pSelectionModel;
 }
 
+///Return the current ringtone device
+QModelIndex InputDeviceModelPrivate::currentDevice() const
+{
+   ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
+   const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex();
+   const int         idx            = currentDevices[static_cast<int>(Audio::Settings::DeviceIndex::INPUT)].toInt();
+   if (idx >= m_lDeviceList.size())
+      return QModelIndex();
+   return q_ptr->index(idx,0);
+}
+
 ///Set the current input device
 void InputDeviceModelPrivate::setCurrentDevice(const QModelIndex& index)
 {
-   if (index.isValid()) {
+   if (index.isValid() and index != currentDevice()) {
       ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
       configurationManager.setAudioInputDevice(index.row());
    }
@@ -135,7 +148,6 @@ void InputDeviceModelPrivate::setCurrentDevice(const QModelIndex& index)
 ///Reload input device list
 void Audio::InputDeviceModel::reload()
 {
-   const int currentRow = selectionModel()->currentIndex().row();
    ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
    beginResetModel();
    d_ptr->m_lDeviceList = configurationManager.getAudioInputDeviceList  ();
@@ -144,7 +156,7 @@ void Audio::InputDeviceModel::reload()
    emit dataChanged(index(0,0),index(d_ptr->m_lDeviceList.size()-1,0));
 
    // Restore the selection
-   d_ptr->m_pSelectionModel->setCurrentIndex(index(currentRow,0), QItemSelectionModel::ClearAndSelect);
+   selectionModel()->setCurrentIndex(d_ptr->currentDevice(), QItemSelectionModel::ClearAndSelect);
 }
 
 #include <inputdevicemodel.moc>
diff --git a/src/audio/inputdevicemodel.h b/src/audio/inputdevicemodel.h
index 539b3bd4f9c2314ec7787029868c592844484732..0b17442f774baae469123b38197d59bd31b98100 100644
--- a/src/audio/inputdevicemodel.h
+++ b/src/audio/inputdevicemodel.h
@@ -46,7 +46,7 @@ public:
    //Getters
    QItemSelectionModel* selectionModel() const;
 
-   //Mutator
+public Q_SLOTS:
    void reload();
 
 private:
diff --git a/src/audio/outputdevicemodel.cpp b/src/audio/outputdevicemodel.cpp
index b08433eb004c1d229d58b5722b9fb252f2a680ee..d1b55e59f86f253650624ea971dae6ba6b13384a 100644
--- a/src/audio/outputdevicemodel.cpp
+++ b/src/audio/outputdevicemodel.cpp
@@ -32,6 +32,7 @@ public:
    OutputDeviceModelPrivate(Audio::OutputDeviceModel* parent);
    QStringList m_lDeviceList;
    mutable QItemSelectionModel* m_pSelectionModel;
+   QModelIndex currentDevice() const;
 
 private:
    Audio::OutputDeviceModel* q_ptr;
@@ -53,6 +54,7 @@ d_ptr(new OutputDeviceModelPrivate(this))
 {
    ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
    d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList();
+   connect(&configurationManager, SIGNAL(audioDeviceEvent()), this, SLOT(reload()));
 }
 
 ///Destructor
@@ -125,10 +127,21 @@ QItemSelectionModel* Audio::OutputDeviceModel::selectionModel() const
    return d_ptr->m_pSelectionModel;
 }
 
+///Return the current ringtone device
+QModelIndex OutputDeviceModelPrivate::currentDevice() const
+{
+   ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
+   const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex();
+   const int         idx            = currentDevices[static_cast<int>(Audio::Settings::DeviceIndex::OUTPUT)].toInt();
+   if (idx >= m_lDeviceList.size())
+      return QModelIndex();
+   return q_ptr->index(idx,0);
+}
+
 ///Set the current output device
 void OutputDeviceModelPrivate::setCurrentDevice(const QModelIndex& index)
 {
-   if (index.isValid()) {
+   if (index.isValid() and index != currentDevice()) {
       ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
       configurationManager.setAudioOutputDevice(index.row());
    }
@@ -137,8 +150,6 @@ void OutputDeviceModelPrivate::setCurrentDevice(const QModelIndex& index)
 ///reload output devices list
 void Audio::OutputDeviceModel::reload()
 {
-   const int currentRow = selectionModel()->currentIndex().row();
-
    ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
    beginResetModel();
    d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList();
@@ -147,7 +158,7 @@ void Audio::OutputDeviceModel::reload()
    emit dataChanged(index(0,0),index(d_ptr->m_lDeviceList.size()-1,0));
 
    // Restore the selection
-   d_ptr->m_pSelectionModel->setCurrentIndex(index(currentRow,0), QItemSelectionModel::ClearAndSelect);
+   selectionModel()->setCurrentIndex(d_ptr->currentDevice(), QItemSelectionModel::ClearAndSelect);
 
 }
 
diff --git a/src/audio/outputdevicemodel.h b/src/audio/outputdevicemodel.h
index 03fb6b7fe80840ad5a2a927330b623caefbaf199..2495113aa348529006e0a156c90a4b071c783191 100644
--- a/src/audio/outputdevicemodel.h
+++ b/src/audio/outputdevicemodel.h
@@ -46,12 +46,12 @@ public:
    //Getters
    QItemSelectionModel* selectionModel() const;
 
-   //Mutator
-   void reload();
-
    //Static methods
    static void playDTMF(const QString& str);
 
+public Q_SLOTS:
+   void reload();
+
 private:
    QScopedPointer<OutputDeviceModelPrivate> d_ptr;
    Q_DECLARE_PRIVATE(OutputDeviceModel)
diff --git a/src/audio/ringtonedevicemodel.cpp b/src/audio/ringtonedevicemodel.cpp
index b9698dccc6f5ea18bc9cbc396192891687ebca22..72b9167c4f32887049b14fe5ff172356a52302d7 100644
--- a/src/audio/ringtonedevicemodel.cpp
+++ b/src/audio/ringtonedevicemodel.cpp
@@ -31,6 +31,7 @@ public:
    RingtoneDeviceModelPrivate(Audio::RingtoneDeviceModel* parent);
    QStringList m_lDeviceList;
    mutable QItemSelectionModel* m_pSelectionModel;
+   QModelIndex currentDevice() const;
 
 private:
    Audio::RingtoneDeviceModel* q_ptr;
@@ -51,6 +52,7 @@ d_ptr(new RingtoneDeviceModelPrivate(this))
 {
    ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
    d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList();
+   connect(&configurationManager, SIGNAL(audioDeviceEvent()), this, SLOT(reload()));
 }
 
 ///Destructor
@@ -124,20 +126,20 @@ QItemSelectionModel* Audio::RingtoneDeviceModel::selectionModel() const
 }
 
 ///Return the current ringtone device
-QModelIndex Audio::RingtoneDeviceModel::currentDevice() const
+QModelIndex RingtoneDeviceModelPrivate::currentDevice() const
 {
    ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
    const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex();
    const int         idx            = currentDevices[static_cast<int>(Audio::Settings::DeviceIndex::RINGTONE)].toInt();
-   if (idx >= d_ptr->m_lDeviceList.size())
+   if (idx >= m_lDeviceList.size())
       return QModelIndex();
-   return index(idx,0);
+   return q_ptr->index(idx,0);
 }
 
 ///Set the current ringtone device
 void RingtoneDeviceModelPrivate::setCurrentDevice(const QModelIndex& index)
 {
-   if (index.isValid()) {
+   if (index.isValid() and index != currentDevice()) {
       ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
       configurationManager.setAudioRingtoneDevice(index.row());
    }
@@ -146,8 +148,6 @@ void RingtoneDeviceModelPrivate::setCurrentDevice(const QModelIndex& index)
 ///Reload ringtone device list
 void Audio::RingtoneDeviceModel::reload()
 {
-   const int currentRow = selectionModel()->currentIndex().row();
-
    ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance();
    beginResetModel();
    d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList();
@@ -156,7 +156,7 @@ void Audio::RingtoneDeviceModel::reload()
    emit dataChanged(index(0,0),index(d_ptr->m_lDeviceList.size()-1,0));
 
    // Restore the selection
-   d_ptr->m_pSelectionModel->setCurrentIndex(index(currentRow,0), QItemSelectionModel::ClearAndSelect);
+   selectionModel()->setCurrentIndex(d_ptr->currentDevice(), QItemSelectionModel::ClearAndSelect);
 
 }
 
diff --git a/src/audio/ringtonedevicemodel.h b/src/audio/ringtonedevicemodel.h
index d052f9cee69f2e759b8749c8033b1281fbf8ea50..698c03f9aa440661ee4ab4c2c059cd2e20a10dda 100644
--- a/src/audio/ringtonedevicemodel.h
+++ b/src/audio/ringtonedevicemodel.h
@@ -44,10 +44,9 @@ public:
    virtual QHash<int,QByteArray> roleNames() const override;
 
    //Getters
-   QModelIndex currentDevice() const;
    QItemSelectionModel* selectionModel() const;
 
-   //Mutator
+public Q_SLOTS:
    void reload();
 
 private:
diff --git a/xml/configurationmanager-introspec.xml b/xml/configurationmanager-introspec.xml
index 202e4cbf83979e3dcf8b0a151e4a00aef0ef844a..cb93b51280ef3f283c6b1e21c6836a513829f362 100644
--- a/xml/configurationmanager-introspec.xml
+++ b/xml/configurationmanager-introspec.xml
@@ -441,6 +441,10 @@
            </arg>
        </method>
 
+        <signal name="audioDeviceEvent" tp:name-for-bindings="audioDeviceEvent">
+           <tp:docstring>Signal triggered by changes in the detected audio devices, e.g. a headset being unplugged.</tp:docstring>
+        </signal>
+
        <method name="getAudioOutputDeviceList" tp:name-for-bindings="getAudioOutputDeviceList">
            <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/>
            <arg type="as" name="list" direction="out">