diff -Naur qt-gstreamer-orig/elements/gstqtvideosink/CMakeLists.txt qt-gstreamer/elements/gstqtvideosink/CMakeLists.txt
--- qt-gstreamer-orig/elements/gstqtvideosink/CMakeLists.txt	2013-06-28 11:29:16.052978040 +0200
+++ qt-gstreamer/elements/gstqtvideosink/CMakeLists.txt	2013-07-02 11:27:02.432915899 +0200
@@ -19,6 +19,10 @@
     ${CMAKE_CURRENT_BINARY_DIR}/gstqtvideosinkmarshal.c
 )
 
+if (USE_QT5)
+    set(GstQtVideoSink_SRCS ${GstQtVideoSink_SRCS} ../../src/QGst/Ui/videonode.cpp)
+endif()
+
 if (Qt4or5_OpenGL_FOUND AND (OPENGL_FOUND OR OPENGLES2_FOUND))
     set(GstQtVideoSink_GL_SRCS
         openglsurfacepainter.cpp
@@ -55,7 +59,11 @@
     ${GSTREAMER_INTERFACES_LIBRARY}
     ${GstQtVideoSink_GL_LIBS}
 )
-qt4or5_use_modules(gst${QTVIDEOSINK_NAME} Core Gui Widgets)
+if (USE_QT5)
+    qt4or5_use_modules(gst${QTVIDEOSINK_NAME} Core Gui Widgets Quick2)
+else()
+    qt4or5_use_modules(gst${QTVIDEOSINK_NAME} Core Gui Widgets)
+endif()
 if (Qt4or5_OpenGL_FOUND AND (OPENGL_FOUND OR OPENGLES2_FOUND))
     qt4or5_use_modules(gst${QTVIDEOSINK_NAME} OpenGL)
 endif()
