diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,14 @@
+2.13.1.0
+--------
+* Added `extensionSupported`.
+* Relaxed upper version bound for OpenGLRaw.
+* Added CHANGELOG.md to distribution.
+
+2.13.0.0
+--------
+* Added missing drawing commands using vertex arrays and some related types.
+* Added missing whole framebuffer operations.
+* Added getters for `stencilMaskSeparate`, `stencilFuncSeparate`, and `stencilOpSeparate`, making them full-blown `StateVar`s.
+* Added `patchDefaultInnerLevel` and `patchDefaultOuterLevel` to control the default tessellation levels.
+* Added `ContextLost` constructor to `ErrorCategory` type.
+* Added `SeparateAttribs` and deprecated `SeperateAttribs`, fixing a spelling mistake.
diff --git a/OpenGL.cabal b/OpenGL.cabal
--- a/OpenGL.cabal
+++ b/OpenGL.cabal
@@ -1,5 +1,5 @@
 name: OpenGL
-version: 2.13.0.0
+version: 2.13.1.0
 synopsis: A binding for the OpenGL graphics system
 description:
   A Haskell binding for the OpenGL graphics system (GL, version 4.5) and its
@@ -22,6 +22,7 @@
 build-type: Simple
 cabal-version: >= 1.10
 extra-source-files:
+   CHANGELOG.md
    README.md
 
 library
@@ -147,14 +148,15 @@
   hs-source-dirs: src
   ghc-options: -Wall
   build-depends:
-    base         >= 3   && < 5,
-    bytestring   >= 0.9 && < 0.11,
-    text         >= 0.1 && < 1.3,
-    transformers >= 0.2 && < 0.5,
-    ObjectName   >= 1.1 && < 1.2,
-    StateVar     >= 1.1 && < 1.2,
-    OpenGLRaw    >= 2.1 && < 2.6,
-    GLURaw       >= 1.3 && < 1.6
+    base         >= 3     && < 5,
+    bytestring   >= 0.9   && < 0.11,
+    containers   >= 0.3   && < 0.6,
+    text         >= 0.1   && < 1.3,
+    transformers >= 0.2   && < 0.5,
+    ObjectName   >= 1.1   && < 1.2,
+    StateVar     >= 1.1   && < 1.2,
+    OpenGLRaw    >= 2.5.5 && < 2.7,
+    GLURaw       >= 1.3   && < 1.6
   default-language: Haskell2010
   other-extensions:
     CPP
diff --git a/src/Graphics/Rendering/OpenGL/GL/ByteString.hs b/src/Graphics/Rendering/OpenGL/GL/ByteString.hs
--- a/src/Graphics/Rendering/OpenGL/GL/ByteString.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/ByteString.hs
@@ -16,11 +16,13 @@
 module Graphics.Rendering.OpenGL.GL.ByteString (
    B.ByteString, stringQuery, createAndTrimByteString,
    withByteString, withGLstring,
-   packUtf8, unpackUtf8
+   packUtf8, unpackUtf8,
+   getStringWith
 ) where
 
 import Data.StateVar
 import Foreign.Ptr
+import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.Raw
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Internal as BI
@@ -60,3 +62,9 @@
 
 unpackUtf8 :: B.ByteString -> String
 unpackUtf8 = T.unpack . TE.decodeUtf8
+
+getStringWith :: IO (Ptr GLubyte) -> IO String
+getStringWith getStr = getStr >>= maybeNullPtr (return "") peekGLstring
+
+peekGLstring :: Ptr GLubyte -> IO String
+peekGLstring p = fmap unpackUtf8 $ BU.unsafePackCString (castPtr p)
diff --git a/src/Graphics/Rendering/OpenGL/GL/QueryUtils/PName.hs b/src/Graphics/Rendering/OpenGL/GL/QueryUtils/PName.hs
--- a/src/Graphics/Rendering/OpenGL/GL/QueryUtils/PName.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/QueryUtils/PName.hs
@@ -570,6 +570,8 @@
     | GetDebugNextLoggedMessageLength -- ^ int
     | GetMaxDebugGroupStackDepth      -- ^ int
     | GetMaxLabelLength               -- ^ int
+    -- Extensions
+    | GetNumExtensions     -- ^ uint
 
 instance GetPName1I PName1I where
 
@@ -848,6 +850,7 @@
         GetDebugNextLoggedMessageLength -> Just gl_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH
         GetMaxDebugGroupStackDepth -> Just gl_MAX_DEBUG_GROUP_STACK_DEPTH
         GetMaxLabelLength -> Just gl_MAX_LABEL_LENGTH
+        GetNumExtensions -> Just gl_NUM_EXTENSIONS
 
 -- 0x8825 through 0x8834 are reserved for draw buffers
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/StringQueries.hs b/src/Graphics/Rendering/OpenGL/GL/StringQueries.hs
--- a/src/Graphics/Rendering/OpenGL/GL/StringQueries.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/StringQueries.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Graphics.Rendering.OpenGL.GL.StringQueries
@@ -14,34 +15,42 @@
 --------------------------------------------------------------------------------
 
 module Graphics.Rendering.OpenGL.GL.StringQueries (
-   vendor, renderer, glVersion, glExtensions, shadingLanguageVersion,
-   majorMinor, ContextProfile'(..), contextProfile
+   vendor, renderer, glVersion, glExtensions, extensionSupported,
+   shadingLanguageVersion, majorMinor, ContextProfile'(..), contextProfile
 ) where
 
 import Data.Bits
 import Data.Char
-import Data.StateVar
-import Foreign.C.String
-import Foreign.Ptr
+#if !MIN_VERSION_base(4,8,0)
+import Data.Functor( (<$>), (<$) )
+#endif
+import Data.Set ( member, toList )
+import Data.StateVar as S
+import Graphics.Rendering.OpenGL.GL.ByteString
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.Raw
+import Text.ParserCombinators.ReadP as R
 
 --------------------------------------------------------------------------------
 
 vendor :: GettableStateVar String
-vendor = makeGettableStateVar (getString gl_VENDOR)
+vendor = makeStringVar gl_VENDOR
 
 renderer :: GettableStateVar String
-renderer = makeGettableStateVar (getString gl_RENDERER)
+renderer = makeStringVar gl_RENDERER
 
 glVersion :: GettableStateVar String
-glVersion = makeGettableStateVar (getString gl_VERSION)
+glVersion = makeStringVar gl_VERSION
 
 glExtensions :: GettableStateVar [String]
-glExtensions = makeGettableStateVar (fmap words $ getString gl_EXTENSIONS)
+glExtensions = makeGettableStateVar (toList <$> getExtensions)
 
+extensionSupported :: String -> GettableStateVar Bool
+extensionSupported ext =
+  makeGettableStateVar (getExtensions >>= (return . member ext))
+
 shadingLanguageVersion :: GettableStateVar String
-shadingLanguageVersion = makeGettableStateVar (getString gl_SHADING_LANGUAGE_VERSION)
+shadingLanguageVersion = makeStringVar gl_SHADING_LANGUAGE_VERSION
 
 --------------------------------------------------------------------------------
 
@@ -65,8 +74,8 @@
 
 --------------------------------------------------------------------------------
 
-getString :: GLenum -> IO String
-getString n = glGetString n >>= maybeNullPtr (return "") (peekCString . castPtr)
+makeStringVar :: GLenum -> GettableStateVar String
+makeStringVar = makeGettableStateVar . getStringWith . glGetString
 
 --------------------------------------------------------------------------------
 
@@ -77,12 +86,30 @@
 -- with a sane OpenGL implementation, it is transformed to @(-1,-1)@.
 
 majorMinor :: GettableStateVar String -> GettableStateVar (Int, Int)
-majorMinor = makeGettableStateVar . fmap parse . get
-   where defaultVersion = (-1, -1)
-         parse str =
-            case span isDigit str of
-               (major@(_:_), '.':rest) ->
-                  case span isDigit rest of
-                     (minor@(_:_), _) -> (read major, read minor)
-                     _ -> defaultVersion
-               _ -> defaultVersion
+majorMinor =
+  makeGettableStateVar . (runParser parseVersion (-1, -1) <$>) . S.get
+
+--------------------------------------------------------------------------------
+-- Copy from Graphics.Rendering.OpenGL.Raw.GetProcAddress... :-/
+
+runParser :: ReadP a -> a -> String -> a
+runParser parser failed str =
+  case readP_to_S parser str of
+    [(v, "")] -> v
+    _ -> failed
+
+-- This does quite a bit more than we need for "normal" OpenGL, but at least it
+-- documents the convoluted format of the version string in detail.
+parseVersion :: ReadP (Int, Int)
+parseVersion = do
+  _prefix <-
+    -- Too lazy to define a type for the API...
+    ("CL" <$ string "OpenGL ES-CL ") <++  -- OpenGL ES 1.x Common-Lite
+    ("CM" <$ string "OpenGL ES-CM ") <++  -- OpenGL ES 1.x Common
+    ("ES" <$ string "OpenGL ES "   ) <++  -- OpenGL ES 2.x or 3.x
+    ("GL" <$ string ""             )      -- OpenGL
+  major <- read <$> munch1 isDigit
+  minor <- char '.' >> read <$> munch1 isDigit
+  _release <- (char '.' >> munch1 (/= ' ')) <++ return ""
+  _vendorStuff <- (char ' ' >> R.get `manyTill` eof) <++ ("" <$ eof)
+  return (major, minor)
diff --git a/src/Graphics/Rendering/OpenGL/GLU/Initialization.hs b/src/Graphics/Rendering/OpenGL/GLU/Initialization.hs
--- a/src/Graphics/Rendering/OpenGL/GLU/Initialization.hs
+++ b/src/Graphics/Rendering/OpenGL/GLU/Initialization.hs
@@ -17,10 +17,8 @@
 ) where
 
 import Data.StateVar
-import Foreign.C.String
-import Foreign.Ptr
 import Graphics.Rendering.GLU.Raw
-import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.ByteString
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
@@ -32,5 +30,4 @@
 gluExtensions = makeGettableStateVar (fmap words $ getString glu_EXTENSIONS)
 
 getString :: GLenum -> IO String
-getString n = gluGetString n >>=
-              maybeNullPtr (return "") (peekCString . castPtr)
+getString = getStringWith . gluGetString
