diff --git a/CMakeLists.txt b/CMakeLists.txt
index f7b5121746fd488fa670727861278dab95ccaa70..55b127e984220fbb25acbf2f542277a6f4e0b5eb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -205,7 +205,6 @@ SET( libringclient_LIB_SRCS
   src/video/sourcesmodel.cpp
   src/video/channel.cpp
   src/video/resolution.cpp
-  src/video/manager.cpp
   src/audio/alsapluginmodel.cpp
   src/audio/inputdevicemodel.cpp
   src/audio/managermodel.cpp
@@ -241,6 +240,8 @@ SET( libringclient_LIB_SRCS
   src/categorizedcompositenode.cpp
   src/hookmanager.cpp
   src/vcardutils.cpp
+  src/private/videorenderermanager.cpp
+  src/video/previewmanager.cpp
 
   #Extension
   src/extensions/presencecollectionextension.cpp
@@ -316,11 +317,11 @@ SET(libringclient_video_LIB_HDRS
   src/video/device.h
   src/video/devicemodel.h
   src/video/sourcesmodel.h
-  src/video/manager.h
   src/video/renderer.h
   src/video/resolution.h
   src/video/channel.h
   src/video/rate.h
+  src/video/previewmanager.h
   #The renderer implementations are not exported on purpose
 )
 
diff --git a/src/call.cpp b/src/call.cpp
index cf89a3c289a457c5b2c41a94d4ca8371d8d0f651..9133aa3b416e0a2c8465684b601936499f4e1321 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -41,7 +41,7 @@
 #include "account.h"
 #include "accountmodel.h"
 #include "availableaccountmodel.h"
-#include "video/manager.h"
+#include "private/videorenderermanager.h"
 #include "historymodel.h"
 #include "instantmessagingmodel.h"
 #include "useractionmodel.h"
@@ -755,7 +755,7 @@ bool Call::hasRemote() const
 bool Call::hasVideo() const
 {
    #ifdef ENABLE_VIDEO
-   return Video::Manager::instance()->getRenderer(this) != nullptr;
+   return VideoRendererManager::instance()->getRenderer(this) != nullptr;
    #else
    return false;
    #endif
@@ -810,7 +810,17 @@ bool Call::isSecure() const
 Video::Renderer* Call::videoRenderer() const
 {
    #ifdef ENABLE_VIDEO
-   return Video::Manager::instance()->getRenderer(this);
+   return VideoRendererManager::instance()->getRenderer(this);
+   #else
+   return nullptr;
+   #endif
+}
+
+
+void CallPrivate::registerRenderer(Video::Renderer* renderer)
+{
+   #ifdef ENABLE_VIDEO
+   emit q_ptr->videoStarted(renderer);
    #else
    return nullptr;
    #endif
diff --git a/src/call.h b/src/call.h
index 0a9cda95821c098491513ef2f8cb90ac0ce31f64..7d17005ff5deb09d65b6084766477b5152bc7c9e 100644
--- a/src/call.h
+++ b/src/call.h
@@ -42,6 +42,7 @@ class Certificate           ;
 namespace Video {
    class Manager;
    class Renderer;
+   class ManagerPrivate;
 }
 
 class Call;
@@ -72,7 +73,8 @@ public:
    friend class HistoryModel         ;
    friend class CallModelPrivate     ;
    friend class IMConversationManager;
-   friend class Video::Manager       ;
+   friend class VideoRendererManager;
+   friend class VideoRendererManagerPrivate;
 
    //Enum
 
@@ -329,6 +331,8 @@ Q_SIGNALS:
    void startTimeStampChanged(time_t newTimeStamp);
    ///The dial number has changed
    void dialNumberChanged(const QString& number);
+   ///Announce a new video renderer
+   void videoStarted(Video::Renderer* renderer);
 };
 
 Q_DECLARE_METATYPE(Call*)
diff --git a/src/callmodel.cpp b/src/callmodel.cpp
index fbee91a2bf8cb7723b93fa09bb913897a4ba1740..6a2a20eb25bc22d280a0d77f87406e5dc8a7b46f 100644
--- a/src/callmodel.cpp
+++ b/src/callmodel.cpp
@@ -34,6 +34,7 @@
 #include "dbus/callmanager.h"
 #include "dbus/configurationmanager.h"
 #include "dbus/instancemanager.h"
+#include "private/videorenderermanager.h"
 #include "mime.h"
 #include "typedefs.h"
 #include "collectioninterface.h"
@@ -42,6 +43,7 @@
 #include "delegates/phonenumberselectordelegate.h"
 #include "personmodel.h"
 #include "useractionmodel.h"
+#include "video/renderer.h"
 
 //Other
 #include <unistd.h>
@@ -137,6 +139,9 @@ CallModel::CallModel() : QAbstractItemModel(QCoreApplication::instance()),d_ptr(
    //Register with the daemon
    InstanceInterface& instance = DBus::InstanceManager::instance();
    setObjectName("CallModel");
+   #ifdef ENABLE_VIDEO
+   VideoRendererManager::instance();
+   #endif
 } //CallModel
 
 ///Constructor (there fix an initializationn loop)
@@ -411,6 +416,9 @@ Call* CallModelPrivate::addCall2(Call* call, Call* parentCall)
       emit q_ptr->dataChanged(idx, idx);
       connect(call,SIGNAL(changed(Call*)),this,SLOT(slotCallChanged(Call*)));
       connect(call,SIGNAL(dtmfPlayed(QString)),this,SLOT(slotDTMFPlayed(QString)));
+      connect(call,&Call::videoStarted,[this,call](Video::Renderer* r){
+         emit q_ptr->rendererAdded(call, r);
+      });
       emit q_ptr->layoutChanged();
    }
    return call;
diff --git a/src/callmodel.h b/src/callmodel.h
index 60c7084f5df8b492b528952b740abb689845505c..303a9ba71462d8708e0180fd039338292af1b7c3 100644
--- a/src/callmodel.h
+++ b/src/callmodel.h
@@ -34,6 +34,11 @@ class ContactMethod;
 class CallModelPrivate;
 class CallPrivate;
 
+namespace Video {
+   class ManagerPrivate;
+   class Renderer;
+}
+
 //Typedef
 typedef QMap<uint, Call*>  CallMap;
 typedef QList<Call*>       CallList;
@@ -50,6 +55,8 @@ Q_OBJECT
    friend class IMConversationManagerPrivate;
    //Now that the ID is set at a later time, this model need to be notified
    friend class CallPrivate;
+   //The renderer use DringId as identifiers and have to be matched to calls
+   friend class VideoRendererManagerPrivate;
 
 public:
    ///Accepted (mime) payload types
@@ -95,6 +102,7 @@ public:
    bool                 hasConference       () const;
    bool                 isConnected         () const;
    UserActionModel*     userActionModel     () const;
+   QItemSelectionModel* selectionModel      () const;
 
    Q_INVOKABLE Call* getCall ( const QModelIndex& idx ) const;
 
@@ -112,7 +120,6 @@ public:
    virtual bool          dropMimeData ( const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent ) override;
    virtual QHash<int,QByteArray> roleNames() const override;
 
-   QItemSelectionModel* selectionModel() const;
 
    //Singleton
    static CallModel* instance();
@@ -144,6 +151,8 @@ Q_SIGNALS:
    void conferenceRemoved       ( Call* conf                              );
    ///Emitted when a call is added
    void callAdded               ( Call* call               , Call* parent );
+   ///Emitted when a new Video::Renderer is available
+   void rendererAdded           ( Call* call, Video::Renderer* renderer   );
 };
 Q_DECLARE_METATYPE(CallModel*)
 
diff --git a/src/private/call_p.h b/src/private/call_p.h
index 096b364a85cf34deeb41e9a3a9f2ea0567bd25d9..17585cadf7ac4814cc98fe91a39bcf032f1e35b2 100644
--- a/src/private/call_p.h
+++ b/src/private/call_p.h
@@ -219,6 +219,7 @@ public:
    void changeCurrentState(Call::State newState);
    void setStartTimeStamp(time_t stamp);
    void initTimer();
+   void registerRenderer(Video::Renderer* renderer);
 
    //Static getters
    static Call::State        startStateFromDaemonCallState ( const QString& daemonCallState, const QString& daemonCallType );
diff --git a/src/private/directrenderer.cpp b/src/private/directrenderer.cpp
index e5611ccac020a7d0f90ff410122b9221c1793036..fea4ed26d0c3044fb5f8dafe995b99463ec41590 100644
--- a/src/private/directrenderer.cpp
+++ b/src/private/directrenderer.cpp
@@ -27,7 +27,7 @@
 #define CLOCK_REALTIME 0
 #endif
 
-#include "video/manager.h"
+#include "private/videorenderermanager.h"
 #include "video/resolution.h"
 #include "private/videorenderer_p.h"
 
diff --git a/src/private/shmrenderer.cpp b/src/private/shmrenderer.cpp
index 44e4ef10696d72fc55eb8183a84341f6a330e4de..9a327dab16fd8cedfd69c62fd3cf3717b4a2e7de 100644
--- a/src/private/shmrenderer.cpp
+++ b/src/private/shmrenderer.cpp
@@ -37,7 +37,7 @@
 #endif
 
 #include <QtCore/QTimer>
-#include "video/manager.h"
+#include "private/videorenderermanager.h"
 #include "video/resolution.h"
 #include "private/videorenderer_p.h"
 
@@ -128,7 +128,7 @@ bool Video::ShmRendererPrivate::renderToBitmap()
       return false;
    }
 
