diff --git a/OpenGL.cabal b/OpenGL.cabal
--- a/OpenGL.cabal
+++ b/OpenGL.cabal
@@ -1,5 +1,5 @@
 name: OpenGL
-version: 2.11.1.0
+version: 2.12.0.0
 synopsis: A binding for the OpenGL graphics system
 description:
   A Haskell binding for the OpenGL graphics system (GL, version 4.5) and its
@@ -13,6 +13,7 @@
   and <http://www.opengl.org/registry/>.
 homepage: http://www.haskell.org/haskellwiki/Opengl
 bug-reports: https://github.com/haskell-opengl/OpenGL/issues
+copyright: Copyright (C) 2002-2015 Sven Panne
 license: BSD3
 license-file: LICENSE
 author: Sven Panne
@@ -50,7 +51,6 @@
     Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObjects
     Graphics.Rendering.OpenGL.GL.Hints
     Graphics.Rendering.OpenGL.GL.LineSegments
-    Graphics.Rendering.OpenGL.GL.ObjectName
     Graphics.Rendering.OpenGL.GL.PerFragment
     Graphics.Rendering.OpenGL.GL.PixelRectangles
     Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable
@@ -79,7 +79,6 @@
     Graphics.Rendering.OpenGL.GL.Shaders.ShaderBinaries
     Graphics.Rendering.OpenGL.GL.Shaders.ShaderObjects
     Graphics.Rendering.OpenGL.GL.Shaders.Uniform
-    Graphics.Rendering.OpenGL.GL.StateVar
     Graphics.Rendering.OpenGL.GL.StringQueries
     Graphics.Rendering.OpenGL.GL.SyncObjects
     Graphics.Rendering.OpenGL.GL.Tensor
@@ -148,7 +147,14 @@
   hs-source-dirs: src
   ghc-options: -Wall
   build-depends:
-    base >= 3 && < 5, bytestring, text, OpenGLRaw >= 2.1, GLURaw >= 1.3.0.0
+    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.5,
+    GLURaw       >= 1.3 && < 1.6
   default-language: Haskell2010
   other-extensions:
     CPP
diff --git a/src/Graphics/Rendering/OpenGL/GL.hs b/src/Graphics/Rendering/OpenGL/GL.hs
--- a/src/Graphics/Rendering/OpenGL/GL.hs
+++ b/src/Graphics/Rendering/OpenGL/GL.hs
@@ -17,7 +17,7 @@
    -- * OpenGL Fundamentals
    module Graphics.Rendering.OpenGL.Raw.Types,
    module Graphics.Rendering.OpenGL.GL.FlushFinish,
-   module Graphics.Rendering.OpenGL.GL.ObjectName,
+   module Data.ObjectName,
 
    -- * Event Model
    module Graphics.Rendering.OpenGL.GL.SyncObjects,
@@ -68,7 +68,7 @@
    module Graphics.Rendering.OpenGL.GL.DebugOutput,
 
    -- * State and State Requests
-   module Graphics.Rendering.OpenGL.GL.StateVar,
+   module Data.StateVar,
    module Graphics.Rendering.OpenGL.GL.Tensor,
    module Graphics.Rendering.OpenGL.GL.StringQueries,
    module Graphics.Rendering.OpenGL.GL.SavingState
@@ -76,7 +76,8 @@
 
 import Graphics.Rendering.OpenGL.Raw.Types
 import Graphics.Rendering.OpenGL.GL.FlushFinish
-import Graphics.Rendering.OpenGL.GL.ObjectName
+import Data.ObjectName
+import Data.StateVar
 
 import Graphics.Rendering.OpenGL.GL.SyncObjects
 import Graphics.Rendering.OpenGL.GL.QueryObjects
@@ -120,7 +121,6 @@
 import Graphics.Rendering.OpenGL.GL.TransformFeedback
 import Graphics.Rendering.OpenGL.GL.DebugOutput
 
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Tensor
 import Graphics.Rendering.OpenGL.GL.StringQueries
 import Graphics.Rendering.OpenGL.GL.SavingState
diff --git a/src/Graphics/Rendering/OpenGL/GL/Antialiasing.hs b/src/Graphics/Rendering/OpenGL/GL/Antialiasing.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Antialiasing.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Antialiasing.hs
@@ -17,7 +17,7 @@
    sampleBuffers, samples, multisample, subpixelBits
 ) where
 
-import Graphics.Rendering.OpenGL.GL.StateVar
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.Raw
diff --git a/src/Graphics/Rendering/OpenGL/GL/BeginEnd.hs b/src/Graphics/Rendering/OpenGL/GL/BeginEnd.hs
--- a/src/Graphics/Rendering/OpenGL/GL/BeginEnd.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/BeginEnd.hs
@@ -22,7 +22,7 @@
    edgeFlag
 ) where
 
-import Graphics.Rendering.OpenGL.GL.StateVar
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.EdgeFlag
 import Graphics.Rendering.OpenGL.GL.Exception
 import Graphics.Rendering.OpenGL.GL.PrimitiveMode
diff --git a/src/Graphics/Rendering/OpenGL/GL/BufferObjects.hs b/src/Graphics/Rendering/OpenGL/GL/BufferObjects.hs
--- a/src/Graphics/Rendering/OpenGL/GL/BufferObjects.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/BufferObjects.hs
@@ -41,17 +41,18 @@
    indexedBufferStart, indexedBufferSize
 ) where
 
-import Data.Maybe
-import Foreign.Marshal.Array
-import Foreign.Marshal.Utils
-import Foreign.Ptr
-import Foreign.Storable
+import Control.Monad.IO.Class
+import Data.Maybe ( fromMaybe )
+import Data.ObjectName
+import Data.StateVar
+import Foreign.Marshal.Array ( allocaArray, peekArray, withArrayLen )
+import Foreign.Marshal.Utils ( with )
+import Foreign.Ptr ( Ptr, nullPtr )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
 import Graphics.Rendering.OpenGL.GL.Exception
 import Graphics.Rendering.OpenGL.GL.GLboolean
-import Graphics.Rendering.OpenGL.GL.ObjectName
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.VertexArrays
 import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
 import Graphics.Rendering.OpenGL.Raw
@@ -64,18 +65,21 @@
 --------------------------------------------------------------------------------
 
 instance ObjectName BufferObject where
-   isObjectName = fmap unmarshalGLboolean . glIsBuffer . bufferID
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsBuffer . bufferID
 
    deleteObjectNames bufferObjects =
-      withArrayLen (map bufferID bufferObjects) $
+      liftIO . withArrayLen (map bufferID bufferObjects) $
          glDeleteBuffers . fromIntegral
 
 instance GeneratableObjectName BufferObject where
    genObjectNames n =
-      allocaArray n $ \buf -> do
+      liftIO . allocaArray n $ \buf -> do
         glGenBuffers (fromIntegral n) buf
         fmap (map BufferObject) $ peekArray n buf
 
+instance CanBeLabeled BufferObject where
+   objectLabel = objectNameLabel gl_BUFFER . bufferID
+
 --------------------------------------------------------------------------------
 
 data BufferTarget =
@@ -288,7 +292,7 @@
 getBufferPointer :: BufferTarget -> IO (Ptr a)
 getBufferPointer t = with nullPtr $ \buf -> do
    glGetBufferPointerv (marshalBufferTarget t) gl_BUFFER_MAP_POINTER buf
-   peek buf
+   peek1 id buf
 
 --------------------------------------------------------------------------------
 
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
@@ -19,8 +19,8 @@
    packUtf8, unpackUtf8
 ) where
 
+import Data.StateVar
 import Foreign.Ptr
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Internal as BI
diff --git a/src/Graphics/Rendering/OpenGL/GL/Capability.hs b/src/Graphics/Rendering/OpenGL/GL/Capability.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Capability.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Capability.hs
@@ -21,7 +21,7 @@
    IndexedEnableCap(..), makeIndexedCapability,
 ) where
 
-import Graphics.Rendering.OpenGL.GL.StateVar
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.GLboolean
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
diff --git a/src/Graphics/Rendering/OpenGL/GL/Clipping.hs b/src/Graphics/Rendering/OpenGL/GL/Clipping.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Clipping.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Clipping.hs
@@ -17,6 +17,7 @@
    ClipPlaneName(..), clipPlane, maxClipPlanes
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Alloc
 import Foreign.Marshal.Utils
 import Foreign.Ptr
@@ -24,7 +25,6 @@
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.CoordTrans
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
 import Graphics.Rendering.OpenGL.Raw
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/ColorSum.hs b/src/Graphics/Rendering/OpenGL/GL/ColorSum.hs
--- a/src/Graphics/Rendering/OpenGL/GL/ColorSum.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/ColorSum.hs
@@ -16,7 +16,7 @@
    colorSum
 ) where
 
-import Graphics.Rendering.OpenGL.GL.StateVar
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.Capability
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/Colors.hs b/src/Graphics/Rendering/OpenGL/GL/Colors.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Colors.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Colors.hs
@@ -44,12 +44,12 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Foreign.Marshal.Alloc
 import Foreign.Marshal.Array
 import Foreign.Marshal.Utils
 import Foreign.Ptr
 import Foreign.Storable
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Tensor
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.Face
diff --git a/src/Graphics/Rendering/OpenGL/GL/CoordTrans.hs b/src/Graphics/Rendering/OpenGL/GL/CoordTrans.hs
--- a/src/Graphics/Rendering/OpenGL/GL/CoordTrans.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/CoordTrans.hs
@@ -36,13 +36,13 @@
    Plane(..), TextureCoordName(..), TextureGenMode(..), textureGenMode
 ) where
 
+import Data.StateVar
 import Foreign.ForeignPtr
 import Foreign.Marshal.Alloc
 import Foreign.Marshal.Array
 import Foreign.Marshal.Utils
 import Foreign.Ptr
 import Foreign.Storable
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Tensor
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.Exception
diff --git a/src/Graphics/Rendering/OpenGL/GL/DebugOutput.hs b/src/Graphics/Rendering/OpenGL/GL/DebugOutput.hs
--- a/src/Graphics/Rendering/OpenGL/GL/DebugOutput.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/DebugOutput.hs
@@ -17,7 +17,7 @@
 module Graphics.Rendering.OpenGL.GL.DebugOutput (
   -- * Debug Messages
   debugOutput, DebugMessage(..), DebugSource(..), DebugType(..),
-  DebugMessageID(..), DebugSeverity(..), maxDebugMessageLength,
+  DebugMessageID(DebugMessageID), DebugSeverity(..), maxDebugMessageLength,
 
   -- * Debug Message Callback
   debugMessageCallback,
@@ -25,7 +25,8 @@
   -- * Debug Message Log
   maxDebugLoggedMessages, debugLoggedMessages,
 
-  -- * Controlling Debug Messages (TODO)
+  -- * Controlling Debug Messages
+  MessageGroup(..), debugMessageControl,
 
   -- * Externally Generated Messages
   debugMessageInsert,
@@ -34,24 +35,25 @@
   DebugGroup(..), pushDebugGroup, popDebugGroup, withDebugGroup,
   maxDebugGroupStackDepth,
 
-  -- * Debug Labels (TODO)
+  -- * Debug Labels
+  CanBeLabeled(..), maxLabelLength,
 
   -- * Asynchronous and Synchronous Debug Output
   debugOutputSynchronous
 ) where
 
 import Control.Monad ( unless, replicateM )
+import Data.StateVar
 import Foreign.C.String ( peekCStringLen, withCStringLen )
 import Foreign.C.Types
 import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Array ( allocaArray )
+import Foreign.Marshal.Array ( allocaArray, withArrayLen )
 import Foreign.Ptr (
-  Ptr, nullPtr, castPtrToFunPtr, FunPtr, nullFunPtr, freeHaskellFunPtr )
+  nullPtr, castPtrToFunPtr, FunPtr, nullFunPtr, freeHaskellFunPtr )
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.Exception
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
@@ -177,7 +179,7 @@
 
 getDebugMessageCallback :: IO (Maybe (DebugMessage -> IO ()))
 getDebugMessageCallback = do
-  cb <- castPtrToFunPtr `fmap` getPointer DebugCallbackFunction
+  cb <- getDebugCallbackFunction
   return $ if (cb == nullFunPtr)
              then Nothing
              else Just . toDebugProc . dyn_debugProc $ cb
@@ -198,7 +200,7 @@
 
 setDebugMessageCallback :: Maybe (DebugMessage -> IO ()) -> IO ()
 setDebugMessageCallback maybeDebugProc = do
-  oldCB <- castPtrToFunPtr `fmap` getPointer DebugCallbackFunction
+  oldCB <- getDebugCallbackFunction
   unless (oldCB == nullFunPtr) $
     freeHaskellFunPtr oldCB
   newCB <-
@@ -214,6 +216,10 @@
                           (unmarshalDebugSeverity severity)
                           msg)
 
+getDebugCallbackFunction :: IO (FunPtr GLDEBUGPROCFunc)
+getDebugCallbackFunction =
+  castPtrToFunPtr `fmap` getPointer DebugCallbackFunction
+
 --------------------------------------------------------------------------------
 
 maxDebugLoggedMessages :: GettableStateVar GLsizei
@@ -233,8 +239,8 @@
       alloca $ \idBuf ->
         alloca $ \severityBuf ->
           allocaArray (fromIntegral len) $ \messageBuf -> do
-            glGetDebugMessageLog 1 len sourceBuf typeBuf idBuf severityBuf
-                                 nullPtr messageBuf
+            _ <- glGetDebugMessageLog 1 len sourceBuf typeBuf idBuf
+                                      severityBuf nullPtr messageBuf
             source <- peek1 unmarshalDebugSource sourceBuf
             typ <- peek1 unmarshalDebugType typeBuf
             msgID <- peek1 DebugMessageID idBuf
@@ -244,6 +250,35 @@
 
 --------------------------------------------------------------------------------
 
+data MessageGroup =
+    MessageGroup (Maybe DebugSource) (Maybe DebugType) (Maybe DebugSeverity)
+  | MessageGroupWithIDs DebugSource DebugType [DebugMessageID]
+  deriving ( Eq, Ord, Show )
+
+debugMessageControl :: MessageGroup -> SettableStateVar Capability
+debugMessageControl x = case x of
+  MessageGroup maybeSource maybeType maybeSeverity ->
+    doDebugMessageControl maybeSource maybeType maybeSeverity []
+  MessageGroupWithIDs source typ messageIDs ->
+    doDebugMessageControl (Just source) (Just typ) Nothing messageIDs
+
+doDebugMessageControl :: Maybe DebugSource
+                      -> Maybe DebugType
+                      -> Maybe DebugSeverity
+                      -> [DebugMessageID]
+                      -> SettableStateVar Capability
+doDebugMessageControl maybeSource maybeType maybeSeverity messageIDs =
+  makeSettableStateVar $ \cap ->
+    withArrayLen (map debugMessageID messageIDs) $ \len idsBuf ->
+      glDebugMessageControl (maybe gl_DONT_CARE marshalDebugSource maybeSource)
+                            (maybe gl_DONT_CARE marshalDebugType maybeType)
+                            (maybe gl_DONT_CARE marshalDebugSeverity maybeSeverity)
+                            (fromIntegral len)
+                            idsBuf
+                            (marshalCapability cap)
+
+--------------------------------------------------------------------------------
+
 debugMessageInsert :: DebugMessage -> IO ()
 debugMessageInsert (DebugMessage source typ msgID severity message) =
   withCStringLen message $ \(msg, len) ->
@@ -276,6 +311,16 @@
 maxDebugGroupStackDepth :: GettableStateVar GLsizei
 maxDebugGroupStackDepth =
   makeGettableStateVar (getSizei1 id GetMaxDebugGroupStackDepth)
+
+--------------------------------------------------------------------------------
+
+-- TODO: Make instances for the following features when we have them:
+--   * PROGRAM_PIPELINE / glGenProgramPipelines
+--   * SAMPLER / glGenSamplers
+--   * TRANSFORM_FEEDBACK / glGenTransformFeedbacks
+
+class CanBeLabeled a where
+  objectLabel :: a -> StateVar (Maybe String)
 
 --------------------------------------------------------------------------------
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/DisplayLists.hs b/src/Graphics/Rendering/OpenGL/GL/DisplayLists.hs
--- a/src/Graphics/Rendering/OpenGL/GL/DisplayLists.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/DisplayLists.hs
@@ -22,9 +22,11 @@
    callList, callLists, listBase
 ) where
 
-import Foreign.Ptr
-import Graphics.Rendering.OpenGL.GL.ObjectName
-import Graphics.Rendering.OpenGL.GL.StateVar
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Data.StateVar
+import Foreign.Ptr ( Ptr )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
 import Graphics.Rendering.OpenGL.GL.DataType
 import Graphics.Rendering.OpenGL.GL.Exception
 import Graphics.Rendering.OpenGL.GL.GLboolean
@@ -38,9 +40,13 @@
    deriving ( Eq, Ord, Show )
 
 instance ObjectName DisplayList where
-   isObjectName = fmap unmarshalGLboolean . glIsList . displayListID
-   deleteObjectNames = mapM_ (uncurry glDeleteLists) . combineConsecutive
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsList . displayListID
+   deleteObjectNames =
+     liftIO . mapM_ (uncurry glDeleteLists) . combineConsecutive
 
+instance CanBeLabeled DisplayList where
+   objectLabel = objectNameLabel gl_DISPLAY_LIST . displayListID
+
 combineConsecutive :: [DisplayList] -> [(GLuint, GLsizei)]
 combineConsecutive [] = []
 combineConsecutive (z:zs) = (displayListID z, len) : combineConsecutive rest
@@ -53,12 +59,13 @@
          DisplayList x `isFollowedBy` DisplayList y = x + 1 == y
 
 instance GeneratableObjectName DisplayList where
-   genObjectNames n = do
+   genObjectNames n = liftIO $ do
       first <- glGenLists (fromIntegral n)
       if DisplayList first == noDisplayList
          then do recordOutOfMemory
                  return []
-         else return [ DisplayList l | l <- [ first .. first + fromIntegral n - 1 ] ]
+         else return [ DisplayList l
+                     | l <- [ first .. first + fromIntegral n - 1 ] ]
 
 --------------------------------------------------------------------------------
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/Evaluators.hs b/src/Graphics/Rendering/OpenGL/GL/Evaluators.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Evaluators.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Evaluators.hs
@@ -46,6 +46,7 @@
 
 import Control.Monad
 import Data.List
+import Data.StateVar
 import Foreign.ForeignPtr
 import Foreign.Marshal.Array
 import Foreign.Marshal.Utils
@@ -57,7 +58,6 @@
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.PolygonMode
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.VertexArrays
 import Graphics.Rendering.OpenGL.Raw
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/Feedback.hs b/src/Graphics/Rendering/OpenGL/GL/Feedback.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Feedback.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Feedback.hs
@@ -18,12 +18,12 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Foreign.Marshal.Array
 import Foreign.Ptr
 import Foreign.Storable
 import Graphics.Rendering.OpenGL.GL.IOState
 import Graphics.Rendering.OpenGL.GL.RenderMode
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Tensor
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.Raw
diff --git a/src/Graphics/Rendering/OpenGL/GL/Fog.hs b/src/Graphics/Rendering/OpenGL/GL/Fog.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Fog.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Fog.hs
@@ -20,9 +20,9 @@
    FogDistanceMode(..), fogDistanceMode
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Utils
 import Foreign.Ptr
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.GL.VertexSpec
diff --git a/src/Graphics/Rendering/OpenGL/GL/Framebuffer.hs b/src/Graphics/Rendering/OpenGL/GL/Framebuffer.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Framebuffer.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Framebuffer.hs
@@ -35,13 +35,13 @@
 import Control.Monad
 import Data.List
 import Data.Maybe
+import Data.StateVar
 import Foreign.Marshal.Array
 import Graphics.Rendering.OpenGL.GL.BufferMode
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.Face
 import Graphics.Rendering.OpenGL.GL.GLboolean
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
 import Graphics.Rendering.OpenGL.Raw
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObject.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObject.hs
--- a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObject.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObject.hs
@@ -17,25 +17,32 @@
    FramebufferObject(..)
 ) where
 
-import Foreign.Marshal
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Foreign.Marshal.Array ( allocaArray, peekArray, withArrayLen )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
 import Graphics.Rendering.OpenGL.GL.GLboolean
-import Graphics.Rendering.OpenGL.GL.ObjectName
+import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.Raw
        
 --------------------------------------------------------------------------------
 
-data FramebufferObject = FramebufferObject { framebufferID :: GLuint }
+newtype FramebufferObject = FramebufferObject { framebufferID :: GLuint }
    deriving ( Eq, Ord, Show )
 
 instance ObjectName FramebufferObject where
-    isObjectName = fmap unmarshalGLboolean . glIsFramebuffer . framebufferID
+    isObjectName =
+      liftIO . fmap unmarshalGLboolean . glIsFramebuffer . framebufferID
 
     deleteObjectNames objs =
-       withArrayLen (map framebufferID objs) $
+       liftIO . withArrayLen (map framebufferID objs) $
           glDeleteFramebuffers . fromIntegral
 
 instance GeneratableObjectName FramebufferObject where
     genObjectNames n =
-       allocaArray n $ \buf -> do
+       liftIO . allocaArray n $ \buf -> do
           glGenFramebuffers (fromIntegral n) buf
           fmap (map FramebufferObject) $ peekArray n buf
+
+instance CanBeLabeled FramebufferObject where
+   objectLabel = objectNameLabel gl_FRAMEBUFFER . framebufferID
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObjects.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObjects.hs
--- a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObjects.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObjects.hs
@@ -16,10 +16,10 @@
    FramebufferStatus(..), framebufferStatus,
 ) where
 
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObject
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 -----------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/Queries.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/Queries.hs
--- a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/Queries.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/Queries.hs
@@ -25,11 +25,11 @@
    renderbufferAlphaSize, renderbufferDepthSize, renderbufferStencilSize,
 ) where
 
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjectAttachment
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObject
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
 import Graphics.Rendering.OpenGL.GL.Texturing.Specification(Level)
 import Graphics.Rendering.OpenGL.GL.Texturing.TextureObject
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObject.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObject.hs
--- a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObject.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObject.hs
@@ -17,25 +17,33 @@
    RenderbufferObject(..)
 ) where
 
-import Foreign.Marshal
+
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Foreign.Marshal ( allocaArray, peekArray, withArrayLen )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
 import Graphics.Rendering.OpenGL.GL.GLboolean
-import Graphics.Rendering.OpenGL.GL.ObjectName
+import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.Raw
        
 --------------------------------------------------------------------------------
 
-data RenderbufferObject = RenderbufferObject { renderbufferID :: GLuint}
+newtype RenderbufferObject = RenderbufferObject { renderbufferID :: GLuint}
    deriving ( Eq, Ord, Show )
 
 instance ObjectName RenderbufferObject where
-   isObjectName = fmap unmarshalGLboolean . glIsRenderbuffer . renderbufferID
+   isObjectName =
+     liftIO . fmap unmarshalGLboolean . glIsRenderbuffer . renderbufferID
 
    deleteObjectNames objs =
-      withArrayLen (map renderbufferID objs) $
+      liftIO . withArrayLen (map renderbufferID objs) $
          glDeleteRenderbuffers . fromIntegral
 
 instance GeneratableObjectName RenderbufferObject where
    genObjectNames n =
-      allocaArray n $ \buf -> do
+      liftIO . allocaArray n $ \buf -> do
          glGenRenderbuffers (fromIntegral n) buf
          fmap (map RenderbufferObject) $ peekArray n buf
+
+instance CanBeLabeled RenderbufferObject where
+   objectLabel = objectNameLabel gl_RENDERBUFFER . renderbufferID
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObjects.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObjects.hs
--- a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObjects.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObjects.hs
@@ -22,10 +22,10 @@
    renderbufferStorage, renderbufferStorageMultiSample,
 ) where
 
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObject
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
 import Graphics.Rendering.OpenGL.Raw
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/Hints.hs b/src/Graphics/Rendering/OpenGL/GL/Hints.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Hints.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Hints.hs
@@ -16,8 +16,8 @@
    HintTarget(..), HintMode(..), hint
 ) where
 
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/LineSegments.hs b/src/Graphics/Rendering/OpenGL/GL/LineSegments.hs
--- a/src/Graphics/Rendering/OpenGL/GL/LineSegments.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/LineSegments.hs
@@ -28,9 +28,9 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/ObjectName.hs b/src/Graphics/Rendering/OpenGL/GL/ObjectName.hs
deleted file mode 100644
--- a/src/Graphics/Rendering/OpenGL/GL/ObjectName.hs
+++ /dev/null
@@ -1,75 +0,0 @@
-{-# LANGUAGE CPP #-}
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.ObjectName
--- Copyright   :  (c) Sven Panne 2013
--- License     :  BSD3
--- 
--- Maintainer  :  Sven Panne <svenpanne@gmail.com>
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.5 (Objects and the Object Model) of the
--- OpenGL 4.4 specs.
---
--- Object names are explicitly handled identifiers for API objects, e.g. a
--- texture object name in OpenGL or a buffer object name in OpenAL. They come in
--- two flavors: If a name can exist on its own without an associated object, we
--- have a 'GeneratableObjectName', otherwise we have an 'ObjectName'.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.ObjectName (
-   ObjectName(..), GeneratableObjectName(..)
-) where
-
-import Control.Monad ( replicateM )
-
---------------------------------------------------------------------------------
-
--- | An 'ObjectName' is an explicitly handled identifier for API objects, e.g. a
--- texture object name in OpenGL or a buffer object name in OpenAL.
-#if __GLASGOW_HASKELL__ < 708
---
--- Minimal complete definition: 'isObjectName' plus one of 'deleteObjectName' or
--- 'deleteObjectNames'.
-#endif
-
-class ObjectName a where
-#if __GLASGOW_HASKELL__ >= 708
-   {-# MINIMAL isObjectName, ( deleteObjectName | deleteObjectNames ) #-}
-#endif
-   -- | Test if the given object name is currently in use, i.e. test if it has
-   -- been generated, but not been deleted so far.
-   isObjectName :: a -> IO Bool
-
-   -- | Make the given object name available again, declaring it as unused.
-   deleteObjectName :: a -> IO ()
-   deleteObjectName = deleteObjectNames . (:[])
-
-   -- | Bulk version of 'deleteObjectName'.
-   deleteObjectNames:: [a] -> IO ()
-   deleteObjectNames = mapM_ deleteObjectName
-
--- | A 'GeneratableObjectName' is an 'ObjectName' which can be generated without
--- creating an associated object at the same time, e.g. an OpenGL buffer object
--- name. Note that e.g. OpenGL program object names do not fall into this
--- category, because you can only create such a name together with a program
--- object itself.
-#if __GLASGOW_HASKELL__ < 708
---
--- Minimal complete definition: One of 'genObjectName' or 'genObjectNames'.
-#endif
-
-class ObjectName a => GeneratableObjectName  a where
-#if __GLASGOW_HASKELL__ >= 708
-   {-# MINIMAL genObjectName | genObjectNames #-}
-#endif
-   -- | Generate a new unused object name. By generating the name, it becomes
-   -- used.
-   genObjectName :: IO a
-   genObjectName = fmap head $ genObjectNames 1
-
-   -- | Bulk version of 'genObjectName'.
-   genObjectNames :: Int -> IO [a]
-   genObjectNames = flip replicateM genObjectName
diff --git a/src/Graphics/Rendering/OpenGL/GL/PerFragment.hs b/src/Graphics/Rendering/OpenGL/GL/PerFragment.hs
--- a/src/Graphics/Rendering/OpenGL/GL/PerFragment.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/PerFragment.hs
@@ -48,6 +48,7 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.BlendingFactor
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.ComparisonFunction
@@ -57,7 +58,6 @@
 import Graphics.Rendering.OpenGL.GL.Framebuffer
 import Graphics.Rendering.OpenGL.GL.GLboolean
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.Raw
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/ColorTable.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/ColorTable.hs
--- a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/ColorTable.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/ColorTable.hs
@@ -21,6 +21,7 @@
    colorTableRGBASizes, colorTableLuminanceSize, colorTableIntesitySize,
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Alloc
 import Foreign.Marshal.Utils
 import Foreign.Ptr
@@ -29,7 +30,6 @@
 import Graphics.Rendering.OpenGL.GL.CoordTrans
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.PixelData
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Convolution.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Convolution.hs
--- a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Convolution.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Convolution.hs
@@ -25,6 +25,7 @@
    convolutionFilterScale, convolutionFilterBias,
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Alloc
 import Foreign.Marshal.Utils
 import Foreign.Ptr
@@ -33,7 +34,6 @@
 import Graphics.Rendering.OpenGL.GL.CoordTrans
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.PixelData
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Histogram.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Histogram.hs
--- a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Histogram.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Histogram.hs
@@ -18,6 +18,7 @@
    histogramRGBASizes, histogramLuminanceSize
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Utils
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.PeekPoke
@@ -25,7 +26,6 @@
 import Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable
 import Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset
 import Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.Raw
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Minmax.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Minmax.hs
--- a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Minmax.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Minmax.hs
@@ -17,13 +17,13 @@
    minmax, getMinmax, resetMinmax
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Utils
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.PixelData
 import Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset
 import Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
 import Graphics.Rendering.OpenGL.Raw
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelMap.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelMap.hs
--- a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelMap.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelMap.hs
@@ -21,12 +21,12 @@
 ) where
 
 import Data.List
+import Data.StateVar
 import Foreign.ForeignPtr
 import Foreign.Marshal.Array
 import Foreign.Ptr
 import Foreign.Storable
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.Raw
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelStorage.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelStorage.hs
--- a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelStorage.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelStorage.hs
@@ -18,9 +18,9 @@
    skipPixels, rowAlignment, imageHeight, skipImages
 ) where
 
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.GLboolean
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelTransfer.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelTransfer.hs
--- a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelTransfer.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelTransfer.hs
@@ -19,9 +19,9 @@
    rgbaScale, rgbaBias
 ) where
 
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.Raw
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Rasterization.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Rasterization.hs
--- a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Rasterization.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Rasterization.hs
@@ -18,11 +18,11 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.CoordTrans
 import Graphics.Rendering.OpenGL.GL.PixelData
 import Graphics.Rendering.OpenGL.GL.PixelFormat
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixellikeObject.hs b/src/Graphics/Rendering/OpenGL/GL/PixellikeObject.hs
--- a/src/Graphics/Rendering/OpenGL/GL/PixellikeObject.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/PixellikeObject.hs
@@ -15,12 +15,12 @@
   PixellikeObjectTarget(pixellikeObjTarParam),
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Utils
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjectAttachment
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
 import Graphics.Rendering.OpenGL.GL.PeekPoke
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.Specification
 import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
 import Graphics.Rendering.OpenGL.Raw
diff --git a/src/Graphics/Rendering/OpenGL/GL/Points.hs b/src/Graphics/Rendering/OpenGL/GL/Points.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Points.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Points.hs
@@ -33,11 +33,11 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Foreign.Marshal.Array
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.PointParameter
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/Polygons.hs b/src/Graphics/Rendering/OpenGL/GL/Polygons.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Polygons.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Polygons.hs
@@ -20,6 +20,7 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Foreign.ForeignPtr
 import Foreign.Marshal.Array
 import Foreign.Ptr
@@ -29,7 +30,6 @@
 import Graphics.Rendering.OpenGL.GL.PolygonMode
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.GL.SavingState
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/PrimitiveMode.hs b/src/Graphics/Rendering/OpenGL/GL/PrimitiveMode.hs
--- a/src/Graphics/Rendering/OpenGL/GL/PrimitiveMode.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/PrimitiveMode.hs
@@ -20,7 +20,7 @@
    patchVertices, maxPatchVertices
 ) where
 
-import Graphics.Rendering.OpenGL.GL.StateVar
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.QueryUtils.PName
 import Graphics.Rendering.OpenGL.Raw
 
@@ -82,10 +82,12 @@
 -- 'patchVertices' is set to a value less than or equal to zero or greater
 -- than the implementation-dependent maximum value 'maxPatchVertices'.
 
-patchVertices :: SettableStateVar GLint
-patchVertices = makeSettableStateVar $ glPatchParameteri gl_PATCH_VERTICES
+patchVertices :: StateVar GLsizei
+patchVertices =
+  makeStateVar (getSizei1 id GetMaxPatchVertices)
+               (glPatchParameteri gl_PATCH_VERTICES . fromIntegral)
 
 -- | Contains the maximumum number of vertices in a single patch.
 
-maxPatchVertices :: GettableStateVar GLint
-maxPatchVertices = makeGettableStateVar $ getInteger1 id GetMaxPatchVertices
+maxPatchVertices :: GettableStateVar GLsizei
+maxPatchVertices = makeGettableStateVar $ getSizei1 id GetMaxPatchVertices
diff --git a/src/Graphics/Rendering/OpenGL/GL/QueryObject.hs b/src/Graphics/Rendering/OpenGL/GL/QueryObject.hs
--- a/src/Graphics/Rendering/OpenGL/GL/QueryObject.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/QueryObject.hs
@@ -17,9 +17,12 @@
    QueryObject(..), noQueryObject
 ) where
 
-import Foreign.Marshal.Array
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Foreign.Marshal.Array ( allocaArray, peekArray, withArrayLen )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
 import Graphics.Rendering.OpenGL.GL.GLboolean
-import Graphics.Rendering.OpenGL.GL.ObjectName
+import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
@@ -33,14 +36,17 @@
 --------------------------------------------------------------------------------
 
 instance ObjectName QueryObject where
-   isObjectName = fmap unmarshalGLboolean . glIsQuery . queryID
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsQuery . queryID
 
    deleteObjectNames queryObjects =
-      withArrayLen (map queryID queryObjects) $
+      liftIO . withArrayLen (map queryID queryObjects) $
          glDeleteQueries . fromIntegral
 
 instance GeneratableObjectName QueryObject where
    genObjectNames n =
-      allocaArray n $ \buf -> do
+      liftIO . allocaArray n $ \buf -> do
         glGenQueries (fromIntegral n) buf
         fmap (map QueryObject) $ peekArray n buf
+
+instance CanBeLabeled QueryObject where
+   objectLabel = objectNameLabel gl_QUERY . queryID
diff --git a/src/Graphics/Rendering/OpenGL/GL/QueryObjects.hs b/src/Graphics/Rendering/OpenGL/GL/QueryObjects.hs
--- a/src/Graphics/Rendering/OpenGL/GL/QueryObjects.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/QueryObjects.hs
@@ -30,6 +30,7 @@
    timestampQuery, timestamp
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Alloc
 import Foreign.Marshal.Utils
 import Foreign.Ptr
@@ -39,7 +40,6 @@
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.QueryObject
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/QueryUtils.hs b/src/Graphics/Rendering/OpenGL/GL/QueryUtils.hs
--- a/src/Graphics/Rendering/OpenGL/GL/QueryUtils.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/QueryUtils.hs
@@ -20,10 +20,17 @@
    lightIndexToEnum,
    modelviewIndexToEnum, modelviewEnumToIndex,
 
-   maybeNullPtr
+   maybeNullPtr,
+
+   objectNameLabel, objectPtrLabel, maxLabelLength
 ) where
 
-import Foreign.Ptr
+import Data.StateVar
+import Foreign.C.String ( peekCStringLen, withCStringLen )
+import Foreign.Ptr ( Ptr, nullPtr )
+import Foreign.Marshal.Alloc ( alloca )
+import Foreign.Marshal.Array ( allocaArray )
+import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.QueryUtils.PName
 import Graphics.Rendering.OpenGL.GL.QueryUtils.VertexAttrib
 import Graphics.Rendering.OpenGL.Raw
@@ -63,3 +70,37 @@
 maybeNullPtr :: b -> (Ptr a -> b) -> Ptr a -> b
 maybeNullPtr n f ptr | ptr == nullPtr = n
                      | otherwise      = f ptr
+
+--------------------------------------------------------------------------------
+
+objectNameLabel :: GLuint -> GLenum -> StateVar (Maybe String)
+objectNameLabel name ident =
+ makeStateVar
+   (getObjectLabelWith (glGetObjectLabel ident name))
+   (setObjectLabelWith (glObjectLabel ident name))
+
+objectPtrLabel :: Ptr () -> StateVar (Maybe String)
+objectPtrLabel ptr =
+  makeStateVar
+    (getObjectLabelWith (glGetObjectPtrLabel ptr))
+    (setObjectLabelWith (glObjectPtrLabel ptr))
+
+getObjectLabelWith :: (GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ())
+                   -> IO (Maybe String)
+getObjectLabelWith getLabel = do
+  maxLen <- get maxLabelLength
+  alloca $ \lenBuf ->
+    allocaArray (fromIntegral maxLen) $ \labelBuf -> do
+      getLabel maxLen lenBuf labelBuf
+      actualLen <- peek1 fromIntegral lenBuf
+      label <- peekCStringLen (labelBuf, actualLen)
+      return $ if label == "" then Nothing else Just label
+
+setObjectLabelWith :: (GLsizei -> Ptr GLchar -> IO ()) -> Maybe String -> IO ()
+setObjectLabelWith setLabel =
+  maybe (set (nullPtr, (0 :: Int))) (flip withCStringLen set)
+  where set (labelBuf, len) = setLabel (fromIntegral len) labelBuf
+
+maxLabelLength :: GettableStateVar GLsizei
+maxLabelLength =
+  makeGettableStateVar (getSizei1 id GetMaxLabelLength)
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
@@ -370,8 +370,9 @@
     | GetMaxVertexAttribs               -- ^ sizei
     | GetMaxVaryingFloats               -- ^ sizei
     -- tessellation
-    | GetMaxPatchVertices               -- ^ int
-    | GetMaxTessellationLevel           -- ^ int
+    | GetPatchVertices                  -- ^ sizei
+    | GetMaxPatchVertices               -- ^ sizei
+    | GetMaxTessGenLevel                -- ^ sizei
     -- coordtrans
     | GetMatrixMode                 -- ^ enum
     | GetModelviewStackDepth        -- ^ sizei
@@ -561,6 +562,7 @@
     | GetDebugLoggedMessages          -- ^ int
     | GetDebugNextLoggedMessageLength -- ^ int
     | GetMaxDebugGroupStackDepth      -- ^ int
+    | GetMaxLabelLength               -- ^ int
 
 instance GetPName1I PName1I where
 
@@ -638,8 +640,9 @@
         GetMaxVaryingFloats -> Just gl_MAX_VARYING_COMPONENTS
         GetMaxVertexAttribs -> Just gl_MAX_VERTEX_ATTRIBS
         -- tessellation
+        GetPatchVertices -> Just gl_PATCH_VERTICES
         GetMaxPatchVertices -> Just gl_MAX_PATCH_VERTICES
-        GetMaxTessellationLevel -> Just gl_MAX_TESS_GEN_LEVEL
+        GetMaxTessGenLevel -> Just gl_MAX_TESS_GEN_LEVEL
         -- coordtrans
         GetMatrixMode -> Just gl_MATRIX_MODE
         GetModelviewStackDepth -> Just gl_MODELVIEW_STACK_DEPTH
@@ -830,6 +833,7 @@
         GetDebugLoggedMessages -> Just gl_DEBUG_LOGGED_MESSAGES
         GetDebugNextLoggedMessageLength -> Just gl_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH
         GetMaxDebugGroupStackDepth -> Just gl_MAX_DEBUG_GROUP_STACK_DEPTH
