diff --git a/Test/120.frag b/Test/120.frag
new file mode 100644
index 0000000000000000000000000000000000000000..98f5c1487b8558516aa070c8ab13fc65099ab52d
--- /dev/null
+++ b/Test/120.frag
@@ -0,0 +1,14 @@
+#version 120
+
+lowp vec3 a;
+mediump float b;
+highp int c;
+
+precision highp float;
+
+in vec4 i;
+out vec4 o;
+
+void main()
+{
+}
diff --git a/Test/130.frag b/Test/130.frag
new file mode 100644
index 0000000000000000000000000000000000000000..cd7aae3e2c7e73270507ad040452c9751973ab92
--- /dev/null
+++ b/Test/130.frag
@@ -0,0 +1,14 @@
+#version 130
+
+lowp vec3 a;
+mediump float b;
+highp int c;
+
+precision highp float;
+
+in vec4 i;
+out vec4 o;
+
+void main()
+{
+}
diff --git a/Test/pre150.frag b/Test/140.frag
similarity index 54%
rename from Test/pre150.frag
rename to Test/140.frag
index 31e758481ad0a05da723ddd2ce67e2a1b05f6e3f..045983d198fb52d4b6eed14a3e7a0f711808af89 100644
--- a/Test/pre150.frag
+++ b/Test/140.frag
@@ -1,3 +1,10 @@
+#version 140
+
 varying vec4 v;
+
 in vec4 i;
 out vec4 o;
+
+void main()
+{
+}
diff --git a/Test/testlist b/Test/testlist
index 208ca6832932469e5c3138d4b99567c4431a940e..e55cdd83089df37de88e0c5651104b7b37c2d203 100644
--- a/Test/testlist
+++ b/Test/testlist
@@ -6,4 +6,6 @@ versionsClean.frag
 versionsClean.vert
 versionsErrors.frag
 versionsErrors.vert
-pre150.frag
+120.frag
+130.frag
+140.frag
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index 0178ae6bfb44797a12a983e5717518c247734f59..1cee7b1c8aa8b24df4283c8291c05b3c4df3b3c9 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -88,7 +88,7 @@ void TParseContext::requireStage(int line, EShLanguageMask languageMask, const c
 
 //
 // Within a profile, if a feature requires a version level or extension, use
-// ProfileRequires().  This only checks if the current profile matches 
+// ProfileRequires().  This only checks if the current profile matches
 // the passed-in profile.
 //
 
@@ -137,7 +137,8 @@ void TParseContext::checkDeprecated(int line, EProfile callingProfile, int depVe
                 error(line, "deprecated, may be removed in future release", featureDesc, "");
                 recover();
             } else {
-                infoSink.info.message(EPrefixWarning, (TString(featureDesc) + " being used, but may be removed in future release").c_str(), line);
+                infoSink.info.message(EPrefixWarning, (TString(featureDesc) + " deprecated in version " +
+                                                       String(depVersion) + "; may be removed in future release").c_str(), line);
             }
         }
     }
diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y
index fc6ad8365146e5064eb4da21dff27650243111c3..3ccc5c02d9268d268a05021a44cf844ea85732b2 100644
--- a/glslang/MachineIndependent/glslang.y
+++ b/glslang/MachineIndependent/glslang.y
@@ -1121,6 +1121,7 @@ declaration
         $$ = $1.intermAggregate;
     }
     | PRECISION precision_qualifier type_specifier SEMICOLON {
+        parseContext.profileRequires($1.line, ENoProfile, 130, 0, "precision statement");
         $$ = 0;
     }
     | type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE SEMICOLON {
@@ -1641,15 +1642,19 @@ storage_qualifier
         $$.setBasic(EbtVoid, EvqConst, $1.line);
     }
     | ATTRIBUTE {
-        //parseContext.requireProfile($1.line, (EProfileMask)(ENoProfileMask | ECompatibilityProfileMask), "attribute");
         parseContext.requireStage($1.line, EShLangVertexMask, "attribute");
+
+        parseContext.checkDeprecated($1.line, ENoProfile, 140, "attribute");
         parseContext.requireNotRemoved($1.line, ECoreProfile, 420, "attribute");
+
         if (parseContext.globalErrorCheck($1.line, parseContext.symbolTable.atGlobalLevel(), "attribute"))
             parseContext.recover();
         $$.setBasic(EbtVoid, EvqAttribute, $1.line);
     }
     | VARYING {
+        parseContext.checkDeprecated($1.line, ENoProfile, 140, "varying");
         parseContext.requireNotRemoved($1.line, ECoreProfile, 420, "varying");
+        
         if (parseContext.globalErrorCheck($1.line, parseContext.symbolTable.atGlobalLevel(), "varying"))
             parseContext.recover();
         if (parseContext.language == EShLangVertex)
@@ -2396,10 +2401,13 @@ type_specifier_nonarray
 
 precision_qualifier
     : HIGH_PRECISION {
+        parseContext.profileRequires($1.line, ENoProfile, 130, 0, "highp precision qualifier");
     }
     | MEDIUM_PRECISION {
+        parseContext.profileRequires($1.line, ENoProfile, 130, 0, "mediump precision qualifier");
     }
     | LOW_PRECISION {
+        parseContext.profileRequires($1.line, ENoProfile, 130, 0, "lowp precision qualifier");
     }
     ;