-   if(!Video::Manager::instance()->startStopMutex()->tryLock())
+   if(!VideoRendererManager::instance()->startStopMutex()->tryLock())
       return false;
 
    // wait for a new buffer
@@ -160,7 +160,7 @@ bool Video::ShmRendererPrivate::renderToBitmap()
 //             break;
 //       }
       if ((err < 0) || (!shmLock())) {
-         Video::Manager::instance()->startStopMutex()->unlock();
+         VideoRendererManager::instance()->startStopMutex()->unlock();
          return false;
       }
       usleep((1/60.0)*100);
@@ -168,7 +168,7 @@ bool Video::ShmRendererPrivate::renderToBitmap()
 
    if (!q_ptr->resizeShm()) {
       qDebug() << "Could not resize shared memory";
-      Video::Manager::instance()->startStopMutex()->unlock();
+      VideoRendererManager::instance()->startStopMutex()->unlock();
       return false;
    }
 
@@ -179,7 +179,7 @@ bool Video::ShmRendererPrivate::renderToBitmap()
    shmUnlock();
    static_cast<Video::Renderer*>(q_ptr)->d_ptr->updateFrameIndex();
 
-   Video::Manager::instance()->startStopMutex()->unlock();
+   VideoRendererManager::instance()->startStopMutex()->unlock();
    return true;
 #else
    return false;
