diff --git a/Test/150.tesc b/Test/150.tesc
index b72f0def9ce3a0972dbf5f6f8e61ae5762aefa5e..66c0f3ea4a1df838c20254f3a4b32391fdb457ec 100644
--- a/Test/150.tesc
+++ b/Test/150.tesc
@@ -25,9 +25,9 @@ void main()
     int pid = gl_PrimitiveID;
     int iid = gl_InvocationID;
 
-    gl_out[1].gl_Position = p;
-    gl_out[1].gl_PointSize = ps;
-    gl_out[1].gl_ClipDistance[1] = cd;
+    gl_out[gl_InvocationID].gl_Position = p;
+    gl_out[gl_InvocationID].gl_PointSize = ps;
+    gl_out[gl_InvocationID].gl_ClipDistance[1] = cd;
 
     gl_TessLevelOuter[3] = 3.2;
     gl_TessLevelInner[1] = 1.3;
diff --git a/Test/310.frag b/Test/310.frag
index 78f13f60b21b1114f0f63bed5ad0d3999897884b..b08391a54350df21439e1f4b0e5711b648c15844 100644
--- a/Test/310.frag
+++ b/Test/310.frag
@@ -166,7 +166,7 @@ void fooIO()
 {
     vec4 v = inbinst.v + vAnon;
     v *= arrayedInst[2].f;
-    v *= arrayedInst[i].f;       // ERROR, not constant
+    v *= arrayedInst[i].f;
 }
 
 in vec4 gl_FragCoord;
diff --git a/Test/310.tesc b/Test/310.tesc
index 8220021ee02277452dfa9fd7d130b4129d42cae0..29c393239b364af573274212f1656425b1b02b5d 100644
--- a/Test/310.tesc
+++ b/Test/310.tesc
@@ -3,7 +3,7 @@
 #extension GL_OES_tessellation_shader : enable
 
 layout(vertices = 4) out;
-int outa[gl_out.length()];
+out int outa[gl_out.length()];
 
 layout(quads) in;                   // ERROR
 layout(ccw) out;                    // ERROR
@@ -30,9 +30,9 @@ void main()
     int pid = gl_PrimitiveID;
     int iid = gl_InvocationID;
 
-    gl_out[1].gl_Position = p;
-    gl_out[1].gl_PointSize = ps;        // ERROR, need point_size extension
-    gl_out[1].gl_ClipDistance[1] = cd;  // ERROR, not in ES
+    gl_out[gl_InvocationID].gl_Position = p;
+    gl_out[gl_InvocationID].gl_PointSize = ps;        // ERROR, need point_size extension
+    gl_out[gl_InvocationID].gl_ClipDistance[1] = cd;  // ERROR, not in ES
 
     gl_TessLevelOuter[3] = 3.2;
     gl_TessLevelInner[1] = 1.3;
@@ -112,7 +112,7 @@ out float okaySize[4];
 void pointSize2()
 {
     float ps = gl_in[1].gl_PointSize;
-    gl_out[1].gl_PointSize = ps;
+    gl_out[gl_InvocationID].gl_PointSize = ps;
 }
 
 #extension GL_OES_gpu_shader5 : enable
@@ -141,3 +141,29 @@ void bb()
     gl_BoundingBoxOES[1] = vec4(1.0);
     gl_BoundingBoxOES[2] = vec4(2.0);  // ERROR, overflow
 }
+
+out patch badpatchBName {  // ERROR, array size required
+    float f;
+} badpatchIName[];
+
+out patch patchBName {
+    float f;
+} patchIName[4];
+
+void outputtingOutparam(out int a)
+{
+    a = 2;
+}
+
+void outputting()
+{
+    outa[gl_InvocationID] = 2;
+    outa[1] = 2;                         // ERROR, not gl_InvocationID
+    gl_out[0].gl_Position = vec4(1.0);   // ERROR, not gl_InvocationID
+    outa[1];
+    gl_out[0];
+    outputtingOutparam(outa[0]);         // ERROR, not gl_InvocationID
+    outputtingOutparam(outa[gl_InvocationID]);
+    patchIName[1].f = 3.14;
+    outa[(gl_InvocationID)] = 2;
+}
diff --git a/Test/400.tesc b/Test/400.tesc
index cf9ba5171783632ec3a8c50493f4da04f1a21069..950f5de1e99fd44c67551c7856610b690ebca700 100644
--- a/Test/400.tesc
+++ b/Test/400.tesc
@@ -28,9 +28,9 @@ void main()
     int pid = gl_PrimitiveID;
     int iid = gl_InvocationID;
 
-    gl_out[1].gl_Position = p;
-    gl_out[1].gl_PointSize = ps;
-    gl_out[1].gl_ClipDistance[1] = cd;
+    gl_out[gl_InvocationID].gl_Position = p;
+    gl_out[gl_InvocationID].gl_PointSize = ps;
+    gl_out[gl_InvocationID].gl_ClipDistance[1] = cd;
 
     gl_TessLevelOuter[3] = 3.2;
     gl_TessLevelInner[1] = 1.3;
diff --git a/Test/420.tesc b/Test/420.tesc
index 93f2386a46f997008756671c2ad6377643650841..04ac4433a80aa3be0d34af37db7e8e16d4f2ad3b 100644
--- a/Test/420.tesc
+++ b/Test/420.tesc
@@ -22,8 +22,8 @@ void main()
     int pid = gl_PrimitiveID;
     int iid = gl_InvocationID;
 
-    gl_out[1].gl_Position = p;
-    gl_out[1].gl_PointSize = ps;        // ERROR
+    gl_out[gl_InvocationID].gl_Position = p;
+    gl_out[gl_InvocationID].gl_PointSize = ps;        // ERROR
 }
 
 out float outf;  // ERROR, no array
diff --git a/Test/450.tesc b/Test/450.tesc
index 9cbf71c005f202c61949558ca6fe16247a4b8b12..75a9bf4692673eb1e536b49e587f69197423c4d5 100644
--- a/Test/450.tesc
+++ b/Test/450.tesc
@@ -6,9 +6,9 @@ in gl_PerVertex {
 
 out gl_PerVertex {
     float gl_CullDistance[3];
-} gl_out[];
+} gl_out[4];
 
 void main()
 {
-    gl_out[0].gl_CullDistance[2] = gl_in[1].gl_CullDistance[2];
+    gl_out[gl_InvocationID].gl_CullDistance[2] = gl_in[1].gl_CullDistance[2];
 }
diff --git a/Test/baseResults/150.tesc.out b/Test/baseResults/150.tesc.out
index 8e50b81568eb89a40566dbfd594ba89a0939fb18..185789cad2e14fc5cfc6e5b20a602cf3fa6ea13f 100644
--- a/Test/baseResults/150.tesc.out
+++ b/Test/baseResults/150.tesc.out
@@ -59,29 +59,26 @@ vertices = 4
 0:26          'gl_InvocationID' (in int InvocationID)
 0:28      move second child to first child (temp 4-component vector of float)
 0:28        gl_Position: direct index for structure (out 4-component vector of float Position)
-0:28          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:28          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
 0:28            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:28            Constant:
-0:28              1 (const int)
+0:28            'gl_InvocationID' (in int InvocationID)
 0:28          Constant:
 0:28            0 (const int)
 0:28        'p' (temp 4-component vector of float)
 0:29      move second child to first child (temp float)
 0:29        gl_PointSize: direct index for structure (out float PointSize)
-0:29          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:29          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
 0:29            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:29            Constant:
-0:29              1 (const int)
+0:29            'gl_InvocationID' (in int InvocationID)
 0:29          Constant:
 0:29            1 (const int)
 0:29        'ps' (temp float)
 0:30      move second child to first child (temp float)
 0:30        direct index (temp float ClipDistance)
 0:30          gl_ClipDistance: direct index for structure (out implicitly-sized array of float ClipDistance)
-0:30            direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:30            indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
 0:30              'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:30              Constant:
-0:30                1 (const int)
+0:30              'gl_InvocationID' (in int InvocationID)
 0:30            Constant:
 0:30              2 (const int)
 0:30          Constant:
@@ -295,29 +292,26 @@ ERROR: node is still EOpNull!
 0:29          'gl_InvocationID' (in int InvocationID)
 0:31      move second child to first child (temp 4-component vector of float)
 0:31        gl_Position: direct index for structure (out 4-component vector of float Position)
-0:31          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:31          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
 0:31            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:31            Constant:
-0:31              1 (const int)
+0:31            'gl_InvocationID' (in int InvocationID)
 0:31          Constant:
 0:31            0 (const int)
 0:31        'p' (temp 4-component vector of float)
 0:32      move second child to first child (temp float)
 0:32        gl_PointSize: direct index for structure (out float PointSize)
-0:32          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:32          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
 0:32            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:32            Constant:
-0:32              1 (const int)
+0:32            'gl_InvocationID' (in int InvocationID)
 0:32          Constant:
 0:32            1 (const int)
 0:32        'ps' (temp float)
 0:33      move second child to first child (temp float)
 0:33        direct index (temp float ClipDistance)
 0:33          gl_ClipDistance: direct index for structure (out implicitly-sized array of float ClipDistance)
-0:33            direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:33            indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
 0:33              'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:33              Constant:
-0:33                1 (const int)
+0:33              'gl_InvocationID' (in int InvocationID)
 0:33            Constant:
 0:33              2 (const int)
 0:33          Constant:
@@ -666,17 +660,15 @@ ERROR: node is still EOpNull!
 0:23          'gl_InvocationID' (in int InvocationID)
 0:25      move second child to first child (temp 4-component vector of float)
 0:25        gl_Position: direct index for structure (out 4-component vector of float Position)
-0:25          direct index (temp block{out 4-component vector of float Position gl_Position})
+0:25          indirect index (temp block{out 4-component vector of float Position gl_Position})
 0:25            'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position})
-0:25            Constant:
-0:25              1 (const int)
+0:25            'gl_InvocationID' (in int InvocationID)
 0:25          Constant:
 0:25            0 (const int)
 0:25        'p' (temp 4-component vector of float)
-0:26      direct index (temp block{out 4-component vector of float Position gl_Position})
+0:26      indirect index (temp block{out 4-component vector of float Position gl_Position})
 0:26        'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position})
-0:26        Constant:
-0:26          1 (const int)
+0:26        'gl_InvocationID' (in int InvocationID)
 0:34  Function Definition: foo( (global void)
 0:34    Function Parameters: 
 0:36    Sequence
@@ -982,29 +974,26 @@ vertices = 4
 0:26          'gl_InvocationID' (in int InvocationID)
 0:28      move second child to first child (temp 4-component vector of float)
 0:28        gl_Position: direct index for structure (out 4-component vector of float Position)
-0:28          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:28          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
 0:28            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
-0:28            Constant:
-0:28              1 (const int)
+0:28            'gl_InvocationID' (in int InvocationID)
 0:28          Constant:
 0:28            0 (const int)
 0:28        'p' (temp 4-component vector of float)
 0:29      move second child to first child (temp float)
 0:29        gl_PointSize: direct index for structure (out float PointSize)
-0:29          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:29          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
 0:29            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
-0:29            Constant:
-0:29              1 (const int)
+0:29            'gl_InvocationID' (in int InvocationID)
 0:29          Constant:
 0:29            1 (const int)
 0:29        'ps' (temp float)
 0:30      move second child to first child (temp float)
 0:30        direct index (temp float ClipDistance)
 0:30          gl_ClipDistance: direct index for structure (out 1-element array of float ClipDistance)
-0:30            direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:30            indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
 0:30              'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
-0:30              Constant:
-0:30                1 (const int)
+0:30              'gl_InvocationID' (in int InvocationID)
 0:30            Constant:
 0:30              2 (const int)
 0:30          Constant:
@@ -1080,29 +1069,26 @@ vertices = 4
 0:29          'gl_InvocationID' (in int InvocationID)
 0:31      move second child to first child (temp 4-component vector of float)
 0:31        gl_Position: direct index for structure (out 4-component vector of float Position)
-0:31          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:31          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
 0:31            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
-0:31            Constant:
-0:31              1 (const int)
+0:31            'gl_InvocationID' (in int InvocationID)
 0:31          Constant:
 0:31            0 (const int)
 0:31        'p' (temp 4-component vector of float)
 0:32      move second child to first child (temp float)
 0:32        gl_PointSize: direct index for structure (out float PointSize)
-0:32          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:32          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
 0:32            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
-0:32            Constant:
-0:32              1 (const int)
+0:32            'gl_InvocationID' (in int InvocationID)
 0:32          Constant:
 0:32            1 (const int)
 0:32        'ps' (temp float)
 0:33      move second child to first child (temp float)
 0:33        direct index (temp float ClipDistance)
 0:33          gl_ClipDistance: direct index for structure (out 1-element array of float ClipDistance)
-0:33            direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:33            indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
 0:33              'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
-0:33              Constant:
-0:33                1 (const int)
+0:33              'gl_InvocationID' (in int InvocationID)
 0:33            Constant:
 0:33              2 (const int)
 0:33          Constant:
@@ -1248,17 +1234,15 @@ vertices = 4
 0:23          'gl_InvocationID' (in int InvocationID)
 0:25      move second child to first child (temp 4-component vector of float)
 0:25        gl_Position: direct index for structure (out 4-component vector of float Position)
-0:25          direct index (temp block{out 4-component vector of float Position gl_Position})
+0:25          indirect index (temp block{out 4-component vector of float Position gl_Position})
 0:25            'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position})
-0:25            Constant:
-0:25              1 (const int)
+0:25            'gl_InvocationID' (in int InvocationID)
 0:25          Constant:
 0:25            0 (const int)
 0:25        'p' (temp 4-component vector of float)
-0:26      direct index (temp block{out 4-component vector of float Position gl_Position})
+0:26      indirect index (temp block{out 4-component vector of float Position gl_Position})
 0:26        'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position})
-0:26        Constant:
-0:26          1 (const int)
+0:26        'gl_InvocationID' (in int InvocationID)
 0:34  Function Definition: foo( (global void)
 0:34    Function Parameters: 
 0:36    Sequence
diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out
index 9769eb6ad5d596832038d0491e5669d4a011020e..9cfd0ef844b11c031d9bffb7095adb20b682f8c0 100644
--- a/Test/baseResults/310.frag.out
+++ b/Test/baseResults/310.frag.out
@@ -49,7 +49,6 @@ ERROR: 0:148: 'inbname2' : Cannot reuse block name within the same interface: in
 ERROR: 0:153: 'badmember' : nameless block contains a member that already has a name at global scope 
 ERROR: 0:157: 'inbname' : redefinition 
 ERROR: 0:159: 'vAnon' : redefinition 
-ERROR: 0:169: 'variable indexing in/out block array' : not supported with this profile: es
 ERROR: 0:173: 'origin_upper_left' : not supported with this profile: es
 ERROR: 0:173: 'pixel_center_integer' : not supported with this profile: es
 ERROR: 0:173: 'redeclaration' : cannot redeclare with different qualification: gl_FragCoord
@@ -130,7 +129,7 @@ ERROR: 0:427: 'blend equation' : can only apply to a standalone qualifier
 ERROR: 0:428: 'blend equation' : can only apply to a standalone qualifier 
 ERROR: 0:429: 'blend_support' : unknown blend equation 
 ERROR: 0:431: 'fragment-shader array-of-array output' : not supported with this profile: es
-ERROR: 122 compilation errors.  No code generated.
+ERROR: 121 compilation errors.  No code generated.
 
 
 Shader version: 310
diff --git a/Test/baseResults/310.tesc.out b/Test/baseResults/310.tesc.out
index 9bf8ab521b35e94276c9413b881f1f0c42c729d9..a498674e9b343c4b15a04a649ca4fef73b6d3461 100644
--- a/Test/baseResults/310.tesc.out
+++ b/Test/baseResults/310.tesc.out
@@ -41,7 +41,11 @@ ERROR: 0:133: 'gl_BoundingBoxOES' : required extension not requested: Possible e
 GL_EXT_primitive_bounding_box
 GL_OES_primitive_bounding_box
 ERROR: 0:142: '[' :  array index out of range '2'
-ERROR: 33 compilation errors.  No code generated.
+ERROR: 0:145: '' : array size required 
+ERROR: 0:161: '[]' : tessellation-control per-vertex output l-value must be indexed with gl_InvocationID 
+ERROR: 0:162: '[]' : tessellation-control per-vertex output l-value must be indexed with gl_InvocationID 
+ERROR: 0:165: '[]' : tessellation-control per-vertex output l-value must be indexed with gl_InvocationID 
+ERROR: 37 compilation errors.  No code generated.
 
 
 Shader version: 310
@@ -101,19 +105,17 @@ ERROR: node is still EOpNull!
 0:31          'gl_InvocationID' (in highp int InvocationID)
 0:33      move second child to first child (temp highp 4-component vector of float)
 0:33        gl_Position: direct index for structure (out highp 4-component vector of float Position)
-0:33          direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:33          indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
 0:33            'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
-0:33            Constant:
-0:33              1 (const int)
+0:33            'gl_InvocationID' (in highp int InvocationID)
 0:33          Constant:
 0:33            0 (const int)
 0:33        'p' (temp highp 4-component vector of float)
 0:34      move second child to first child (temp highp float)
 0:34        gl_PointSize: direct index for structure (out highp float PointSize)
-0:34          direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:34          indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
 0:34            'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
-0:34            Constant:
-0:34              1 (const int)
+0:34            'gl_InvocationID' (in highp int InvocationID)
 0:34          Constant:
 0:34            1 (const int)
 0:34        'ps' (temp highp float)
@@ -215,10 +217,9 @@ ERROR: node is still EOpNull!
 0:114              1 (const int)
 0:115      move second child to first child (temp highp float)
 0:115        gl_PointSize: direct index for structure (out highp float PointSize)
-0:115          direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:115          indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
 0:115            'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
-0:115            Constant:
-0:115              1 (const int)
+0:115            'gl_InvocationID' (in highp int InvocationID)
 0:115          Constant:
 0:115            1 (const int)
 0:115        'ps' (temp highp float)
@@ -277,9 +278,79 @@ ERROR: node is still EOpNull!
 0:142          2.000000
 0:142          2.000000
 0:142          2.000000
+0:153  Function Definition: outputtingOutparam(i1; (global void)
+0:153    Function Parameters: 
+0:153      'a' (out highp int)
+0:155    Sequence
+0:155      move second child to first child (temp highp int)
+0:155        'a' (out highp int)
+0:155        Constant:
+0:155          2 (const int)
+0:158  Function Definition: outputting( (global void)
+0:158    Function Parameters: 
+0:160    Sequence
+0:160      move second child to first child (temp highp int)
+0:160        indirect index (temp highp int)
+0:160          'outa' (out 4-element array of highp int)
+0:160          'gl_InvocationID' (in highp int InvocationID)
+0:160        Constant:
+0:160          2 (const int)
+0:161      move second child to first child (temp highp int)
+0:161        direct index (temp highp int)
+0:161          'outa' (out 4-element array of highp int)
+0:161          Constant:
+0:161            1 (const int)
+0:161        Constant:
+0:161          2 (const int)
+0:162      move second child to first child (temp highp 4-component vector of float)
+0:162        gl_Position: direct index for structure (out highp 4-component vector of float Position)
+0:162          direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:162            'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:162            Constant:
+0:162              0 (const int)
+0:162          Constant:
+0:162            0 (const int)
+0:162        Constant:
+0:162          1.000000
+0:162          1.000000
+0:162          1.000000
+0:162          1.000000
+0:163      direct index (temp highp int)
+0:163        'outa' (out 4-element array of highp int)
+0:163        Constant:
+0:163          1 (const int)
+0:164      direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:164        'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:164        Constant:
+0:164          0 (const int)
+0:165      Function Call: outputtingOutparam(i1; (global void)
+0:165        direct index (temp highp int)
+0:165          'outa' (out 4-element array of highp int)
+0:165          Constant:
+0:165            0 (const int)
+0:166      Function Call: outputtingOutparam(i1; (global void)
+0:166        indirect index (temp highp int)
+0:166          'outa' (out 4-element array of highp int)
+0:166          'gl_InvocationID' (in highp int InvocationID)
+0:167      move second child to first child (temp highp float)
+0:167        f: direct index for structure (out highp float)
+0:167          direct index (patch temp block{out highp float f})
+0:167            'patchIName' (patch out 4-element array of block{out highp float f})
+0:167            Constant:
+0:167              1 (const int)
+0:167          Constant:
+0:167            0 (const int)
+0:167        Constant:
+0:167          3.140000
+0:168      move second child to first child (temp highp int)
+0:168        indirect index (temp highp int)
+0:168          'outa' (out 4-element array of highp int)
+0:168          'gl_InvocationID' (in highp int InvocationID)
+0:168        Constant:
+0:168          2 (const int)
 0:?   Linker Objects
 0:?     'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
-0:?     'outa' (global 4-element array of highp int)
+0:?     'outa' (out 4-element array of highp int)
 0:?     'patchIn' (patch in highp 4-component vector of float)
 0:?     'patchOut' (patch out highp 4-component vector of float)
 0:?     'ina' (in highp 2-component vector of float)
@@ -301,6 +372,8 @@ ERROR: node is still EOpNull!
 0:?     'misSized' (out 5-element array of highp float)
 0:?     'okaySize' (out 4-element array of highp float)
 0:?     'pv3' (temp highp 3-component vector of float)
+0:?     'badpatchIName' (patch out implicitly-sized array of block{out highp float f})
+0:?     'patchIName' (patch out 4-element array of block{out highp float f})
 
 
 Linked tessellation control stage:
@@ -363,19 +436,17 @@ ERROR: node is still EOpNull!
 0:31          'gl_InvocationID' (in highp int InvocationID)
 0:33      move second child to first child (temp highp 4-component vector of float)
 0:33        gl_Position: direct index for structure (out highp 4-component vector of float Position)
-0:33          direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:33          indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
 0:33            'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
-0:33            Constant:
-0:33              1 (const int)
+0:33            'gl_InvocationID' (in highp int InvocationID)
 0:33          Constant:
 0:33            0 (const int)
 0:33        'p' (temp highp 4-component vector of float)
 0:34      move second child to first child (temp highp float)
 0:34        gl_PointSize: direct index for structure (out highp float PointSize)
-0:34          direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:34          indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
 0:34            'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
-0:34            Constant:
-0:34              1 (const int)
+0:34            'gl_InvocationID' (in highp int InvocationID)
 0:34          Constant:
 0:34            1 (const int)
 0:34        'ps' (temp highp float)
@@ -477,10 +548,9 @@ ERROR: node is still EOpNull!
 0:114              1 (const int)
 0:115      move second child to first child (temp highp float)
 0:115        gl_PointSize: direct index for structure (out highp float PointSize)
-0:115          direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:115          indirect index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
 0:115            'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
-0:115            Constant:
-0:115              1 (const int)
+0:115            'gl_InvocationID' (in highp int InvocationID)
 0:115          Constant:
 0:115            1 (const int)
 0:115        'ps' (temp highp float)
@@ -539,9 +609,79 @@ ERROR: node is still EOpNull!
 0:142          2.000000
 0:142          2.000000
 0:142          2.000000
+0:153  Function Definition: outputtingOutparam(i1; (global void)
+0:153    Function Parameters: 
+0:153      'a' (out highp int)
+0:155    Sequence
+0:155      move second child to first child (temp highp int)
+0:155        'a' (out highp int)
+0:155        Constant:
+0:155          2 (const int)
+0:158  Function Definition: outputting( (global void)
+0:158    Function Parameters: 
+0:160    Sequence
+0:160      move second child to first child (temp highp int)
+0:160        indirect index (temp highp int)
+0:160          'outa' (out 4-element array of highp int)
+0:160          'gl_InvocationID' (in highp int InvocationID)
+0:160        Constant:
+0:160          2 (const int)
+0:161      move second child to first child (temp highp int)
+0:161        direct index (temp highp int)
+0:161          'outa' (out 4-element array of highp int)
+0:161          Constant:
+0:161            1 (const int)
+0:161        Constant:
+0:161          2 (const int)
+0:162      move second child to first child (temp highp 4-component vector of float)
+0:162        gl_Position: direct index for structure (out highp 4-component vector of float Position)
+0:162          direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:162            'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:162            Constant:
+0:162              0 (const int)
+0:162          Constant:
+0:162            0 (const int)
+0:162        Constant:
+0:162          1.000000
+0:162          1.000000
+0:162          1.000000
+0:162          1.000000
+0:163      direct index (temp highp int)
+0:163        'outa' (out 4-element array of highp int)
+0:163        Constant:
+0:163          1 (const int)
+0:164      direct index (temp block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:164        'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
+0:164        Constant:
+0:164          0 (const int)
+0:165      Function Call: outputtingOutparam(i1; (global void)
+0:165        direct index (temp highp int)
+0:165          'outa' (out 4-element array of highp int)
+0:165          Constant:
+0:165            0 (const int)
+0:166      Function Call: outputtingOutparam(i1; (global void)
+0:166        indirect index (temp highp int)
+0:166          'outa' (out 4-element array of highp int)
+0:166          'gl_InvocationID' (in highp int InvocationID)
+0:167      move second child to first child (temp highp float)
+0:167        f: direct index for structure (out highp float)
+0:167          direct index (patch temp block{out highp float f})
+0:167            'patchIName' (patch out 4-element array of block{out highp float f})
+0:167            Constant:
+0:167              1 (const int)
+0:167          Constant:
+0:167            0 (const int)
+0:167        Constant:
+0:167          3.140000
+0:168      move second child to first child (temp highp int)
+0:168        indirect index (temp highp int)
+0:168          'outa' (out 4-element array of highp int)
+0:168          'gl_InvocationID' (in highp int InvocationID)
+0:168        Constant:
+0:168          2 (const int)
 0:?   Linker Objects
 0:?     'gl_out' (out 4-element array of block{out highp 4-component vector of float Position gl_Position, out highp float PointSize gl_PointSize})
-0:?     'outa' (global 4-element array of highp int)
+0:?     'outa' (out 4-element array of highp int)
 0:?     'patchIn' (patch in highp 4-component vector of float)
 0:?     'patchOut' (patch out highp 4-component vector of float)
 0:?     'ina' (in highp 2-component vector of float)
@@ -563,4 +703,6 @@ ERROR: node is still EOpNull!
 0:?     'misSized' (out 5-element array of highp float)
 0:?     'okaySize' (out 4-element array of highp float)
 0:?     'pv3' (temp highp 3-component vector of float)
+0:?     'badpatchIName' (patch out 1-element array of block{out highp float f})
+0:?     'patchIName' (patch out 4-element array of block{out highp float f})
 
diff --git a/Test/baseResults/400.tesc.out b/Test/baseResults/400.tesc.out
index 7430cffaaac032e41b4ed1c2295ed90adbbbbb47..a1401d333681790a84945e3f8154e40183827620 100644
--- a/Test/baseResults/400.tesc.out
+++ b/Test/baseResults/400.tesc.out
@@ -81,29 +81,26 @@ ERROR: node is still EOpNull!
 0:29          'gl_InvocationID' (in int InvocationID)
 0:31      move second child to first child (temp 4-component vector of float)
 0:31        gl_Position: direct index for structure (out 4-component vector of float Position)
-0:31          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:31          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
 0:31            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:31            Constant:
-0:31              1 (const int)
+0:31            'gl_InvocationID' (in int InvocationID)
 0:31          Constant:
 0:31            0 (const int)
 0:31        'p' (temp 4-component vector of float)
 0:32      move second child to first child (temp float)
 0:32        gl_PointSize: direct index for structure (out float PointSize)
-0:32          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:32          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
 0:32            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:32            Constant:
-0:32              1 (const int)
+0:32            'gl_InvocationID' (in int InvocationID)
 0:32          Constant:
 0:32            1 (const int)
 0:32        'ps' (temp float)
 0:33      move second child to first child (temp float)
 0:33        direct index (temp float ClipDistance)
 0:33          gl_ClipDistance: direct index for structure (out implicitly-sized array of float ClipDistance)
-0:33            direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
+0:33            indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
 0:33              'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out implicitly-sized array of float ClipDistance gl_ClipDistance})
-0:33              Constant:
-0:33                1 (const int)
+0:33              'gl_InvocationID' (in int InvocationID)
 0:33            Constant:
 0:33              2 (const int)
 0:33          Constant:
@@ -279,29 +276,26 @@ ERROR: node is still EOpNull!
 0:29          'gl_InvocationID' (in int InvocationID)
 0:31      move second child to first child (temp 4-component vector of float)
 0:31        gl_Position: direct index for structure (out 4-component vector of float Position)
-0:31          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:31          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
 0:31            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
-0:31            Constant:
-0:31              1 (const int)
+0:31            'gl_InvocationID' (in int InvocationID)
 0:31          Constant:
 0:31            0 (const int)
 0:31        'p' (temp 4-component vector of float)
 0:32      move second child to first child (temp float)
 0:32        gl_PointSize: direct index for structure (out float PointSize)
-0:32          direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:32          indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
 0:32            'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
-0:32            Constant:
-0:32              1 (const int)
+0:32            'gl_InvocationID' (in int InvocationID)
 0:32          Constant:
 0:32            1 (const int)
 0:32        'ps' (temp float)
 0:33      move second child to first child (temp float)
 0:33        direct index (temp float ClipDistance)
 0:33          gl_ClipDistance: direct index for structure (out 1-element array of float ClipDistance)
-0:33            direct index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
+0:33            indirect index (temp block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
 0:33              'gl_out' (out 4-element array of block{out 4-component vector of float Position gl_Position, out float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
-0:33              Constant:
-0:33                1 (const int)
+0:33              'gl_InvocationID' (in int InvocationID)
 0:33            Constant:
 0:33              2 (const int)
 0:33          Constant:
diff --git a/Test/baseResults/420.tesc.out b/Test/baseResults/420.tesc.out
index 999c1c6f60721278f6de6beccd44f6970d7b7a80..c0875138205dbbe9688752e64a608c7af101a4e2 100644
--- a/Test/baseResults/420.tesc.out
+++ b/Test/baseResults/420.tesc.out
@@ -63,17 +63,15 @@ ERROR: node is still EOpNull!
 0:23          'gl_InvocationID' (in int InvocationID)
 0:25      move second child to first child (temp 4-component vector of float)
 0:25        gl_Position: direct index for structure (out 4-component vector of float Position)
-0:25          direct index (temp block{out 4-component vector of float Position gl_Position})
+0:25          indirect index (temp block{out 4-component vector of float Position gl_Position})
 0:25            'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position})
-0:25            Constant:
-0:25              1 (const int)
+0:25            'gl_InvocationID' (in int InvocationID)
 0:25          Constant:
 0:25            0 (const int)
 0:25        'p' (temp 4-component vector of float)
-0:26      direct index (temp block{out 4-component vector of float Position gl_Position})
+0:26      indirect index (temp block{out 4-component vector of float Position gl_Position})
 0:26        'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position})
-0:26        Constant:
-0:26          1 (const int)
+0:26        'gl_InvocationID' (in int InvocationID)
 0:34  Function Definition: foo( (global void)
 0:34    Function Parameters: 
 0:36    Sequence
@@ -176,17 +174,15 @@ ERROR: node is still EOpNull!
 0:23          'gl_InvocationID' (in int InvocationID)
 0:25      move second child to first child (temp 4-component vector of float)
 0:25        gl_Position: direct index for structure (out 4-component vector of float Position)
-0:25          direct index (temp block{out 4-component vector of float Position gl_Position})
+0:25          indirect index (temp block{out 4-component vector of float Position gl_Position})
 0:25            'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position})
-0:25            Constant:
-0:25              1 (const int)
+0:25            'gl_InvocationID' (in int InvocationID)
 0:25          Constant:
 0:25            0 (const int)
 0:25        'p' (temp 4-component vector of float)
-0:26      direct index (temp block{out 4-component vector of float Position gl_Position})
+0:26      indirect index (temp block{out 4-component vector of float Position gl_Position})
 0:26        'gl_out' (out 3-element array of block{out 4-component vector of float Position gl_Position})
-0:26        Constant:
-0:26          1 (const int)
+0:26        'gl_InvocationID' (in int InvocationID)
 0:34  Function Definition: foo( (global void)
 0:34    Function Parameters: 
 0:36    Sequence
diff --git a/Test/baseResults/450.tesc.out b/Test/baseResults/450.tesc.out
index 6eaf6f9d5bfb0c8c1df88a6fd5be65afe59acc8d..26d93075d1f5e7c14cfcf85ae825933f23f0e344 100644
--- a/Test/baseResults/450.tesc.out
+++ b/Test/baseResults/450.tesc.out
@@ -10,10 +10,9 @@ vertices = 0
 0:13      move second child to first child (temp float)
 0:13        direct index (temp float CullDistance)
 0:13          gl_CullDistance: direct index for structure (out implicitly-sized array of float CullDistance)
-0:13            direct index (temp block{out implicitly-sized array of float CullDistance gl_CullDistance})
-0:13              'gl_out' (out implicitly-sized array of block{out implicitly-sized array of float CullDistance gl_CullDistance})
-0:13              Constant:
-0:13                0 (const int)
+0:13            indirect index (temp block{out implicitly-sized array of float CullDistance gl_CullDistance})
+0:13              'gl_out' (out 4-element array of block{out implicitly-sized array of float CullDistance gl_CullDistance})
+0:13              'gl_InvocationID' (in int InvocationID)
 0:13            Constant:
 0:13              0 (const int)
 0:13          Constant:
@@ -30,7 +29,7 @@ vertices = 0
 0:13            2 (const int)
 0:?   Linker Objects
 0:?     'gl_in' (in 32-element array of block{in implicitly-sized array of float CullDistance gl_CullDistance})
-0:?     'gl_out' (out implicitly-sized array of block{out implicitly-sized array of float CullDistance gl_CullDistance})
+0:?     'gl_out' (out 4-element array of block{out implicitly-sized array of float CullDistance gl_CullDistance})
 
 
 Linked tessellation control stage:
@@ -46,10 +45,9 @@ vertices = 0
 0:13      move second child to first child (temp float)
 0:13        direct index (temp float CullDistance)
 0:13          gl_CullDistance: direct index for structure (out 1-element array of float CullDistance)
-0:13            direct index (temp block{out 1-element array of float CullDistance gl_CullDistance})
-0:13              'gl_out' (out 1-element array of block{out 1-element array of float CullDistance gl_CullDistance})
-0:13              Constant:
-0:13                0 (const int)
+0:13            indirect index (temp block{out 1-element array of float CullDistance gl_CullDistance})
+0:13              'gl_out' (out 4-element array of block{out 1-element array of float CullDistance gl_CullDistance})
+0:13              'gl_InvocationID' (in int InvocationID)
 0:13            Constant:
 0:13              0 (const int)
 0:13          Constant:
@@ -66,5 +64,5 @@ vertices = 0
 0:13            2 (const int)
 0:?   Linker Objects
 0:?     'gl_in' (in 32-element array of block{in 1-element array of float CullDistance gl_CullDistance})
-0:?     'gl_out' (out 1-element array of block{out 1-element array of float CullDistance gl_CullDistance})
+0:?     'gl_out' (out 4-element array of block{out 1-element array of float CullDistance gl_CullDistance})
 
diff --git a/Test/baseResults/spv.400.tesc.out b/Test/baseResults/spv.400.tesc.out
index c1bee8376c8cf7a622702379cb0b7946bb82e297..dee214d6a6f981fa6724f305a3685396365002f6 100755
--- a/Test/baseResults/spv.400.tesc.out
+++ b/Test/baseResults/spv.400.tesc.out
@@ -7,12 +7,12 @@ Linked tessellation control stage:
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 90
+// Id's are bound by 93
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 52 76 80 81 84 85 88 89
+                              EntryPoint TessellationControl 4  "main" 52 79 83 84 87 88 91 92
                               ExecutionMode 4 OutputVertices 4
                               Source GLSL 400
                               SourceExtension  "GL_ARB_separate_shader_objects"
@@ -37,16 +37,16 @@ Linked tessellation control stage:
                               MemberName 48(gl_PerVertex) 1  "gl_PointSize"
                               MemberName 48(gl_PerVertex) 2  "gl_ClipDistance"
                               Name 52  "gl_out"
-                              Name 63  "gl_TessLevelOuter"
-                              Name 70  "gl_TessLevelInner"
-                              Name 75  "outa"
-                              Name 76  "patchOut"
-                              Name 80  "inb"
-                              Name 81  "ind"
-                              Name 84  "ivla"
-                              Name 85  "ivlb"
-                              Name 88  "ovla"
-                              Name 89  "ovlb"
+                              Name 66  "gl_TessLevelOuter"
+                              Name 73  "gl_TessLevelInner"
+                              Name 78  "outa"
+                              Name 79  "patchOut"
+                              Name 83  "inb"
+                              Name 84  "ind"
+                              Name 87  "ivla"
+                              Name 88  "ivlb"
+                              Name 91  "ovla"
+                              Name 92  "ovlb"
                               MemberDecorate 19(gl_PerVertex) 0 BuiltIn Position
                               MemberDecorate 19(gl_PerVertex) 1 BuiltIn PointSize
                               MemberDecorate 19(gl_PerVertex) 2 BuiltIn ClipDistance
@@ -58,15 +58,15 @@ Linked tessellation control stage:
                               MemberDecorate 48(gl_PerVertex) 1 BuiltIn PointSize
                               MemberDecorate 48(gl_PerVertex) 2 BuiltIn ClipDistance
                               Decorate 48(gl_PerVertex) Block
-                              Decorate 63(gl_TessLevelOuter) Patch
-                              Decorate 63(gl_TessLevelOuter) BuiltIn TessLevelOuter
-                              Decorate 70(gl_TessLevelInner) Patch
-                              Decorate 70(gl_TessLevelInner) BuiltIn TessLevelInner
-                              Decorate 76(patchOut) Patch
-                              Decorate 84(ivla) Location 3
-                              Decorate 85(ivlb) Location 4
-                              Decorate 88(ovla) Location 3
-                              Decorate 89(ovlb) Location 4
+                              Decorate 66(gl_TessLevelOuter) Patch
+                              Decorate 66(gl_TessLevelOuter) BuiltIn TessLevelOuter
+                              Decorate 73(gl_TessLevelInner) Patch
+                              Decorate 73(gl_TessLevelInner) BuiltIn TessLevelInner
+                              Decorate 79(patchOut) Patch
+                              Decorate 87(ivla) Location 3
+                              Decorate 88(ivlb) Location 4
+                              Decorate 91(ovla) Location 3
+                              Decorate 92(ovlb) Location 4
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -100,35 +100,35 @@ Linked tessellation control stage:
               50:             TypeArray 48(gl_PerVertex) 49
               51:             TypePointer Output 50
       52(gl_out):     51(ptr) Variable Output
-              54:             TypePointer Output 15(fvec4)
-              57:             TypePointer Output 14(float)
-              61:             TypeArray 14(float) 49
-              62:             TypePointer Output 61
-63(gl_TessLevelOuter):     62(ptr) Variable Output
-              64:     10(int) Constant 3
-              65:   14(float) Constant 1078774989
-              67:      6(int) Constant 2
-              68:             TypeArray 14(float) 67
-              69:             TypePointer Output 68
-70(gl_TessLevelInner):     69(ptr) Variable Output
-              71:   14(float) Constant 1067869798
-              73:             TypeArray 10(int) 49
-              74:             TypePointer Private 73
-        75(outa):     74(ptr) Variable Private
-    76(patchOut):     54(ptr) Variable Output
-              77:             TypeVector 14(float) 2
-              78:             TypeArray 77(fvec2) 20
-              79:             TypePointer Input 78
-         80(inb):     79(ptr) Variable Input
-         81(ind):     79(ptr) Variable Input
-              82:             TypeArray 15(fvec4) 20
-              83:             TypePointer Input 82
-        84(ivla):     83(ptr) Variable Input
-        85(ivlb):     83(ptr) Variable Input
-              86:             TypeArray 15(fvec4) 49
-              87:             TypePointer Output 86
-        88(ovla):     87(ptr) Variable Output
-        89(ovlb):     87(ptr) Variable Output
+              55:             TypePointer Output 15(fvec4)
+              59:             TypePointer Output 14(float)
+              64:             TypeArray 14(float) 49
+              65:             TypePointer Output 64
+66(gl_TessLevelOuter):     65(ptr) Variable Output
+              67:     10(int) Constant 3
+              68:   14(float) Constant 1078774989
+              70:      6(int) Constant 2
+              71:             TypeArray 14(float) 70
+              72:             TypePointer Output 71
+73(gl_TessLevelInner):     72(ptr) Variable Output
+              74:   14(float) Constant 1067869798
+              76:             TypeArray 10(int) 49
+              77:             TypePointer Private 76
+        78(outa):     77(ptr) Variable Private
+    79(patchOut):     55(ptr) Variable Output
+              80:             TypeVector 14(float) 2
+              81:             TypeArray 80(fvec2) 20
+              82:             TypePointer Input 81
+         83(inb):     82(ptr) Variable Input
+         84(ind):     82(ptr) Variable Input
+              85:             TypeArray 15(fvec4) 20
+              86:             TypePointer Input 85
+        87(ivla):     86(ptr) Variable Input
+        88(ivlb):     86(ptr) Variable Input
+              89:             TypeArray 15(fvec4) 49
+              90:             TypePointer Output 89
+        91(ovla):     90(ptr) Variable Output
+        92(ovlb):     90(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            12(a):     11(ptr) Variable Function
@@ -156,18 +156,21 @@ Linked tessellation control stage:
                               Store 42(pid) 44
               47:     10(int) Load 46(gl_InvocationID)
                               Store 45(iid) 47
-              53:   15(fvec4) Load 17(p)
-              55:     54(ptr) AccessChain 52(gl_out) 24 25
-                              Store 55 53
-              56:   14(float) Load 30(ps)
-              58:     57(ptr) AccessChain 52(gl_out) 24 24
-                              Store 58 56
-              59:   14(float) Load 34(cd)
-              60:     57(ptr) AccessChain 52(gl_out) 24 35 24
-                              Store 60 59
-              66:     57(ptr) AccessChain 63(gl_TessLevelOuter) 64
-                              Store 66 65
-              72:     57(ptr) AccessChain 70(gl_TessLevelInner) 24
-                              Store 72 71
+              53:     10(int) Load 46(gl_InvocationID)
+              54:   15(fvec4) Load 17(p)
+              56:     55(ptr) AccessChain 52(gl_out) 53 25
+                              Store 56 54
+              57:     10(int) Load 46(gl_InvocationID)
+              58:   14(float) Load 30(ps)
+              60:     59(ptr) AccessChain 52(gl_out) 57 24
+                              Store 60 58
+              61:     10(int) Load 46(gl_InvocationID)
+              62:   14(float) Load 34(cd)
+              63:     59(ptr) AccessChain 52(gl_out) 61 35 24
+                              Store 63 62
+              69:     59(ptr) AccessChain 66(gl_TessLevelOuter) 67
+                              Store 69 68
+              75:     59(ptr) AccessChain 73(gl_TessLevelInner) 24
+                              Store 75 74
                               Return
                               FunctionEnd
diff --git a/Test/spv.400.tesc b/Test/spv.400.tesc
index 348e6214f4487ec44d24baafbd4fece25766cd2f..1c926d084d12e5b80f04927977ca1c7eb6f6ea97 100644
--- a/Test/spv.400.tesc
+++ b/Test/spv.400.tesc
@@ -23,9 +23,9 @@ void main()
     int pid = gl_PrimitiveID;
     int iid = gl_InvocationID;
 
-    gl_out[1].gl_Position = p;
-    gl_out[1].gl_PointSize = ps;
-    gl_out[1].gl_ClipDistance[1] = cd;
+    gl_out[gl_InvocationID].gl_Position = p;
+    gl_out[gl_InvocationID].gl_PointSize = ps;
+    gl_out[gl_InvocationID].gl_ClipDistance[1] = cd;
 
     gl_TessLevelOuter[3] = 3.2;
     gl_TessLevelInner[1] = 1.3;
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 7f6f67742bae4f5f61ecf44641778c61e74d69cf..90b2697da809eaf47eba44d9b18aff0ef7a28333 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -2,5 +2,5 @@
 // For the version, it uses the latest git tag followed by the number of commits.
 // For the date, it uses the current date (when then script is run).
 
-#define GLSLANG_REVISION "SPIRV99.807"
+#define GLSLANG_REVISION "SPIRV99.809"
 #define GLSLANG_DATE "28-Nov-2015"
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 6d50cbe6ca1a16e556b984e54ff17ef4a97cdd35..55c0ee039152053189c2bdaa74cc4030358afa81 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -518,8 +518,9 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn
                     requireProfile(base->getLoc(), ~EEsProfile, "variable indexing buffer block array");
                 else if (base->getQualifier().storage == EvqUniform)
                     profileRequires(base->getLoc(), EEsProfile, 0, Num_AEP_gpu_shader5, AEP_gpu_shader5, "variable indexing uniform block array");
-                else
-                    requireProfile(base->getLoc(), ~EEsProfile, "variable indexing in/out block array");
+                else {
+                    // input/output blocks either don't exist or can be variable indexed
+                }
             } else if (language == EShLangFragment && base->getQualifier().isPipeOutput())
                 requireProfile(base->getLoc(), ~EEsProfile, "variable indexing fragment shader ouput array");
             else if (base->getBasicType() == EbtSampler && version >= 130) {
@@ -1871,6 +1872,21 @@ bool TParseContext::lValueErrorCheck(const TSourceLoc& loc, const char* op, TInt
         switch(binaryNode->getOp()) {
         case EOpIndexDirect:
         case EOpIndexIndirect:
+            // ...  tessellation control shader ...
+            // If a per-vertex output variable is used as an l-value, it is a
+            // compile-time or link-time error if the expression indicating the
+            // vertex index is not the identifier gl_InvocationID.
+            if (language == EShLangTessControl) {
+                const TType& leftType = binaryNode->getLeft()->getType();
+                if (leftType.getQualifier().storage == EvqVaryingOut && ! leftType.getQualifier().patch && binaryNode->getLeft()->getAsSymbolNode()) {
+                    // we have a per-vertex output
+                    const TIntermSymbol* rightSymbol = binaryNode->getRight()->getAsSymbolNode();
+                    if (! rightSymbol || rightSymbol->getQualifier().builtIn != EbvInvocationId)
+                        error(loc, "tessellation-control per-vertex output l-value must be indexed with gl_InvocationID", "[]", "");
+                }
+            }
+
+            // fall through
         case EOpIndexDirectStruct:
             return lValueErrorCheck(loc, op, binaryNode->getLeft());
         case EOpVectorSwizzle: