diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,9 @@
 HsQML Samples - Release History
 
+release-0.3.3.0 - 2015.01.20
+
+  * Add OpenGLControlContext sample.
+
 release-0.3.2.0 - 2014.11.13
 
   * Added OpenGL sample.
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c)2014, Robin KAY
+Copyright (c)2014-2015, Robin KAY
 
 All rights reserved.
 
diff --git a/hsqml-demo-samples.cabal b/hsqml-demo-samples.cabal
--- a/hsqml-demo-samples.cabal
+++ b/hsqml-demo-samples.cabal
@@ -1,15 +1,15 @@
 Name:          hsqml-demo-samples
-Version:       0.3.2.0
+Version:       0.3.3.0
 Cabal-version: >= 1.10
 Build-type:    Simple
 License:       BSD3
 License-file:  LICENSE
-Copyright:     (c) 2014 Robin KAY
+Copyright:     (c) 2014-2015 Robin KAY
 Author:        Robin KAY
 Maintainer:    komadori@gekkou.co.uk
 Stability:     experimental
 Homepage:      http://www.gekkou.co.uk/software/hsqml/
-Category:      Graphics
+Category:      Graphics, GUI
 Synopsis:      HsQML sample programs
 Data-dir:      qml
 Data-files:    *.qml
@@ -53,6 +53,20 @@
         OpenGL     == 2.9.*,
         OpenGLRaw  == 1.5.*,
         hsqml      >= 0.3.2 && < 0.4
+    GHC-options: -threaded
+    if !flag(OpenGL)
+        Buildable: False
+
+Executable hsqml-opengl2
+    Default-language: Haskell2010
+    Hs-source-dirs: src
+    Main-is: OpenGL2.hs
+    Build-depends:
+        base       == 4.*,
+        text       >= 0.11 && < 1.3,
+        OpenGL     == 2.9.*,
+        OpenGLRaw  == 1.5.*,
+        hsqml      >= 0.3.3 && < 0.4
     GHC-options: -threaded
     if !flag(OpenGL)
         Buildable: False
