diff --git a/Test/300.vert b/Test/300.vert
index 91bea9982d41cb61a6a0246819448d7a2a4f9007..daf98b836f6661875d9099300be2c2282e6b91d2 100644
--- a/Test/300.vert
+++ b/Test/300.vert
@@ -186,6 +186,8 @@ void fooDeeparray()
     yp = x; // ERROR, wrong size
 }
 
+layout(num_views = 2) in; // ERROR, no extension
+
 void mwErr()
 {
     gl_ViewID_OVR;   // ERROR, no extension
@@ -193,6 +195,9 @@ void mwErr()
 
 #extension GL_OVR_multiview : enable
 
+layout(num_views = 2) uniform float mwUniform; // ERROR, must be global
+layout(num_views = 2) in; // OK
+
 void mwOk()
 {
     gl_ViewID_OVR;
diff --git a/Test/baseResults/300.vert.out b/Test/baseResults/300.vert.out
index 9cf309fe1c52feaf33d3668e9b0b10218759789c..507ad73b1e936d8cc3cb978e709dd2bf6af79f79 100644
--- a/Test/baseResults/300.vert.out
+++ b/Test/baseResults/300.vert.out
@@ -43,10 +43,14 @@ ERROR: 0:172: 'std430' : requires the 'buffer' storage qualifier
 ERROR: 0:175: '' : array size required 
 ERROR: 0:185: 'assign' :  cannot convert from ' temp 4-element array of highp float' to ' temp 3-element array of highp float'
 ERROR: 0:186: 'assign' :  cannot convert from ' temp 3-element array of highp float' to ' temp 4-element array of highp float'
-ERROR: 0:191: 'gl_ViewID_OVR' : required extension not requested: Possible extensions include:
+ERROR: 0:189: 'num_views' : required extension not requested: Possible extensions include:
 GL_OVR_multiview
 GL_OVR_multiview2
-ERROR: 45 compilation errors.  No code generated.
+ERROR: 0:193: 'gl_ViewID_OVR' : required extension not requested: Possible extensions include:
+GL_OVR_multiview
+GL_OVR_multiview2
+ERROR: 0:198: 'num_views' : can only apply to a standalone qualifier 
+ERROR: 47 compilation errors.  No code generated.
 
 
 Shader version: 300
@@ -293,14 +297,14 @@ ERROR: node is still EOpNull!
 0:184        'y' ( temp 4-element array of highp float)
 0:185      'xp' ( temp 3-element array of highp float)
 0:186      'yp' ( temp 4-element array of highp float)
-0:189  Function Definition: mwErr( ( global void)
-0:189    Function Parameters: 
-0:191    Sequence
-0:191      'gl_ViewID_OVR' ( in highp uint ViewIndex)
-0:196  Function Definition: mwOk( ( global void)
-0:196    Function Parameters: 
-0:198    Sequence
-0:198      'gl_ViewID_OVR' ( in highp uint ViewIndex)
+0:191  Function Definition: mwErr( ( global void)
+0:191    Function Parameters: 
+0:193    Sequence
+0:193      'gl_ViewID_OVR' ( in highp uint ViewIndex)
+0:201  Function Definition: mwOk( ( global void)
+0:201    Function Parameters: 
+0:203    Sequence
+0:203      'gl_ViewID_OVR' ( in highp uint ViewIndex)
 0:?   Linker Objects
 0:?     'm43' ( uniform highp 4X3 matrix of float)
 0:?     'm33' ( uniform highp 3X3 matrix of float)
@@ -335,6 +339,7 @@ ERROR: node is still EOpNull!
 0:?     'Binst' (layout( column_major shared) uniform block{layout( column_major shared) uniform highp int a})
 0:?     'Bfoo' ( global highp int)
 0:?     'B430i' (layout( column_major std430) uniform block{layout( column_major std430 offset=0) uniform highp int a})
+0:?     'mwUniform' ( uniform highp float)
 0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
 
@@ -494,6 +499,7 @@ ERROR: node is still EOpNull!
 0:?     'Binst' (layout( column_major shared) uniform block{layout( column_major shared) uniform highp int a})
 0:?     'Bfoo' ( global highp int)
 0:?     'B430i' (layout( column_major std430) uniform block{layout( column_major std430 offset=0) uniform highp int a})
+0:?     'mwUniform' ( uniform highp float)
 0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
 
diff --git a/Test/spv.OVR_multiview.vert b/Test/spv.OVR_multiview.vert
index eb2082578390f14c3872b5667290d8b6a4862ad0..c81a4d996cdf16c1fef1086f3a4c9d2d9c521ed6 100644
--- a/Test/spv.OVR_multiview.vert
+++ b/Test/spv.OVR_multiview.vert
@@ -2,6 +2,8 @@
 
 #extension GL_OVR_multiview : enable
 
+layout(num_views = 2) in;
+
 void main() {
     gl_Position = vec4(gl_ViewID_OVR, 0, 0, 0);
 }
diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h
index 00e20b531c8824719722c67645939a7910c4accf..54dac837f4f49f934202a85aaa0603ef1ff1133f 100644
--- a/glslang/Include/Types.h
+++ b/glslang/Include/Types.h
@@ -970,6 +970,7 @@ struct TShaderQualifiers {
     bool earlyFragmentTests;  // fragment input
     TLayoutDepth layoutDepth;
     bool blendEquation;       // true if any blend equation was specified
+    int numViews;             // multiview extenstions
 
 #ifdef NV_EXTENSIONS
     bool layoutOverrideCoverage;    // true if layout override_coverage set
@@ -994,6 +995,7 @@ struct TShaderQualifiers {
         earlyFragmentTests = false;
         layoutDepth = EldNone;
         blendEquation = false;
+        numViews = TQualifier::layoutNotSet;
 #ifdef NV_EXTENSIONS
         layoutOverrideCoverage = false;
 #endif
@@ -1033,6 +1035,8 @@ struct TShaderQualifiers {
             layoutDepth = src.layoutDepth;
         if (src.blendEquation)
             blendEquation = src.blendEquation;
+        if (src.numViews != TQualifier::layoutNotSet)
+            numViews = src.numViews;
 #ifdef NV_EXTENSIONS
         if (src.layoutOverrideCoverage)
             layoutOverrideCoverage = src.layoutOverrideCoverage;
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 95bf1ab25abfc0b2e03f71c803773e31a4ae1cad..116f08494088f4b44953cf10a03715c2d0500b11 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -4206,6 +4206,11 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
         }
         return;
     }
+    if (id == "num_views") {
+        requireExtensions(loc, Num_OVR_multiview_EXTs, OVR_multiview_EXTs, "num_views");
+        publicType.shaderQualifiers.numViews = value;
+        return;
+    }
 
 #if NV_EXTENSIONS
     if (language == EShLangVertex ||
@@ -4804,6 +4809,8 @@ void TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQua
     }
     if (shaderQualifiers.blendEquation)
         error(loc, message, "blend equation", "");
+    if (shaderQualifiers.numViews != TQualifier::layoutNotSet)
+        error(loc, message, "num_views", "");
 }
 
 // Correct and/or advance an object's offset layout qualifier.