diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 0f260674ed77ea394b6fe031b38d565ad146eb13..52b8de8365e33aad52101c46ad8e0f33f98b4899 100755
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -324,6 +324,14 @@ LLGLSLShader::~LLGLSLShader()
 }
 
 void LLGLSLShader::unload()
+{
+    mShaderFiles.clear();
+    mDefines.clear();
+
+    unloadInternal();
+}
+
+void LLGLSLShader::unloadInternal()
 {
     sInstances.erase(this);
 
@@ -331,8 +339,6 @@ void LLGLSLShader::unload()
     mAttribute.clear();
     mTexture.clear();
     mUniform.clear();
-    mShaderFiles.clear();
-    mDefines.clear();
 
     if (mProgramObject)
     {
@@ -354,13 +360,13 @@ void LLGLSLShader::unload()
 
         mProgramObject = 0;
     }
-    
+
     if (mTimerQuery)
     {
         glDeleteQueriesARB(1, &mTimerQuery);
         mTimerQuery = 0;
     }
-    
+
     if (mSamplesQuery)
     {
         glDeleteQueriesARB(1, &mSamplesQuery);
@@ -369,7 +375,7 @@ void LLGLSLShader::unload()
 
     //hack to make apple not complain
     glGetError();
-    
+
     stop_glerror();
 }
 
@@ -378,6 +384,8 @@ BOOL LLGLSLShader::createShader(std::vector<LLStaticHashedString> * attributes,
                                 U32 varying_count,
                                 const char** varyings)
 {
+    unloadInternal();
+
     sInstances.insert(this);
 
     //reloading, reset matrix hash values
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 5abddf274b4a689779d07bfc24236e2b32fb0999..0746e8760abfbd5426f60502f631d812f10d12b4 100755
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -198,7 +198,9 @@ class LLGLSLShader
 	bool mTextureStateFetched;
 	std::vector<U32> mTextureMagFilter;
 	std::vector<U32> mTextureMinFilter;
-	
+
+private:
+	void unloadInternal();
 };
 
 //UI shader (declared here so llui_libtest will link properly)