diff --git a/src/quick/designer/designerwindowmanager_p.h b/src/quick/designer/designerwindowmanager_p.h
index 17a227d212918131c1593d3bfd86a767ec70aab5..7414f4e3ba04094a54e6de4cc8befd4722c706d5 100644
--- a/src/quick/designer/designerwindowmanager_p.h
+++ b/src/quick/designer/designerwindowmanager_p.h
@@ -93,8 +93,6 @@ public:
     QSGContext *sceneGraphContext() const;
     QSGRenderContext *createRenderContext(QSGContext *) const { return m_renderContext.data(); }
 
-    QList<QQuickWindow *> windows() const { return QList<QQuickWindow *>(); };
-
     static void createOpenGLContext(QQuickWindow *window);
 
 private:
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp
index b55761ba85b9dc92f863baf0ffb828f69ccf0189..81001e19fa76d26cdf97bb04f47458f559fea7d6 100644
--- a/src/quick/items/qquickwindow.cpp
+++ b/src/quick/items/qquickwindow.cpp
@@ -452,6 +452,7 @@ void QQuickWindowPrivate::init(QQuickWindow *c, QQuickRenderControl *control)
         sg = renderControl->sceneGraphContext();
         context = renderControl->renderContext(sg);
     } else {
+        windowManager->addWindow(q);
         sg = windowManager->sceneGraphContext();
         context = windowManager->createRenderContext(sg);
     }
@@ -1077,10 +1078,12 @@ QQuickWindow::~QQuickWindow()
     Q_D(QQuickWindow);
 
     d->animationController->deleteLater();
-    if (d->renderControl)
+    if (d->renderControl) {
         d->renderControl->windowDestroyed();
-    else if (d->windowManager)
+    } else if (d->windowManager) {
+        d->windowManager->removeWindow(this);
         d->windowManager->windowDestroyed(this);
+    }
 
     QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
     delete d->incubationController; d->incubationController = 0;
diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp
index bd9c7609ad1cc634d7906d314e56c9e55a217b07..f3e879c354a8e65bc37d372eb5174051449dd689 100644
--- a/src/quick/scenegraph/qsgrenderloop.cpp
+++ b/src/quick/scenegraph/qsgrenderloop.cpp
@@ -126,8 +126,6 @@ public:
     QSGContext *sceneGraphContext() const;
     QSGRenderContext *createRenderContext(QSGContext *) const { return rc; }
 
-    QList<QQuickWindow *> windows() const { return m_windows.keys(); }
-
     bool event(QEvent *);
 
     struct WindowData {
diff --git a/src/quick/scenegraph/qsgrenderloop_p.h b/src/quick/scenegraph/qsgrenderloop_p.h
index 47b59992e2dade740764921824a4b19fc9b4f70b..4a22fd60e79754953ef028c8aad67015f7271c14 100644
--- a/src/quick/scenegraph/qsgrenderloop_p.h
+++ b/src/quick/scenegraph/qsgrenderloop_p.h
@@ -44,6 +44,7 @@
 
 #include <QtGui/QImage>
 #include <private/qtquickglobal_p.h>
+#include <QtCore/QSet>
 
 QT_BEGIN_NAMESPACE
 
@@ -78,7 +79,9 @@ public:
 
     virtual void releaseResources(QQuickWindow *window) = 0;
 
-    virtual QList<QQuickWindow *> windows() const = 0;
+    void addWindow(QQuickWindow *win) { m_windows.insert(win); }
+    void removeWindow(QQuickWindow *win) { m_windows.remove(win); }
+    QSet<QQuickWindow *> windows() const { return m_windows; }
 
     // ### make this less of a singleton
     static QSGRenderLoop *instance();
@@ -99,6 +102,8 @@ public Q_SLOTS:
 
 private:
     static QSGRenderLoop *s_instance;
+
+    QSet<QQuickWindow *> m_windows;
 };
 
 QT_END_NAMESPACE
diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp
index 3dc2a50542d5711dd52e0c34068e148ba4a03f77..ba8c3a7fce02b09bc0ce0ee3cb618c108356cb1e 100644
--- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp
+++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp
@@ -738,14 +738,6 @@ QSGThreadedRenderLoop::QSGThreadedRenderLoop()
     QSG_GUI_DEBUG((void *) 0, "QSGThreadedRenderLoop() created");
 }
 
-QList<QQuickWindow *> QSGThreadedRenderLoop::windows() const
-{
-    QList<QQuickWindow *> list;
-    foreach (const Window &w, m_windows)
-        list << w.window;
-    return list;
-}
-
 QSGRenderContext *QSGThreadedRenderLoop::createRenderContext(QSGContext *sg) const
 {
     return sg->createRenderContext();
diff --git a/src/quick/scenegraph/qsgthreadedrenderloop_p.h b/src/quick/scenegraph/qsgthreadedrenderloop_p.h
index 3997ef92b7be59c1ee243b195556a4c00e17a52e..e142f7f2c8f719f208f61736d3cba988c7e9f6ad 100644
--- a/src/quick/scenegraph/qsgthreadedrenderloop_p.h
+++ b/src/quick/scenegraph/qsgthreadedrenderloop_p.h
@@ -79,8 +79,6 @@ public:
 
     bool interleaveIncubation() const;
 
-    QList<QQuickWindow *> windows() const;
-
 public Q_SLOTS:
     void animationStarted();
     void animationStopped();
diff --git a/src/quick/scenegraph/qsgwindowsrenderloop.cpp b/src/quick/scenegraph/qsgwindowsrenderloop.cpp
index cbe9ea384b46bb8035c249ba622f93276fb5ce17..913b73779830ef1550b6e990a7323c15792e40bb 100644
--- a/src/quick/scenegraph/qsgwindowsrenderloop.cpp
+++ b/src/quick/scenegraph/qsgwindowsrenderloop.cpp
@@ -111,15 +111,6 @@ QSGWindowsRenderLoop::~QSGWindowsRenderLoop()
     delete m_sg;
 }
 
-QList<QQuickWindow *> QSGWindowsRenderLoop::windows() const
-{
-    QList<QQuickWindow *> list;
-    foreach (const WindowData &w, m_windows)
-        list << w.window;
-    return list;
-}
-
-
 bool QSGWindowsRenderLoop::interleaveIncubation() const
 {
     return m_animationDriver->isRunning() && anyoneShowing();
diff --git a/src/quick/scenegraph/qsgwindowsrenderloop_p.h b/src/quick/scenegraph/qsgwindowsrenderloop_p.h
index 6c26e728da09c55326d060bb2919d4906eb818da..e4ee688c9f61b4876bf98911ae3eab2337439aa4 100644
--- a/src/quick/scenegraph/qsgwindowsrenderloop_p.h
+++ b/src/quick/scenegraph/qsgwindowsrenderloop_p.h
@@ -86,8 +86,6 @@ public:
 
     bool interleaveIncubation() const;
 
-    QList<QQuickWindow *> windows() const;
-
 public Q_SLOTS:
     void started();
     void stopped();