diff --git a/Test/420.vert b/Test/420.vert
index 7e6120713a0d0a2f128ea119864f2d060439db0e..5007e20c9c4e20d1bc811174b2c879a61e45253b 100644
--- a/Test/420.vert
+++ b/Test/420.vert
@@ -127,12 +127,12 @@ void passr(coherent readonly iimage2D image)
 }
 
 layout(r32i) coherent readonly uniform iimage2D qualim1;
-layout(r32i) coherent restrict readonly uniform iimage2D qualim2;
+layout(r32i) coherent volatile readonly uniform iimage2D qualim2;
 
 void passrc()
 {
     passr(qualim1);
-    passr(qualim2);   // ERROR, drops restrict
+    passr(qualim2);   // ERROR, drops volatile
     passr(iimg2D);
 }
 
diff --git a/Test/baseResults/310.comp.out b/Test/baseResults/310.comp.out
index 30df51b9255310d0ae4e578a4c1824d9631432f9..0f759c5ab2a6d21367d553c73ebeafc77d33acf4 100644
--- a/Test/baseResults/310.comp.out
+++ b/Test/baseResults/310.comp.out
@@ -24,7 +24,6 @@ ERROR: 0:90: 'imageAtomicMax' : no matching overloaded function found
 ERROR: 0:94: 'writeonly' : argument cannot drop memory qualifier when passed to formal parameter 
 ERROR: 0:97: '' : memory qualifiers cannot be used on this type 
 ERROR: 0:98: '' : memory qualifiers cannot be used on this type 
-ERROR: 0:110: 'restrict' : argument cannot drop memory qualifier when passed to formal parameter 
 ERROR: 0:114: 'image load-store format' : not supported with this profile: es
 ERROR: 0:114: 'rg8i' : does not apply to unsigned integer images 
 ERROR: 0:115: 'rgba32i' : does not apply to floating point images 
@@ -73,7 +72,7 @@ ERROR: 0:207: 'constructor' : can't read from writeonly object:  wo
 ERROR: 0:208: '~' : can't read from writeonly object:  wo
 ERROR: 0:221: 'assign' : can't read from writeonly object:  wo
 ERROR: 0:222: '~' : can't read from writeonly object:  wo
-ERROR: 73 compilation errors.  No code generated.
+ERROR: 72 compilation errors.  No code generated.
 
 
 Shader version: 310
diff --git a/Test/baseResults/420.vert.out b/Test/baseResults/420.vert.out
index fd58f68bfa4b885fd6d7fe4723d6c4fa09982906..12e06739a2a39d89b28d7e81ca387982a4b6016a 100644
--- a/Test/baseResults/420.vert.out
+++ b/Test/baseResults/420.vert.out
@@ -41,7 +41,7 @@ ERROR: 0:115: 'imageAtomicMax' : no matching overloaded function found
 ERROR: 0:119: 'writeonly' : argument cannot drop memory qualifier when passed to formal parameter 
 ERROR: 0:122: '' : memory qualifiers cannot be used on this type 
 ERROR: 0:123: '' : memory qualifiers cannot be used on this type 
-ERROR: 0:135: 'restrict' : argument cannot drop memory qualifier when passed to formal parameter 
+ERROR: 0:135: 'volatile' : argument cannot drop memory qualifier when passed to formal parameter 
 ERROR: 0:139: 'rg8i' : does not apply to unsigned integer images 
 ERROR: 0:140: 'rgba32i' : does not apply to floating point images 
 ERROR: 0:141: 'rgba32f' : does not apply to unsigned integer images 
@@ -236,7 +236,7 @@ ERROR: node is still EOpNull!
 0:134      Function Call: passr(iI21; (void)
 0:134        'qualim1' (layout(r32i ) coherent readonly uniform iimage2D)
 0:135      Function Call: passr(iI21; (void)
-0:135        'qualim2' (layout(r32i ) coherent restrict readonly uniform iimage2D)
+0:135        'qualim2' (layout(r32i ) coherent volatile readonly uniform iimage2D)
 0:136      Function Call: passr(iI21; (void)
 0:136        'iimg2D' (layout(r32i ) uniform iimage2D)
 0:?   Linker Objects
@@ -282,7 +282,7 @@ ERROR: node is still EOpNull!
 0:?     'vol' (volatile float)
 0:?     'vol2' (readonly int)
 0:?     'qualim1' (layout(r32i ) coherent readonly uniform iimage2D)
-0:?     'qualim2' (layout(r32i ) coherent restrict readonly uniform iimage2D)
+0:?     'qualim2' (layout(r32i ) coherent volatile readonly uniform iimage2D)
 0:?     'i1bad' (layout(rg8i ) uniform uimage2D)
 0:?     'i2bad' (layout(rgba32i ) uniform image2D)
 0:?     'i3bad' (layout(rgba32f ) uniform uimage2D)
@@ -481,7 +481,7 @@ ERROR: node is still EOpNull!
 0:134      Function Call: passr(iI21; (void)
 0:134        'qualim1' (layout(r32i ) coherent readonly uniform iimage2D)
 0:135      Function Call: passr(iI21; (void)
-0:135        'qualim2' (layout(r32i ) coherent restrict readonly uniform iimage2D)
+0:135        'qualim2' (layout(r32i ) coherent volatile readonly uniform iimage2D)
 0:136      Function Call: passr(iI21; (void)
 0:136        'iimg2D' (layout(r32i ) uniform iimage2D)
 0:?   Linker Objects
@@ -527,7 +527,7 @@ ERROR: node is still EOpNull!
 0:?     'vol' (volatile float)
 0:?     'vol2' (readonly int)
 0:?     'qualim1' (layout(r32i ) coherent readonly uniform iimage2D)
-0:?     'qualim2' (layout(r32i ) coherent restrict readonly uniform iimage2D)
+0:?     'qualim2' (layout(r32i ) coherent volatile readonly uniform iimage2D)
 0:?     'i1bad' (layout(rg8i ) uniform uimage2D)
 0:?     'i2bad' (layout(rgba32i ) uniform image2D)
 0:?     'i3bad' (layout(rgba32f ) uniform uimage2D)
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index eb7de1bd3c3fb795a08e5e0ee8c5e812234cc22d..2cab87883263d5bb5ef5fc83b9aa4f1441df9386 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -418,29 +418,29 @@ void TBuiltIns::initialize(int version, EProfile profile)
     if (profile == EEsProfile && version >= 310 ||
         profile != EEsProfile && version >= 430) {
         commonBuiltins.append(
-            "uint atomicAdd(coherent volatile restrict inout uint, uint);"
-            " int atomicAdd(coherent volatile restrict inout  int,  int);"
+            "uint atomicAdd(coherent volatile inout uint, uint);"
+            " int atomicAdd(coherent volatile inout  int,  int);"
 
-            "uint atomicMin(coherent volatile restrict inout uint, uint);"
-            " int atomicMin(coherent volatile restrict inout  int,  int);"
+            "uint atomicMin(coherent volatile inout uint, uint);"
+            " int atomicMin(coherent volatile inout  int,  int);"
             
-            "uint atomicMax(coherent volatile restrict inout uint, uint);"
-            " int atomicMax(coherent volatile restrict inout  int,  int);"
+            "uint atomicMax(coherent volatile inout uint, uint);"
+            " int atomicMax(coherent volatile inout  int,  int);"
             
-            "uint atomicAnd(coherent volatile restrict inout uint, uint);"
-            " int atomicAnd(coherent volatile restrict inout  int,  int);"
+            "uint atomicAnd(coherent volatile inout uint, uint);"
+            " int atomicAnd(coherent volatile inout  int,  int);"
             
-            "uint atomicOr (coherent volatile restrict inout uint, uint);"
-            " int atomicOr (coherent volatile restrict inout  int,  int);"
+            "uint atomicOr (coherent volatile inout uint, uint);"
+            " int atomicOr (coherent volatile inout  int,  int);"
             
-            "uint atomicXor(coherent volatile restrict inout uint, uint);"
-            " int atomicXor(coherent volatile restrict inout  int,  int);"
+            "uint atomicXor(coherent volatile inout uint, uint);"
+            " int atomicXor(coherent volatile inout  int,  int);"
 
-            "uint atomicExchange(coherent volatile restrict inout uint, uint);"
-            " int atomicExchange(coherent volatile restrict inout  int,  int);"
+            "uint atomicExchange(coherent volatile inout uint, uint);"
+            " int atomicExchange(coherent volatile inout  int,  int);"
 
-            "uint atomicCompSwap(coherent volatile restrict inout uint, uint, uint);"
-            " int atomicCompSwap(coherent volatile restrict inout  int,  int,  int);"
+            "uint atomicCompSwap(coherent volatile inout uint, uint, uint);"
+            " int atomicCompSwap(coherent volatile inout  int,  int,  int);"
 
             "\n");
     }
@@ -1847,7 +1847,7 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, TString& typeName, int versi
         commonBuiltins.append(postfixes[dims]);
     }
     if (sampler.image)
-        commonBuiltins.append(" imageSize(readonly writeonly volatile coherent restrict ");
+        commonBuiltins.append(" imageSize(readonly writeonly volatile coherent ");
     else
         commonBuiltins.append(" textureSize(");
     commonBuiltins.append(typeName);
@@ -1861,7 +1861,7 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, TString& typeName, int versi
     if (profile != EEsProfile && version >= 430 && sampler.ms) {
         commonBuiltins.append("int ");
         if (sampler.image)
-            commonBuiltins.append("imageSamples(");
+            commonBuiltins.append("imageSamples(readonly writeonly volatile coherent ");
         else
             commonBuiltins.append("textureSamples(");
         commonBuiltins.append(typeName);
@@ -1889,11 +1889,11 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi
         imageParams.append(", int");
 
     commonBuiltins.append(prefixes[sampler.type]);
-    commonBuiltins.append("vec4 imageLoad(readonly volatile coherent restrict ");
+    commonBuiltins.append("vec4 imageLoad(readonly volatile coherent ");
     commonBuiltins.append(imageParams);
     commonBuiltins.append(");\n");
 
-    commonBuiltins.append("void imageStore(writeonly volatile coherent restrict ");
+    commonBuiltins.append("void imageStore(writeonly volatile coherent ");
     commonBuiltins.append(imageParams);
     commonBuiltins.append(", ");
     commonBuiltins.append(prefixes[sampler.type]);
@@ -1906,13 +1906,13 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi
             const int numBuiltins = 7;
 
             static const char* atomicFunc[numBuiltins] = {
-                " imageAtomicAdd(volatile coherent restrict ",
-                " imageAtomicMin(volatile coherent restrict ",
-                " imageAtomicMax(volatile coherent restrict ",
-                " imageAtomicAnd(volatile coherent restrict ",
-                " imageAtomicOr(volatile coherent restrict ",
-                " imageAtomicXor(volatile coherent restrict ",
-                " imageAtomicExchange(volatile coherent restrict "
+                " imageAtomicAdd(volatile coherent ",
+                " imageAtomicMin(volatile coherent ",
+                " imageAtomicMax(volatile coherent ",
+                " imageAtomicAnd(volatile coherent ",
+                " imageAtomicOr(volatile coherent ",
+                " imageAtomicXor(volatile coherent ",
+                " imageAtomicExchange(volatile coherent "
             }; 
 
             for (size_t i = 0; i < numBuiltins; ++i) {
@@ -1925,7 +1925,7 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi
             }
 
             commonBuiltins.append(dataType);
-            commonBuiltins.append(" imageAtomicCompSwap(volatile coherent restrict ");
+            commonBuiltins.append(" imageAtomicCompSwap(volatile coherent ");
             commonBuiltins.append(imageParams);
             commonBuiltins.append(", ");
             commonBuiltins.append(dataType);
@@ -1937,7 +1937,7 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi
             // GL_ARB_ES3_1_compatibility
             // TODO: spec issue: are there restrictions on the kind of layout() that can be used?  what about dropping memory qualifiers?
             if (version >= 450) {
-                commonBuiltins.append("float imageAtomicExchange(volatile coherent restrict ");
+                commonBuiltins.append("float imageAtomicExchange(volatile coherent ");
                 commonBuiltins.append(imageParams);
                 commonBuiltins.append(", float);\n");
             }
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 944bf1f4cc769528202446a8a712858cf855c2cf..176d295c5b65697ac8c2c8b010b412d7880d405a 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -1026,8 +1026,6 @@ TIntermTyped* TParseContext::handleFunctionCall(TSourceLoc loc, TFunction* funct
                             error(arguments->getLoc(), message, "volatile", "");
                         if (argQualifier.coherent && ! formalQualifier.coherent)
                             error(arguments->getLoc(), message, "coherent", "");
-                        if (argQualifier.restrict && ! formalQualifier.restrict)
-                            error(arguments->getLoc(), message, "restrict", "");
                         if (argQualifier.readonly && ! formalQualifier.readonly)
                             error(arguments->getLoc(), message, "readonly", "");
                         if (argQualifier.writeonly && ! formalQualifier.writeonly)