diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 12a8443d7fe6e7229611ca7a50437251c831b0e0..81e1eaf36ace0c678e049631350282c200037e8c 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -1085,7 +1085,6 @@ LLRender::LLRender()
     mMode(LLRender::TRIANGLES),
     mCurrTextureUnitIndex(0),
     mLineWidth(1.f),
-    mDummyVAO(0),
 	mPrimitiveReset(false)
 {	
 	mTexUnits.reserve(LL_NUM_TEXTURE_LAYERS);
@@ -1138,22 +1137,6 @@ LLRender::~LLRender()
 
 void LLRender::init()
 {
-	if (mDummyVAO != 0)
-	{ 
-#ifdef GL_ARB_vertex_array_object
-		glDeleteVertexArrays(1, &mDummyVAO);
-#endif
-		mDummyVAO = 0;
-	}
-
-	if (sGLCoreProfile && !LLVertexBuffer::sUseVAO)
-	{ //bind a dummy vertex array object so we're core profile compliant
-#ifdef GL_ARB_vertex_array_object
-		glGenVertexArrays(1, &mDummyVAO);
-		glBindVertexArray(mDummyVAO);
-#endif
-	}
-	stop_glerror();
 	restoreVertexBuffers();
 }
 
@@ -1174,14 +1157,6 @@ void LLRender::shutdown()
 	mLightState.clear();
 
 	mBuffer = nullptr;
-	
-	if (mDummyVAO != 0)
-    { //bind a dummy vertex array object so we're core profile compliant
-#ifdef GL_ARB_vertex_array_object
-        glDeleteVertexArrays(1, &mDummyVAO);
-#endif
-        mDummyVAO = 0;
-    }
 }
 
 void LLRender::refreshState(void)
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index f49dbe66e17c3c3a59aab8ee2012c3182a28884d..6f158a2cb8d628ed084c057545abb3923934a96e 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -516,8 +516,6 @@ class LLRender
 	eBlendFactor mCurrBlendAlphaSFactor;
 	eBlendFactor mCurrBlendAlphaDFactor;
 
-    U32             mDummyVAO;
-
 	std::vector<LLVector4a, boost::alignment::aligned_allocator<LLVector4a, 64> > mUIOffset;
 	std::vector<LLVector4a, boost::alignment::aligned_allocator<LLVector4a, 64> > mUIScale;
 
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 6322eb27152de4d88a5e9299fd5baceacb53a0e3..913f49eb48ba60b65945da18ad6097b6d8187df4 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -120,6 +120,7 @@ bool LLVertexBuffer::sUseStreamDraw = true;
 bool LLVertexBuffer::sUseVAO = false;
 bool LLVertexBuffer::sPreferStreamDraw = false;
 LLVertexBuffer* LLVertexBuffer::sUtilityBuffer = nullptr;
+U32 LLVertexBuffer::sDummyVAO = 0;
 
 #if LL_DEBUG || LL_RELEASE_WITH_DEBUG_INFO || defined(RELEASE_SHOW_ASSERT)
 static absl::flat_hash_set<U32> sActiveBufferNames;
@@ -996,6 +997,24 @@ void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
 {
 	sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject;
 	sDisableVBOMapping = sEnableVBOs && no_vbo_mapping;
+
+#ifdef GL_ARB_vertex_array_object
+	if (LLRender::sGLCoreProfile && !sUseVAO)
+	{
+		if (sDummyVAO != 0)
+		{
+			glBindVertexArray(0);
+			glDeleteVertexArrays(1, &sDummyVAO);
+			sDummyVAO = 0;
+		}
+
+		{ //bind a dummy vertex array object so we're core profile compliant
+			glGenVertexArrays(1, &sDummyVAO);
+			glBindVertexArray(sDummyVAO);
+		}
+		stop_glerror();
+	}
+#endif
 }
 
 //static 
@@ -1050,6 +1069,17 @@ void LLVertexBuffer::cleanupClass()
 
 	delete sUtilityBuffer;
 	sUtilityBuffer = nullptr;
+
+
+	if (sDummyVAO != 0)
+	{
+#ifdef GL_ARB_vertex_array_object
+		glBindVertexArray(0);
+		glDeleteVertexArrays(1, &sDummyVAO);
+#endif
+		sDummyVAO = 0;
+	}
+	stop_glerror();
 }
 
 //----------------------------------------------------------------------------
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index c2c16ca69c261bd29944786754fe2e5943671bac..511aaaae96291c75be8ddf56ccb3462cf8f1d2c2 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -352,6 +352,7 @@ class LLVertexBuffer final : public LLRefCount, public LLTrace::MemTrackable<LLV
 
 private:
 	static LLVertexBuffer* sUtilityBuffer;
+	static U32 sDummyVAO;
 };
 
 
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 03f46a0342e2b93227d4951802848ac070e6c49e..9e939bec214bdc29cc2e065fe6bf0207e9d069e7 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -7590,9 +7590,10 @@ void LLPipeline::doResetVertexBuffers(bool forced)
 
 	LLVertexBuffer::initClass(LLVertexBuffer::sEnableVBOs, LLVertexBuffer::sDisableVBOMapping);
 
-	LLVOPartGroup::restoreGL();
 	gGL.restoreVertexBuffers();
 
+	LLVOPartGroup::restoreGL();
+
 	if (mCubeVB.isNull())
 	{
 		mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW);