diff --git a/src/conference.cpp b/src/conference.cpp
index e5d519c89d14187faa83bbc55ad574a35ff3bf92..e9549effe73b24e7abeca5b6cc56da90e5f9c8b0 100644
--- a/src/conference.cpp
+++ b/src/conference.cpp
@@ -150,10 +150,19 @@ bool Conference::toggleRecording()
     return startRecording;
 }
 
-std::string Conference::getConfID() const {
+const std::string&
+Conference::getConfID() const {
     return id_;
 }
 
+void
+Conference::switchInput(const std::string& input)
+{
+#ifdef ENABLE_VIDEO
+    getVideoMixer()->switchInput(input);
+#endif
+}
+
 #ifdef ENABLE_VIDEO
 std::shared_ptr<video::VideoMixer> Conference::getVideoMixer()
 {
diff --git a/src/conference.h b/src/conference.h
index f4344bb7f479295fb30cf4229d9c2018aa561fe8..caebbf7fe56585a981e663e14f897fd1a8288c6a 100644
--- a/src/conference.h
+++ b/src/conference.h
@@ -58,7 +58,7 @@ class Conference : public Recordable {
         /**
          * Return the conference id
          */
-        std::string getConfID() const;
+        const std::string& getConfID() const;
 
         /**
          * Return the current conference state
@@ -104,7 +104,9 @@ class Conference : public Recordable {
         /**
          * Start/stop recording toggle
          */
-        virtual bool toggleRecording();
+        bool toggleRecording() override;
+
+        void switchInput(const std::string& input);
 
 #ifdef ENABLE_VIDEO
         std::shared_ptr<video::VideoMixer> getVideoMixer();
diff --git a/src/manager.cpp b/src/manager.cpp
index 5ec1faa85ac3265c0f100f01b36f947842b38948..2ed1d8b6dd548150b0126a4ddc42f6d96f43b050 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -2236,13 +2236,14 @@ Manager::getCurrentAudioDevicesIndex()
 bool
 Manager::switchInput(const std::string& call_id, const std::string& res)
 {
-    auto call = getCallFromCallID(call_id);
-    if (!call) {
-        JAMI_ERR("Call %s is NULL", call_id.c_str());
-        return false;
+    if (auto conf = getConferenceFromID(call_id)) {
+        conf->switchInput(res);
+        return true;
+    } else if (auto call = getCallFromCallID(call_id)) {
+        call->switchInput(res);
+        return true;
     }
-    call->switchInput(res);
-    return true;
+    return false;
 }
 
 int
diff --git a/src/media/video/video_mixer.cpp b/src/media/video/video_mixer.cpp
index 687fa477c3c88f47b6f5ed5bfd69ded928a070ec..b283c847ab1ae7607ab799a2fc8cd45d1c370101 100644
--- a/src/media/video/video_mixer.cpp
+++ b/src/media/video/video_mixer.cpp
@@ -88,6 +88,15 @@ VideoMixer::~VideoMixer()
     loop_.join();
 }
 
+void
+VideoMixer::switchInput(const std::string& input)
+{
+    if (auto local = videoLocal_) {
+        if (auto localInput = std::dynamic_pointer_cast<VideoInput>(local))
+            localInput->switchInput(input);
+    }
+}
+
 void
 VideoMixer::attached(Observable<std::shared_ptr<MediaFrame>>* ob)
 {
diff --git a/src/media/video/video_mixer.h b/src/media/video/video_mixer.h
index db32f777f69be2fa42cc922424ac32a92f721cdd..3fd3c8a807ec50ba8d402210d81e2f21cea06238 100644
--- a/src/media/video/video_mixer.h
+++ b/src/media/video/video_mixer.h
@@ -54,6 +54,8 @@ public:
     void attached(Observable<std::shared_ptr<MediaFrame>>* ob) override;
     void detached(Observable<std::shared_ptr<MediaFrame>>* ob) override;
 
+    void switchInput(const std::string& input);
+
 private:
     NON_COPYABLE(VideoMixer);