diff --git a/daemon/src/client/Makefile.am b/daemon/src/client/Makefile.am
index b84213ff3996e05c588d48bc20f32c727aefe5ad..45b07835138a07e22937c1c76f325ec44f454127 100644
--- a/daemon/src/client/Makefile.am
+++ b/daemon/src/client/Makefile.am
@@ -13,6 +13,7 @@ noinst_HEADERS += presencemanager.h
 endif
 
 if SFL_VIDEO
+VIDEO_SRC = videomanager.cpp
 VIDEO_STUB = videomanager_stub.cpp
 noinst_HEADERS += videomanager.h
 endif
@@ -32,6 +33,7 @@ endif
 libclient_la_SOURCES = callmanager.cpp           \
                        configurationmanager.cpp  \
                        $(PRESENCE_SRC)           \
+                       $(VIDEO_SRC)              \
                        $(STUB_SRC)
 
 libclient_la_CXXFLAGS = -I./ \
diff --git a/daemon/src/client/dbus/videomanager_dbus.cpp b/daemon/src/client/dbus/videomanager_dbus.cpp
index 5f8021612ab877e334d36e5cb507a6f6b0b1c5d6..59ab8839862d38c8b5e2f791c369ac115ee8f1c4 100644
--- a/daemon/src/client/dbus/videomanager_dbus.cpp
+++ b/daemon/src/client/dbus/videomanager_dbus.cpp
@@ -33,183 +33,13 @@
 #include "videomanager.h"
 #include "video/libav_utils.h"
 #include "video/video_input_selector.h"
-#include "account.h"
-#include "logger.h"
-#include "manager.h"
-
-namespace {
-const char * const SERVER_PATH = "/org/sflphone/SFLphone/VideoManager";
-}
+#include "video/video_preferences.h"
 
 VideoManager::VideoManager(DBus::Connection& connection) :
-    DBus::ObjectAdaptor(connection, SERVER_PATH)
+    DBus::ObjectAdaptor(connection, "/org/sflphone/SFLphone/VideoManager")
     , videoInputSelector_()
     , videoPreference_()
 {
     // initialize libav libraries
     libav_utils::sfl_avcodec_init();
 }
-
-VideoPreference &
-VideoManager::getVideoPreferences()
-{
-    return videoPreference_;
-}
-
-std::vector<std::map<std::string, std::string> >
-VideoManager::getCodecs(const std::string &accountID)
-{
-    Account *acc = Manager::instance().getAccount(accountID);
-
-    if (acc != NULL)
-        return acc->getAllVideoCodecs();
-    else
-        return std::vector<std::map<std::string, std::string> >();
-}
-
-void
-VideoManager::setCodecs(const std::string& accountID,
-                         const std::vector<std::map<std::string, std::string> > &details)
-{
-    Account *acc = Manager::instance().getAccount(accountID);
-    if (acc != NULL) {
-        acc->setVideoCodecs(details);
-        Manager::instance().saveConfig();
-    }
-}
-
-std::vector<std::string>
-VideoManager::getDeviceList()
-{
-    return videoPreference_.getDeviceList();
-}
-
-std::vector<std::string>
-VideoManager::getDeviceChannelList(const std::string &dev)
-{
-    return videoPreference_.getChannelList(dev);
-}
-
-std::vector<std::string>
-VideoManager::getDeviceSizeList(const std::string &dev, const std::string &channel)
-{
-    return videoPreference_.getSizeList(dev, channel);
-}
-
-std::vector<std::string>
-VideoManager::getDeviceRateList(const std::string &dev, const std::string &channel, const std::string &size)
-{
-    return videoPreference_.getRateList(dev, channel, size);
-}
-
-std::string
-VideoManager::getActiveDevice()
-{
-    return videoPreference_.getDevice();
-}
-
-std::string
-VideoManager::getActiveDeviceChannel()
-{
-    return videoPreference_.getChannel();
-}
-
-std::string
-VideoManager::getActiveDeviceSize()
-{
-    return videoPreference_.getSize();
-}
-
-std::string
-VideoManager::getActiveDeviceRate()
-{
-    return videoPreference_.getRate();
-}
-
-void
-VideoManager::setActiveDevice(const std::string &device)
-{
-    DEBUG("Setting device to %s", device.c_str());
-    videoPreference_.setDevice(device);
-}
-
-void
-VideoManager::setActiveDeviceChannel(const std::string &channel)
-{
-    videoPreference_.setChannel(channel);
-}
-
-void
-VideoManager::setActiveDeviceSize(const std::string &size)
-{
-    videoPreference_.setSize(size);
-}
-
-void
-VideoManager::setActiveDeviceRate(const std::string &rate)
-{
-    videoPreference_.setRate(rate);
-}
-
-std::map<std::string, std::string>
-VideoManager::getSettingsFor(const std::string& device) {
-    return videoPreference_.getSettingsFor(device);
-}
-
-std::map<std::string, std::string>
-VideoManager::getSettings() {
-    return videoPreference_.getSettings();
-}
-
-void
-VideoManager::startCamera()
-{
-    if (hasCameraStarted()) {
-        WARN("Video preview was already started!");
-        return;
-    }
-
-    const std::string device = "v4l2://" + videoPreference_.getDevice();
-    videoInputSelector_.reset(new sfl_video::VideoInputSelector(device));
-}
-
-void
-VideoManager::stopCamera()
-{
-    if (not hasCameraStarted()) {
-        WARN("Video preview was already stopped");
-        return;
-    }
-
-    videoInputSelector_.reset();
-}
-
-bool
-VideoManager::switchInput(const std::string &resource)
-{
-    if (not hasCameraStarted()) {
-        ERROR("Input selector not initialized");
-        return false;
-    }
-
-    return videoInputSelector_->switchInput(resource);
-}
-
-std::weak_ptr<sfl_video::VideoFrameActiveWriter>
-VideoManager::getVideoCamera()
-{
-    return videoInputSelector_;
-}
-
-bool
-VideoManager::hasCameraStarted()
-{
-    // see http://stackoverflow.com/a/7580064/21185
-    return static_cast<bool>(videoInputSelector_);
-}
-
-std::string
-VideoManager::getCurrentCodecName(const std::string & /*callID*/)
-{
-    return "";
-}
diff --git a/daemon/src/client/videomanager.cpp b/daemon/src/client/videomanager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9e61e364607d4266b89f3680b618198db55f16af
--- /dev/null
+++ b/daemon/src/client/videomanager.cpp
@@ -0,0 +1,203 @@
+/*
+ *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
+ *  Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com>
+ *  Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
+ *  Author: Guillaume Carmel-Archambault <guillaume.carmel-archambault@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
+ *
+ *  Additional permission under GNU GPL version 3 section 7:
+ *
+ *  If you modify this program, or any covered work, by linking or
+ *  combining it with the OpenSSL project's OpenSSL library (or a
+ *  modified version of that library), containing parts covered by the
+ *  terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
+ *  grants you additional permission to convey the resulting work.
+ *  Corresponding Source for a non-source form of such a combination
+ *  shall include the source code for the parts of OpenSSL used as well
+ *  as that of the covered work.
+ */
+
+#include "videomanager.h"
+#include "video/libav_utils.h"
+#include "video/video_input_selector.h"
+#include "video/video_preferences.h"
+#include "account.h"
+#include "logger.h"
+#include "manager.h"
+
+VideoPreference &
+VideoManager::getVideoPreferences()
+{
+    return videoPreference_;
+}
+
+std::vector<std::map<std::string, std::string> >
+VideoManager::getCodecs(const std::string &accountID)
+{
+    Account *acc = Manager::instance().getAccount(accountID);
+
+    if (acc != NULL)
+        return acc->getAllVideoCodecs();
+    else
+        return std::vector<std::map<std::string, std::string> >();
+}
+
+void
+VideoManager::setCodecs(const std::string& accountID,
+                         const std::vector<std::map<std::string, std::string> > &details)
+{
+    Account *acc = Manager::instance().getAccount(accountID);
+    if (acc != NULL) {
+        acc->setVideoCodecs(details);
+        Manager::instance().saveConfig();
+    }
+}
+
+std::vector<std::string>
+VideoManager::getDeviceList()
+{
+    return videoPreference_.getDeviceList();
+}
+
+std::vector<std::string>
+VideoManager::getDeviceChannelList(const std::string &dev)
+{
+    return videoPreference_.getChannelList(dev);
+}
+
+std::vector<std::string>
+VideoManager::getDeviceSizeList(const std::string &dev, const std::string &channel)
+{
+    return videoPreference_.getSizeList(dev, channel);
+}
+
+std::vector<std::string>
+VideoManager::getDeviceRateList(const std::string &dev, const std::string &channel, const std::string &size)
+{
+    return videoPreference_.getRateList(dev, channel, size);
+}
+
+std::string
+VideoManager::getActiveDevice()
+{
+    return videoPreference_.getDevice();
+}
+
+std::string
+VideoManager::getActiveDeviceChannel()
+{
+    return videoPreference_.getChannel();
+}
+
+std::string
+VideoManager::getActiveDeviceSize()
+{
+    return videoPreference_.getSize();
+}
+
+std::string
+VideoManager::getActiveDeviceRate()
+{
+    return videoPreference_.getRate();
+}
+
+void
+VideoManager::setActiveDevice(const std::string &device)
+{
+    DEBUG("Setting device to %s", device.c_str());
+    videoPreference_.setDevice(device);
+}
+
+void
+VideoManager::setActiveDeviceChannel(const std::string &channel)
+{
+    videoPreference_.setChannel(channel);
+}
+
+void
+VideoManager::setActiveDeviceSize(const std::string &size)
+{
+    videoPreference_.setSize(size);
+}
+
+void
+VideoManager::setActiveDeviceRate(const std::string &rate)
+{
+    videoPreference_.setRate(rate);
+}
+
+std::map<std::string, std::string>
+VideoManager::getSettingsFor(const std::string& device) {
+    return videoPreference_.getSettingsFor(device);
+}
+
+std::map<std::string, std::string>
+VideoManager::getSettings() {
+    return videoPreference_.getSettings();
+}
+
+void
+VideoManager::startCamera()
+{
+    if (hasCameraStarted()) {
+        WARN("Video preview was already started!");
+        return;
+    }
+
+    const std::string device = "v4l2://" + videoPreference_.getDevice();
+    videoInputSelector_.reset(new sfl_video::VideoInputSelector(device));
+}
+
+void
+VideoManager::stopCamera()
+{
+    if (not hasCameraStarted()) {
+        WARN("Video preview was already stopped");
+        return;
+    }
+
+    videoInputSelector_.reset();
+}
+
+bool
+VideoManager::switchInput(const std::string &resource)
+{
+    if (not hasCameraStarted()) {
+        ERROR("Input selector not initialized");
+        return false;
+    }
+
+    return videoInputSelector_->switchInput(resource);
+}
+
+std::weak_ptr<sfl_video::VideoFrameActiveWriter>
+VideoManager::getVideoCamera()
+{
+    return videoInputSelector_;
+}
+
+bool
+VideoManager::hasCameraStarted()
+{
+    // see http://stackoverflow.com/a/7580064/21185
+    return static_cast<bool>(videoInputSelector_);
+}
+
+std::string
+VideoManager::getCurrentCodecName(const std::string & /*callID*/)
+{
+    return "";
+}