@@ -306,7 +306,7 @@ void Video::ShmRendererPrivate::timedEvents()
 ///Start the rendering loop
 void Video::ShmRenderer::startRendering()
 {
-   Video::Manager::instance()->startStopMutex()->lock();
+   VideoRendererManager::instance()->startStopMutex()->lock();
    QMutexLocker locker(mutex());
    startShm();
    if (!d_ptr->m_pTimer) {
@@ -325,21 +325,21 @@ void Video::ShmRenderer::startRendering()
       qDebug() << "Timer already started!";
 
    setRendering(true);
-   Video::Manager::instance()->startStopMutex()->unlock();
+   VideoRendererManager::instance()->startStopMutex()->unlock();
 }
 
 ///Stop the rendering loop
 void Video::ShmRenderer::stopRendering()
 {
-   Video::Manager::instance()->startStopMutex()->lock();
+   VideoRendererManager::instance()->startStopMutex()->lock();
    QMutexLocker locker(mutex());
    setRendering(false);
-   qDebug() << "Stopping rendering on" << id();
+   qDebug() << "Stopping rendering on" << this;
    if (d_ptr->m_pTimer)
       d_ptr->m_pTimer->stop();
    emit stopped();
    stopShm();
-   Video::Manager::instance()->startStopMutex()->unlock();
+   VideoRendererManager::instance()->startStopMutex()->unlock();
 }
 
 
diff --git a/src/video/manager.cpp b/src/private/videorenderermanager.cpp
similarity index 76%
rename from src/video/manager.cpp
rename to src/private/videorenderermanager.cpp
index 672c625fcf0450bc28f56e8dd0cd576d4e9fb89e..4086b791f3d60c68bbd010fd415330f12aa1d03d 100644
--- a/src/video/manager.cpp
+++ b/src/private/videorenderermanager.cpp
@@ -16,22 +16,23 @@
  *   You should have received a copy of the GNU General Public License      *
  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
  ***************************************************************************/
-#include "manager.h"
+#include "videorenderermanager.h"
 
 //Qt
 #include <QtCore/QMutex>
 
 //Ring
 #include "../dbus/videomanager.h"
-#include "device.h"
+#include "video/device.h"
 #include <call.h>
 #include <callmodel.h>
-#include "renderer.h"
-#include "devicemodel.h"
-#include "channel.h"
-#include "rate.h"
-#include "resolution.h"
+#include "video/renderer.h"
+#include "video/devicemodel.h"
+#include "video/channel.h"
+#include "video/rate.h"
+#include "video/resolution.h"
 #include "private/videorate_p.h"
+#include "private/call_p.h"
 #if defined(Q_OS_DARWIN)
 #include "private/directrenderer.h"
 #else
@@ -40,15 +41,14 @@
 
 
 //Static member
-Video::Manager* Video::Manager::m_spInstance = nullptr;
+VideoRendererManager* VideoRendererManager::m_spInstance = nullptr;
 
-namespace Video {
-class ManagerPrivate : public QObject
+class VideoRendererManagerPrivate : public QObject
 {
    Q_OBJECT
 
 public:
-   ManagerPrivate(Video::Manager* parent);
+   VideoRendererManagerPrivate(VideoRendererManager* parent);
 
    //Attributes
    bool           m_PreviewState;
@@ -57,7 +57,7 @@ public:
    QHash<QByteArray,Video::Renderer*> m_lRenderers;
 
 private:
-   Video::Manager* q_ptr;
+   VideoRendererManager* q_ptr;
 
 private Q_SLOTS:
    void startedDecoding(const QString& id, const QString& shmPath, int width, int height);
@@ -65,16 +65,15 @@ private Q_SLOTS:
    void deviceEvent();
 
 };
-}
 
-Video::ManagerPrivate::ManagerPrivate(Video::Manager* parent) : QObject(parent), q_ptr(parent),
+VideoRendererManagerPrivate::VideoRendererManagerPrivate(VideoRendererManager* parent) : QObject(parent), q_ptr(parent),
 m_BufferSize(0),m_PreviewState(false),m_SSMutex(new QMutex())
 {
 
 }
 
 ///Constructor
-Video::Manager::Manager():QThread(), d_ptr(new Video::ManagerPrivate(this))
+VideoRendererManager::VideoRendererManager():QThread(), d_ptr(new VideoRendererManagerPrivate(this))
 {
    VideoManagerInterface& interface = DBus::VideoManager::instance();
    connect( &interface , SIGNAL(deviceEvent())                           , d_ptr.data(), SLOT(deviceEvent())                           );
@@ -83,29 +82,29 @@ Video::Manager::Manager():QThread(), d_ptr(new Video::ManagerPrivate(this))
 }
 
 
-Video::Manager::~Manager()
+VideoRendererManager::~VideoRendererManager()
 {
 //    delete d_ptr;
 }
 
 ///Singleton
-Video::Manager* Video::Manager::instance()
+VideoRendererManager* VideoRendererManager::instance()
 {
    if (!m_spInstance) {
-      m_spInstance = new Video::Manager();
+      m_spInstance = new VideoRendererManager();
    }
    return m_spInstance;
 }
 
 ///Return the call Renderer or nullptr
-Video::Renderer* Video::Manager::getRenderer(const Call* call) const
+Video::Renderer* VideoRendererManager::getRenderer(const Call* call) const
 {
    if (!call) return nullptr;
    return d_ptr->m_lRenderers[call->dringId().toLatin1()];
 }
 
 ///Get the video preview Renderer
-Video::Renderer* Video::Manager::previewRenderer()
+Video::Renderer* VideoRendererManager::previewRenderer()
 {
    if (!d_ptr->m_lRenderers["local"]) {
       Video::Resolution* res = Video::DeviceModel::instance()->activeDevice()->activeChannel()->activeResolution();
@@ -124,7 +123,7 @@ Video::Renderer* Video::Manager::previewRenderer()
 }
 
 ///Stop video preview
-void Video::Manager::stopPreview()
+void VideoRendererManager::stopPreview()
 {
    VideoManagerInterface& interface = DBus::VideoManager::instance();
    interface.stopCamera();
@@ -132,7 +131,7 @@ void Video::Manager::stopPreview()
 }
 
 ///Start video preview
-void Video::Manager::startPreview()
+void VideoRendererManager::startPreview()
 {
    if (d_ptr->m_PreviewState) return;
    VideoManagerInterface& interface = DBus::VideoManager::instance();
@@ -141,28 +140,28 @@ void Video::Manager::startPreview()
 }
 
 ///Is the video model fetching preview from a camera
-bool Video::Manager::isPreviewing()
+bool VideoRendererManager::isPreviewing()
 {
    return d_ptr->m_PreviewState;
 }
 
 ///@todo Set the video buffer size
-void Video::Manager::setBufferSize(uint size)
+void VideoRendererManager::setBufferSize(uint size)
 {
    d_ptr->m_BufferSize = size;
 }
 
 ///Event callback
-void Video::ManagerPrivate::deviceEvent()
+void VideoRendererManagerPrivate::deviceEvent()
 {
    //TODO is there anything useful to do?
 }
 
 ///A video is not being rendered
-void Video::ManagerPrivate::startedDecoding(const QString& id, const QString& shmPath, int width, int height)
+void VideoRendererManagerPrivate::startedDecoding(const QString& id, const QString& shmPath, int width, int height)
 {
 
-   QSize res = QSize(width,height);
+   const QSize res = QSize(width,height);
 
    if (m_lRenderers[id.toLatin1()] == nullptr ) {
 #if defined(Q_OS_DARWIN)
@@ -179,7 +178,7 @@ void Video::ManagerPrivate::startedDecoding(const QString& id, const QString& sh
       //TODO: do direct renderer stuff here
       m_lRenderers[id.toLatin1()]->setSize(res);
 #if !defined(Q_OS_DARWIN)
-      static_cast<ShmRenderer*>(m_lRenderers[id.toLatin1()])->setShmPath(shmPath);
+      static_cast<Video::ShmRenderer*>(m_lRenderers[id.toLatin1()])->setShmPath(shmPath);
 #endif
    }
 
@@ -190,7 +189,9 @@ void Video::ManagerPrivate::startedDecoding(const QString& id, const QString& sh
    }
    if (id != "local") {
       qDebug() << "Starting video for call" << id;
-      emit q_ptr->videoCallInitiated(m_lRenderers[id.toLatin1()]);
+      Call* c = CallModel::instance()->getCall(id);
+      if (c)
+         c->d_ptr->registerRenderer(m_lRenderers[id.toLatin1()]);
    }
    else {
       m_PreviewState = true;
@@ -200,7 +201,7 @@ void Video::ManagerPrivate::startedDecoding(const QString& id, const QString& sh
 }
 
 ///A video stopped being rendered
-void Video::ManagerPrivate::stoppedDecoding(const QString& id, const QString& shmPath)
+void VideoRendererManagerPrivate::stoppedDecoding(const QString& id, const QString& shmPath)
 {
    Q_UNUSED(shmPath)
    Video::Renderer* r = m_lRenderers[id.toLatin1()];
@@ -224,15 +225,15 @@ void Video::ManagerPrivate::stoppedDecoding(const QString& id, const QString& sh
    delete r;
 }
 
-void Video::Manager::switchDevice(const Video::Device* device) const
+void VideoRendererManager::switchDevice(const Video::Device* device) const
 {
    VideoManagerInterface& interface = DBus::VideoManager::instance();
    interface.switchInput(device->id());
 }
 
-QMutex* Video::Manager::startStopMutex() const
+QMutex* VideoRendererManager::startStopMutex() const
 {
    return d_ptr->m_SSMutex;
 }
 
-#include <manager.moc>
+#include <videorenderermanager.moc>
diff --git a/src/video/manager.h b/src/private/videorenderermanager.h
similarity index 77%
rename from src/video/manager.h
rename to src/private/videorenderermanager.h
index 9e127bc3a4c1c70a27e8017cdfe784c5ce75a3b8..1bcf167d116c0b3eb9763c8d0058bb74fba478cc 100644
--- a/src/video/manager.h
+++ b/src/private/videorenderermanager.h
@@ -15,8 +15,8 @@
  *   You should have received a copy of the Lesser GNU General Public License *
  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.    *
  *****************************************************************************/
-#ifndef MANAGER_H
-#define MANAGER_H
+#ifndef VIDEORENDERERMANAGER_H
+#define VIDEORENDERERMANAGER_H
 //Base
 #include <typedefs.h>
 #include <QtCore/QThread>
@@ -25,7 +25,7 @@
 #include <QtCore/QHash>
 
 //Ring
-#include "device.h"
+#include "video/device.h"
 namespace Video {
    class Renderer;
 }
@@ -33,55 +33,45 @@ class Call;
 class QMutex;
 struct SHMHeader;
 
-namespace Video {
 
-class ManagerPrivate;
+class VideoRendererManagerPrivate;
 
 ///VideoModel: Video event dispatcher
-class LIB_EXPORT Manager : public QThread {
+class VideoRendererManager : public QThread {
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
    Q_OBJECT
    #pragma GCC diagnostic pop
 public:
    //Singleton
-   static Manager* instance();
+   static VideoRendererManager* instance();
 
    //Getters
-   bool       isPreviewing       ();
-   Video::Renderer* getRenderer(const Call* call) const;
+   bool             isPreviewing   ();
    Video::Renderer* previewRenderer();
-   QMutex* startStopMutex() const;
 
-   //Setters
+   //Helpers
+   Video::Renderer* getRenderer(const Call* call) const;
+   QMutex* startStopMutex() const;
    void setBufferSize(uint size);
    void switchDevice(const Video::Device* device) const;
 
-protected:
-//    void run();
-
 private:
    //Constructor
-   explicit Manager();
-   virtual ~Manager();
+   explicit VideoRendererManager();
+   virtual ~VideoRendererManager();
 
-   QScopedPointer<ManagerPrivate> d_ptr;
-   Q_DECLARE_PRIVATE(Manager)
+   QScopedPointer<VideoRendererManagerPrivate> d_ptr;
+   Q_DECLARE_PRIVATE(VideoRendererManager)
 
    //Static attributes
-   static Manager* m_spInstance;
+   static VideoRendererManager* m_spInstance;
 
 public Q_SLOTS:
    void stopPreview ();
    void startPreview();
 
 Q_SIGNALS:
-   ///Emitted when a new frame is ready
-//    void frameUpdated();
-   ///Emmitted when the video is stopped, before the framebuffer become invalid
-//    void videoStopped();
-   ///Emmitted when a call make video available
-   void videoCallInitiated(Video::Renderer*);
    ///The preview started/stopped
    void previewStateChanged(bool startStop);
    void previewStarted(Video::Renderer* Renderer);
@@ -89,6 +79,5 @@ Q_SIGNALS:
 
 };
 
-}
 
 #endif
diff --git a/src/video/device.h b/src/video/device.h
index 8ebbca85fb7c8b68f69c7bd105ee22fb56bb39a6..123faea9a9c53c00079bf5ea855b4112c9de4dc5 100644
--- a/src/video/device.h
+++ b/src/video/device.h
@@ -46,8 +46,8 @@ namespace Video {
 ///Device: V4L devices used to record video for video call
 class LIB_EXPORT Device : public QAbstractListModel {
    Q_OBJECT
-   friend class Video::Manager;
-   friend class Video::ManagerPrivate;
+   friend class VideoRendererManager;
+   friend class VideoRendererManagerPrivate;
    friend class Video::DeviceModel;
    friend class VideoDevicePrivate;
 
diff --git a/src/video/previewmanager.cpp b/src/video/previewmanager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5bf05c7b6d55468f972827637ee5a146a7fc39b3
--- /dev/null
+++ b/src/video/previewmanager.cpp
@@ -0,0 +1,71 @@
+/******************************************************************************
+ *   Copyright (C) 2012-2015 by Savoir-Faire Linux                            *
+ *   Author : Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>   *
+ *                                                                            *
+ *   This library is free software; you can redistribute it and/or            *
+ *   modify it under the terms of the GNU Lesser General Public               *
+ *   License as published by the Free Software Foundation; either             *
+ *   version 2.1 of the License, or (at your option) any later version.       *
+ *                                                                            *
+ *   This library 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        *
+ *   Lesser General Public License for more details.                          *
+ *                                                                            *
+ *   You should have received a copy of the Lesser GNU General Public License *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.    *
+ *****************************************************************************/
+#include "previewmanager.h"
+
+#include "private/videorenderermanager.h"
+#include "video/renderer.h"
+
+Video::PreviewManager* Video::PreviewManager::m_spInstance = nullptr;
+
+
+Video::PreviewManager* Video::PreviewManager::instance()
+{
+   if (!m_spInstance)
+      m_spInstance = new PreviewManager();
+
+   return m_spInstance;
+}
+
+//Getters
+bool Video::PreviewManager::isPreviewing()
+{
+   return VideoRendererManager::instance()->isPreviewing();
+}
+
+Video::Renderer* Video::PreviewManager::previewRenderer()
+{
+   return VideoRendererManager::instance()->previewRenderer();
+}
+
+Video::PreviewManager::PreviewManager() : QObject(VideoRendererManager::instance())
+{
+   connect(VideoRendererManager::instance(), &VideoRendererManager::previewStateChanged, [this](bool startStop) {
+      emit previewStateChanged(startStop);
+   });
+   connect(VideoRendererManager::instance(), &VideoRendererManager::previewStarted     , [this](Video::Renderer* renderer) {
+      emit previewStarted(renderer);
+   });
+   connect(VideoRendererManager::instance(), &VideoRendererManager::previewStopped     , [this](Video::Renderer* renderer) {
+      emit previewStopped(renderer);
+   });
+}
+
+Video::PreviewManager::~PreviewManager()
+{
+   
+}
+
+void Video::PreviewManager::stopPreview()
+{
+   return VideoRendererManager::instance()->stopPreview();
+}
+
+void Video::PreviewManager::startPreview()
+{
+   return VideoRendererManager::instance()->startPreview();
+}
diff --git a/src/video/previewmanager.h b/src/video/previewmanager.h
new file mode 100644
index 0000000000000000000000000000000000000000..c9c198041ee1116f8c4d4eda93dc77984d2f716e
--- /dev/null
+++ b/src/video/previewmanager.h
@@ -0,0 +1,67 @@
+/******************************************************************************
+ *   Copyright (C) 2012-2015 by Savoir-Faire Linux                            *
+ *   Author : Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>   *
+ *                                                                            *
+ *   This library is free software; you can redistribute it and/or            *
+ *   modify it under the terms of the GNU Lesser General Public               *
+ *   License as published by the Free Software Foundation; either             *
+ *   version 2.1 of the License, or (at your option) any later version.       *
+ *                                                                            *
+ *   This library 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        *
+ *   Lesser General Public License for more details.                          *
+ *                                                                            *
+ *   You should have received a copy of the Lesser GNU General Public License *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.    *
+ *****************************************************************************/
+#ifndef PREVIEWMANGER_H
+#define PREVIEWMANGER_H
+
+#include <QtCore/QObject>
+
+#include <typedefs.h>
+
+namespace Video {
+
+   class Renderer;
+
+/**
+ * This class is used to enable, disable and use the video preview.
+ *
+ * The preview can be embedded into video widgets or used for configuration.
+ */
+class LIB_EXPORT PreviewManager : public QObject
+{
+   Q_OBJECT
+
+public:
+   //Singleton
+   static PreviewManager* instance();
+
+   //Getters
+   bool             isPreviewing   ();
+   Video::Renderer* previewRenderer();
+
+private:
+   //Constructor
+   explicit PreviewManager();
+   virtual ~PreviewManager();
+
+   //Static attributes
+   static PreviewManager* m_spInstance;
+
+public Q_SLOTS:
+   void stopPreview ();
+   void startPreview();
+
+Q_SIGNALS:
+   ///The preview started/stopped
+   void previewStateChanged(bool startStop);
+   void previewStarted(Video::Renderer* renderer);
+   void previewStopped(Video::Renderer* renderer);
+};
+
+}
+
+#endif
\ No newline at end of file
diff --git a/src/video/renderer.cpp b/src/video/renderer.cpp
index c7c640c3516e8f98139a4f62a5aa11d70b98c8c5..4f136e9ccf648aed88e9b9738df89b02e56e9725 100644
--- a/src/video/renderer.cpp
+++ b/src/video/renderer.cpp
@@ -30,8 +30,9 @@ m_pMutex(new QMutex()), m_FrameIdx(false)
 
 Video::Renderer::Renderer(const QByteArray& id, const QSize& res) : d_ptr(new RendererPrivate(this))
 {
-  d_ptr->m_pSize = res;
-  d_ptr->m_Id = id;
+   setObjectName("Renderer:"+id);
+   d_ptr->m_pSize = res;
+   d_ptr->m_Id = id;
 }
 
 Video::Renderer::~Renderer()
@@ -61,12 +62,6 @@ const QByteArray& Video::Renderer::currentFrame() const
   return isRendering()?d_ptr->m_Frame[d_ptr->m_FrameIdx]:empty;
 }
 
-///Get id of this renderer
-QString Video::Renderer::id() const
-{
-  return d_ptr->m_Id;
-}
-
 ///Get mutex, in case renderer and views are not in the same thread
 QMutex* Video::Renderer::mutex() const
 {
diff --git a/src/video/renderer.h b/src/video/renderer.h
index 9374ca43d45e47649281167cda5e8541f1cda242..6b6e05ec813ba7e1b0a8a29f9d7d6a4a186e30aa 100644
--- a/src/video/renderer.h
+++ b/src/video/renderer.h
@@ -61,7 +61,6 @@ public:
    virtual const QByteArray& currentFrame    () const;
    virtual QSize             size            () const;
    virtual QMutex*           mutex           () const;
-   virtual QString           id              () const;
 
    //Setters
    void setRendering(bool rendering)            const;