diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index eb99b39802bb249347417a55f1c42dea5297ff26..fa73f5cc773bcb8d983cbd16bb6bec0aa40e975e 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -88,31 +88,6 @@ BOOL shouldChange(const LLVector4& v1, const LLVector4& v2)
     return v1 != v2;
 }
 
-LLShaderFeatures::LLShaderFeatures()
-    : calculatesLighting(false)
-    , calculatesAtmospherics(false)
-    , hasLighting(false)
-    , isAlphaLighting(false)
-    , isSpecular(false)
-    , hasWaterFog(false)
-    , hasTransport(false)
-    , hasSkinning(false)
-    , hasObjectSkinning(false)
-    , hasAtmospherics(false)
-    , hasGamma(false)
-    , hasSrgb(false)
-    , encodesNormal(false)
-    , isDeferred(false)
-    , hasScreenSpaceReflections(false)
-    , hasShadows(false)
-    , hasAmbientOcclusion(false)
-    , mIndexedTextureChannels(0)
-    , disableTextureIndex(false)
-    , hasAlphaMask(false)
-    , attachNothing(false)
-{
-}
-
 //===============================
 // LLGLSL Shader implementation
 //===============================
@@ -335,6 +310,7 @@ LLGLSLShader::LLGLSLShader()
     mActiveTextureChannels(0),
     mShaderLevel(0),
     mShaderGroup(SG_DEFAULT),
+    mFeatures(),
     mUniformsDirty(FALSE),
     mTimerQuery(0),
     mSamplesQuery(0),
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 80559db9617ddd49402c76c7d6a37ad97502e89d..d39dc6697d0505b004453beff8d987a0a237e9b6 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -35,32 +35,28 @@
 class LLShaderFeatures
 {
 public:
-    bool calculatesLighting;
-    bool calculatesAtmospherics;
-    bool hasLighting; // implies no transport (it's possible to have neither though)
-    bool isAlphaLighting; // indicates lighting shaders need not be linked in (lighting performed directly in alpha shader to match deferred lighting functions)
-    bool isSpecular;
-    bool hasWaterFog; // implies no gamma
-    bool hasTransport; // implies no lighting (it's possible to have neither though)
-    bool hasSkinning;
-    bool hasObjectSkinning;
-    bool hasAtmospherics;
-    bool hasGamma;
-    bool hasShadows;
-    bool hasAmbientOcclusion;
-    bool hasSrgb;
-    bool encodesNormal; // include: shaders\class1\environment\encodeNormF.glsl
-    bool isDeferred;
-    bool hasScreenSpaceReflections;
-    S32 mIndexedTextureChannels;
-    bool disableTextureIndex;
-    bool hasAlphaMask;
+    S32 mIndexedTextureChannels = 0;
+    bool calculatesLighting = false;
+    bool calculatesAtmospherics = false;
+    bool hasLighting = false; // implies no transport (it's possible to have neither though)
+    bool isAlphaLighting = false; // indicates lighting shaders need not be linked in (lighting performed directly in alpha shader to match deferred lighting functions)
+    bool isSpecular = false;
+    bool hasWaterFog = false; // implies no gamma
+    bool hasTransport = false; // implies no lighting (it's possible to have neither though)
+    bool hasSkinning = false;
+    bool hasObjectSkinning = false;
+    bool hasAtmospherics = false;
+    bool hasGamma = false;
+    bool hasShadows = false;
+    bool hasAmbientOcclusion = false;
+    bool hasSrgb = false;
+    bool encodesNormal = false; // include: shaders\class1\environment\encodeNormF.glsl
+    bool isDeferred = false;
+    bool hasScreenSpaceReflections = false;
+    bool disableTextureIndex = false;
+    bool hasAlphaMask = false;
     bool hasReflectionProbes = false;
-    bool attachNothing;
-
-    // char numLights;
-
-    LLShaderFeatures();
+    bool attachNothing = false;
 };
 
 // ============= Structure for caching shader uniforms ===============
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 0785d4e9acea7ad1e1563be539f46c118b8c2a2f..e9433f3851d9f046bd7f416509d24a428d69e25b 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -1116,7 +1116,7 @@ void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version,
 					binary_info.mBinaryFormat = data_pair.second["binary_format"].asInteger();
 					binary_info.mBinaryLength = data_pair.second["binary_size"].asInteger();
 					binary_info.mLastUsedTime = data_pair.second["last_used"].asReal();
-					mShaderBinaryCache.emplace(data_pair.first, binary_info);
+					mShaderBinaryCache.insert_or_assign(LLUUID(data_pair.first), binary_info);
 				}
 			}
 			else
@@ -1234,7 +1234,7 @@ bool LLShaderMgr::saveCachedProgramBinary(LLGLSLShader* shader)
 
 		binary_info.mLastUsedTime = LLTimer::getTotalSeconds();
 
-		mShaderBinaryCache.emplace(shader->mShaderHash, binary_info);
+		mShaderBinaryCache.insert_or_assign(shader->mShaderHash, binary_info);
 		return true;
 	}
 	return false;
diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h
index 6881b98197b10dad147b9893f2ed2ad0796fa1ac..013b01e574b38054fe1d1d0f82fac67bbaa69be8 100644
--- a/indra/llrender/llshadermgr.h
+++ b/indra/llrender/llshadermgr.h
@@ -336,7 +336,7 @@ class LLShaderMgr
         GLenum mBinaryFormat;
         F32 mLastUsedTime;
     };
-    boost::unordered_map<LLUUID, ProgramBinaryData> mShaderBinaryCache;
+    std::map<LLUUID, ProgramBinaryData> mShaderBinaryCache;
     bool mShaderCacheInitialized = false;
     bool mShaderCacheEnabled = false;
     std::string mShaderCacheDir;
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index df8227027b01e801845008f67648f072a1db708d..75457ce43149d43e2e8ebae4e0c2c7f3f8f79b71 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -558,13 +558,11 @@ void LLViewerShaderMgr::setShaders()
 
 void LLViewerShaderMgr::unloadShaders()
 {
-	if (!LLGLSLShader::sInstances.empty())
+	//unload shader's
+	while (!LLGLSLShader::sInstances.empty())
 	{
-		auto instance_copy = LLGLSLShader::sInstances;
-		for (auto instancep : instance_copy)
-		{
-			instancep->unload();
-		}
+		LLGLSLShader* shader = *(LLGLSLShader::sInstances.begin());
+		shader->unload();
 	}
 
 	mShaderLevel[SHADER_LIGHTING] = 0;
@@ -3210,26 +3208,6 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
 		gAvatarProgram.mShaderLevel = mShaderLevel[SHADER_AVATAR];
 		success = gAvatarProgram.createShader(NULL, NULL);
 			
-		if (success)
-		{
-			gAvatarWaterProgram.mName = "Avatar Water Shader";
-			gAvatarWaterProgram.mFeatures.hasSkinning = true;
-			gAvatarWaterProgram.mFeatures.calculatesAtmospherics = true;
-			gAvatarWaterProgram.mFeatures.calculatesLighting = true;
-			gAvatarWaterProgram.mFeatures.hasWaterFog = true;
-			gAvatarWaterProgram.mFeatures.hasAtmospherics = true;
-			gAvatarWaterProgram.mFeatures.hasLighting = true;
-			gAvatarWaterProgram.mFeatures.hasAlphaMask = true;
-			gAvatarWaterProgram.mFeatures.disableTextureIndex = true;
-			gAvatarWaterProgram.mShaderFiles.clear();
-			gAvatarWaterProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER));
-			gAvatarWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER));
-			// Note: no cloth under water:
-			gAvatarWaterProgram.mShaderLevel = llmin(mShaderLevel[SHADER_AVATAR], 1);	
-			gAvatarWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;				
-			success = gAvatarWaterProgram.createShader(NULL, NULL);
-		}
-
 		/// Keep track of avatar levels
 		if (gAvatarProgram.mShaderLevel != mShaderLevel[SHADER_AVATAR])
 		{
@@ -3237,6 +3215,26 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
 		}
 	}
 
+	if (success)
+	{
+		gAvatarWaterProgram.mName = "Avatar Water Shader";
+		gAvatarWaterProgram.mFeatures.hasSkinning = true;
+		gAvatarWaterProgram.mFeatures.calculatesAtmospherics = true;
+		gAvatarWaterProgram.mFeatures.calculatesLighting = true;
+		gAvatarWaterProgram.mFeatures.hasWaterFog = true;
+		gAvatarWaterProgram.mFeatures.hasAtmospherics = true;
+		gAvatarWaterProgram.mFeatures.hasLighting = true;
+		gAvatarWaterProgram.mFeatures.hasAlphaMask = true;
+		gAvatarWaterProgram.mFeatures.disableTextureIndex = true;
+		gAvatarWaterProgram.mShaderFiles.clear();
+		gAvatarWaterProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER));
+		gAvatarWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER));
+		// Note: no cloth under water:
+		gAvatarWaterProgram.mShaderLevel = llmin(mShaderLevel[SHADER_AVATAR], 1);
+		gAvatarWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+		success = gAvatarWaterProgram.createShader(NULL, NULL);
+	}
+
 	if (success)
 	{
 		gAvatarEyeballProgram.mName = "Avatar Eyeball Program";