+        GetMaxLabelLength -> Just gl_MAX_LABEL_LENGTH
 
 -- 0x8825 through 0x8834 are reserved for draw buffers
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/RasterPos.hs b/src/Graphics/Rendering/OpenGL/GL/RasterPos.hs
--- a/src/Graphics/Rendering/OpenGL/GL/RasterPos.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/RasterPos.hs
@@ -23,11 +23,11 @@
    rasterPositionUnclipped
 ) where
 
+import Data.StateVar
 import Foreign.Ptr
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.GLboolean
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Tensor
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.Raw
diff --git a/src/Graphics/Rendering/OpenGL/GL/ReadCopyPixels.hs b/src/Graphics/Rendering/OpenGL/GL/ReadCopyPixels.hs
--- a/src/Graphics/Rendering/OpenGL/GL/ReadCopyPixels.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/ReadCopyPixels.hs
@@ -24,11 +24,11 @@
    BlitBuffer(..), blitFramebuffer
 ) where
 
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.BufferMode
 import Graphics.Rendering.OpenGL.GL.CoordTrans
 import Graphics.Rendering.OpenGL.GL.PixelData
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.Filter
 import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
 import Graphics.Rendering.OpenGL.Raw
diff --git a/src/Graphics/Rendering/OpenGL/GL/RenderMode.hs b/src/Graphics/Rendering/OpenGL/GL/RenderMode.hs
--- a/src/Graphics/Rendering/OpenGL/GL/RenderMode.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/RenderMode.hs
@@ -17,9 +17,9 @@
    RenderMode(..), withRenderMode, renderMode
 ) where
 
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.Exception
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/Selection.hs b/src/Graphics/Rendering/OpenGL/GL/Selection.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Selection.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Selection.hs
@@ -18,13 +18,13 @@
    RenderMode(..), renderMode
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Array
 import Foreign.Ptr
 import Graphics.Rendering.OpenGL.GL.Exception
 import Graphics.Rendering.OpenGL.GL.IOState
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.GL.RenderMode
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Attribs.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Attribs.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Shaders/Attribs.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Attribs.hs
@@ -17,11 +17,11 @@
    attribLocation, VariableType(..), activeAttribs,
 ) where
 
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.ByteString
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.GL.Shaders.Program
 import Graphics.Rendering.OpenGL.GL.Shaders.Variables
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Limits.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Limits.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Shaders/Limits.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Limits.hs
@@ -16,10 +16,10 @@
    maxVertexTextureImageUnits, maxTextureImageUnits,
    maxCombinedTextureImageUnits, maxTextureCoords, maxVertexUniformComponents,
    maxFragmentUniformComponents, maxVertexAttribs, maxVaryingFloats,
-   maxTessellationLevel
+   maxTessGenLevel
 ) where
 
-import Graphics.Rendering.OpenGL.GL.StateVar
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.Raw
 
@@ -79,8 +79,8 @@
 
 -- | Contains the maximum allowed tessellation level.
 
-maxTessellationLevel :: GettableStateVar GLint
-maxTessellationLevel = makeGettableStateVar $ getInteger1 id GetMaxTessellationLevel
+maxTessGenLevel :: GettableStateVar GLsizei
+maxTessGenLevel = getLimit GetMaxTessGenLevel
 
 getLimit :: PName1I -> GettableStateVar GLsizei
 getLimit = makeGettableStateVar . getSizei1 id
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Program.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Program.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Shaders/Program.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Program.hs
@@ -20,12 +20,15 @@
    programVar1, programVar3
 ) where
 
-import Foreign.Marshal.Utils
-import Foreign.Ptr
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Data.StateVar
+import Foreign.Marshal.Utils ( with )
+import Foreign.Ptr ( Ptr )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
 import Graphics.Rendering.OpenGL.GL.GLboolean
-import Graphics.Rendering.OpenGL.GL.ObjectName
 import Graphics.Rendering.OpenGL.GL.PeekPoke
-import Graphics.Rendering.OpenGL.GL.StateVar
+import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
@@ -34,8 +37,11 @@
    deriving ( Eq, Ord, Show )
 
 instance ObjectName Program where
-   isObjectName = fmap unmarshalGLboolean . glIsProgram . programID
-   deleteObjectName = glDeleteProgram . programID
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsProgram . programID
+   deleteObjectName = liftIO . glDeleteProgram . programID
+
+instance CanBeLabeled Program where
+   objectLabel = objectNameLabel gl_PROGRAM . programID
 
 --------------------------------------------------------------------------------
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramBinaries.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramBinaries.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramBinaries.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramBinaries.hs
@@ -18,12 +18,12 @@
    ProgramBinary(..), programBinary
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Alloc
 import Graphics.Rendering.OpenGL.GL.ByteString
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.GL.Shaders.Program
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramObjects.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramObjects.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramObjects.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramObjects.hs
@@ -39,6 +39,7 @@
 
 import Data.List
 import Data.Maybe
+import Data.StateVar
 import Foreign.Marshal.Array
 import Foreign.Ptr
 import Graphics.Rendering.OpenGL.GL.ByteString
@@ -47,7 +48,6 @@
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.GL.Shaders.Program
 import Graphics.Rendering.OpenGL.GL.Shaders.Shader
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Shader.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Shader.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Shaders/Shader.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Shader.hs
@@ -17,8 +17,11 @@
    Shader(..)
 ) where
 
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Graphics.Rendering.OpenGL.GL.DebugOutput
 import Graphics.Rendering.OpenGL.GL.GLboolean
-import Graphics.Rendering.OpenGL.GL.ObjectName
+import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
@@ -27,5 +30,8 @@
    deriving ( Eq, Ord, Show )
 
 instance ObjectName Shader where
-   isObjectName = fmap unmarshalGLboolean . glIsShader . shaderID
-   deleteObjectName = glDeleteShader . shaderID
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsShader . shaderID
+   deleteObjectName = liftIO . glDeleteShader . shaderID
+
+instance CanBeLabeled Shader where
+   objectLabel = objectNameLabel gl_SHADER . shaderID
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderBinaries.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderBinaries.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderBinaries.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderBinaries.hs
@@ -18,11 +18,11 @@
    ShaderBinary(..), shaderBinary,
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Array
 import Graphics.Rendering.OpenGL.GL.ByteString
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.GL.Shaders.Shader
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderObjects.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderObjects.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderObjects.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderObjects.hs
@@ -28,6 +28,7 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Foreign.Marshal.Alloc
 import Foreign.Marshal.Array
 import Foreign.Marshal.Utils
@@ -37,7 +38,6 @@
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.GL.Shaders.Shader
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Uniform.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Uniform.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Shaders/Uniform.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Uniform.hs
@@ -24,6 +24,7 @@
 ) where
 
 import Data.Maybe
+import Data.StateVar
 import Foreign.Marshal.Alloc
 import Foreign.Ptr
 import Foreign.Storable
@@ -31,7 +32,6 @@
 import Graphics.Rendering.OpenGL.GL.Shaders.Program
 import Graphics.Rendering.OpenGL.GL.Shaders.ProgramObjects
 import Graphics.Rendering.OpenGL.GL.Shaders.Variables
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Tensor
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.Raw
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Variables.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Variables.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Shaders/Variables.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Variables.hs
@@ -19,13 +19,13 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Foreign.Marshal.Utils
 import Foreign.Ptr
 import Foreign.Storable
 import Graphics.Rendering.OpenGL.GL.ByteString
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.Shaders.Program
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/StateVar.hs b/src/Graphics/Rendering/OpenGL/GL/StateVar.hs
deleted file mode 100644
--- a/src/Graphics/Rendering/OpenGL/GL/StateVar.hs
+++ /dev/null
@@ -1,160 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.StateVar
--- Copyright   :  (c) Sven Panne 2013
--- License     :  BSD3
--- 
--- Maintainer  :  Sven Panne <svenpanne@gmail.com>
--- Stability   :  stable
--- Portability :  portable
---
--- State variables are references in the IO monad, like 'IORef's or parts of
--- the OpenGL state. Note that state variables are not neccessarily writable or
--- readable, they may come in read-only or write-only flavours, too. As a very
--- simple example for a state variable, consider an explicitly allocated memory
--- buffer. This buffer can easily be converted into a 'StateVar':
---
--- @
--- makeStateVarFromPtr :: Storable a => Ptr a -> StateVar a
--- makeStateVarFromPtr p = makeStateVar (peek p) (poke p)
--- @
---
--- The example below puts 11 into a state variable (i.e. into the buffer),
--- increments the contents of the state variable by 22, and finally prints the
--- resulting content:
---
--- @
---   do p <- malloc :: IO (Ptr Int)
---      let v = makeStateVarFromPtr p
---      v $= 11
---      v $~ (+ 22)
---      x <- get v
---      print x
--- @
---
--- 'IORef's are state variables, too, so an example with them looks extremely
--- similiar:
---
--- @
---   do v <- newIORef (0 :: Int)
---      v $= 11
---      v $~ (+ 22)
---      x <- get v
---      print x
--- @
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.StateVar (
-   -- * Readable State Variables
-   HasGetter(..),
-   GettableStateVar(..), makeGettableStateVar,
-   -- * Writable State Variables
-   HasSetter(..),
-   SettableStateVar(..), makeSettableStateVar,
-   -- * General State Variables
-   StateVar(..), makeStateVar,
-   -- * Utility Functions
-   ($~), ($=!), ($~!)
-) where
-
-import Control.Applicative ( Applicative(..) )
-import Data.IORef ( IORef, readIORef, writeIORef )
-
---------------------------------------------------------------------------------
-
-infixr 2 $=
-
---------------------------------------------------------------------------------
-
--- | The class of all readable state variables.
-class HasGetter g where
-   -- | Read the value of a state variable.
-   get :: g a -> IO a
-
-instance HasGetter IORef where
-   get = readIORef
-
--- | A concrete implementation of a read-only state variable, carrying an IO
--- action to read the value.
-newtype GettableStateVar a = GettableStateVar (IO a)
-
-instance HasGetter GettableStateVar where
-   get (GettableStateVar g) = g
-
-instance Functor GettableStateVar where
-  fmap f (GettableStateVar g) = GettableStateVar (fmap f g)
-
-instance Applicative GettableStateVar where
-  pure = GettableStateVar . pure
-  GettableStateVar g <*> GettableStateVar h = GettableStateVar (g <*> h)
-
-instance Monad GettableStateVar where
-  return = pure
-  GettableStateVar g >>= h = GettableStateVar (g >>= get . h)
-
--- | Construct a 'GettableStateVar' from an IO action.
-makeGettableStateVar :: IO a -> GettableStateVar a
-makeGettableStateVar = GettableStateVar
-
---------------------------------------------------------------------------------
-
--- | The class of all writable state variables.
-class HasSetter s where
-   -- | Write a new value into a state variable.
-   ($=) :: s a -> a -> IO ()
-
-instance HasSetter IORef where
-   ($=) = writeIORef
-
--- | A concrete implementation of a write-only state variable, carrying an IO
--- action to write the new value.
-newtype SettableStateVar a = SettableStateVar (a -> IO ())
-
-instance HasSetter SettableStateVar where
-   ($=) (SettableStateVar s) a = s a
-
--- instance Contravariant SettableStateVar where
---    contramap f (SettableStateVar s) = SettableStateVar (s . f)
-
--- | Construct a 'SettableStateVar' from an IO action.
-makeSettableStateVar :: (a -> IO ()) -> SettableStateVar a
-makeSettableStateVar = SettableStateVar
-
---------------------------------------------------------------------------------
-
--- | A concrete implementation of a readable and writable state variable,
--- carrying one IO action to read the value and another IO action to write the
--- new value.
-data StateVar a =
-   StateVar (GettableStateVar a) (SettableStateVar a)
-
-instance HasGetter StateVar where
-   get (StateVar g _) = get g
-
-instance HasSetter StateVar where
-   ($=) (StateVar _ s) a = s $= a
-
--- | Construct a 'StateVar' from two IO actions, one for reading and one for
--- writing.
-makeStateVar :: IO a -> (a -> IO ()) -> StateVar a
-makeStateVar g s = StateVar (makeGettableStateVar g) (makeSettableStateVar s)
-
---------------------------------------------------------------------------------
-
--- | A modificator convenience function, transforming the contents of a state
--- variable with a given funtion.
-
-($~) :: (HasGetter v, HasSetter v) => v a -> (a -> a) -> IO ()
-v $~ f = do
-   x <- get v
-   v $= f x
-
--- | A variant of '$=' which is strict in the value to be set.
-($=!) :: HasSetter s => s a -> a -> IO ()
-v $=! x = x `seq` v $= x
-
--- | A variant of '$~' which is strict in the transformed value.
-($~!) :: (HasGetter v, HasSetter v) => v a -> (a -> a) -> IO ()
-v $~! f = do
-   x <- get v
-   v $=! f x
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
@@ -20,10 +20,10 @@
 
 import Data.Bits
 import Data.Char
+import Data.StateVar
 import Foreign.C.String
 import Foreign.Ptr
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/SyncObjects.hs b/src/Graphics/Rendering/OpenGL/GL/SyncObjects.hs
--- a/src/Graphics/Rendering/OpenGL/GL/SyncObjects.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/SyncObjects.hs
@@ -25,13 +25,15 @@
    SyncStatus(..), syncStatus
 ) where
 
-import Foreign.Marshal.Utils
-import Foreign.Ptr
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Data.StateVar
+import Foreign.Marshal.Utils ( with )
+import Foreign.Ptr ( nullPtr )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
 import Graphics.Rendering.OpenGL.GL.GLboolean
-import Graphics.Rendering.OpenGL.GL.ObjectName
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
@@ -40,8 +42,11 @@
    deriving ( Eq, Ord, Show )
 
 instance ObjectName SyncObject where
-   isObjectName = fmap unmarshalGLboolean . glIsSync . syncID
-   deleteObjectName = glDeleteSync . syncID
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsSync . syncID
+   deleteObjectName = liftIO . glDeleteSync . syncID
+
+instance CanBeLabeled SyncObject where
+   objectLabel = objectPtrLabel . syncID
 
 syncGpuCommandsComplete :: IO SyncObject
 syncGpuCommandsComplete =
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Application.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Application.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Texturing/Application.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Application.hs
@@ -17,7 +17,7 @@
    texture
 ) where
 
-import Graphics.Rendering.OpenGL.GL.StateVar
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Environments.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Environments.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Texturing/Environments.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Environments.hs
@@ -22,13 +22,13 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Foreign.Marshal.Alloc
 import Foreign.Marshal.Utils
 import Foreign.Ptr
 import Foreign.Storable
 import Graphics.Rendering.OpenGL.GL.BlendingFactor
 import Graphics.Rendering.OpenGL.GL.PeekPoke
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.Parameters
 import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit
 import Graphics.Rendering.OpenGL.GL.VertexSpec
@@ -320,7 +320,8 @@
 
 arg :: TextureEnvParameter -> TextureEnvParameter -> StateVar Arg
 arg op src = combineArg (textureEnvOperand op) (textureEnvSrc src)
-   where combineArg v w = makeStateVar
+   where combineArg :: StateVar BlendingFactor -> StateVar Src -> StateVar Arg
+         combineArg v w = makeStateVar
                              (liftM2 Arg (get v) (get w))
                              (\(Arg x y) -> do v $= x; w $= y)
 
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Objects.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Objects.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Texturing/Objects.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Objects.hs
@@ -22,10 +22,10 @@
 
 import Data.List
 import Data.Maybe (fromMaybe)
+import Data.StateVar
 import Foreign.Marshal.Array
 import Graphics.Rendering.OpenGL.GL.GLboolean
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.TexParameter
 import Graphics.Rendering.OpenGL.GL.Texturing.TextureObject
 import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Parameters.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Parameters.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Texturing/Parameters.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Parameters.hs
@@ -24,11 +24,11 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.ComparisonFunction
 import Graphics.Rendering.OpenGL.GL.CoordTrans
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.Filter
 import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
 import Graphics.Rendering.OpenGL.GL.Texturing.Specification
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Queries.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Queries.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Texturing/Queries.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Queries.hs
@@ -20,11 +20,11 @@
 ) where
 
 import Control.Monad
+import Data.StateVar
 import Foreign.Marshal.Utils
 import Graphics.Rendering.OpenGL.GL.GLboolean
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.PixelRectangles
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
 import Graphics.Rendering.OpenGL.GL.Texturing.Specification
 import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Specification.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Specification.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Texturing/Specification.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Specification.hs
@@ -73,13 +73,13 @@
 ) where
 
 import Foreign.Ptr
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GL.CoordTrans
 import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
 import Graphics.Rendering.OpenGL.GL.GLboolean
 import Graphics.Rendering.OpenGL.GL.PixelData
 import Graphics.Rendering.OpenGL.GL.PixelRectangles
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
 import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
 import Graphics.Rendering.OpenGL.Raw
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/TexParameter.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/TexParameter.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Texturing/TexParameter.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/TexParameter.hs
@@ -17,12 +17,12 @@
    TexParameter(..), texParami, texParamf, texParamC4f, getTexParameteri
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Alloc
 import Foreign.Marshal.Utils
 import Foreign.Ptr
 import Foreign.Storable
 import Graphics.Rendering.OpenGL.GL.PeekPoke
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.Raw
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureObject.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureObject.hs
--- a/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureObject.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureObject.hs
@@ -17,9 +17,12 @@
    TextureObject(..)
 ) where
 
-import Foreign.Marshal.Array
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Foreign.Marshal.Array ( allocaArray, peekArray, withArrayLen )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
 import Graphics.Rendering.OpenGL.GL.GLboolean
-import Graphics.Rendering.OpenGL.GL.ObjectName
+import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
@@ -30,14 +33,17 @@
 --------------------------------------------------------------------------------
 
 instance ObjectName TextureObject where
-   isObjectName = fmap unmarshalGLboolean . glIsTexture . textureID
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsTexture . textureID
 
    deleteObjectNames textureObjects =
-      withArrayLen (map textureID textureObjects) $
+      liftIO . withArrayLen (map textureID textureObjects) $
          glDeleteTextures . fromIntegral
 
 instance GeneratableObjectName TextureObject where
    genObjectNames n =
-      allocaArray n $ \buf -> do
+      liftIO . allocaArray n $ \buf -> do
         glGenTextures (fromIntegral n) buf
         fmap (map TextureObject) $ peekArray n buf
+
+instance CanBeLabeled TextureObject where
+   objectLabel = objectNameLabel gl_TEXTURE . textureID
diff --git a/src/Graphics/Rendering/OpenGL/GL/TransformFeedback.hs b/src/Graphics/Rendering/OpenGL/GL/TransformFeedback.hs
--- a/src/Graphics/Rendering/OpenGL/GL/TransformFeedback.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/TransformFeedback.hs
@@ -29,6 +29,7 @@
    maxTransformFeedbackSeparateComponents
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Array
 import Graphics.Rendering.OpenGL.GL.ByteString
 import Graphics.Rendering.OpenGL.GL.DataType
@@ -37,7 +38,6 @@
 import Graphics.Rendering.OpenGL.GL.QueryUtils
 import Graphics.Rendering.OpenGL.GL.Shaders.Program
 import Graphics.Rendering.OpenGL.GL.Shaders.Variables
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/VertexArrayObjects.hs b/src/Graphics/Rendering/OpenGL/GL/VertexArrayObjects.hs
--- a/src/Graphics/Rendering/OpenGL/GL/VertexArrayObjects.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/VertexArrayObjects.hs
@@ -15,12 +15,13 @@
    bindVertexArrayObject
 ) where
 
-import Foreign.Marshal.Array
-
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Data.StateVar
+import Foreign.Marshal.Array ( allocaArray, peekArray, withArrayLen )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
 import Graphics.Rendering.OpenGL.GL.GLboolean
-import Graphics.Rendering.OpenGL.GL.ObjectName
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 -----------------------------------------------------------------------------
@@ -29,16 +30,20 @@
    deriving( Eq, Ord, Show )
 
 instance ObjectName VertexArrayObject where
-   isObjectName =  fmap unmarshalGLboolean . glIsVertexArray . vertexArrayID
+   isObjectName =
+     liftIO . fmap unmarshalGLboolean . glIsVertexArray . vertexArrayID
 
    deleteObjectNames bufferObjects =
-      withArrayLen (map vertexArrayID bufferObjects) $
+      liftIO . withArrayLen (map vertexArrayID bufferObjects) $
          glDeleteVertexArrays . fromIntegral
 
 instance GeneratableObjectName VertexArrayObject where
-   genObjectNames n = allocaArray n $ \buf -> do
+   genObjectNames n = liftIO . allocaArray n $ \buf -> do
       glGenVertexArrays (fromIntegral n) buf
       fmap (map VertexArrayObject) $ peekArray n buf
+
+instance CanBeLabeled VertexArrayObject where
+   objectLabel = objectNameLabel gl_VERTEX_ARRAY . vertexArrayID
 
 bindVertexArrayObject :: StateVar (Maybe VertexArrayObject)
 bindVertexArrayObject = makeStateVar getVAO bindVAO
diff --git a/src/Graphics/Rendering/OpenGL/GL/VertexArrays.hs b/src/Graphics/Rendering/OpenGL/GL/VertexArrays.hs
--- a/src/Graphics/Rendering/OpenGL/GL/VertexArrays.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/VertexArrays.hs
@@ -35,6 +35,7 @@
    vertexAttribPointer, vertexAttribArray,
 ) where
 
+import Data.StateVar
 import Foreign.Ptr ( Ptr, nullPtr )
 import Graphics.Rendering.OpenGL.GL.Capability
 import Graphics.Rendering.OpenGL.GL.DataType
@@ -42,7 +43,6 @@
 import Graphics.Rendering.OpenGL.GL.PrimitiveMode
 import Graphics.Rendering.OpenGL.GL.PrimitiveModeInternal
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit
 import Graphics.Rendering.OpenGL.GL.VertexSpec
 import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
diff --git a/src/Graphics/Rendering/OpenGL/GL/VertexSpec.hs b/src/Graphics/Rendering/OpenGL/GL/VertexSpec.hs
--- a/src/Graphics/Rendering/OpenGL/GL/VertexSpec.hs
+++ b/src/Graphics/Rendering/OpenGL/GL/VertexSpec.hs
@@ -58,13 +58,13 @@
    TextureUnit(..), maxTextureUnit
 ) where
 
+import Data.StateVar
 import Foreign.Marshal.Array
 import Foreign.Ptr
 import Foreign.Storable
 import Graphics.Rendering.OpenGL.GL.GLboolean
 import Graphics.Rendering.OpenGL.GL.PeekPoke
 import Graphics.Rendering.OpenGL.GL.QueryUtils
-import Graphics.Rendering.OpenGL.GL.StateVar
 import Graphics.Rendering.OpenGL.GL.Tensor
 import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit
 import Graphics.Rendering.OpenGL.GL.VertexAttributes
diff --git a/src/Graphics/Rendering/OpenGL/GLU/Errors.hs b/src/Graphics/Rendering/OpenGL/GLU/Errors.hs
--- a/src/Graphics/Rendering/OpenGL/GLU/Errors.hs
+++ b/src/Graphics/Rendering/OpenGL/GLU/Errors.hs
@@ -18,7 +18,7 @@
    Error(..), ErrorCategory(..), errors
 ) where
 
-import Graphics.Rendering.OpenGL.GL.StateVar
+import Data.StateVar
 import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
 
 --------------------------------------------------------------------------------
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
@@ -16,11 +16,11 @@
    gluVersion, gluExtensions
 ) 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.StateVar
 import Graphics.Rendering.OpenGL.Raw
 
 --------------------------------------------------------------------------------