diff --git a/qml/opengl2.qml b/qml/opengl2.qml
new file mode 100644
--- /dev/null
+++ b/qml/opengl2.qml
@@ -0,0 +1,214 @@
+import QtQuick 2.0
+import QtQuick.Controls 1.0
+import QtQuick.Window 2.0
+import HsQML.Canvas 1.0
+
+Window {
+    title: 'Context Controls';
+    width: col.width; height: col.height;
+    visible: true;
+
+    Column {
+        id: col;
+
+        GroupBox {
+            title: 'Control';
+
+            Grid {
+                columns: 2; width: col.width;
+                columnSpacing: 5;
+
+                Label {
+                    text: 'Major Version';
+                    font.bold: true;
+                }
+                TextField {
+                    id: majorVersionField;
+                }
+                Label {
+                    text: 'Minor Version';
+                    font.bold: true;
+                }
+                TextField {
+                    id: minorVersionField;
+                }
+                Label {
+                    text: 'Context Type';
+                    font.bold: true;
+                }
+                ComboBox {
+                    id: contextTypeField;
+                    model: ListModel {
+                        ListElement { text: 'Type Unset'; }
+                        ListElement { text: 'OpenGL';
+                            type: OpenGLContextControl.OpenGL; }
+                        ListElement { text: 'OpenGL ES';
+                            type: OpenGLContextControl.OpenGLES; }
+                    }
+                }
+                Label {
+                    text: 'Context Profile';
+                    font.bold: true;
+                }
+                ComboBox {
+                    id: contextProfileField;
+                    model: ListModel {
+                        ListElement { text: 'Profile Unset'; }
+                        ListElement { text: 'No Profile';
+                            profile: OpenGLContextControl.NoProfile;}
+                        ListElement { text: 'Core Profile';
+                            profile: OpenGLContextControl.CoreProfile;}
+                        ListElement { text: 'Compatibility Profile';
+                            profile: OpenGLContextControl.CompatibilityProfile;}
+                    }
+                }
+                Label {
+                    text: 'Deprecated Functions';
+                    font.bold: true;
+                }
+                ComboBox {
+                    id: deprecatedFunctionsField;
+                    model: ListModel {
+                        ListElement { text: 'Unset'; }
+                        ListElement { text: 'Enabled'; value: true; }
+                        ListElement { text: 'Disabled'; value: false; }
+                    }
+                }
+                Label {
+                    text: 'Depth Buffer Size';
+                    font.bold: true;
+                }
+                TextField {
+                    id: depthBufferSizeField;
+                }
+                Label {
+                    text: 'Stencil Buffer Size';
+                    font.bold: true;
+                }
+                TextField {
+                    id: stencilBufferSizeField;
+                }
+                Button {
+                    text: 'Control Context';
+                    onClicked: {
+                        victimCtrl.when = false;
+                        victimCtrl.majorVersion =
+                            parseInt(majorVersionField.text);
+                        victimCtrl.minorVersion =
+                            parseInt(minorVersionField.text);
+                        victimCtrl.contextType = contextTypeField.model.get(
+                            contextTypeField.currentIndex).type;
+                        victimCtrl.contextProfile =
+                            contextProfileField.model.get(
+                                contextProfileField.currentIndex).profile;
+                        victimCtrl.deprecatedFunctions =
+                            deprecatedFunctionsField.model.get(
+                                deprecatedFunctionsField.currentIndex).value;
+                        victimCtrl.depthBufferSize =
+                            parseInt(depthBufferSizeField.text);
+                        victimCtrl.stencilBufferSize =
+                            parseInt(stencilBufferSizeField.text);
+                        victimCtrl.when = true;
+                        victim.visible = true;
+                    }
+                }
+            }
+        }
+        GroupBox {
+            title: 'Status';
+
+            Grid {
+                columns: 2; width: col.width;
+                columnSpacing: 5;
+
+                Label {
+                    text: 'Vendor String';
+                    font.bold: true;
+                }
+                Label {
+                    text: vendor;
+                }
+                Label {
+                    text: 'Renderer String';
+                    font.bold: true;
+                }
+                Label {
+                    text: renderer;
+                }
+                Label {
+                    text: 'Version String';
+                    font.bold: true;
+                }
+                Label {
+                    text: version;
+                }
+                Label {
+                    text: 'Major Version';
+                    font.bold: true;
+                }
+                Label {
+                    text: victimCtrl.majorVersion;
+                }
+                Label {
+                    text: 'Minor Version';
+                    font.bold: true;
+                }
+                Label {
+                    text: victimCtrl.minorVersion;
+                }
+                Label {
+                    text: 'Context Type';
+                    font.bold: true;
+                }
+                Label {
+                    text: ['Unknown','OpenGL','OpenGL ES'][
+                        victimCtrl.contextType];
+                }
+                Label {
+                    text: 'Context Profile';
+                    font.bold: true;
+                }
+                Label {
+                    text: ['None','Core','Compatability'][
+                        victimCtrl.contextProfile];
+                }
+                Label {
+                    text: 'Deprecated Functions';
+                    font.bold: true;
+                }
+                Label {
+                    text: victimCtrl.deprecatedFunctions;
+                }
+                Label {
+                    text: 'Depth Buffer Size';
+                    font.bold: true;
+                }
+                Label {
+                    text: victimCtrl.depthBufferSize;
+                }
+                Label {
+                    text: 'Stencil Buffer Size';
+                    font.bold: true;
+                }
+                Label {
+                    text: victimCtrl.stencilBufferSize;
+                }
+            }
+        }
+    }
+
+    Window {
+        id: victim;
+        title: 'Victim Window';
+        visible: true;
+
+        HaskellCanvas {
+            id: victimCanvas;
+            anchors.fill: parent;
+            delegate: glDelegate;
+        }
+        OpenGLContextControl {
+            id: victimCtrl;
+        }
+    }
+}
diff --git a/src/OpenGL2.hs b/src/OpenGL2.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenGL2.hs
@@ -0,0 +1,46 @@
+{-# LANGUAGE
+    ScopedTypeVariables
+  #-}
+
+module Main where
+
+import Data.Text (Text)
+import qualified Data.Text as T
+import Data.IORef
+import Graphics.QML
+import Graphics.QML.Canvas
+import Graphics.Rendering.OpenGL.GL
+
+import Paths_hsqml_demo_samples
+
+data GLInfo = GLInfo {
+    vendorText :: Text,
+    rendererText :: Text,
+    versionText :: Text
+}
+
+main :: IO ()
+main = do
+    info <- newIORef $ GLInfo (T.pack "-") (T.pack "-") (T.pack "-")
+    skey <- newSignalKey
+    let defInfoProp name field = defPropertySigRO' name skey (\_ ->
+            fmap field $ readIORef info)
+    clazz <- newClass [
+        defPropertyConst' "glDelegate" (\this -> newOpenGLDelegate
+            (\paint -> do
+                vend <- get vendor
+                rend <- get renderer
+                ver <- get glVersion
+                writeIORef info $
+                    GLInfo (T.pack vend) (T.pack rend) (T.pack ver)
+                fireSignal skey this)
+            (\(_ :: OpenGLPaint' ()) -> return ())
+            (\_ -> return ())),
+        defInfoProp "vendor" vendorText,
+        defInfoProp "renderer" rendererText,
+        defInfoProp "version" versionText]
+    ctx <- newObject clazz ()
+    doc <- getDataFileName "opengl2.qml"
+    runEngineLoop defaultEngineConfig {
+        initialDocument = fileDocument doc,
+        contextObject = Just $ anyObjRef ctx}
