diff --git a/src/call.cpp b/src/call.cpp
index 38160f643a9343fa301569708212d96a6df94e7e..fa6b7ae1ae2f552771aa346ec72c9b636946eb55 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -881,6 +881,7 @@ void Call::nothing()
 void Call::error()
 {
    if (videoRenderer()) {
+      //Well, in this case we have no choice, it still doesn't belong here
       videoRenderer()->stopRendering();
    }
    throw QString("There was an error handling your call, please restart SFLPhone.Is you encounter this problem often, \
@@ -950,7 +951,7 @@ void Call::hangUp()
    m_pStopTimeStamp = curTime;
    qDebug() << "Hanging up call. callId : " << m_CallId << "ConfId:" << m_ConfId;
    bool ret;
-   if (videoRenderer()) {
+   if (videoRenderer()) { //TODO remove, cheap hack
       videoRenderer()->stopRendering();
    }
    if (!isConference())
@@ -1091,7 +1092,7 @@ void Call::startStop()
 void Call::stop()
 {
    qDebug() << "Stoping call. callId : " << m_CallId  << "ConfId:" << m_ConfId;
-   if (videoRenderer()) {
+   if (videoRenderer()) { //TODO remove, cheap hack
       videoRenderer()->stopRendering();
    }
    time_t curTime;
diff --git a/src/videomodel.cpp b/src/videomodel.cpp
index 75ee6a97437f5199fdc63c13c56d04747dcc33a4..8ca02e8903531a64e42e9592200009bdee743654 100644
--- a/src/videomodel.cpp
+++ b/src/videomodel.cpp
@@ -28,7 +28,7 @@
 VideoModel* VideoModel::m_spInstance = nullptr;
 
 ///Constructor
-VideoModel::VideoModel():QObject(),m_BufferSize(0),m_ShmKey(0),m_SemKey(0),m_PreviewState(false),m_Thread(this)
+VideoModel::VideoModel():QThread(),m_BufferSize(0),m_ShmKey(0),m_SemKey(0),m_PreviewState(false)
 {
    VideoInterface& interface = DBus::VideoManager::instance();
    connect( &interface , SIGNAL(deviceEvent())                           , this, SLOT(deviceEvent())                           );
@@ -104,15 +104,15 @@ void VideoModel::startedDecoding(const QString& id, const QString& shmPath, int
 
    if (m_lRenderers[id] == nullptr ) {
       m_lRenderers[id] = new VideoRenderer(id,shmPath,Resolution(width,height));
-      m_lRenderers[id]->moveToThread(&m_Thread);
+      m_lRenderers[id]->moveToThread(this);
+      if (!isRunning())
+         start();
    }
    else {
       VideoRenderer* renderer = m_lRenderers[id];
       renderer->setShmPath(shmPath);
       renderer->setResolution(QSize(width,height));
    }
-   if (!m_Thread.isRunning())
-      m_Thread.start();
 
    m_lRenderers[id]->startRendering();
    if (id != "local") {
@@ -129,8 +129,13 @@ void VideoModel::stoppedDecoding(const QString& id, const QString& shmPath)
    if ( r ) {
       r->stopRendering();
    }
+   qDebug() << "Video stopped for call" << id <<  "Renderer found:" << (m_lRenderers[id] != nullptr);
    m_lRenderers[id] = nullptr;
    delete r;
-   qDebug() << "Video stopped for call" << id <<  "Renderer found:" << (m_lRenderers[id] != nullptr);
    emit videoStopped();
 }
+
+void VideoModel::run()
+{
+   exec();
+}
diff --git a/src/videomodel.h b/src/videomodel.h
index 9dd62132a62defca9a1573313db5fd027a8ff135..d6fe21b330efff22ec88a426de7e69ebeebcaa9b 100644
--- a/src/videomodel.h
+++ b/src/videomodel.h
@@ -31,7 +31,7 @@ class Call;
 struct SHMHeader;
 
 ///VideoModel: Video event dispatcher
-class LIB_EXPORT VideoModel : public QObject {
+class LIB_EXPORT VideoModel : public QThread {
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
    Q_OBJECT
@@ -48,6 +48,9 @@ public:
    //Setters
    void       setBufferSize(uint size);
 
+protected:
+   void run();
+
 private:
    //Constructor
    VideoModel();
@@ -60,7 +63,6 @@ private:
    uint           m_BufferSize  ;
    uint           m_ShmKey      ;
    uint           m_SemKey      ;
-   QThread        m_Thread      ;
    QHash<QString,VideoRenderer*> m_lRenderers;
 
 public Q_SLOTS:
diff --git a/src/videorenderer.cpp b/src/videorenderer.cpp
index 85b470cb687f4e3b7c41f8595222c01a3b0a7549..7262dae7eb2fedf08d54fcdde9a3299df63beb9e 100644
--- a/src/videorenderer.cpp
+++ b/src/videorenderer.cpp
@@ -71,15 +71,14 @@ VideoRenderer::~VideoRenderer()
 }
 
 ///Get the data from shared memory and transform it into a QByteArray
-QByteArray VideoRenderer::renderToBitmap(QByteArray& data,bool& ok)
+bool VideoRenderer::renderToBitmap(QByteArray& data)
 {
    if (!m_isRendering) {
-      return QByteArray();
+      return false;
    }
 
    if (!shmLock()) {
-      ok = false;
-      return QByteArray();
+      return false;
    }
 
    // wait for a new buffer
@@ -111,20 +110,17 @@ QByteArray VideoRenderer::renderToBitmap(QByteArray& data,bool& ok)
 //             break;
 //       }
       if (err < 0) {
-         ok = false;
-         return QByteArray();
+         return false;
       }
 
       if (!shmLock()) {
-         ok = false;
-         return QByteArray();
+         return false;
       }
    }
 
    if (!resizeShm()) {
       qDebug() << "Could not resize shared memory";
-      ok = false;
-      return QByteArray();
+      return false;
    }
 
    if (data.size() != m_pShmArea->m_BufferSize)
@@ -132,7 +128,8 @@ QByteArray VideoRenderer::renderToBitmap(QByteArray& data,bool& ok)
    memcpy(data.data(),m_pShmArea->m_Data,m_pShmArea->m_BufferSize);
    m_BufferGen = m_pShmArea->m_BufferGen;
    shmUnlock();
-   return data;
+//    return data;
+   return true;
 }
 
 ///Connect to the shared memory
@@ -243,9 +240,9 @@ timespec VideoRenderer::createTimeout()
 ///Update the buffer
 void VideoRenderer::timedEvents()
 {
-   bool ok = true;
    m_pMutex->lock();
-   renderToBitmap(m_Frame,ok);
+
+   bool ok = renderToBitmap(m_Frame);
    m_pMutex->unlock();
    if (ok == true) {
       emit frameUpdated();
@@ -294,7 +291,7 @@ void VideoRenderer::stopRendering()
 ///Get the raw bytes directly from the SHM, not recommended, but optimal
 const char* VideoRenderer::rawData()
 {
-   return m_isRendering?m_pShmArea->m_Data:nullptr;
+   return m_isRendering?m_Frame.data():nullptr;
 }
 
 ///Is this redenrer active
diff --git a/src/videorenderer.h b/src/videorenderer.h
index 4b5a9b877ec9b22c19d1022538e9acbbd112b064..bd75e597f8d05e689db52c36cc8b8ec94510a213 100644
--- a/src/videorenderer.h
+++ b/src/videorenderer.h
@@ -48,7 +48,6 @@ class LIB_EXPORT VideoRenderer : public QObject {
       bool startShm ();
 
       //Getters
-      QByteArray  renderToBitmap(QByteArray& data, bool& ok);
       const char* rawData         ();
       bool        isRendering     ();
       QByteArray  currentFrame    ();
@@ -82,6 +81,7 @@ class LIB_EXPORT VideoRenderer : public QObject {
       timespec createTimeout();
       bool     shmLock      ();
       void     shmUnlock    ();
+      bool     renderToBitmap(QByteArray& data);
 
    private Q_SLOTS:
       void timedEvents();