diff --git a/src/quick/items/qquickcanvas.cpp b/src/quick/items/qquickcanvas.cpp
index 92a422a56d5b72fe0400d86d5d181b7f99ba213a..3d10d556386b9ea9e99bc252d395d53d8763cdbb 100644
--- a/src/quick/items/qquickcanvas.cpp
+++ b/src/quick/items/qquickcanvas.cpp
@@ -166,7 +166,7 @@ QQuickRootItem::QQuickRootItem()
 void QQuickCanvas::exposeEvent(QExposeEvent *)
 {
     Q_D(QQuickCanvas);
-    d->windowManager->paint(this);
+    d->windowManager->exposureChanged(this);
 }
 
 void QQuickCanvas::resizeEvent(QResizeEvent *)
diff --git a/src/quick/items/qquickwindowmanager.cpp b/src/quick/items/qquickwindowmanager.cpp
index 5de8ad12796892ac018cc75c3a0d57003f789f54..12c5dbd9321b6cbcac44b1dd1e87d593544bdf6c 100644
--- a/src/quick/items/qquickwindowmanager.cpp
+++ b/src/quick/items/qquickwindowmanager.cpp
@@ -188,7 +188,7 @@ public:
 
     void canvasDestroyed(QQuickCanvas *canvas);
 
-    void paint(QQuickCanvas *canvas);
+    void exposureChanged(QQuickCanvas *canvas);
     QImage grab(QQuickCanvas *canvas);
     void resize(QQuickCanvas *canvas, const QSize &size);
     void handleDeferredUpdate();
@@ -297,7 +297,7 @@ public:
 
     void initializeGL();
     void renderCanvas(QQuickCanvas *canvas);
-    void paint(QQuickCanvas *canvas);
+    void exposureChanged(QQuickCanvas *canvas);
     QImage grab(QQuickCanvas *canvas);
     void resize(QQuickCanvas *canvas, const QSize &size);
     void wakeup();
@@ -333,14 +333,21 @@ QQuickWindowManager *QQuickWindowManager::instance()
     static QQuickWindowManager *theInstance;
 
     if (!theInstance) {
-        bool fancy = QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL);
+
+        theInstance = QSGContext::createWindowManager();
+
+        bool fancy = QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::BufferQueueingOpenGL);
         if (qmlNoThreadedRenderer())
             fancy = false;
+
         if (qmlFixedAnimationStep())
             QUnifiedTimer::instance(true)->setConsistentTiming(true);
-        theInstance = fancy
-                ? (QQuickWindowManager*) new QQuickRenderThreadSingleContextWindowManager
-                : (QQuickWindowManager*) new QQuickTrivialWindowManager;
+
+        if (!theInstance) {
+            theInstance = fancy
+                    ? (QQuickWindowManager*) new QQuickRenderThreadSingleContextWindowManager
+                    : (QQuickWindowManager*) new QQuickTrivialWindowManager;
+        }
     }
     return theInstance;
 }
@@ -932,26 +939,15 @@ void QQuickRenderThreadSingleContextWindowManager::animationStopped()
 }
 
 
-void QQuickRenderThreadSingleContextWindowManager::paint(QQuickCanvas *canvas)
+void QQuickRenderThreadSingleContextWindowManager::exposureChanged(QQuickCanvas *canvas)
 {
     Q_UNUSED(canvas);
 #ifdef THREAD_DEBUG
-    printf("GUI: paint called: %p\n", canvas);
+    printf("GUI: exposure changed: %p\n", canvas);
 #endif
 
-    lockInGui();
-    exhaustSyncEvent();
-
-    isPaintCompleted = false;
-    while (isRunning() && !isPaintCompleted) {
-        if (isRenderBlocked)
-            wake();
-        wait();
-    }
-    unlockInGui();
-
 #ifdef THREAD_DEBUG
-    printf("GUI: paint done: %p\n", canvas);
+    printf("GUI: exposure changed done: %p\n", canvas);
 #endif
 }
 
@@ -1234,13 +1230,8 @@ void QQuickTrivialWindowManager::renderCanvas(QQuickCanvas *canvas)
         maybeUpdate(canvas);
 }
 
-void QQuickTrivialWindowManager::paint(QQuickCanvas *canvas)
+void QQuickTrivialWindowManager::exposureChanged(QQuickCanvas *canvas)
 {
-    if (!m_windows.contains(canvas))
-        return;
-
-    m_windows[canvas].updatePending = true;
-    renderCanvas(canvas);
 }
 
 QImage QQuickTrivialWindowManager::grab(QQuickCanvas *canvas)
diff --git a/src/quick/items/qquickwindowmanager_p.h b/src/quick/items/qquickwindowmanager_p.h
index 9372e90f5e70e2c6d6579022119b81a72a425e1d..eb877d4756cfc6cb8387fa74f78f202058b00295 100644
--- a/src/quick/items/qquickwindowmanager_p.h
+++ b/src/quick/items/qquickwindowmanager_p.h
@@ -43,13 +43,14 @@
 #define QQUICKWINDOWMANAGER_P_H
 
 #include <QtGui/QImage>
+#include <qtquickglobal.h>
 
 QT_BEGIN_NAMESPACE
 
 class QQuickCanvas;
 class QSGContext;
 
-class QQuickWindowManager
+class Q_QUICK_EXPORT QQuickWindowManager
 {
 public:
     virtual ~QQuickWindowManager();
@@ -59,7 +60,7 @@ public:
 
     virtual void canvasDestroyed(QQuickCanvas *canvas) = 0;
 
-    virtual void paint(QQuickCanvas *canvas) = 0;
+    virtual void exposureChanged(QQuickCanvas *canvas) = 0;
     virtual QImage grab(QQuickCanvas *canvas) = 0;
     virtual void resize(QQuickCanvas *canvas, const QSize &size) = 0;
 
diff --git a/src/quick/scenegraph/qsgcontext_p.h b/src/quick/scenegraph/qsgcontext_p.h
index 0f8b5ae1decae9c7a2398170c76d1135ce9eb5e1..dfb960f420af746fb6e1b2c123b6bd3396938059 100644
--- a/src/quick/scenegraph/qsgcontext_p.h
+++ b/src/quick/scenegraph/qsgcontext_p.h
@@ -68,6 +68,7 @@ class QSGTexture;
 class QSGMaterial;
 class QSGMaterialShader;
 class QSGEngine;
+class QQuickWindowManager;
 
 class QOpenGLContext;
 class QOpenGLFramebufferObject;
@@ -122,6 +123,7 @@ public:
     virtual QAnimationDriver *createAnimationDriver(QObject *parent);
 
     static QQuickTextureFactory *createTextureFactoryFromImage(const QImage &image);
+    static QQuickWindowManager *createWindowManager();
 
 
 public slots:
diff --git a/src/quick/scenegraph/qsgcontextplugin.cpp b/src/quick/scenegraph/qsgcontextplugin.cpp
index b8a66fd0c09f18ec6ce428278bbfd8351dad7985..bd1c4cece8544001eb1aa7c3042eb4aad8695c5f 100644
--- a/src/quick/scenegraph/qsgcontextplugin.cpp
+++ b/src/quick/scenegraph/qsgcontextplugin.cpp
@@ -152,5 +152,23 @@ QQuickTextureFactory *QSGContext::createTextureFactoryFromImage(const QImage &im
 }
 
 
+/*!
+    \fn QQuickWindowManager *createWindowManager()
+
+    Calls into the scene graph adaptation if available and creates a hardware
+    specific window manager.
+ */
+
+QQuickWindowManager *QSGContext::createWindowManager()
+{
+    QSGAdaptionPluginData *plugin = contextFactory();
+    if (plugin->factory)
+        return plugin->factory->createWindowManager();
+    return 0;
+}
+
+
+
+
 
 QT_END_NAMESPACE
diff --git a/src/quick/scenegraph/qsgcontextplugin_p.h b/src/quick/scenegraph/qsgcontextplugin_p.h
index d0d8ea143bd81cab4f76ed7e89cd7aa993e25a9f..cc7761a0951bb8a6f50cb65ef7847d7889695606 100644
--- a/src/quick/scenegraph/qsgcontextplugin_p.h
+++ b/src/quick/scenegraph/qsgcontextplugin_p.h
@@ -54,11 +54,14 @@ QT_BEGIN_NAMESPACE
 
 class QSGContext;
 
+class QQuickWindowManager;
+
 struct Q_QUICK_EXPORT QSGContextFactoryInterface : public QFactoryInterface
 {
     virtual QSGContext *create(const QString &key) const = 0;
 
     virtual QQuickTextureFactory *createTextureFactoryFromImage(const QImage &image) = 0;
+    virtual QQuickWindowManager *createWindowManager() = 0;
 };
 
 #define QSGContextFactoryInterface_iid \
@@ -77,6 +80,7 @@ public:
     virtual QSGContext *create(const QString &key) const = 0;
 
     virtual QQuickTextureFactory *createTextureFactoryFromImage(const QImage &) { return 0; }
+    virtual QQuickWindowManager *createWindowManager() { return 0; }
 };
 
 QT_END_NAMESPACE