diff --git a/Test/140.vert b/Test/140.vert
index 380d30e7c485f8141d99c27f7f363a382020345d..914e672d8f1ff392a2d984cf55ee4036c39adbd9 100644
--- a/Test/140.vert
+++ b/Test/140.vert
@@ -57,3 +57,23 @@ void foo()
     v += textureProjGradOffset(s2dr, tloc4, ivec2(0.0), ivec2(0.0), ivec2(1,2));
     v += textureProjGradOffset(s2drs, tloc4, ivec2(0.0), ivec2(0.0), ivec2(1,2));
 }
+
+void devi()
+{
+    gl_DeviceIndex; // ERROR, no extension
+    gl_ViewIndex;   // ERROR, no extension
+}
+
+#ifdef GL_EXT_device_group
+#extension GL_EXT_device_group : enable
+#endif
+
+#ifdef GL_EXT_device_group
+#extension GL_EXT_multiview : enable
+#endif
+
+void devie()
+{
+    gl_DeviceIndex;
+    gl_ViewIndex;
+}
diff --git a/Test/310.comp b/Test/310.comp
index 3252728c8063dce60200eb9ddaf53274efe798b0..9575b6f9db3cf262a1348aa32ce5a5c99a44866a 100644
--- a/Test/310.comp
+++ b/Test/310.comp
@@ -238,3 +238,19 @@ float t__;  // ERROR, no __ until revision 310
 #define __D
 
 shared vec4 arr[2][3][4];
+
+void devi()
+{
+    gl_DeviceIndex; // ERROR, no extension
+    gl_ViewIndex;   // ERROR, never this stage
+}
+
+#ifdef GL_EXT_device_group
+#extension GL_EXT_device_group : enable
+#endif
+
+void devie()
+{
+    gl_DeviceIndex;
+    gl_ViewIndex;   // ERROR, never this stage
+}
diff --git a/Test/310.frag b/Test/310.frag
index e9f0395004157457049bc790098d7068c3b6cb8e..6814e6c5390a6da8438cd2a19cc6e15d3c95f19f 100644
--- a/Test/310.frag
+++ b/Test/310.frag
@@ -429,3 +429,23 @@ void blendFoo(layout(blend_support_hsl_luminosity) vec3 v) { } // ERROR, only on
 layout(blend_support_flizbit) out;                             // ERROR, no flizbit
 
 out vec4 outAA[2][2];  // ERROR
+
+void devi()
+{
+    gl_DeviceIndex; // ERROR, no extension
+    gl_ViewIndex;   // ERROR, no extension
+}
+
+#ifdef GL_EXT_device_group
+#extension GL_EXT_device_group : enable
+#endif
+
+#ifdef GL_EXT_device_group
+#extension GL_EXT_multiview : enable
+#endif
+
+void devie()
+{
+    gl_DeviceIndex;
+    gl_ViewIndex;
+}
diff --git a/Test/400.tesc b/Test/400.tesc
index d01bd3ea1bfb68e37705fe8290e2fc02ef9598a8..415d7f7d7b9b68189cb8e89dac074b3dae4b2904 100644
--- a/Test/400.tesc
+++ b/Test/400.tesc
@@ -103,3 +103,23 @@ patch out pinbn {
 
 invariant precise out vec4 badOrder[]; // ERROR, precise must appear first
 void badp(out precise float f);        // ERROR, precise must appear first
+
+void devi()
+{
+    gl_DeviceIndex; // ERROR, no extension
+    gl_ViewIndex;   // ERROR, no extension
+}
+
+#ifdef GL_EXT_device_group
+#extension GL_EXT_device_group : enable
+#endif
+
+#ifdef GL_EXT_device_group
+#extension GL_EXT_multiview : enable
+#endif
+
+void devie()
+{
+    gl_DeviceIndex;
+    gl_ViewIndex;
+}
diff --git a/Test/400.tese b/Test/400.tese
index a1d3ed8289ad1a8c52be4db82ca4905aef9cd99a..aea454651dec86afbbc1cfd238082d5eccd384aa 100644
--- a/Test/400.tese
+++ b/Test/400.tese
@@ -103,3 +103,23 @@ in float gl_TessLevelOuter[4];           // ERROR, can't redeclare
 patch in pinbn {
     int a;
 } pinbi;
+
+void devi()
+{
+    gl_DeviceIndex; // ERROR, no extension
+    gl_ViewIndex;   // ERROR, no extension
+}
+
+#ifdef GL_EXT_device_group
+#extension GL_EXT_device_group : enable
+#endif
+
+#ifdef GL_EXT_device_group
+#extension GL_EXT_multiview : enable
+#endif
+
+void devie()
+{
+    gl_DeviceIndex;
+    gl_ViewIndex;
+}
diff --git a/Test/baseResults/140.vert.out b/Test/baseResults/140.vert.out
index e7f88e320750fa7512346f9c34d95fea9093a7c0..0f2a06322a3015f39fbd1a411c9af3c7c25b1553 100644
--- a/Test/baseResults/140.vert.out
+++ b/Test/baseResults/140.vert.out
@@ -9,12 +9,16 @@ ERROR: 0:38: 'gl_ClipVertex' : cannot redeclare after use
 ERROR: 0:39: 'gl_FogFragCoord' : cannot redeclare after use 
 ERROR: 0:51: 'texelFetch' : no matching overloaded function found 
 ERROR: 0:53: 'texture' : no matching overloaded function found 
-ERROR: 10 compilation errors.  No code generated.
+ERROR: 0:63: 'gl_DeviceIndex' : required extension not requested: GL_EXT_device_group
+ERROR: 0:64: 'gl_ViewIndex' : required extension not requested: GL_EXT_multiview
+ERROR: 12 compilation errors.  No code generated.
 
 
 Shader version: 140
 Requested GL_ARB_explicit_attrib_location
 Requested GL_ARB_separate_shader_objects
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 ERROR: node is still EOpNull!
 0:9  Function Definition: main( (global void)
 0:9    Function Parameters: 
@@ -116,6 +120,16 @@ ERROR: node is still EOpNull!
 0:58          Constant:
 0:58            1 (const int)
 0:58            2 (const int)
+0:61  Function Definition: devi( (global void)
+0:61    Function Parameters: 
+0:63    Sequence
+0:63      'gl_DeviceIndex' (in int DeviceIndex)
+0:64      'gl_ViewIndex' (in int ViewIndex)
+0:75  Function Definition: devie( (global void)
+0:75    Function Parameters: 
+0:77    Sequence
+0:77      'gl_DeviceIndex' (in int DeviceIndex)
+0:78      'gl_ViewIndex' (in int ViewIndex)
 0:?   Linker Objects
 0:?     'sbuf' (uniform isamplerBuffer)
 0:?     'anon@0' (layout(column_major std140 ) uniform block{layout(column_major std140 offset=0 ) uniform int anonMem})
@@ -142,6 +156,8 @@ Linked vertex stage:
 Shader version: 140
 Requested GL_ARB_explicit_attrib_location
 Requested GL_ARB_separate_shader_objects
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 ERROR: node is still EOpNull!
 0:9  Function Definition: main( (global void)
 0:9    Function Parameters: 
diff --git a/Test/baseResults/150.tesc.out b/Test/baseResults/150.tesc.out
index 21fade77b967c962701f34c58736f17d0f6d98c8..40bf080243450daf97ec0ba9b4a3b1539c0020ae 100644
--- a/Test/baseResults/150.tesc.out
+++ b/Test/baseResults/150.tesc.out
@@ -232,11 +232,15 @@ ERROR: 0:87: 'location' : overlapping use of location 4
 ERROR: 0:104: '' : precise qualifier must appear first 
 ERROR: 0:105: '' : precise qualifier must appear first 
 ERROR: 0:105: '' : precise qualifier must appear first 
-ERROR: 21 compilation errors.  No code generated.
+ERROR: 0:109: 'gl_DeviceIndex' : required extension not requested: GL_EXT_device_group
+ERROR: 0:110: 'gl_ViewIndex' : required extension not requested: GL_EXT_multiview
+ERROR: 23 compilation errors.  No code generated.
 
 
 Shader version: 400
 Requested GL_ARB_separate_shader_objects
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 vertices = 4
 ERROR: node is still EOpNull!
 0:13  Function Definition: main( (global void)
@@ -408,6 +412,16 @@ ERROR: node is still EOpNull!
 0:97          'd' (noContraction temp double)
 0:97          'd' (noContraction temp double)
 0:97          'd' (noContraction temp double)
+0:107  Function Definition: devi( (global void)
+0:107    Function Parameters: 
+0:109    Sequence
+0:109      'gl_DeviceIndex' (in int DeviceIndex)
+0:110      'gl_ViewIndex' (in int ViewIndex)
+0:121  Function Definition: devie( (global void)
+0:121    Function Parameters: 
+0:123    Sequence
+0:123      'gl_DeviceIndex' (in int DeviceIndex)
+0:124      'gl_ViewIndex' (in int ViewIndex)
 0:?   Linker Objects
 0:?     '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:?     'outa' (global 4-element array of int)
@@ -459,11 +473,15 @@ ERROR: 0:86: '[]' : tessellation input array size must be gl_MaxPatchVertices or
 ERROR: 0:96: 'location' : overlapping use of location 24
 ERROR: 0:99: 'location' : overlapping use of location 24
 ERROR: 0:101: 'gl_TessLevelOuter' : identifiers starting with "gl_" are reserved 
-ERROR: 30 compilation errors.  No code generated.
+ERROR: 0:109: 'gl_DeviceIndex' : required extension not requested: GL_EXT_device_group
+ERROR: 0:110: 'gl_ViewIndex' : required extension not requested: GL_EXT_multiview
+ERROR: 32 compilation errors.  No code generated.
 
 
 Shader version: 400
 Requested GL_ARB_separate_shader_objects
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 input primitive = quads
 vertex spacing = fractional_odd_spacing
 triangle order = cw
@@ -559,6 +577,16 @@ ERROR: node is still EOpNull!
 0:44          Constant:
 0:44            2 (const int)
 0:44        'cd' (temp float)
+0:107  Function Definition: devi( (global void)
+0:107    Function Parameters: 
+0:109    Sequence
+0:109      'gl_DeviceIndex' (in int DeviceIndex)
+0:110      'gl_ViewIndex' (in int ViewIndex)
+0:121  Function Definition: devie( (global void)
+0:121    Function Parameters: 
+0:123    Sequence
+0:123      'gl_DeviceIndex' (in int DeviceIndex)
+0:124      'gl_ViewIndex' (in int ViewIndex)
 0:?   Linker Objects
 0:?     'patchIn' (patch in 4-component vector of float)
 0:?     'patchOut' (patch out 4-component vector of float)
@@ -952,6 +980,8 @@ ERROR: Linking tessellation evaluation stage: Multiple function bodies in multip
 Shader version: 420
 Requested GL_ARB_separate_shader_objects
 Requested GL_ARB_tessellation_shader
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 vertices = 4
 0:? Sequence
 0:10  Function Definition: main( (global void)
@@ -1277,6 +1307,8 @@ vertices = 4
 Shader version: 420
 Requested GL_ARB_separate_shader_objects
 Requested GL_ARB_tessellation_shader
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 input primitive = quads
 vertex spacing = fractional_odd_spacing
 triangle order = cw
diff --git a/Test/baseResults/310.comp.out b/Test/baseResults/310.comp.out
index e063626dd5e112265d0b881bffe1c353dc13ac5f..2ff29f174b646331bbff6880074bcf7e774391dd 100644
--- a/Test/baseResults/310.comp.out
+++ b/Test/baseResults/310.comp.out
@@ -81,10 +81,14 @@ ERROR: 0:227: 'input block' : not supported in this stage: compute
 ERROR: 0:231: 'output block' : not supported in this stage: compute
 WARNING: 0:235: 't__' : identifiers containing consecutive underscores ("__") are reserved 
 WARNING: 0:238: '#define' : names containing consecutive underscores are reserved: __D
-ERROR: 79 compilation errors.  No code generated.
+ERROR: 0:244: 'gl_DeviceIndex' : required extension not requested: GL_EXT_device_group
+ERROR: 0:245: 'gl_ViewIndex' : undeclared identifier 
+ERROR: 0:255: 'gl_ViewIndex' : undeclared identifier 
+ERROR: 82 compilation errors.  No code generated.
 
 
 Shader version: 310
+Requested GL_EXT_device_group
 local_size = (2, 1, 4096)
 ERROR: node is still EOpNull!
 0:27  Function Definition: main( (global void)
@@ -443,6 +447,16 @@ ERROR: node is still EOpNull!
 0:224            0 (const int)
 0:224        Constant:
 0:224          2 (const int)
+0:242  Function Definition: devi( (global void)
+0:242    Function Parameters: 
+0:244    Sequence
+0:244      'gl_DeviceIndex' (in highp int DeviceIndex)
+0:245      'gl_ViewIndex' (temp float)
+0:252  Function Definition: devie( (global void)
+0:252    Function Parameters: 
+0:254    Sequence
+0:254      'gl_DeviceIndex' (in highp int DeviceIndex)
+0:255      'gl_ViewIndex' (temp float)
 0:?   Linker Objects
 0:?     'gl_WorkGroupSize' (const highp 3-component vector of uint WorkGroupSize)
 0:?       2 (const uint)
@@ -512,6 +526,7 @@ Linked compute stage:
 
 
 Shader version: 310
+Requested GL_EXT_device_group
 local_size = (2, 1, 4096)
 ERROR: node is still EOpNull!
 0:27  Function Definition: main( (global void)
diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out
index 7033d4f3f1d5ce9dd9328161b8c15e59e80cbba3..25c96156e485d8812a19c2c4cd88b94ebf0b17d4 100644
--- a/Test/baseResults/310.frag.out
+++ b/Test/baseResults/310.frag.out
@@ -133,10 +133,14 @@ 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: 125 compilation errors.  No code generated.
+ERROR: 0:435: 'gl_DeviceIndex' : required extension not requested: GL_EXT_device_group
+ERROR: 0:436: 'gl_ViewIndex' : required extension not requested: GL_EXT_multiview
+ERROR: 127 compilation errors.  No code generated.
 
 
 Shader version: 310
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 Requested GL_EXT_shader_io_blocks
 Requested GL_EXT_texture_cube_map_array
 Requested GL_KHR_blend_equation_advanced
@@ -916,6 +920,16 @@ ERROR: node is still EOpNull!
 0:428  Function Definition: blendFoo(vf3; (global void)
 0:428    Function Parameters: 
 0:428      'v' (in mediump 3-component vector of float)
+0:433  Function Definition: devi( (global void)
+0:433    Function Parameters: 
+0:435    Sequence
+0:435      'gl_DeviceIndex' (flat in highp int DeviceIndex)
+0:436      'gl_ViewIndex' (flat in highp int ViewIndex)
+0:447  Function Definition: devie( (global void)
+0:447    Function Parameters: 
+0:449    Sequence
+0:449      'gl_DeviceIndex' (flat in highp int DeviceIndex)
+0:450      'gl_ViewIndex' (flat in highp int ViewIndex)
 0:?   Linker Objects
 0:?     'gl_FragCoord' (smooth in mediump 4-component vector of float)
 0:?     'v3' (layout(location=2 ) smooth in mediump 3-component vector of float)
@@ -1017,6 +1031,8 @@ Linked fragment stage:
 ERROR: Linking fragment stage: when more than one fragment shader output, all must have location qualifiers
 
 Shader version: 310
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 Requested GL_EXT_shader_io_blocks
 Requested GL_EXT_texture_cube_map_array
 Requested GL_KHR_blend_equation_advanced
diff --git a/Test/baseResults/400.tesc.out b/Test/baseResults/400.tesc.out
index f3e7b8bb68b581344f65d4fe4f79b37bff88598a..027d58f8604235e2a245ca3f0622b4ba46aa685a 100644
--- a/Test/baseResults/400.tesc.out
+++ b/Test/baseResults/400.tesc.out
@@ -21,11 +21,15 @@ ERROR: 0:87: 'location' : overlapping use of location 4
 ERROR: 0:104: '' : precise qualifier must appear first 
 ERROR: 0:105: '' : precise qualifier must appear first 
 ERROR: 0:105: '' : precise qualifier must appear first 
-ERROR: 21 compilation errors.  No code generated.
+ERROR: 0:109: 'gl_DeviceIndex' : required extension not requested: GL_EXT_device_group
+ERROR: 0:110: 'gl_ViewIndex' : required extension not requested: GL_EXT_multiview
+ERROR: 23 compilation errors.  No code generated.
 
 
 Shader version: 400
 Requested GL_ARB_separate_shader_objects
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 vertices = 4
 ERROR: node is still EOpNull!
 0:13  Function Definition: main( (global void)
@@ -197,6 +201,16 @@ ERROR: node is still EOpNull!
 0:97          'd' (noContraction temp double)
 0:97          'd' (noContraction temp double)
 0:97          'd' (noContraction temp double)
+0:107  Function Definition: devi( (global void)
+0:107    Function Parameters: 
+0:109    Sequence
+0:109      'gl_DeviceIndex' (in int DeviceIndex)
+0:110      'gl_ViewIndex' (in int ViewIndex)
+0:121  Function Definition: devie( (global void)
+0:121    Function Parameters: 
+0:123    Sequence
+0:123      'gl_DeviceIndex' (in int DeviceIndex)
+0:124      'gl_ViewIndex' (in int ViewIndex)
 0:?   Linker Objects
 0:?     '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:?     'outa' (global 4-element array of int)
@@ -222,6 +236,8 @@ Linked tessellation control stage:
 
 Shader version: 400
 Requested GL_ARB_separate_shader_objects
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 vertices = 4
 ERROR: node is still EOpNull!
 0:13  Function Definition: main( (global void)
diff --git a/Test/baseResults/400.tese.out b/Test/baseResults/400.tese.out
index 324dbaa304de7eeecf9b9eca88461d348560d330..363ad96d74cbc02e98eae2e5879894df5fa85375 100644
--- a/Test/baseResults/400.tese.out
+++ b/Test/baseResults/400.tese.out
@@ -30,11 +30,15 @@ ERROR: 0:86: '[]' : tessellation input array size must be gl_MaxPatchVertices or
 ERROR: 0:96: 'location' : overlapping use of location 24
 ERROR: 0:99: 'location' : overlapping use of location 24
 ERROR: 0:101: 'gl_TessLevelOuter' : identifiers starting with "gl_" are reserved 
-ERROR: 30 compilation errors.  No code generated.
+ERROR: 0:109: 'gl_DeviceIndex' : required extension not requested: GL_EXT_device_group
+ERROR: 0:110: 'gl_ViewIndex' : required extension not requested: GL_EXT_multiview
+ERROR: 32 compilation errors.  No code generated.
 
 
 Shader version: 400
 Requested GL_ARB_separate_shader_objects
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 input primitive = quads
 vertex spacing = fractional_odd_spacing
 triangle order = cw
@@ -130,6 +134,16 @@ ERROR: node is still EOpNull!
 0:44          Constant:
 0:44            2 (const int)
 0:44        'cd' (temp float)
+0:107  Function Definition: devi( (global void)
+0:107    Function Parameters: 
+0:109    Sequence
+0:109      'gl_DeviceIndex' (in int DeviceIndex)
+0:110      'gl_ViewIndex' (in int ViewIndex)
+0:121  Function Definition: devie( (global void)
+0:121    Function Parameters: 
+0:123    Sequence
+0:123      'gl_DeviceIndex' (in int DeviceIndex)
+0:124      'gl_ViewIndex' (in int ViewIndex)
 0:?   Linker Objects
 0:?     'patchIn' (patch in 4-component vector of float)
 0:?     'patchOut' (patch out 4-component vector of float)
@@ -160,6 +174,8 @@ Linked tessellation evaluation stage:
 
 Shader version: 400
 Requested GL_ARB_separate_shader_objects
+Requested GL_EXT_device_group
+Requested GL_EXT_multiview
 input primitive = quads
 vertex spacing = fractional_odd_spacing
 triangle order = cw
diff --git a/Test/baseResults/spv.310.comp.out b/Test/baseResults/spv.310.comp.out
index 095bf39fc97e5bea1efe9352de64129d050e976f..4b47c7d7615015de8855795c13a6d4357917ffbe 100644
--- a/Test/baseResults/spv.310.comp.out
+++ b/Test/baseResults/spv.310.comp.out
@@ -3,14 +3,17 @@ Warning, version 310 is not yet complete; most version-specific features are pre
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 67
+// Id's are bound by 69
 
                               Capability Shader
+                              Capability DeviceGroup
+                              Extension  "SPV_KHR_device_group"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "main" 53
+                              EntryPoint GLCompute 4  "main" 53 64
                               ExecutionMode 4 LocalSize 16 32 4
                               Source ESSL 310
+                              SourceExtension  "GL_EXT_device_group"
                               Name 4  "main"
                               Name 13  "outb"
                               MemberName 13(outb) 0  "f"
@@ -29,6 +32,7 @@ Warning, version 310 is not yet complete; most version-specific features are pre
                               MemberName 48(outs) 1  "va"
                               Name 50  "outnames"
                               Name 53  "gl_LocalInvocationID"
+                              Name 64  "gl_DeviceIndex"
                               Decorate 12 ArrayStride 16
                               MemberDecorate 13(outb) 0 Offset 0
                               MemberDecorate 13(outb) 1 Offset 4
@@ -46,7 +50,8 @@ Warning, version 310 is not yet complete; most version-specific features are pre
                               Decorate 48(outs) BufferBlock
                               Decorate 50(outnames) DescriptorSet 0
                               Decorate 53(gl_LocalInvocationID) BuiltIn LocalInvocationId
-                              Decorate 66 BuiltIn WorkgroupSize
+                              Decorate 64(gl_DeviceIndex) BuiltIn DeviceIndex
+                              Decorate 68 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -87,10 +92,12 @@ Warning, version 310 is not yet complete; most version-specific features are pre
 53(gl_LocalInvocationID):     52(ptr) Variable Input
               54:             TypePointer Input 6(int)
               61:             TypePointer Uniform 16(int)
-              63:      6(int) Constant 16
-              64:      6(int) Constant 32
-              65:      6(int) Constant 4
-              66:   51(ivec3) ConstantComposite 63 64 65
+              63:             TypePointer Input 16(int)
+64(gl_DeviceIndex):     63(ptr) Variable Input
+              65:      6(int) Constant 16
+              66:      6(int) Constant 32
+              67:      6(int) Constant 4
+              68:   51(ivec3) ConstantComposite 65 66 67
          4(main):           2 Function None 3
                5:             Label
                               ControlBarrier 7 8 9
diff --git a/Test/baseResults/spv.deviceGroup.frag.out b/Test/baseResults/spv.deviceGroup.frag.out
index 9c23443617fbc8124f0039fe4e00e8b6ef0440ec..42e045b3c891e4447131e9a9c526e7ecc33e1aca 100755
--- a/Test/baseResults/spv.deviceGroup.frag.out
+++ b/Test/baseResults/spv.deviceGroup.frag.out
@@ -10,13 +10,14 @@ Warning, version 450 is not yet complete; most version-specific features are pre
                               Extension  "SPV_KHR_device_group"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 9
+                              EntryPoint Fragment 4  "main" 9 12
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               SourceExtension  "GL_EXT_device_group"
                               Name 4  "main"
                               Name 9  "color"
                               Name 12  "gl_DeviceIndex"
+                              Decorate 12(gl_DeviceIndex) Flat
                               Decorate 12(gl_DeviceIndex) BuiltIn DeviceIndex
                2:             TypeVoid
                3:             TypeFunction 2
@@ -25,8 +26,8 @@ Warning, version 450 is not yet complete; most version-specific features are pre
                8:             TypePointer Output 7(fvec4)
         9(color):      8(ptr) Variable Output
               10:             TypeInt 32 1
-              11:             TypePointer UniformConstant 10(int)
-12(gl_DeviceIndex):     11(ptr) Variable UniformConstant
+              11:             TypePointer Input 10(int)
+12(gl_DeviceIndex):     11(ptr) Variable Input
               15:    6(float) Constant 0
          4(main):           2 Function None 3
                5:             Label
diff --git a/Test/baseResults/spv.multiView.frag.out b/Test/baseResults/spv.multiView.frag.out
index 95716172726701f27dffa49fa4140a99be944331..de2a5496042f6d2014d23751d69d7a652dad3939 100755
--- a/Test/baseResults/spv.multiView.frag.out
+++ b/Test/baseResults/spv.multiView.frag.out
@@ -10,13 +10,14 @@ Warning, version 450 is not yet complete; most version-specific features are pre
                               Extension  "SPV_KHR_multiview"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 9
+                              EntryPoint Fragment 4  "main" 9 12
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               SourceExtension  "GL_EXT_multiview"
                               Name 4  "main"
                               Name 9  "color"
                               Name 12  "gl_ViewIndex"
+                              Decorate 12(gl_ViewIndex) Flat
                               Decorate 12(gl_ViewIndex) BuiltIn ViewIndex
                2:             TypeVoid
                3:             TypeFunction 2
@@ -25,8 +26,8 @@ Warning, version 450 is not yet complete; most version-specific features are pre
                8:             TypePointer Output 7(fvec4)
         9(color):      8(ptr) Variable Output
               10:             TypeInt 32 1
-              11:             TypePointer UniformConstant 10(int)
-12(gl_ViewIndex):     11(ptr) Variable UniformConstant
+              11:             TypePointer Input 10(int)
+12(gl_ViewIndex):     11(ptr) Variable Input
               15:    6(float) Constant 0
          4(main):           2 Function None 3
                5:             Label
diff --git a/Test/spv.310.comp b/Test/spv.310.comp
index bd183e042bec11af92c9a1d03cb2177e8204cd52..6cbb0430f94e2b76b903f47c2ad71c8541e2ae06 100644
--- a/Test/spv.310.comp
+++ b/Test/spv.310.comp
@@ -24,6 +24,8 @@ buffer outs {
     vec4 va[];
 } outnames;
 
+#extension GL_EXT_device_group : enable
+
 void main()
 {
     barrier();
@@ -34,4 +36,5 @@ void main()
     outbname.uns[i] = vec3(s);
     outnames.va[gl_LocalInvocationID.x] = vec4(s);
     outnames.s = outbname.uns.length();
+    gl_DeviceIndex;
 }
diff --git a/glslang/Include/BaseTypes.h b/glslang/Include/BaseTypes.h
index e9a6ac1bb18fb2429bc7982f51077ef462a3fa05..230a6b9cb067317ed15a0b674991f462120ba579 100644
--- a/glslang/Include/BaseTypes.h
+++ b/glslang/Include/BaseTypes.h
@@ -328,6 +328,10 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
     case EbvBaryCoordSmoothSample:      return "BaryCoordSmoothSample";
     case EbvBaryCoordPullModel:         return "BaryCoordPullModel";
 #endif
+
+    case EbvViewIndex:                  return "ViewIndex";
+    case EbvDeviceIndex:                return "DeviceIndex";
+
 #ifdef NV_EXTENSIONS
     case EbvViewportMaskNV:             return "ViewportMaskNV";
     case EbvSecondaryPositionNV:        return "SecondaryPositionNV";
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index cba202264a39df292968985e50df682a34b79916..4f419c0b826436f32426c736afbd4eb0ae304c16 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 "Overload400-PrecQual.1908"
+#define GLSLANG_REVISION "Overload400-PrecQual.1909"
 #define GLSLANG_DATE "14-Mar-2017"
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 60cff60124a7e192aaf18d6362ecfede9a0c2e18..f2cba1a101d01779508bfb9732b81b16459d5707 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -3125,6 +3125,13 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
             "\n");
     }
 
+    if ((profile != EEsProfile && version >= 140) ||
+        (profile == EEsProfile && version >= 310)) {
+        stageBuiltins[EShLangCompute].append(
+            "in highp int gl_DeviceIndex;"     // GL_EXT_device_group
+            "\n");
+    }
+
     //============================================================================
     //
     // Define the interface to the vertex shader.
@@ -3290,6 +3297,15 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
         }
     }
 
+    if ((profile != EEsProfile && version >= 140) ||
+        (profile == EEsProfile && version >= 310)) {
+        stageBuiltins[EShLangVertex].append(
+            "in highp int gl_DeviceIndex;"     // GL_EXT_device_group
+            "in highp int gl_ViewIndex;"       // GL_EXT_multiview
+            "\n");
+    }
+
+
     //============================================================================
     //
     // Define the interface to the geometry shader.
@@ -3398,6 +3414,14 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
             );
     }
 
+    if ((profile != EEsProfile && version >= 140) ||
+        (profile == EEsProfile && version >= 310)) {
+        stageBuiltins[EShLangGeometry].append(
+            "in highp int gl_DeviceIndex;"     // GL_EXT_device_group
+            "in highp int gl_ViewIndex;"       // GL_EXT_multiview
+            "\n");
+    }
+
     //============================================================================
     //
     // Define the interface to the tessellation control shader.
@@ -3469,6 +3493,14 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
             "\n");
     }
 
+    if ((profile != EEsProfile && version >= 140) ||
+        (profile == EEsProfile && version >= 310)) {
+        stageBuiltins[EShLangTessControl].append(
+            "in highp int gl_DeviceIndex;"     // GL_EXT_device_group
+            "in highp int gl_ViewIndex;"       // GL_EXT_multiview
+            "\n");
+    }
+
     //============================================================================
     //
     // Define the interface to the tessellation evaluation shader.
@@ -3544,6 +3576,14 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
             "\n");
     }
 
+    if ((profile != EEsProfile && version >= 140) ||
+        (profile == EEsProfile && version >= 310)) {
+        stageBuiltins[EShLangTessEvaluation].append(
+            "in highp int gl_DeviceIndex;"     // GL_EXT_device_group
+            "in highp int gl_ViewIndex;"       // GL_EXT_multiview
+            "\n");
+    }
+
     //============================================================================
     //
     // Define the interface to the fragment shader.
@@ -3701,9 +3741,12 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
             "\n");
     }
 
-    if (profile != EEsProfile) {
-        commonBuiltins.append("uniform int gl_ViewIndex;");
-        commonBuiltins.append("uniform int gl_DeviceIndex;");  // GL_EXT_device_group
+    if ((profile != EEsProfile && version >= 140) ||
+        (profile == EEsProfile && version >= 310)) {
+        stageBuiltins[EShLangFragment].append(
+            "flat in highp int gl_DeviceIndex;"     // GL_EXT_device_group
+            "flat in highp int gl_ViewIndex;"       // GL_EXT_multiview
+            "\n");
     }
 
     // printf("%s\n", commonBuiltins.c_str());
@@ -5120,6 +5163,14 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
         //        symbolTable.setVariableExtensions("gl_PointSize", Num_AEP_tessellation_point_size, AEP_tessellation_point_size);
         //}
 
+        if ((profile != EEsProfile && version >= 140) ||
+            (profile == EEsProfile && version >= 310)) {
+            symbolTable.setVariableExtensions("gl_DeviceIndex",  1, &E_GL_EXT_device_group);
+            BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
+            symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview);
+            BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
+        }
+
         break;
 
     case EShLangFragment:
@@ -5317,12 +5368,10 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
             symbolTable.setFunctionExtensions("imageAtomicCompSwap", 1, &E_GL_OES_shader_image_atomic);
         }
 
-        if (profile != EEsProfile) {
-            symbolTable.setFunctionExtensions("gl_DeviceIndex",  1, &E_GL_EXT_device_group);
-            BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
-            symbolTable.setFunctionExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview);
-            BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
-        }
+        symbolTable.setVariableExtensions("gl_DeviceIndex",  1, &E_GL_EXT_device_group);
+        BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
+        symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview);
+        BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
         break;
 
     case EShLangCompute:
@@ -5356,6 +5405,15 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
             symbolTable.setFunctionExtensions("memoryBarrierShared",        1, &E_GL_ARB_compute_shader);
             symbolTable.setFunctionExtensions("groupMemoryBarrier",         1, &E_GL_ARB_compute_shader);
         }
+
+        if ((profile != EEsProfile && version >= 140) ||
+            (profile == EEsProfile && version >= 310)) {
+            symbolTable.setVariableExtensions("gl_DeviceIndex",  1, &E_GL_EXT_device_group);
+            BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
+            symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview);
+            BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
+        }
+
         break;
 
     default:
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index 4bc5bdc685b22dfb82d2e747c501bdd467945f7d..528333f4679b101fda4cf216f163b2268b15018c 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -334,6 +334,14 @@ void TParseVersions::getPreamble(std::string& preamble)
         }
     }
 
+    if ((profile != EEsProfile && version >= 140) ||
+        (profile == EEsProfile && version >= 310)) {
+        preamble += 
+            "#define GL_EXT_device_group 1\n"
+            "#define GL_EXT_multiview 1\n"
+            ;
+    }
+
     // #line and #include
     preamble +=
             "#define GL_GOOGLE_cpp_style_line_directive 1\n"