diff --git a/Install/Windows/glslangValidator.exe b/Install/Windows/glslangValidator.exe
index a3ca0d0a727cae116bbac7ed02310cb239766c9b..cf9fc6a1339e382fc1a9d6c49f224bdaab42c26e 100644
Binary files a/Install/Windows/glslangValidator.exe and b/Install/Windows/glslangValidator.exe differ
diff --git a/Test/300.vert b/Test/300.vert
index cdbfa8eeaa3ea45888dd8b2a2470b5df699fb11b..800ffbeed2b403ffca1560aed1f719d555bbc0bf 100644
--- a/Test/300.vert
+++ b/Test/300.vert
@@ -104,3 +104,26 @@ uniform ub3 {
 uniform ub3 {  // ERROR redeclaration of block name (no instance name in first or declared)
     bool b234;
 };
+
+precision lowp sampler3D;
+precision lowp sampler2DShadow;
+precision lowp sampler2DArrayShadow;
+
+uniform sampler2D s2D;
+uniform sampler3D s3D;
+uniform sampler2DShadow s2DS;
+uniform sampler2DArrayShadow s2DAS;
+in vec2 c2D;
+
+void foo23()
+{
+    ivec2 x1 = textureSize(s2D, 2);
+    textureSize(s2D);        // ERROR, no lod
+    ivec3 x3 = textureSize(s2DAS, -1);
+    textureSize(s2DAS);      // ERROR, no lod
+    vec4 x4 = texture(s2D, c2D);
+    texture(s2D, c2D, 0.2);  // ERROR, bias
+    vec4 x5 = textureProjOffset(s3D, vec4(0.2), ivec3(1));
+    textureProjOffset(s3D, vec4(0.2), ivec3(1), .03);  // ERROR, bias
+    float x6 = textureProjGradOffset(s2DS, invIn, vec2(4.2), vec2(5.3), ivec2(1));
+}
diff --git a/Test/baseResults/300.vert.out b/Test/baseResults/300.vert.out
index 4e113b2759696aa6f40dfa2baa983c3836d48656..9cb9ee75c4bfaf96be6b3bed02f710e3053f976d 100644
--- a/Test/baseResults/300.vert.out
+++ b/Test/baseResults/300.vert.out
@@ -25,7 +25,11 @@ ERROR: 0:88: 'ub2' : Cannot reuse block name within the same interface: uniform
 ERROR: 0:92: 'ub2' : Cannot reuse block name within the same interface: uniform
 ERROR: 0:96: 'ub2' : Cannot reuse block name within the same interface: uniform
 ERROR: 0:104: 'ub3' : Cannot reuse block name within the same interface: uniform
-ERROR: 26 compilation errors.  No code generated.
+ERROR: 0:121: 'textureSize' : no matching overloaded function found 
+ERROR: 0:123: 'textureSize' : no matching overloaded function found 
+ERROR: 0:125: 'texture' : no matching overloaded function found 
+ERROR: 0:127: 'textureProjOffset' : no matching overloaded function found 
+ERROR: 30 compilation errors.  No code generated.
 
 
 ERROR: node is still EOpNull!
@@ -150,6 +154,66 @@ ERROR: node is still EOpNull!
 0:73      move second child to first child (highp 3-component vector of float)
 0:73        'newV' (smooth out highp 3-component vector of float)
 0:73        'v3' (in highp 3-component vector of float)
+0:118  Function Definition: foo23( (void)
+0:118    Function Parameters: 
+0:120    Sequence
+0:120      Sequence
+0:120        move second child to first child (highp 2-component vector of int)
+0:120          'x1' (highp 2-component vector of int)
+0:120          Function Call: textureSize(s21;i1; (highp 2-component vector of int)
+0:120            's2D' (uniform lowp sampler2D)
+0:120            Constant:
+0:120              2 (const int)
+0:121      Constant:
+0:121        0.000000
+0:122      Sequence
+0:122        move second child to first child (highp 3-component vector of int)
+0:122          'x3' (highp 3-component vector of int)
+0:122          Function Call: textureSize(sAS21;i1; (highp 3-component vector of int)
+0:122            's2DAS' (uniform lowp sampler2DArrayShadow)
+0:122            Constant:
+0:122              -1 (const int)
+0:123      Constant:
+0:123        0.000000
+0:124      Sequence
+0:124        move second child to first child (highp 4-component vector of float)
+0:124          'x4' (highp 4-component vector of float)
+0:124          Function Call: texture(s21;vf2; (highp 4-component vector of float)
+0:124            's2D' (uniform lowp sampler2D)
+0:124            'c2D' (in highp 2-component vector of float)
+0:125      Constant:
+0:125        0.000000
+0:126      Sequence
+0:126        move second child to first child (highp 4-component vector of float)
+0:126          'x5' (highp 4-component vector of float)
+0:126          Function Call: textureProjOffset(s31;vf4;vi3; (highp 4-component vector of float)
+0:126            's3D' (uniform lowp sampler3D)
+0:126            Constant:
+0:126              0.200000
+0:126              0.200000
+0:126              0.200000
+0:126              0.200000
+0:126            Constant:
+0:126              1 (const int)
+0:126              1 (const int)
+0:126              1 (const int)
+0:127      Constant:
+0:127        0.000000
+0:128      Sequence
+0:128        move second child to first child (highp float)
+0:128          'x6' (highp float)
+0:128          Function Call: textureProjGradOffset(sS21;vf4;vf2;vf2;vi2; (highp float)
+0:128            's2DS' (uniform lowp sampler2DShadow)
+0:128            'invIn' (invariant in highp 4-component vector of float)
+0:128            Constant:
+0:128              4.200000
+0:128              4.200000
+0:128            Constant:
+0:128              5.300000
+0:128              5.300000
+0:128            Constant:
+0:128              1 (const int)
+0:128              1 (const int)
 0:?   Linker Objects
 0:?     'm43' (uniform highp 4X3 matrix of float)
 0:?     'm33' (uniform highp 3X3 matrix of float)
@@ -175,6 +239,11 @@ ERROR: node is still EOpNull!
 0:?     's3' (invariant smooth out structure{c,f})
 0:?     'a' (layout(column_major shared ) uniform block{f})
 0:?     '__anon__0' (layout(column_major shared ) uniform block{b23})
+0:?     's2D' (uniform lowp sampler2D)
+0:?     's3D' (uniform lowp sampler3D)
+0:?     's2DS' (uniform lowp sampler2DShadow)
+0:?     's2DAS' (uniform lowp sampler2DArrayShadow)
+0:?     'c2D' (in highp 2-component vector of float)
 0:?     'gl_VertexID' (gl_VertexId highp int)
 0:?     'gl_InstanceID' (gl_InstanceId highp int)
 
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index cbc04b64a187784af14c3e29c77c092231625dc0..9a11835d414937838818a0f55e39cd0843db4d2a 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -1603,9 +1603,6 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi
 //
 void TBuiltIns::addSamplingFunctions(TSampler sampler, TString& typeName, int version, EProfile profile)
 {
-    // make one string per stage to contain all functions of the passed-in type for that stage
-    TString functions[EShLangCount];
-
     //
     // texturing
     //
@@ -1763,14 +1760,10 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, TString& typeName, int ve
 
                                 // Add to the per-language set of built-ins
 
-                                if (! bias) {
-                                    functions[EShLangVertex].append(s);
-                                    functions[EShLangGeometry].append(s);
-                                    functions[EShLangTessControl].append(s);
-                                    functions[EShLangTessEvaluation].append(s);
-                                    functions[EShLangCompute].append(s);
-                                }
-                                commonBuiltins.append(s);
+                                if (bias)
+                                    stageBuiltins[EShLangFragment].append(s);
+                                else
+                                    commonBuiltins.append(s);
                             }
                         }
                     }
@@ -1804,9 +1797,6 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, TString& typeName, int vers
     if (version < 140 && sampler.dim == EsdRect && sampler.type != EbtFloat)
         return;
 
-    // make one string per stage to contain all functions of the passed-in type for that stage
-    TString functions[EShLangCount];
-
     for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name:  none, Offset, and Offsets
 
         for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument