diff --git a/Install/Windows/glslangValidator.exe b/Install/Windows/glslangValidator.exe
index 6bc8a7a118787dcd670c0161f5a2f2be68c36b50..7f095f44cad4eb6bf95f549ffcb882c444ec1562 100644
Binary files a/Install/Windows/glslangValidator.exe and b/Install/Windows/glslangValidator.exe differ
diff --git a/Test/100scope.vert b/Test/100scope.vert
index 0076846ebefa75150bd82a57378725ecb5701870..7e9f82bafe3446c0247a3dc0f671a88fbd7af61b 100644
--- a/Test/100scope.vert
+++ b/Test/100scope.vert
@@ -17,12 +17,16 @@ bool b;
 float b(int a);      // ERROR: redefinition
 
 float f;             // ERROR: redefinition
-float tan;           // ERROR: redefines built-in function
-float sin(float x);  // ERROR: can't overload built-in functions
-float cos(float x)   // ERROR: can't overload built-in functions
+float tan;           // okay, built-in is in an outer scope
+float sin(float x);  // ERROR: can't redefine built-in functions
+float cos(float x)   // ERROR: can't redefine built-in functions
 {
 	return 1.0;
 }
+bool radians(bool x) // okay, can overload built-in functions
+{
+    return true;
+}
 
 invariant gl_Position;
 
diff --git a/Test/150.geom b/Test/150.geom
index c09b4ce6de8e974a401e83ee3d56b57b2af37093..7e3621291c9290b0093feb09d563f0657f1c15b6 100644
--- a/Test/150.geom
+++ b/Test/150.geom
@@ -52,11 +52,11 @@ out vec4 ov3;  // stream should be 3
 
 layout(stream = 6) out ooutb { vec4 a; } ouuaa6;
 
-layout(stream = 6) out ooutb {
+layout(stream = 6) out ooutb2 {
     layout(stream = 6) vec4 a;
 } ouua6;
 
-layout(stream = 7) out ooutb {
+layout(stream = 7) out ooutb3 {
     layout(stream = 6) vec4 a;  // ERROR
 } ouua7;
 
@@ -74,7 +74,7 @@ layout(triangle_strip) uniform; // ERROR
 layout(triangle_strip) out vec4 badv4;  // ERROR, not on a variable
 layout(triangle_strip) in vec4 bad2v4;  // ERROR, not on a variable or input
 layout(invocations = 3) out outbn { int a; }; // ERROR, not on a block
-out outbn {
+out outbn2 {
     layout(invocations = 3)  int a; // ERROR, not on a block member
     layout(max_vertices = 3) int b; // ERROR, not on a block member
     layout(triangle_strip)   int c; // ERROR, not on a block member
@@ -90,3 +90,15 @@ layout(invocations = 4, max_vertices = 127) out;
 in inbn {
     layout(stream = 2) int a;     // ERROR, stream on input
 } inbi;
+
+in sameName {
+    int a15;
+};
+
+out sameName {
+    float f15;
+};
+
+uniform sameName {
+    bool b15;
+};
diff --git a/Test/300.vert b/Test/300.vert
index 01ececec2897727c84f51b60d15d270306b6babf..1d9d6316732669f1cb86c8beefbb8b77a6a410d3 100644
--- a/Test/300.vert
+++ b/Test/300.vert
@@ -80,3 +80,27 @@ out S s2;
 invariant s2;
 invariant out S s3;
 flat out int;
+
+uniform ub2 {
+    float f;
+} a;
+
+uniform ub2 {  // ERROR redeclaration of block name (same instance name)
+    float g;
+} a;
+
+uniform ub2 {  // ERROR redeclaration of block name (different instance name)
+    float f;
+} c;
+
+uniform ub2 {  // ERROR redeclaration of block name (no instance name)
+    float f123;
+};
+
+uniform ub3 {
+    bool b23;
+};
+
+uniform ub3 {  // ERROR redeclaration of block name (no instance name in first or declared)
+    bool b234;
+};
diff --git a/Test/300scope.vert b/Test/300scope.vert
index 263b62ce34796f2dad9232ebc74d90c80f384413..f88cb0581b310831aae9e6ba99fbc0375125b145 100644
--- a/Test/300scope.vert
+++ b/Test/300scope.vert
@@ -18,11 +18,15 @@ float b(int a);      // ERROR: redefinition
 
 float f;             // ERROR: redefinition
 float tan;           // ERROR: redefines built-in function
-float sin(float x);  // ERROR: can't overload built-in functions
-float cos(float x)   // ERROR: can't overload built-in functions
+float sin(float x);  // ERROR: can't redefine built-in functions
+float cos(float x)   // ERROR: can't redefine built-in functions
 {
 	return 1.0;
 }
+bool radians(bool x) // ERROR: can't overload built-in functions
+{
+    return true;
+}
 
 invariant gl_Position;
 
diff --git a/Test/430scope.vert b/Test/430scope.vert
index 00685adf92c9362a29254dc923b3498b465a9301..b854ef74d04b97d6cbb9c879629d42c8c86aaff8 100644
--- a/Test/430scope.vert
+++ b/Test/430scope.vert
@@ -18,11 +18,15 @@ float b(int a);      // ERROR: redefinition
 
 float f;             // ERROR: redefinition
 float tan;           // okay, hides built-in function
-float sin(float x);  // okay, can overload built-in functions
-float cos(float x)   // okay, can overload built-in functions
+float sin(float x);  // okay, can redefine built-in functions
+float cos(float x)   // okay, can redefine built-in functions
 {
 	return 1.0;
 }
+bool radians(bool x) // okay, can overload built-in functions
+{
+    return true;
+}
 
 invariant gl_Position;
 
diff --git a/Test/baseResults/100scope.vert.out b/Test/baseResults/100scope.vert.out
index 792667008030c9ab1bbdee9fd072c9cfb047ea75..4b948e33bb9bf8690fab18b274708d379ae0f996 100644
--- a/Test/baseResults/100scope.vert.out
+++ b/Test/baseResults/100scope.vert.out
@@ -1,11 +1,12 @@
 ERROR: 0:5: 'a' : redefinition 
-ERROR: 0:17: 'b' : illegal redeclaration 
+ERROR: 0:17: 'b' : redeclaration of existing name 
 ERROR: 0:19: 'f' : redefinition 
-ERROR: 0:20: 'tan' : redefinition 
-ERROR: 0:31: 'local function declaration' : not supported with this profile: es
-ERROR: 0:50: 'z' : undeclared identifier 
-ERROR: 0:50: 'z' : redefinition 
-ERROR: 7 compilation errors.  No code generated.
+ERROR: 0:21: 'redefinition of built-in function' : not supported with this profile: es
+ERROR: 0:22: 'redefinition of built-in function' : not supported with this profile: es
+ERROR: 0:35: 'local function declaration' : not supported with this profile: es
+ERROR: 0:54: 'z' : undeclared identifier 
+ERROR: 0:54: 'z' : redefinition 
+ERROR: 8 compilation errors.  No code generated.
 
 ERROR: node is still EOpNull!
 0:3  Function Definition: f(i1;i1;i1; (highp int)
@@ -32,73 +33,81 @@ ERROR: node is still EOpNull!
 0:24      Branch: Return with expression
 0:24        Constant:
 0:24          1.000000
-0:29  Function Definition: main( (void)
-0:29    Function Parameters: 
+0:26  Function Definition: radians(b1; (bool)
+0:26    Function Parameters: 
+0:26      'x' (in bool)
+0:28    Sequence
+0:28      Branch: Return with expression
+0:28        Constant:
+0:28          true (const bool)
+0:33  Function Definition: main( (void)
+0:33    Function Parameters: 
 0:?     Sequence
-0:32      Function Call: g( (highp int)
-0:35      'sin' (highp float)
-0:37      Function Call: f(i1;i1;i1; (highp int)
-0:37        Constant:
-0:37          1 (const int)
-0:37        Constant:
-0:37          2 (const int)
-0:37        Constant:
-0:37          3 (const int)
-0:40      move second child to first child (highp float)
-0:40        'f' (highp float)
-0:40        Constant:
-0:40          3.000000
-0:42      move second child to first child (highp 4-component vector of float)
-0:42        'gl_Position' (invariant gl_Position highp 4-component vector of float)
-0:42        Construct vec4 (highp 4-component vector of float)
-0:42          'f' (highp float)
-0:44      Sequence
-0:44        Sequence
-0:44          move second child to first child (highp int)
-0:44            'f' (highp int)
-0:44            Constant:
-0:44              0 (const int)
-0:44        Loop with condition tested first
-0:44          Loop Condition
-0:44          Compare Less Than (bool)
-0:44            'f' (highp int)
-0:44            Constant:
-0:44              10 (const int)
-0:44          Loop Body
-0:45          Pre-Increment (highp int)
-0:45            'f' (highp int)
-0:44          Loop Terminal Expression
-0:44          Pre-Increment (highp int)
-0:44            'f' (highp int)
-0:47      Sequence
-0:47        move second child to first child (highp int)
-0:47          'x' (highp int)
-0:47          Constant:
-0:47            1 (const int)
-0:49      Sequence
-0:49        Sequence
-0:49          move second child to first child (highp float)
-0:49            'x' (highp float)
-0:49            Constant:
-0:49              2.000000
-0:49          move second child to first child (highp float)
-0:49            'y' (highp float)
-0:49            'x' (highp float)
+0:36      Function Call: g( (highp int)
+0:39      'sin' (highp float)
+0:41      Function Call: f(i1;i1;i1; (highp int)
+0:41        Constant:
+0:41          1 (const int)
+0:41        Constant:
+0:41          2 (const int)
+0:41        Constant:
+0:41          3 (const int)
+0:44      move second child to first child (highp float)
+0:44        'f' (highp float)
+0:44        Constant:
+0:44          3.000000
+0:46      move second child to first child (highp 4-component vector of float)
+0:46        'gl_Position' (invariant gl_Position highp 4-component vector of float)
+0:46        Construct vec4 (highp 4-component vector of float)
+0:46          'f' (highp float)
+0:48      Sequence
+0:48        Sequence
+0:48          move second child to first child (highp int)
+0:48            'f' (highp int)
+0:48            Constant:
+0:48              0 (const int)
+0:48        Loop with condition tested first
+0:48          Loop Condition
+0:48          Compare Less Than (bool)
+0:48            'f' (highp int)
+0:48            Constant:
+0:48              10 (const int)
+0:48          Loop Body
+0:49          Pre-Increment (highp int)
+0:49            'f' (highp int)
+0:48          Loop Terminal Expression
+0:48          Pre-Increment (highp int)
+0:48            'f' (highp int)
+0:51      Sequence
+0:51        move second child to first child (highp int)
+0:51          'x' (highp int)
+0:51          Constant:
+0:51            1 (const int)
 0:53      Sequence
 0:53        Sequence
-0:53          move second child to first child (highp int)
-0:53            'x' (highp int)
-0:53            'x' (highp int)
-0:61      Sequence
-0:61        Sequence
-0:61          move second child to first child (structure{x})
-0:61            'S' (structure{x})
-0:61            Constant:
-0:61              0 (const int)
-0:62        x: direct index for structure (highp int)
-0:62          'S' (structure{x})
-0:62          Constant:
-0:62            0 (const int)
+0:53          move second child to first child (highp float)
+0:53            'x' (highp float)
+0:53            Constant:
+0:53              2.000000
+0:53          move second child to first child (highp float)
+0:53            'y' (highp float)
+0:53            'x' (highp float)
+0:57      Sequence
+0:57        Sequence
+0:57          move second child to first child (highp int)
+0:57            'x' (highp int)
+0:57            'x' (highp int)
+0:65      Sequence
+0:65        Sequence
+0:65          move second child to first child (structure{x})
+0:65            'S' (structure{x})
+0:65            Constant:
+0:65              0 (const int)
+0:66        x: direct index for structure (highp int)
+0:66          'S' (structure{x})
+0:66          Constant:
+0:66            0 (const int)
 0:?   Linker Objects
 0:?     'b' (bool)
+0:?     'tan' (highp float)
 
diff --git a/Test/baseResults/150.geom.out b/Test/baseResults/150.geom.out
index 0da9b61ddc7ff1dd392b80804676d226b93c89b6..9ae6fa73bf85f19dc81356f1ac2fa5198d9c507b 100644
--- a/Test/baseResults/150.geom.out
+++ b/Test/baseResults/150.geom.out
@@ -135,4 +135,7 @@ ERROR: node is still EOpNull!
 0:?     '__anon__1' (layout(stream=3 ) out block{a})
 0:?     'outbi' (layout(stream=3 ) out block{a,b,c})
 0:?     'inbi' (in block{a})
+0:?     '__anon__2' (in block{a15})
+0:?     '__anon__3' (layout(stream=3 ) out block{f15})
+0:?     '__anon__4' (layout(column_major shared ) uniform block{b15})
 
diff --git a/Test/baseResults/300.vert.out b/Test/baseResults/300.vert.out
index 8000c70f1a34c6471ac87283fea268520be44555..d27382d09c5c9befa4aee7bcb7646d515156e8d8 100644
--- a/Test/baseResults/300.vert.out
+++ b/Test/baseResults/300.vert.out
@@ -18,9 +18,12 @@ ERROR: 0:63: '' : array size required
 ERROR: 0:65: '' : array size required 
 ERROR: 0:64: '' : array size required 
 ERROR: 0:67: '' : array size required 
-ERROR: 0:78: 'invariant' : can only apply to an output
- invIn
-ERROR: 21 compilation errors.  No code generated.
+ERROR: 0:78: 'invariant' : can only apply to an output: invIn
+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: 25 compilation errors.  No code generated.
 
 ERROR: node is still EOpNull!
 0:27  Function Definition: main( (void)
@@ -167,6 +170,8 @@ ERROR: node is still EOpNull!
 0:?     'invIn' (in highp 4-component vector of float)
 0:?     's2' (smooth out structure{c,f})
 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:?     'gl_VertexID' (gl_VertexId highp int)
 0:?     'gl_InstanceID' (gl_InstanceId highp int)
 
diff --git a/Test/baseResults/300scope.vert.out b/Test/baseResults/300scope.vert.out
index 27b43d075f6044ae79daeda0b462740028971781..27e07047f864f2b19a711f3bcc79d6c40a59f326 100644
--- a/Test/baseResults/300scope.vert.out
+++ b/Test/baseResults/300scope.vert.out
@@ -1,13 +1,18 @@
 ERROR: 0:5: 'a' : redefinition 
-ERROR: 0:17: 'b' : illegal redeclaration 
+ERROR: 0:17: 'b' : redeclaration of existing name 
 ERROR: 0:19: 'f' : redefinition 
 ERROR: 0:20: 'tan' : redefinition 
-ERROR: 0:21: 'redeclaration of built-in function' : no longer supported in es profile; removed in version 300
-ERROR: 0:22: 'redeclaration of built-in function' : no longer supported in es profile; removed in version 300
-ERROR: 0:31: 'local function declaration' : not supported with this profile: es
-ERROR: 0:50: 'z' : undeclared identifier 
-ERROR: 0:50: 'z' : redefinition 
-ERROR: 9 compilation errors.  No code generated.
+ERROR: 0:21: 'redefinition of built-in function' : not supported with this profile: es
+ERROR: 0:21: 'sin' : redeclaration of existing name 
+ERROR: 0:22: 'redefinition of built-in function' : not supported with this profile: es
+ERROR: 0:22: 'cos' : redeclaration of existing name 
+ERROR: 0:26: 'radians' : redeclaration of existing name 
+ERROR: 0:26: 'radians' : can't find function 
+ERROR: 0:28: 'return' : void function cannot return a value 
+ERROR: 0:35: 'local function declaration' : not supported with this profile: es
+ERROR: 0:54: 'z' : undeclared identifier 
+ERROR: 0:54: 'z' : redefinition 
+ERROR: 14 compilation errors.  No code generated.
 
 ERROR: node is still EOpNull!
 0:3  Function Definition: f(i1;i1;i1; (highp int)
@@ -34,73 +39,80 @@ ERROR: node is still EOpNull!
 0:24      Branch: Return with expression
 0:24        Constant:
 0:24          1.000000
-0:29  Function Definition: main( (void)
-0:29    Function Parameters: 
+0:26  Function Definition: radians(b1; (bool)
+0:26    Function Parameters: 
+0:26      'x' (in bool)
+0:28    Sequence
+0:28      Branch: Return with expression
+0:28        Constant:
+0:28          true (const bool)
+0:33  Function Definition: main( (void)
+0:33    Function Parameters: 
 0:?     Sequence
-0:32      Function Call: g( (highp int)
-0:35      'sin' (highp float)
-0:37      Function Call: f(i1;i1;i1; (highp int)
-0:37        Constant:
-0:37          1 (const int)
-0:37        Constant:
-0:37          2 (const int)
-0:37        Constant:
-0:37          3 (const int)
-0:40      move second child to first child (highp float)
-0:40        'f' (highp float)
-0:40        Constant:
-0:40          3.000000
-0:42      move second child to first child (highp 4-component vector of float)
-0:42        'gl_Position' (invariant gl_Position highp 4-component vector of float)
-0:42        Construct vec4 (highp 4-component vector of float)
-0:42          'f' (highp float)
-0:44      Sequence
-0:44        Sequence
-0:44          move second child to first child (highp int)
-0:44            'f' (highp int)
-0:44            Constant:
-0:44              0 (const int)
-0:44        Loop with condition tested first
-0:44          Loop Condition
-0:44          Compare Less Than (bool)
-0:44            'f' (highp int)
-0:44            Constant:
-0:44              10 (const int)
-0:44          Loop Body
-0:45          Pre-Increment (highp int)
-0:45            'f' (highp int)
-0:44          Loop Terminal Expression
-0:44          Pre-Increment (highp int)
-0:44            'f' (highp int)
-0:47      Sequence
-0:47        move second child to first child (highp int)
-0:47          'x' (highp int)
-0:47          Constant:
-0:47            1 (const int)
-0:49      Sequence
-0:49        Sequence
-0:49          move second child to first child (highp float)
-0:49            'x' (highp float)
-0:49            Constant:
-0:49              2.000000
-0:49          move second child to first child (highp float)
-0:49            'y' (highp float)
-0:49            'x' (highp float)
+0:36      Function Call: g( (highp int)
+0:39      'sin' (highp float)
+0:41      Function Call: f(i1;i1;i1; (highp int)
+0:41        Constant:
+0:41          1 (const int)
+0:41        Constant:
+0:41          2 (const int)
+0:41        Constant:
+0:41          3 (const int)
+0:44      move second child to first child (highp float)
+0:44        'f' (highp float)
+0:44        Constant:
+0:44          3.000000
+0:46      move second child to first child (highp 4-component vector of float)
+0:46        'gl_Position' (invariant gl_Position highp 4-component vector of float)
+0:46        Construct vec4 (highp 4-component vector of float)
+0:46          'f' (highp float)
+0:48      Sequence
+0:48        Sequence
+0:48          move second child to first child (highp int)
+0:48            'f' (highp int)
+0:48            Constant:
+0:48              0 (const int)
+0:48        Loop with condition tested first
+0:48          Loop Condition
+0:48          Compare Less Than (bool)
+0:48            'f' (highp int)
+0:48            Constant:
+0:48              10 (const int)
+0:48          Loop Body
+0:49          Pre-Increment (highp int)
+0:49            'f' (highp int)
+0:48          Loop Terminal Expression
+0:48          Pre-Increment (highp int)
+0:48            'f' (highp int)
+0:51      Sequence
+0:51        move second child to first child (highp int)
+0:51          'x' (highp int)
+0:51          Constant:
+0:51            1 (const int)
 0:53      Sequence
 0:53        Sequence
-0:53          move second child to first child (highp int)
-0:53            'x' (highp int)
-0:53            'x' (highp int)
-0:61      Sequence
-0:61        Sequence
-0:61          move second child to first child (structure{x})
-0:61            'S' (structure{x})
-0:61            Constant:
-0:61              0 (const int)
-0:62        x: direct index for structure (highp int)
-0:62          'S' (structure{x})
-0:62          Constant:
-0:62            0 (const int)
+0:53          move second child to first child (highp float)
+0:53            'x' (highp float)
+0:53            Constant:
+0:53              2.000000
+0:53          move second child to first child (highp float)
+0:53            'y' (highp float)
+0:53            'x' (highp float)
+0:57      Sequence
+0:57        Sequence
+0:57          move second child to first child (highp int)
+0:57            'x' (highp int)
+0:57            'x' (highp int)
+0:65      Sequence
+0:65        Sequence
+0:65          move second child to first child (structure{x})
+0:65            'S' (structure{x})
+0:65            Constant:
+0:65              0 (const int)
+0:66        x: direct index for structure (highp int)
+0:66          'S' (structure{x})
+0:66          Constant:
+0:66            0 (const int)
 0:?   Linker Objects
 0:?     'b' (bool)
 0:?     'gl_VertexID' (gl_VertexId highp int)
diff --git a/Test/baseResults/430scope.vert.out b/Test/baseResults/430scope.vert.out
index 62dd94abc9bd6f24efa3a4877d0a602d49975b8e..4776db801717ab91b3e68393513daf3e752a6e2a 100644
--- a/Test/baseResults/430scope.vert.out
+++ b/Test/baseResults/430scope.vert.out
@@ -1,9 +1,9 @@
 Warning, version 430 is not yet complete; some version-specific features are present, but many are missing.
 ERROR: 0:5: 'a' : redefinition 
-ERROR: 0:17: 'b' : illegal redeclaration 
+ERROR: 0:17: 'b' : redeclaration of existing name 
 ERROR: 0:19: 'f' : redefinition 
-ERROR: 0:50: 'z' : undeclared identifier 
-ERROR: 0:50: 'z' : redefinition 
+ERROR: 0:54: 'z' : undeclared identifier 
+ERROR: 0:54: 'z' : redefinition 
 ERROR: 5 compilation errors.  No code generated.
 
 ERROR: node is still EOpNull!
@@ -31,76 +31,83 @@ ERROR: node is still EOpNull!
 0:24      Branch: Return with expression
 0:24        Constant:
 0:24          1.000000
-0:29  Function Definition: main( (void)
-0:29    Function Parameters: 
+0:26  Function Definition: radians(b1; (bool)
+0:26    Function Parameters: 
+0:26      'x' (in bool)
+0:28    Sequence
+0:28      Branch: Return with expression
+0:28        Constant:
+0:28          true (const bool)
+0:33  Function Definition: main( (void)
+0:33    Function Parameters: 
 0:?     Sequence
-0:32      Function Call: g( (int)
-0:35      'sin' (float)
-0:37      Function Call: f(i1;i1;i1; (int)
-0:37        Constant:
-0:37          1 (const int)
-0:37        Constant:
-0:37          2 (const int)
-0:37        Constant:
-0:37          3 (const int)
-0:40      move second child to first child (float)
-0:40        'f' (float)
-0:40        Constant:
-0:40          3.000000
-0:42      move second child to first child (4-component vector of float)
-0:42        gl_Position: direct index for structure (invariant gl_Position 4-component vector of float)
-0:42          '__anon__0' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
-0:42          Constant:
-0:42            0 (const uint)
-0:42        Construct vec4 (4-component vector of float)
-0:42          'f' (float)
-0:44      Sequence
-0:44        Sequence
-0:44          move second child to first child (int)
-0:44            'f' (int)
-0:44            Constant:
-0:44              0 (const int)
-0:44        Loop with condition tested first
-0:44          Loop Condition
-0:44          Compare Less Than (bool)
-0:44            'f' (int)
-0:44            Constant:
-0:44              10 (const int)
-0:44          Loop Body
-0:45          Pre-Increment (int)
-0:45            'f' (int)
-0:44          Loop Terminal Expression
-0:44          Pre-Increment (int)
-0:44            'f' (int)
-0:47      Sequence
-0:47        move second child to first child (int)
-0:47          'x' (int)
-0:47          Constant:
-0:47            1 (const int)
-0:49      Sequence
-0:49        Sequence
-0:49          move second child to first child (float)
-0:49            'x' (float)
-0:49            Constant:
-0:49              2.000000
-0:49          move second child to first child (float)
-0:49            'y' (float)
-0:49            'x' (float)
+0:36      Function Call: g( (int)
+0:39      'sin' (float)
+0:41      Function Call: f(i1;i1;i1; (int)
+0:41        Constant:
+0:41          1 (const int)
+0:41        Constant:
+0:41          2 (const int)
+0:41        Constant:
+0:41          3 (const int)
+0:44      move second child to first child (float)
+0:44        'f' (float)
+0:44        Constant:
+0:44          3.000000
+0:46      move second child to first child (4-component vector of float)
+0:46        gl_Position: direct index for structure (invariant gl_Position 4-component vector of float)
+0:46          '__anon__0' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord})
+0:46          Constant:
+0:46            0 (const uint)
+0:46        Construct vec4 (4-component vector of float)
+0:46          'f' (float)
+0:48      Sequence
+0:48        Sequence
+0:48          move second child to first child (int)
+0:48            'f' (int)
+0:48            Constant:
+0:48              0 (const int)
+0:48        Loop with condition tested first
+0:48          Loop Condition
+0:48          Compare Less Than (bool)
+0:48            'f' (int)
+0:48            Constant:
+0:48              10 (const int)
+0:48          Loop Body
+0:49          Pre-Increment (int)
+0:49            'f' (int)
+0:48          Loop Terminal Expression
+0:48          Pre-Increment (int)
+0:48            'f' (int)
+0:51      Sequence
+0:51        move second child to first child (int)
+0:51          'x' (int)
+0:51          Constant:
+0:51            1 (const int)
 0:53      Sequence
 0:53        Sequence
-0:53          move second child to first child (int)
-0:53            'x' (int)
-0:53            'x' (int)
-0:61      Sequence
-0:61        Sequence
-0:61          move second child to first child (structure{x})
-0:61            'S' (structure{x})
-0:61            Constant:
-0:61              0 (const int)
-0:62        x: direct index for structure (int)
-0:62          'S' (structure{x})
-0:62          Constant:
-0:62            0 (const int)
+0:53          move second child to first child (float)
+0:53            'x' (float)
+0:53            Constant:
+0:53              2.000000
+0:53          move second child to first child (float)
+0:53            'y' (float)
+0:53            'x' (float)
+0:57      Sequence
+0:57        Sequence
+0:57          move second child to first child (int)
+0:57            'x' (int)
+0:57            'x' (int)
+0:65      Sequence
+0:65        Sequence
+0:65          move second child to first child (structure{x})
+0:65            'S' (structure{x})
+0:65            Constant:
+0:65              0 (const int)
+0:66        x: direct index for structure (int)
+0:66          'S' (structure{x})
+0:66          Constant:
+0:66            0 (const int)
 0:?   Linker Objects
 0:?     'b' (bool)
 0:?     'tan' (float)
diff --git a/Test/baseResults/specExamples.frag.out b/Test/baseResults/specExamples.frag.out
index f5afa45015df6da3e66ad42b48f1e1ff309c3d7d..92ceaf5ddff873ba8ab35f5352f5077bcfe1d612 100644
--- a/Test/baseResults/specExamples.frag.out
+++ b/Test/baseResults/specExamples.frag.out
@@ -3,8 +3,7 @@ ERROR: 0:6: '=' :  cannot convert from 'const uint' to 'int'
 ERROR: 0:20: '' : numeric literal too big 
 ERROR: 0:21: '' : hexidecimal literal too big 
 ERROR: 0:37: 'view' : redefinition 
-ERROR: 0:63: 'invariant' : can only apply to an output
- Color
+ERROR: 0:63: 'invariant' : can only apply to an output: Color
 ERROR: 0:68: 'lightPosition' : redefinition 
 ERROR: 0:75: 'Atten' : member storage qualifier cannot contradict block storage qualifier 
 ERROR: 0:87: 'Color' : redefinition 
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 9adb2eb8f15b0ee40ea8ac7006a894e229653f4f..a983c05287c6f96c04a13011a15d7ca80b18e139 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -733,12 +733,13 @@ TFunction* TParseContext::handleFunctionDeclarator(TSourceLoc loc, TFunction& fu
     //
     // Redeclarations (full prototype match) are allowed.  But, return types and parameter qualifiers must match.
     //
-    // ES does not allow redeclaring or hiding of built-in functions.
+    // ES 100 does not allow redefining, but does allow overloading of built-in functions.
+    // ES 300 does not allow redefining or overloading of built-in functions.
     //
     bool builtIn;
     TSymbol* symbol = symbolTable.find(function.getMangledName(), &builtIn);
     if (symbol && symbol->getAsFunction() && builtIn)
-        requireNotRemoved(loc, EEsProfile, 300, "redeclaration of built-in function");
+        requireProfile(loc, ~EEsProfile, "redefinition of built-in function");
     const TFunction* prevDec = symbol ? symbol->getAsFunction() : 0;
     if (prevDec) {
         if (prevDec->getType() != function.getType()) {
@@ -752,7 +753,7 @@ TFunction* TParseContext::handleFunctionDeclarator(TSourceLoc loc, TFunction& fu
 
 
     if (! symbolTable.insert(function))
-        error(loc, "illegal redeclaration", function.getName().c_str(), "");
+        error(loc, "redeclaration of existing name", function.getName().c_str(), "");
 
     //
     // If this is a redeclaration, it could also be a definition,
@@ -775,7 +776,7 @@ TIntermAggregate* TParseContext::handleFunctionPrototype(TSourceLoc loc, TFuncti
     TFunction* prevDec = symbol ? symbol->getAsFunction() : 0;
 
     if (! prevDec)
-        error(loc, "can't find function name", function.getName().c_str(), "");
+        error(loc, "can't find function", function.getName().c_str(), "");
 
     //
     // Note:  'prevDec' could be 'function' if this is the first time we've seen function
@@ -3332,13 +3333,17 @@ void TParseContext::declareBlock(TSourceLoc loc, TTypeList& typeList, const TStr
     // whose type is EbtBlock, but without all the structure; that will come from the type
     // the instances point to.
     //
-    TType blockNameType(EbtBlock);
+    TType blockNameType(EbtBlock, blockType.getQualifier().storage);
     TVariable* blockNameVar = new TVariable(blockName, blockNameType);
     if (! symbolTable.insert(*blockNameVar)) {
         TSymbol* existingName = symbolTable.find(*blockName);
-        if (existingName->getType().getBasicType() != EbtBlock) {
+        if (existingName->getType().getBasicType() == EbtBlock) {
+            if (existingName->getType().getQualifier().storage == blockType.getQualifier().storage) {
+                error(loc, "Cannot reuse block name within the same interface:", blockName->c_str(), blockType.getStorageQualifierString());
+                return;
+            }
+        } else {
             error(loc, "block name cannot redefine a non-block name", blockName->c_str(), "");
-
             return;
         }
     }
@@ -3414,7 +3419,7 @@ void TParseContext::invariantCheck(TSourceLoc loc, const TType& type, const TStr
     bool pipeIn = type.getQualifier().isPipeInput();
     if (version >= 300 || profile != EEsProfile && version >= 420) {
         if (! pipeOut)
-            error(loc, "can only apply to an output\n", "invariant", identifier.c_str());
+            error(loc, "can only apply to an output:", "invariant", identifier.c_str());
     } else {
         if ((language == EShLangVertex && pipeIn) || (! pipeOut && ! pipeIn))
             error(loc, "can only apply to an output or an input in a non-vertex stage\n", "invariant", "");
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
index 7a843c45648cba0145c8912710970cca18b22e92..ee1cdd688ed3c707eaeefbd2baadcdb8005c360d 100644
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -168,7 +168,7 @@ void InitializeStageSymbolTable(TBuiltIns& builtIns, int version, EProfile profi
     (*symbolTables[language]).adoptLevels(*commonTable[CommonIndex(profile, language)]);
     InitializeSymbolTable(builtIns.getStageString(language), version, profile, language, infoSink, *symbolTables[language]);
     IdentifyBuiltIns(version, profile, language, *symbolTables[language]);
-    if (profile == EEsProfile)
+    if (profile == EEsProfile && version >= 300)
         (*symbolTables[language]).setNoBuiltInRedeclarations();
 }
 
diff --git a/glslang/MachineIndependent/SymbolTable.h b/glslang/MachineIndependent/SymbolTable.h
index e51f9cee3d17cafb74745e5748c57e4992b3ef99..52182dbb3af7876b6e00479e79669ad5be165924 100644
--- a/glslang/MachineIndependent/SymbolTable.h
+++ b/glslang/MachineIndependent/SymbolTable.h
@@ -292,9 +292,8 @@ public:
             return isOkay;
         } else {
             // Check for redefinition errors:
-            // - STL itself will tell us if there is a direct name collision at this level
-            // - additionally, check for function/variable name collisions
-            // - for ES, for overriding or hiding built-in function
+            // - STL itself will tell us if there is a direct name collision, with name mangling, at this level
+            // - additionally, check for function-redefining-variable name collisions
             const TString& insertName = symbol.getMangledName();
             if (symbol.getAsFunction()) {
                 // make sure there isn't a variable of this name
@@ -457,11 +456,13 @@ public:
     {
         symbol.setUniqueId(++uniqueId);
 
-        if (! symbol.getAsFunction()) {
-            // make sure there isn't a function of this name
-            if (table[currentLevel()]->hasFunctionName(symbol.getName()))
-                return false;
-            if (atGlobalLevel() && currentLevel() > 0 && noBuiltInRedeclarations) {
+        // make sure there isn't a function of this variable name
+        if (! symbol.getAsFunction() && table[currentLevel()]->hasFunctionName(symbol.getName()))
+            return false;
+            
+        // check for not overloading or redefining a built-in function
+        if (noBuiltInRedeclarations) {
+            if (atGlobalLevel() && currentLevel() > 0) {
                 if (table[0]->hasFunctionName(symbol.getName()))
                     return false;
                 if (currentLevel() > 1 && table[1]->hasFunctionName(symbol.getName()))