diff -Naur qt-gstreamer-orig/elements/gstqtvideosink/gstqtglvideosink.cpp qt-gstreamer/elements/gstqtvideosink/gstqtglvideosink.cpp
--- qt-gstreamer-orig/elements/gstqtvideosink/gstqtglvideosink.cpp	2013-06-28 11:29:16.052978040 +0200
+++ qt-gstreamer/elements/gstqtvideosink/gstqtglvideosink.cpp	2013-07-02 11:59:39.058724600 +0200
@@ -1,6 +1,7 @@
 /*
     Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). <qt-info@nokia.com>
     Copyright (C) 2011-2012 Collabora Ltd. <info@collabora.com>
+    Copyright (C) 2013 basysKom GmbH <info@basyskom.com>
 
     This library is free software; you can redistribute it and/or modify
     it under the terms of the GNU Lesser General Public License version 2.1
@@ -51,6 +52,7 @@
 
     GstQtGLVideoSinkClass *qt_video_sink_class = reinterpret_cast<GstQtGLVideoSinkClass*>(g_class);
     qt_video_sink_class->paint = GstQtGLVideoSink::paint;
+    qt_video_sink_class->updatePaintNode = GstQtGLVideoSink::updatePaintNode;
 
     /**
      * GstQtGLVideoSink::paint
@@ -81,6 +83,34 @@
                      G_TYPE_POINTER, G_TYPE_QREAL, G_TYPE_QREAL, G_TYPE_QREAL, G_TYPE_QREAL);
 
     /**
+     * GstQtGLVideoSink::updatePaintNode
+     * @sgnode: A valid QSGNode pointer that will be used to render the video
+     * @x: The x coordinate of the target area rectangle
+     * @y: The y coordinate of the target area rectangle
+     * @width: The width of the target area rectangle
+     * @height: The height of the target area rectangle
+     *
+     * This is an action signal that you can call from your Qt surface class inside
+     * its updatePaintNode function to render the video. It takes a QSGNode* and the target
+     * area rectangle as arguments. You should schedule to call this function to
+     * repaint the surface whenever the ::update signal is emited.
+     *
+     * Note that the x,y,width and height arguments are actually qreal. This means
+     * that on architectures like arm they will be float instead of double. You should
+     * cast the arguments to qreal if they are not already when emitting this signal.
+     **/
+    s_signals[NODE_SIGNAL] =
+        g_signal_new("updatePaintNode", G_TYPE_FROM_CLASS(g_class),
+                     static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+                     G_STRUCT_OFFSET(GstQtGLVideoSinkClass, updatePaintNode),
+                     NULL, NULL,
+                     qRealIsDouble() ?
+                        g_cclosure_user_marshal_VOID__POINTER_DOUBLE_DOUBLE_DOUBLE_DOUBLE :
+                        g_cclosure_user_marshal_VOID__POINTER_FLOAT_FLOAT_FLOAT_FLOAT,
+                     G_TYPE_NONE, 5,
+                     G_TYPE_POINTER, G_TYPE_QREAL, G_TYPE_QREAL, G_TYPE_QREAL, G_TYPE_QREAL);
+
+    /**
      * GstQtGLVideoSink::update
      *
      * This signal is emited when the surface should be repainted. It should
@@ -141,3 +171,16 @@
     GST_QT_VIDEO_SINK_BASE(sink)->delegate->paint(static_cast<QPainter*>(painter),
                                                   QRectF(x, y, width, height));
 }
+
+//------------------------------
+
+void GstQtGLVideoSink::updatePaintNode(GstQtGLVideoSink *sink, gpointer sgnode,
+                           qreal x, qreal y, qreal width, qreal height)
+{
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
+    GST_QT_VIDEO_SINK_BASE(sink)->delegate->updatePaintNode(static_cast<QSGNode*>(sgnode),
+                                                  QRectF(x, y, width, height));
+#else
+    GST_TRACE_OBJECT(GST_QT_VIDEO_SINK_BASE(sink), "updatePaintNode signal usable with Qt5 only.");
+#endif
+}
diff -Naur qt-gstreamer-orig/elements/gstqtvideosink/gstqtglvideosink.h qt-gstreamer/elements/gstqtvideosink/gstqtglvideosink.h
--- qt-gstreamer-orig/elements/gstqtvideosink/gstqtglvideosink.h	2013-06-28 11:29:16.048977997 +0200
+++ qt-gstreamer/elements/gstqtvideosink/gstqtglvideosink.h	2013-07-02 11:59:29.418617115 +0200
@@ -1,6 +1,7 @@
 /*
     Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). <qt-info@nokia.com>
     Copyright (C) 2011-2012 Collabora Ltd. <info@collabora.com>
+    Copyright (C) 2013 basysKom GmbH <info@basyskom.com>
 
     This library is free software; you can redistribute it and/or modify
     it under the terms of the GNU Lesser General Public License version 2.1
@@ -42,6 +43,7 @@
     enum {
         PAINT_SIGNAL,
         UPDATE_SIGNAL,
+        NODE_SIGNAL,
         LAST_SIGNAL
     };
 
@@ -55,6 +57,9 @@
     static void paint(GstQtGLVideoSink *sink, gpointer painter,
                       qreal x, qreal y, qreal width, qreal height);
 
+    static void updatePaintNode(GstQtGLVideoSink *sink, gpointer sgnode,
+                       qreal x, qreal y, qreal width, qreal height);
+
     static guint s_signals[LAST_SIGNAL];
 };
 
@@ -66,6 +71,10 @@
     /* paint action signal */
     void (*paint) (GstQtGLVideoSink *sink, gpointer painter,
                    qreal x, qreal y, qreal width, qreal height);
+
+    /* updatePaintNode action signal */
+    void (*updatePaintNode) (GstQtGLVideoSink *sink, gpointer sgnode,
+                   qreal x, qreal y, qreal width, qreal height);
 };
 
 #endif // GST_QT_VIDEO_SINK_NO_OPENGL
diff -Naur qt-gstreamer-orig/elements/gstqtvideosink/gstqtvideosink.cpp qt-gstreamer/elements/gstqtvideosink/gstqtvideosink.cpp
--- qt-gstreamer-orig/elements/gstqtvideosink/gstqtvideosink.cpp	2013-06-28 11:29:16.044977953 +0200
+++ qt-gstreamer/elements/gstqtvideosink/gstqtvideosink.cpp	2013-07-02 12:00:11.139082165 +0200
@@ -1,6 +1,7 @@
 /*
     Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). <qt-info@nokia.com>
     Copyright (C) 2011-2012 Collabora Ltd. <info@collabora.com>
+    Copyright (C) 2013 basysKom GmbH <info@basyskom.com>
 
     This library is free software; you can redistribute it and/or modify
     it under the terms of the GNU Lesser General Public License version 2.1
@@ -48,6 +49,7 @@
 
     GstQtVideoSinkClass *qt_video_sink_class = reinterpret_cast<GstQtVideoSinkClass*>(g_class);
     qt_video_sink_class->paint = GstQtVideoSink::paint;
+    qt_video_sink_class->updatePaintNode = GstQtVideoSink::updatePaintNode;
 
     /**
      * GstQtVideoSink::paint
@@ -78,6 +80,34 @@
                      G_TYPE_POINTER, G_TYPE_QREAL, G_TYPE_QREAL, G_TYPE_QREAL, G_TYPE_QREAL);
 
     /**
+     * GstQtGLVideoSink::updatePaintNode
+     * @sgnode: A valid QSGNode pointer that will be used to render the video
+     * @x: The x coordinate of the target area rectangle
+     * @y: The y coordinate of the target area rectangle
+     * @width: The width of the target area rectangle
+     * @height: The height of the target area rectangle
+     *
+     * This is an action signal that you can call from your Qt surface class inside
+     * its updatePaintNode function to render the video. It takes a QSGNode* and the target
+     * area rectangle as arguments. You should schedule to call this function to
+     * repaint the surface whenever the ::update signal is emited.
+     *
+     * Note that the x,y,width and height arguments are actually qreal. This means
+     * that on architectures like arm they will be float instead of double. You should
+     * cast the arguments to qreal if they are not already when emitting this signal.
+     **/
+    s_signals[NODE_SIGNAL] =
+        g_signal_new("updatePaintNode", G_TYPE_FROM_CLASS(g_class),
+                     static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
+                     G_STRUCT_OFFSET(GstQtVideoSinkClass, updatePaintNode),
+                     NULL, NULL,
+                     qRealIsDouble() ?
+                        g_cclosure_user_marshal_VOID__POINTER_DOUBLE_DOUBLE_DOUBLE_DOUBLE :
+                        g_cclosure_user_marshal_VOID__POINTER_FLOAT_FLOAT_FLOAT_FLOAT,
+                     G_TYPE_NONE, 5,
+                     G_TYPE_POINTER, G_TYPE_QREAL, G_TYPE_QREAL, G_TYPE_QREAL, G_TYPE_QREAL);
+
+    /**
      * GstQtVideoSink::update
      *
      * This signal is emited when the surface should be repainted. It should
@@ -108,3 +138,16 @@
     GST_QT_VIDEO_SINK_BASE(sink)->delegate->paint(static_cast<QPainter*>(painter),
                                                   QRectF(x, y, width, height));
 }
+
+//------------------------------
+
+void GstQtVideoSink::updatePaintNode(GstQtVideoSink *sink, gpointer sgnode,
+                           qreal x, qreal y, qreal width, qreal height)
+{
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
+    GST_QT_VIDEO_SINK_BASE(sink)->delegate->updatePaintNode(static_cast<QSGNode*>(sgnode),
+                                                  QRectF(x, y, width, height));
+#else
+    GST_TRACE_OBJECT(GST_QT_VIDEO_SINK_BASE(sink), "updatePaintNode signal usable with Qt5 only.");
+#endif
+}
diff -Naur qt-gstreamer-orig/elements/gstqtvideosink/gstqtvideosink.h qt-gstreamer/elements/gstqtvideosink/gstqtvideosink.h
--- qt-gstreamer-orig/elements/gstqtvideosink/gstqtvideosink.h	2013-06-28 11:29:16.048977997 +0200
+++ qt-gstreamer/elements/gstqtvideosink/gstqtvideosink.h	2013-07-02 12:00:18.199160828 +0200
@@ -1,6 +1,7 @@
 /*
     Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). <qt-info@nokia.com>
     Copyright (C) 2011-2012 Collabora Ltd. <info@collabora.com>
+    Copyright (C) 2013 basysKom GmbH <info@basyskom.com>
 
     This library is free software; you can redistribute it and/or modify
     it under the terms of the GNU Lesser General Public License version 2.1
@@ -35,6 +36,7 @@
     enum {
         PAINT_SIGNAL,
         UPDATE_SIGNAL,
+        NODE_SIGNAL,
         LAST_SIGNAL
     };
 
@@ -45,6 +47,9 @@
     static void paint(GstQtVideoSink *sink, gpointer painter,
                       qreal x, qreal y, qreal width, qreal height);
 
+    static void updatePaintNode(GstQtVideoSink *sink, gpointer sgnode,
+                       qreal x, qreal y, qreal width, qreal height);
+
     static guint s_signals[LAST_SIGNAL];
 };
 
@@ -56,6 +61,10 @@
     /* paint action signal */
     void (*paint) (GstQtVideoSink *sink, gpointer painter,
                    qreal x, qreal y, qreal width, qreal height);
+
+    /* updatePaintNode action signal */
+    void (*updatePaintNode) (GstQtVideoSink *sink, gpointer sgnode,
+                   qreal x, qreal y, qreal width, qreal height);
 };
 
 #endif
diff -Naur qt-gstreamer-orig/elements/gstqtvideosink/qtvideosinkdelegate.cpp qt-gstreamer/elements/gstqtvideosink/qtvideosinkdelegate.cpp
--- qt-gstreamer-orig/elements/gstqtvideosink/qtvideosinkdelegate.cpp	2013-06-28 11:29:15.988977345 +0200
+++ qt-gstreamer/elements/gstqtvideosink/qtvideosinkdelegate.cpp	2013-07-02 11:59:01.522305974 +0200
@@ -1,6 +1,7 @@
 /*
     Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). <qt-info@nokia.com>
     Copyright (C) 2011 Collabora Ltd. <info@collabora.com>
+    Copyright (C) 2013 basysKom GmbH <info@basyskom.com>
 
     This library is free software; you can redistribute it and/or modify
     it under the terms of the GNU Lesser General Public License version 2.1
@@ -25,6 +26,10 @@
 #include <QStack>
 #include <QPainter>
 
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
+#include "../../src/QGst/Ui/videonode.h"
+#endif
+
 #define QSIZE_FORMAT "(%d x %d)"
 #define QSIZE_FORMAT_ARGS(size) \
     size.width(), size.height()
@@ -256,6 +261,32 @@
     }
 }
 
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
+void QtVideoSinkDelegate::updatePaintNode(QSGNode *node, const QRectF & targetArea)
+{
+    Q_UNUSED(targetArea)
+    m_currentVideoNode = static_cast<VideoNode*>(node);
+
+    GST_TRACE_OBJECT(m_sink, "updatePaintNode called");
+
+    if (!m_buffer) {
+        // TODO:
+        // Show black screen when buffer is empty.
+        // This happens when video was stopped.
+        qDebug() << "Empty buffer!";
+    } else {
+
+        if (m_formatDirty) {
+            m_bufferFormat = BufferFormat::fromCaps(GST_BUFFER_CAPS(m_buffer));
+            m_currentVideoNode->setBufferFormat(m_bufferFormat);
+        }
+
+        m_currentVideoNode->setCurrentFrame(m_buffer->data);
+    }
+
+}
+#endif
+
 #ifndef GST_QT_VIDEO_SINK_NO_OPENGL
 
 QGLContext *QtVideoSinkDelegate::glContext() const
diff -Naur qt-gstreamer-orig/elements/gstqtvideosink/qtvideosinkdelegate.h qt-gstreamer/elements/gstqtvideosink/qtvideosinkdelegate.h
--- qt-gstreamer-orig/elements/gstqtvideosink/qtvideosinkdelegate.h	2013-06-28 11:29:16.036977866 +0200
+++ qt-gstreamer/elements/gstqtvideosink/qtvideosinkdelegate.h	2013-07-02 11:58:37.654039640 +0200
@@ -1,6 +1,7 @@
 /*
     Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). <qt-info@nokia.com>
     Copyright (C) 2011 Collabora Ltd. <info@collabora.com>
+    Copyright (C) 2013 basysKom GmbH <info@basyskom.com>
 
     This library is free software; you can redistribute it and/or modify
     it under the terms of the GNU Lesser General Public License version 2.1
@@ -29,6 +30,10 @@
 
 class QGLContext;
 
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
+class QSGNode;
+class VideoNode;
+#endif
 
 class QtVideoSinkDelegate : public QObject
 {
@@ -117,6 +122,11 @@
     // paint action
     void paint(QPainter *painter, const QRectF & targetArea);
 
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
+    // scene graph action
+    void updatePaintNode(QSGNode *node, const QRectF & targetArea);
+#endif
+
 protected:
     // internal event handling
     virtual bool event(QEvent *event);
@@ -165,6 +175,10 @@
     // the buffer to be drawn next
     GstBuffer *m_buffer;
 
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
+    VideoNode *m_currentVideoNode;
+#endif
+
 protected:
     GstQtVideoSinkBase * const m_sink;
 };
