diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp
index c390b07b89e48c18dd5bb5e7fb929eba340ef050..546f7395e21354c92b846b6d9b41f41e23187495 100644
--- a/src/core/delegated_frame_node.cpp
+++ b/src/core/delegated_frame_node.cpp
@@ -67,10 +67,9 @@
 #include "cc/quads/tile_draw_quad.h"
 #include "cc/quads/yuv_video_draw_quad.h"
 #include <QOpenGLFramebufferObject>
+#include <QSGSimpleRectNode>
 #include <QSGSimpleTextureNode>
 #include <QSGTexture>
-#include <QtQuick/private/qquickclipnode_p.h>
-#include <QtQuick/private/qsgadaptationlayer_p.h>
 #include <QtQuick/private/qsgcontext_p.h>
 #include <QtQuick/private/qsgrenderer_p.h>
 #include <QtQuick/private/qsgtexture_p.h>
@@ -143,6 +142,14 @@ private:
 #endif
 };
 
+class RectClipNode : public QSGClipNode
+{
+public:
+    RectClipNode(const QRectF &);
+private:
+    QSGGeometry m_geometry;
+};
+
 static inline QSharedPointer<RenderPassTexture> findRenderPassTexture(const cc::RenderPass::Id &id, const QList<QSharedPointer<RenderPassTexture> > &list)
 {
     Q_FOREACH (const QSharedPointer<RenderPassTexture> &texture, list)
@@ -183,8 +190,7 @@ static QSGNode *buildLayerChain(QSGNode *chainParent, const cc::SharedQuadState
 {
     QSGNode *layerChain = chainParent;
     if (layerState->is_clipped) {
-        QQuickDefaultClipNode *clipNode = new QQuickDefaultClipNode(toQt(layerState->clip_rect));
-        clipNode->update();
+        RectClipNode *clipNode = new RectClipNode(toQt(layerState->clip_rect));
         layerChain->appendChildNode(clipNode);
         layerChain = clipNode;
     }
@@ -374,6 +380,15 @@ void MailboxTexture::fetchTexture(gpu::gles2::MailboxManager *mailboxManager)
     }
 }
 
+RectClipNode::RectClipNode(const QRectF &rect)
+    : m_geometry(QSGGeometry::defaultAttributes_Point2D(), 4)
+{
+    QSGGeometry::updateRectGeometry(&m_geometry, rect);
+    setGeometry(&m_geometry);
+    setClipRect(rect);
+    setIsRectangular(true);
+}
+
 DelegatedFrameNode::DelegatedFrameNode(QSGRenderContext *sgRenderContext)
     : m_sgRenderContext(sgRenderContext)
     , m_numPendingSyncPoints(0)
@@ -497,11 +512,10 @@ void DelegatedFrameNode::commit(DelegatedFrameNodeData* data, cc::ReturnedResour
             switch (quad->material) {
             case cc::DrawQuad::CHECKERBOARD: {
                 const cc::CheckerboardDrawQuad *cbquad = cc::CheckerboardDrawQuad::MaterialCast(quad);
-                QSGRectangleNode *rectangleNode = m_sgRenderContext->sceneGraphContext()->createRectangleNode();
+                QSGSimpleRectNode *rectangleNode = new QSGSimpleRectNode;
 
                 rectangleNode->setRect(toQt(quad->rect));
                 rectangleNode->setColor(toQt(cbquad->color));
-                rectangleNode->update();
                 currentLayerChain->appendChildNode(rectangleNode);
                 break;
             } case cc::DrawQuad::RENDER_PASS: {
@@ -541,7 +555,7 @@ void DelegatedFrameNode::commit(DelegatedFrameNodeData* data, cc::ReturnedResour
                 break;
             } case cc::DrawQuad::SOLID_COLOR: {
                 const cc::SolidColorDrawQuad *scquad = cc::SolidColorDrawQuad::MaterialCast(quad);
-                QSGRectangleNode *rectangleNode = m_sgRenderContext->sceneGraphContext()->createRectangleNode();
+                QSGSimpleRectNode *rectangleNode = new QSGSimpleRectNode;
 
                 // Qt only supports MSAA and this flag shouldn't be needed.
                 // If we ever want to use QSGRectangleNode::setAntialiasing for this we should
@@ -550,7 +564,6 @@ void DelegatedFrameNode::commit(DelegatedFrameNodeData* data, cc::ReturnedResour
 
                 rectangleNode->setRect(toQt(quad->rect));
                 rectangleNode->setColor(toQt(scquad->color));
-                rectangleNode->update();
                 currentLayerChain->appendChildNode(rectangleNode);
                 break;
             } case cc::DrawQuad::TILED_CONTENT: {