diff --git a/Test/pointCoord.frag b/Test/pointCoord.frag
new file mode 100644
index 0000000000000000000000000000000000000000..9455246a2ca37efedaed1dedd0f8b53457958337
--- /dev/null
+++ b/Test/pointCoord.frag
@@ -0,0 +1,15 @@
+precision mediump float;
+
+uniform sampler2D sampler;
+
+void main()
+{
+    vec4 color;
+
+    if (length(gl_PointCoord) < 0.3)
+        color = texture2D(sampler, gl_PointCoord);
+    else
+        color = vec4(0.0);
+
+    gl_FragColor = color;
+}
diff --git a/Test/testlist b/Test/testlist
index b1ce6c4fe180ae58a91c7388d0561916d9e4d814..6e8805858d6801c858725f2e1eec8ddbbaba4d93 100644
--- a/Test/testlist
+++ b/Test/testlist
@@ -16,3 +16,4 @@ cppSimple.vert
 cppIndent.vert
 cppNest.vert
 cppComplexExpr.vert
+pointCoord.frag
diff --git a/glslang/Include/BaseTypes.h b/glslang/Include/BaseTypes.h
index 6c4ebb04e350d5580bd8edbb201c31c636218d31..ef3f910171500ef6136f395f454568e25cfea77d 100644
--- a/glslang/Include/BaseTypes.h
+++ b/glslang/Include/BaseTypes.h
@@ -94,6 +94,7 @@ enum TStorageQualifier {
     // built-ins read by fragment shader
     EvqFace,
     EvqFragCoord,
+    EvqPointCoord,
 
     // built-ins written by fragment shader
     EvqFragColor,
@@ -123,8 +124,9 @@ __inline const char* getStorageQualifierString(TStorageQualifier q)
     case EvqPosition:       return "Position";       break;
     case EvqPointSize:      return "PointSize";      break;
     case EvqClipVertex:     return "ClipVertex";     break;
-    case EvqFace:           return "Face";           break;
+    case EvqFace:           return "FrontFacing";    break;
     case EvqFragCoord:      return "FragCoord";      break;
+    case EvqPointCoord:     return "PointCoord";     break;
     case EvqFragColor:      return "FragColor";      break;
     case EvqFragDepth:      return "FragDepth";      break;
     default:                return "unknown qualifier";
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 60795f65f91662cac65b8ad9a49c700c1f4b6b9f..a02f0a30c1e73f7b180420d1968b1d2516bcabc5 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -831,14 +831,13 @@ void IdentifyBuiltIns(EShLanguage language, TSymbolTable& symbolTable)
     // the built-in header files.
     //
     switch(language) {
+    case EShLangFragment:
+        symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"), TType(EbtBool,  EvqFace,        1)));
+        symbolTable.insert(*new TVariable(NewPoolTString("gl_FragCoord"),   TType(EbtFloat, EvqFragCoord,   4)));
+        symbolTable.insert(*new TVariable(NewPoolTString("gl_PointCoord"),  TType(EbtFloat, EvqPointCoord,  2)));
 
-    case EShLangFragment: {
-            symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"), TType(EbtBool,  EvqFace, 1)));
-            symbolTable.insert(*new TVariable(NewPoolTString("gl_FragCoord"),   TType(EbtFloat, EvqFragCoord,   4)));
-            symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"),   TType(EbtFloat, EvqFragColor,   4)));
-            symbolTable.insert(*new TVariable(NewPoolTString("gl_FragDepth"),   TType(EbtFloat, EvqFragDepth,   1)));
-
-        }
+        symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"),   TType(EbtFloat, EvqFragColor,   4)));
+        symbolTable.insert(*new TVariable(NewPoolTString("gl_FragDepth"),   TType(EbtFloat, EvqFragDepth,   1)));
         break;
 
     case EShLangVertex:
@@ -846,7 +845,12 @@ void IdentifyBuiltIns(EShLanguage language, TSymbolTable& symbolTable)
         symbolTable.insert(*new TVariable(NewPoolTString("gl_PointSize"),   TType(EbtFloat, EvqPointSize,   1)));
         symbolTable.insert(*new TVariable(NewPoolTString("gl_ClipVertex"),  TType(EbtFloat, EvqClipVertex,  4)));
         break;
-	default: break;
+        
+    case EShLangTessControl:
+    case EShLangTessEvaluation:
+    case EShLangGeometry:
+        // TODO: support these stages
+        break;
     }
 
     //
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index c968b75744bc09a7a55908de93eea08fdcbbcaee..189d197268acf13ed60ef76065a492514b257ad9 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -76,6 +76,7 @@ void TParseContext::setVersion(int newVersion)
 			defaultPrecision[EbtInt] = EpqMedium;
 			defaultPrecision[EbtSampler2D] = EpqLow;
 			defaultPrecision[EbtSamplerCube] = EpqLow;
+            // TODO: give error when using float in frag shader without default precision
         }
 	} else {
         for (int type = 0; type < EbtNumTypes; ++type)
@@ -294,7 +295,10 @@ void TParseContext::binaryOpError(int line, char* op, TString left, TString righ
 void TParseContext::variableErrorCheck(TIntermTyped*& nodePtr) 
 {
     TIntermSymbol* symbol = nodePtr->getAsSymbolNode();
-    if (symbol && symbol->getType().getBasicType() == EbtVoid) {
+    if (! symbol)
+        return;
+
+    if (symbol->getType().getBasicType() == EbtVoid) {
         error(symbol->getLine(), "undeclared identifier", symbol->getSymbol().c_str(), "");
         recover();
 
@@ -307,6 +311,12 @@ void TParseContext::variableErrorCheck(TIntermTyped*& nodePtr)
         nodePtr = intermediate.addSymbol(fakeVariable->getUniqueId(), 
                                          fakeVariable->getName(), 
                                          fakeVariable->getType(), symbol->getLine());
+    } else {
+        switch (symbol->getQualifier().storage) {
+        case EvqPointCoord:
+            profileRequires(symbol->getLine(), ENoProfile, 120, 0, "gl_PointCoord");
+            break;
+        }
     }
 }
 
@@ -372,6 +382,7 @@ bool TParseContext::lValueErrorCheck(int line, char* op, TIntermTyped* node)
     case EvqVaryingIn:      message = "can't modify a varying";      break;
     case EvqFace:           message = "can't modify gl_FrontFace";   break;
     case EvqFragCoord:      message = "can't modify gl_FragCoord";   break;
+    case EvqPointCoord:     message = "can't modify gl_PointCoord";  break;
     default:
 
         //
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
index f95445d95ee2ee6928c65af6a50cfdc4c2ec9097..4c1d909f59054f6084a9fdecf116b35ee9fbe471 100644
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -217,8 +217,7 @@ bool InitializeSymbolTable(TBuiltInStrings* BuiltInStrings, EShLanguage language
     }
     
     for (TBuiltInStrings::iterator i  = BuiltInStrings[parseContext.language].begin();
-                                    i != BuiltInStrings[parseContext.language].end();
-                                    ++i) {
+                                   i != BuiltInStrings[parseContext.language].end();    ++i) {
         const char* builtInShaders[1];
         int builtInLengths[1];