diff --git a/src/call.cpp b/src/call.cpp
index 176532f105cf450f21affcf3cdbe90cfbbda7280..d2e2541829cd7217a9708359e1787957a811ed50 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -55,6 +55,7 @@
 #include "phonedirectorymodel.h"
 #include "contactmethod.h"
 #include "video/renderer.h"
+#include "video/sourcemodel.h"
 #include "tlsmethodmodel.h"
 #include "audio/settings.h"
 #include "personmodel.h"
@@ -388,6 +389,28 @@ void CallPrivate::deleteCall(Call* call)
     delete call;
 }
 
+void CallPrivate::updateOutgoingMedia(const MapStringString& details)
+{
+   auto list = q_ptr->media(Media::Media::Type::VIDEO, Media::Media::Direction::OUT);
+   QString video_source  = details[ DRing::Call::Details::VIDEO_SOURCE];
+
+   if (video_source.length() <= 0 && list.isEmpty()) {
+       // Means there is no video, and there never was. Nothing to do.
+       return;
+   }
+
+   if (list.isEmpty()) {
+       // Update data
+       static const Media::Media::Direction direction = Media::Media::Direction::OUT;
+       mediaFactory<Media::Video>(direction);
+   }
+
+   list = q_ptr->media(Media::Media::Type::VIDEO, Media::Media::Direction::OUT);
+   Media::Video* media_video = static_cast<Media::Video*>(list[0]);
+   media_video->sourceModel()->setUsedIndex(video_source);
+   return;
+}
+
 MapStringString CallPrivate::getCallDetailsCommon(const QString& callId)
 {
    CallManagerInterface& callManager = CallManager::instance();
@@ -437,6 +460,7 @@ Call* CallPrivate::buildCall(const QString& callId, Call::Direction callDirectio
 
     auto call = std::unique_ptr<Call, decltype(deleteCall)&>( new Call(startState, peerName, nb, acc),
                                                              deleteCall );
+    call->d_ptr->updateOutgoingMedia(details);
 
     call->d_ptr->m_DringId      = callId;
     call->d_ptr->m_Direction    = callDirection;
@@ -1251,6 +1275,8 @@ Call::State CallPrivate::stateChanged(const QString& newStateName)
       }
 
       MapStringString details = getCallDetailsCommon(m_DringId);
+      updateOutgoingMedia(details);
+
       if (!details[DRing::Call::Details::DISPLAY_NAME].isEmpty()
           and ( details[DRing::Call::Details::DISPLAY_NAME] != m_PeerName) )
          m_PeerName = details[DRing::Call::Details::DISPLAY_NAME];
diff --git a/src/media/video.cpp b/src/media/video.cpp
index 198b5d71aac5497edfb6d8b5c9614933ee3c08d1..cf254d57b36f7fadc9138a2389b513217478590f 100644
--- a/src/media/video.cpp
+++ b/src/media/video.cpp
@@ -19,6 +19,7 @@
 
 //Dring
 #include <media_const.h>
+#include <video/sourcemodel.h>
 #include "dbus/callmanager.h"
 
 //Ring
@@ -26,6 +27,8 @@
 
 class MediaVideoPrivate
 {
+public:
+    Video::SourceModel *m_pSourceModel = nullptr;
 };
 
 Media::Video::Video(Call* parent, const Media::Direction direction) : Media::Media(parent, direction), d_ptr(new MediaVideoPrivate())
@@ -50,7 +53,16 @@ bool Media::Video::unmute()
    return callManager.muteLocalMedia(call()->dringId(),DRing::Media::Details::MEDIA_TYPE_VIDEO,false);
 }
 
+Video::SourceModel* Media::Video::sourceModel() const
+{
+    if (!d_ptr->m_pSourceModel) {
+        d_ptr->m_pSourceModel = new ::Video::SourceModel();
+    }
+
+    return d_ptr->m_pSourceModel;
+}
+
 Media::Video::~Video()
 {
    delete d_ptr;
-}
\ No newline at end of file
+}
diff --git a/src/media/video.h b/src/media/video.h
index c71237fc86c8f3bf38e29daaa318880b824ab62e..9073f861f49e2dd300dc1bff065bfa4c060e9e89 100644
--- a/src/media/video.h
+++ b/src/media/video.h
@@ -20,6 +20,11 @@
 #include <media/media.h>
 #include <typedefs.h>
 
+namespace Video{
+class SourceModel;
+}
+
+
 class MediaVideoPrivate;
 class Call;
 class CallPrivate;
@@ -34,6 +39,7 @@ public:
    virtual Media::Type type() override;
    virtual bool mute() override;
    virtual bool unmute() override;
+   ::Video::SourceModel* sourceModel() const;
 
 private:
    Video(Call* parent, const Media::Direction direction);
diff --git a/src/private/call_p.h b/src/private/call_p.h
index 56e389333ae1aa8815b6b9eb2cf30e040364e979..0ba8a0e2a28a9a2f43369c9e392bd10cfd4e6137 100644
--- a/src/private/call_p.h
+++ b/src/private/call_p.h
@@ -237,6 +237,7 @@ public:
    void peerHoldChanged(bool onPeerHold);
    template<typename T>
    T* mediaFactory(Media::Media::Direction dir);
+   void updateOutgoingMedia(const MapStringString& details);
 
    //Static getters
    static Call::State        startStateFromDaemonCallState ( const QString& daemonCallState, const QString& daemonCallType );
diff --git a/src/video/configurationproxy.cpp b/src/video/configurationproxy.cpp
index f71a4e1d9ed1bffa30a6b58eb01cde5b23099146..c6ac3db065eddca9b9f6e86c7e5d8c5102f43401 100644
--- a/src/video/configurationproxy.cpp
+++ b/src/video/configurationproxy.cpp
@@ -40,6 +40,8 @@ namespace ConfigurationProxyPrivate {
    static QItemSelectionModel* m_spResolutionSelectionModel= nullptr;
    static QItemSelectionModel* m_spRateSelectionModel      = nullptr;
 
+   static Video::SourceModel*  m_sourceModel = nullptr;
+
    //Helper
    static Video::Device*     currentDevice    ();
    static Video::Channel*    currentChannel   ();
@@ -60,7 +62,7 @@ namespace ConfigurationProxyPrivate {
 QAbstractItemModel& Video::ConfigurationProxy::deviceModel()
 {
    if (!ConfigurationProxyPrivate::m_spDeviceModel) {
-      ConfigurationProxyPrivate::m_spDeviceModel = new QIdentityProxyModel(&Video::SourceModel::instance());
+      ConfigurationProxyPrivate::m_spDeviceModel = new QIdentityProxyModel(ConfigurationProxyPrivate::m_sourceModel);
       ConfigurationProxyPrivate::m_spDeviceModel->setSourceModel(&Video::DeviceModel::instance());
       ConfigurationProxyPrivate::updateDeviceSelection();
    }
@@ -104,7 +106,9 @@ static Video::Resolution* ConfigurationProxyPrivate::currentResolution()
 
 void ConfigurationProxyPrivate::changeDevice()
 {
-   Video::DeviceModel::instance().setActive(Video::ConfigurationProxy::deviceSelectionModel().currentIndex());
+   Video::ConfigurationProxy::deviceSelectionModel();
+
+   Video::DeviceModel::instance().setActive(ConfigurationProxyPrivate::m_spDeviceSelectionModel->currentIndex());
 
    reinterpret_cast<QIdentityProxyModel&>(Video::ConfigurationProxy::channelModel()).setSourceModel(ConfigurationProxyPrivate::currentDevice());
    changeChannel();
@@ -112,8 +116,12 @@ void ConfigurationProxyPrivate::changeDevice()
 
 void ConfigurationProxyPrivate::changeChannel()
 {
-   if (auto dev = ConfigurationProxyPrivate::currentDevice())
-     dev->setActiveChannel(Video::ConfigurationProxy::channelSelectionModel().currentIndex().row());
+   Video::ConfigurationProxy::channelSelectionModel();
+
+   Video::Device* dev = ConfigurationProxyPrivate::currentDevice();
+
+   if (dev)
+      dev->setActiveChannel(ConfigurationProxyPrivate::m_spChannelSelectionModel->currentIndex().row());
 
    reinterpret_cast<QIdentityProxyModel&>(Video::ConfigurationProxy::resolutionModel()).setSourceModel(ConfigurationProxyPrivate::currentChannel());
 
@@ -124,8 +132,12 @@ void ConfigurationProxyPrivate::changeChannel()
 
 void ConfigurationProxyPrivate::changeResolution()
 {
-   if (auto chan = ConfigurationProxyPrivate::currentChannel())
-     chan->setActiveResolution(Video::ConfigurationProxy::resolutionSelectionModel().currentIndex().row());
+   Video::ConfigurationProxy::resolutionSelectionModel();
+
+   Video::Channel* chan = ConfigurationProxyPrivate::currentChannel();
+
+   if (chan)
+      chan->setActiveResolution(ConfigurationProxyPrivate::m_spResolutionSelectionModel->currentIndex().row());
 
    reinterpret_cast<QIdentityProxyModel&>(Video::ConfigurationProxy::rateModel()).setSourceModel(ConfigurationProxyPrivate::currentResolution());
 
@@ -136,8 +148,12 @@ void ConfigurationProxyPrivate::changeResolution()
 
 void ConfigurationProxyPrivate::changeRate()
 {
-   if (auto res = ConfigurationProxyPrivate::currentResolution())
-     res->setActiveRate(Video::ConfigurationProxy::rateSelectionModel().currentIndex().row());
+   Video::ConfigurationProxy::rateSelectionModel();
+
+   Video::Resolution* res = ConfigurationProxyPrivate::currentResolution();
+
+   if (res)
+      res->setActiveRate(ConfigurationProxyPrivate::m_spRateSelectionModel->currentIndex().row());
 
    updateRateSelection();
 }
@@ -153,8 +169,10 @@ void ConfigurationProxyPrivate::updateDeviceSelection()
 
 void ConfigurationProxyPrivate::updateChannelSelection()
 {
-   if (auto dev = ConfigurationProxyPrivate::currentDevice()) {
-      if (auto chan = dev->activeChannel()) {
+   Video::Device* dev = ConfigurationProxyPrivate::currentDevice();
+   if (dev) {
+      Video::Channel* chan = dev->activeChannel();
+      if (chan) {
          const QModelIndex& newIdx = dev->index(chan->relativeIndex(),0);
          if (newIdx.row() != Video::ConfigurationProxy::channelSelectionModel().currentIndex().row())
             Video::ConfigurationProxy::channelSelectionModel().setCurrentIndex(newIdx, QItemSelectionModel::ClearAndSelect );
@@ -164,8 +182,10 @@ void ConfigurationProxyPrivate::updateChannelSelection()
 
 void ConfigurationProxyPrivate::updateResolutionSelection()
 {
-   if (auto chan = ConfigurationProxyPrivate::currentChannel()) {
-      if (auto res = chan->activeResolution()) {
+   Video::Channel* chan = ConfigurationProxyPrivate::currentChannel();
+   if (chan) {
+      Video::Resolution* res = chan->activeResolution();
+      if (res) {
          const QModelIndex& newIdx = chan->index(res->relativeIndex(),0);
          if (newIdx.row() != Video::ConfigurationProxy::resolutionSelectionModel().currentIndex().row())
             Video::ConfigurationProxy::resolutionSelectionModel().setCurrentIndex(newIdx, QItemSelectionModel::ClearAndSelect);
@@ -175,8 +195,10 @@ void ConfigurationProxyPrivate::updateResolutionSelection()
 
 void ConfigurationProxyPrivate::updateRateSelection()
 {
-   if (auto res = ConfigurationProxyPrivate::currentResolution()) {
-      if (auto rate = res->activeRate()) {
+   Video::Resolution* res = ConfigurationProxyPrivate::currentResolution();
+   if (res) {
+      Video::Rate* rate = res->activeRate();
+      if (rate) {
          const QModelIndex& newIdx = res->index(rate->relativeIndex(),0);
          if (newIdx.row() != Video::ConfigurationProxy::rateSelectionModel().currentIndex().row())
             Video::ConfigurationProxy::rateSelectionModel().setCurrentIndex(newIdx, QItemSelectionModel::ClearAndSelect);
@@ -187,9 +209,11 @@ void ConfigurationProxyPrivate::updateRateSelection()
 QAbstractItemModel& Video::ConfigurationProxy::channelModel()
 {
    if (!ConfigurationProxyPrivate::m_spChannelModel) {
-      ConfigurationProxyPrivate::m_spChannelModel = new QIdentityProxyModel(&Video::SourceModel::instance());
-      if (auto dev = ConfigurationProxyPrivate::currentDevice())
+      ConfigurationProxyPrivate::m_spChannelModel = new QIdentityProxyModel(ConfigurationProxyPrivate::m_sourceModel);
+      Video::Device* dev = ConfigurationProxyPrivate::currentDevice();
+      if (dev) {
          ConfigurationProxyPrivate::m_spChannelModel->setSourceModel(dev);
+      }
    }
    return *ConfigurationProxyPrivate::m_spChannelModel;
 }
@@ -197,9 +221,11 @@ QAbstractItemModel& Video::ConfigurationProxy::channelModel()
 QAbstractItemModel& Video::ConfigurationProxy::resolutionModel()
 {
    if (!ConfigurationProxyPrivate::m_spResolutionModel) {
-      ConfigurationProxyPrivate::m_spResolutionModel = new QIdentityProxyModel(&Video::SourceModel::instance());
-      if (auto chan = ConfigurationProxyPrivate::currentChannel())
+      ConfigurationProxyPrivate::m_spResolutionModel = new QIdentityProxyModel(ConfigurationProxyPrivate::m_sourceModel);
+      Video::Channel* chan = ConfigurationProxyPrivate::currentChannel();
+      if (chan) {
          ConfigurationProxyPrivate::m_spResolutionModel->setSourceModel(chan);
+      }
    }
    return *ConfigurationProxyPrivate::m_spResolutionModel;
 }
@@ -207,7 +233,7 @@ QAbstractItemModel& Video::ConfigurationProxy::resolutionModel()
 QAbstractItemModel& Video::ConfigurationProxy::rateModel()
 {
    if (!ConfigurationProxyPrivate::m_spRateModel) {
-      ConfigurationProxyPrivate::m_spRateModel = new QIdentityProxyModel(&Video::SourceModel::instance());
+      ConfigurationProxyPrivate::m_spRateModel = new QIdentityProxyModel(ConfigurationProxyPrivate::m_sourceModel);
       ConfigurationProxyPrivate::m_spRateModel->setSourceModel(ConfigurationProxyPrivate::currentResolution());
    }
    return *ConfigurationProxyPrivate::m_spRateModel;
@@ -216,13 +242,13 @@ QAbstractItemModel& Video::ConfigurationProxy::rateModel()
 QItemSelectionModel& Video::ConfigurationProxy::deviceSelectionModel()
 {
    if (!ConfigurationProxyPrivate::m_spDeviceSelectionModel) {
-      ConfigurationProxyPrivate::m_spDeviceSelectionModel = new QItemSelectionModel(&deviceModel());
+      ConfigurationProxyPrivate::m_spDeviceSelectionModel = new QItemSelectionModel(ConfigurationProxyPrivate::m_spDeviceModel);
 
       ConfigurationProxyPrivate::updateDeviceSelection();
 
       //Can happen if a device is removed
       QObject::connect(&Video::DeviceModel::instance(), &Video::DeviceModel::currentIndexChanged,[](int idx) {
-         ConfigurationProxyPrivate::m_spDeviceSelectionModel->setCurrentIndex(deviceModel().index(idx,0), QItemSelectionModel::ClearAndSelect );
+         ConfigurationProxyPrivate::m_spDeviceSelectionModel->setCurrentIndex(ConfigurationProxyPrivate::m_spDeviceModel->index(idx,0), QItemSelectionModel::ClearAndSelect );
       });
 
       QObject::connect(ConfigurationProxyPrivate::m_spDeviceSelectionModel,&QItemSelectionModel::currentChanged, &ConfigurationProxyPrivate::changeDevice);
@@ -233,7 +259,7 @@ QItemSelectionModel& Video::ConfigurationProxy::deviceSelectionModel()
 QItemSelectionModel& Video::ConfigurationProxy::channelSelectionModel()
 {
    if (!ConfigurationProxyPrivate::m_spChannelSelectionModel) {
-      ConfigurationProxyPrivate::m_spChannelSelectionModel = new QItemSelectionModel(&channelModel());
+      ConfigurationProxyPrivate::m_spChannelSelectionModel = new QItemSelectionModel(ConfigurationProxyPrivate::m_spChannelModel);
 
       ConfigurationProxyPrivate::updateChannelSelection();
 
@@ -245,7 +271,7 @@ QItemSelectionModel& Video::ConfigurationProxy::channelSelectionModel()
 QItemSelectionModel& Video::ConfigurationProxy::resolutionSelectionModel()
 {
    if (!ConfigurationProxyPrivate::m_spResolutionSelectionModel) {
-      ConfigurationProxyPrivate::m_spResolutionSelectionModel = new QItemSelectionModel(&resolutionModel());
+      ConfigurationProxyPrivate::m_spResolutionSelectionModel = new QItemSelectionModel(ConfigurationProxyPrivate::m_spResolutionModel);
 
       ConfigurationProxyPrivate::updateResolutionSelection();
 
@@ -257,7 +283,7 @@ QItemSelectionModel& Video::ConfigurationProxy::resolutionSelectionModel()
 QItemSelectionModel& Video::ConfigurationProxy::rateSelectionModel()
 {
    if (!ConfigurationProxyPrivate::m_spRateSelectionModel) {
-      ConfigurationProxyPrivate::m_spRateSelectionModel = new QItemSelectionModel(&rateModel());
+      ConfigurationProxyPrivate::m_spRateSelectionModel = new QItemSelectionModel(ConfigurationProxyPrivate::m_spRateModel);
 
       ConfigurationProxyPrivate::updateRateSelection();
 
diff --git a/src/video/sourcemodel.cpp b/src/video/sourcemodel.cpp
index de57de75584e0722f317f11e218da8ed35025d02..d6a36a0ed9f927368febff252a77d1658fa4437e 100644
--- a/src/video/sourcemodel.cpp
+++ b/src/video/sourcemodel.cpp
@@ -20,6 +20,7 @@
 #include <QtCore/QCoreApplication>
 #include "../dbus/videomanager.h"
 #include "devicemodel.h"
+#include "callmodel.h"
 
 namespace Video {
 class SourceModelPrivate
@@ -50,10 +51,9 @@ public:
 
 Video::SourceModelPrivate::SourceModelPrivate() : m_CurrentSelection(-1)
 {
-
 }
 
-Video::SourceModel::SourceModel() : QAbstractListModel(QCoreApplication::instance()),
+Video::SourceModel::SourceModel(QObject* parent) : QAbstractListModel(parent),
 d_ptr(new Video::SourceModelPrivate())
 {
    d_ptr->m_Display.rect = QRect(0,0,0,0);
@@ -64,12 +64,6 @@ Video::SourceModel::~SourceModel()
    delete d_ptr;
 }
 
-Video::SourceModel& Video::SourceModel::instance()
-{
-   static auto instance = new Video::SourceModel;
-   return *instance;
-}
-
 QHash<int,QByteArray> Video::SourceModel::roleNames() const
 {
    static QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
@@ -143,8 +137,7 @@ void Video::SourceModel::switchTo(const QModelIndex& idx)
 ///This model is designed for "live" switching rather than configuration
 void Video::SourceModel::switchTo(const int idx)
 {
-   auto newIdx = idx > -1 ? idx : ExtendedDeviceList::NONE;
-   switch (newIdx) {
+   switch (idx) {
       case ExtendedDeviceList::NONE:
          VideoManager::instance().switchInput(Video::SourceModelPrivate::ProtocolPrefix::NONE);
          break;
@@ -164,11 +157,41 @@ void Video::SourceModel::switchTo(const int idx)
       default:
          VideoManager::instance().switchInput(Video::SourceModelPrivate::ProtocolPrefix::CAMERA +
             Video::DeviceModel::instance().index(idx-ExtendedDeviceList::COUNT__,0).data(Qt::DisplayRole).toString());
-         Video::DeviceModel::instance().setActive(idx-ExtendedDeviceList::COUNT__);
-         newIdx = -1;
          break;
    };
-   d_ptr->m_CurrentSelection = newIdx;
+}
+
+///Set the index of the currently used source
+void Video::SourceModel::setUsedIndex(QString &deviceStr)
+{
+    int idx = 0;
+    //find out index here
+    if (deviceStr.length() <= 0) {
+        idx = ExtendedDeviceList::NONE;
+    }
+    else if (deviceStr.indexOf(Video::SourceModelPrivate::ProtocolPrefix::DISPLAY) == 0) {
+        // Look for the display string into the incomming device string
+        idx = ExtendedDeviceList::SCREEN;
+    }
+    else if (deviceStr.indexOf(Video::SourceModelPrivate::ProtocolPrefix::FILE) == 0) {
+        idx = ExtendedDeviceList::FILE;
+    }
+    else if (deviceStr.indexOf(Video::SourceModelPrivate::ProtocolPrefix::CAMERA) == 0) {
+        Video::Device* dev = Video::DeviceModel::instance().getDevice(deviceStr.replace(Video::SourceModelPrivate::ProtocolPrefix::CAMERA,""));
+        if (dev == nullptr) {
+            // Device not found we dont know what camera is used
+            idx = ExtendedDeviceList::NONE;
+            return;
+        }
+
+        Video::DeviceModel::instance().setActive(dev);
+        idx = ExtendedDeviceList::COUNT__ + Video::DeviceModel::instance().activeIndex();
+    }
+    else {
+        idx = ExtendedDeviceList::NONE;
+    }
+
+    d_ptr->m_CurrentSelection = idx;
 }
 
 void Video::SourceModel::switchTo(Video::Device* device)
@@ -191,10 +214,7 @@ Video::Device* Video::SourceModel::deviceAt(const QModelIndex& idx) const
 
 int Video::SourceModel::activeIndex() const
 {
-   if (d_ptr->m_CurrentSelection == -1) {
-      return ExtendedDeviceList::COUNT__ + Video::DeviceModel::instance().activeIndex();
-   }
-   return d_ptr->m_CurrentSelection;
+    return d_ptr->m_CurrentSelection;
 }
 
 void Video::SourceModel::setFile(const QUrl& url)
diff --git a/src/video/sourcemodel.h b/src/video/sourcemodel.h
index 644be2d6785aac08a912d2b9f71c42af5b8aaba3..13c692327b66a31c27ab0331981e708c8e13e473 100644
--- a/src/video/sourcemodel.h
+++ b/src/video/sourcemodel.h
@@ -32,6 +32,9 @@ class SourceModelPrivate;
 class LIB_EXPORT SourceModel : public QAbstractListModel {
    Q_OBJECT
 public:
+   explicit SourceModel(QObject* parent = nullptr);
+   virtual ~SourceModel();
+
    enum ExtendedDeviceList {
       NONE   ,
       SCREEN ,
@@ -49,13 +52,9 @@ public:
    int activeIndex() const;
 
    int getDeviceIndex(Video::Device* device);
+   void setUsedIndex(QString& deviceStr);
 
-   //Singleton
-   static Video::SourceModel& instance();
 private:
-   explicit SourceModel();
-   virtual ~SourceModel();
-
    Video::SourceModelPrivate* d_ptr;
 
 public Q_SLOTS: