diff --git a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp
index 4a8d908d2f0c2041a2d7665ca4537ce33f528689..a625eebd5d9b56af241d7af69013834dac59f854 100644
--- a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp
+++ b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp
@@ -69,7 +69,7 @@ QSGDefaultDistanceFieldGlyphCache::QSGDefaultDistanceFieldGlyphCache(QSGDistance
 {
     m_blitBuffer.create();
     m_blitBuffer.bind();
-    static GLfloat buffer[16] = {1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f,
+    static GLfloat buffer[16] = {-1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f,
                                  0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};
     m_blitBuffer.allocate(buffer, sizeof(buffer));
     m_blitBuffer.release();
@@ -405,13 +405,21 @@ void QSGDefaultDistanceFieldGlyphCache::resizeTexture(TextureInfo *texInfo, int
 
     glViewport(0, 0, oldWidth, oldHeight);
 
-    m_blitBuffer.bind();
-
+    const bool vaoInit = m_vao.isCreated();
+    if (isCoreProfile()) {
+        if ( !vaoInit )
+            m_vao.create();
+        m_vao.bind();
+    }
     m_blitProgram->bind();
-    m_blitProgram->enableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
-    m_blitProgram->enableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
-    m_blitProgram->setAttributeBuffer(int(QT_VERTEX_COORDS_ATTR), GL_FLOAT, 0, 2);
-    m_blitProgram->setAttributeBuffer(int(QT_TEXTURE_COORDS_ATTR), GL_FLOAT, 8, 2);
+    if (!vaoInit || !isCoreProfile()) {
+        m_blitBuffer.bind();
+
+        m_blitProgram->enableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
+        m_blitProgram->enableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
+        m_blitProgram->setAttributeBuffer(int(QT_VERTEX_COORDS_ATTR), GL_FLOAT, 0, 2);
+        m_blitProgram->setAttributeBuffer(int(QT_TEXTURE_COORDS_ATTR), GL_FLOAT, 32, 2);
+    }
     m_blitProgram->disableAttributeArray(int(QT_OPACITY_ATTR));
     m_blitProgram->setUniformValue("imageTexture", GLuint(0));
 
@@ -447,7 +455,8 @@ void QSGDefaultDistanceFieldGlyphCache::resizeTexture(TextureInfo *texInfo, int
 
     m_blitProgram->disableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
     m_blitProgram->disableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
-    m_blitBuffer.release();
+    if (isCoreProfile())
+        m_vao.release();
 }
 
 bool QSGDefaultDistanceFieldGlyphCache::useTextureResizeWorkaround() const
diff --git a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h
index b561bc08f762ddc9a9706c8647851ba283bb0aa6..e1be2105cdfb66d4df0dbf48f752a0676356d2b9 100644
--- a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h
+++ b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h
@@ -46,6 +46,7 @@
 #include <QtGui/qopenglfunctions.h>
 #include <qopenglshaderprogram.h>
 #include <qopenglbuffer.h>
+#include <qopenglvertexarrayobject.h>
 #include <QtGui/private/qopenglengineshadersource_p.h>
 #include <private/qsgareaallocator_p.h>
 
@@ -135,6 +136,7 @@ private:
 
     QOpenGLShaderProgram *m_blitProgram;
     QOpenGLBuffer m_blitBuffer;
+    QOpenGLVertexArrayObject m_vao;
 
     QOpenGLSharedResourceGuard *m_fboGuard;
 #if !defined(QT_OPENGL_ES_2)