diff --git a/Source/GLControl/CarbonGLControl.cs b/Source/GLControl/CarbonGLControl.cs
new file mode 100644
index 00000000..7b2e45b2
--- /dev/null
+++ b/Source/GLControl/CarbonGLControl.cs
@@ -0,0 +1,77 @@
+#region License
+//
+// The Open Toolkit Library License
+//
+// Copyright (c) 2006 - 2009 the Open Toolkit library, except where noted.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights to 
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+using OpenTK.Graphics;
+using OpenTK.Platform;
+
+namespace OpenTK
+{
+    class CarbonGLControl : IGLControl 
+    {
+        GraphicsMode mode;
+        Control control;
+
+        internal CarbonGLControl(GraphicsMode mode, Control owner)
+        {
+            this.mode = mode;
+            this.control = owner;
+        }
+
+        #region IGLControl Members
+
+        public IGraphicsContext CreateContext(int major, int minor, GraphicsContextFlags flags)
+        {
+            return new GraphicsContext(mode, WindowInfo, major, minor, flags);
+        }
+
+        // TODO: Fix this
+        bool lastIsIdle = false;
+        public bool IsIdle
+        {
+            get 
+            { 
+                lastIsIdle = !lastIsIdle;
+                return lastIsIdle;
+            }
+        }
+
+        public IWindowInfo WindowInfo
+        {
+            get
+            {
+                return Utilities.CreateWindowInfo(mode, control.Handle, true);
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/Source/OpenTK/Platform/Dummy/DummyGLControl.cs b/Source/GLControl/DummyGLControl.cs
similarity index 81%
rename from Source/OpenTK/Platform/Dummy/DummyGLControl.cs
rename to Source/GLControl/DummyGLControl.cs
index 3a02e167..dc778418 100644
--- a/Source/OpenTK/Platform/Dummy/DummyGLControl.cs
+++ b/Source/GLControl/DummyGLControl.cs
@@ -1,53 +1,55 @@
-#region License
-//
-// The Open Toolkit Library License
-//
-// Copyright (c) 2006 - 2008 the Open Toolkit library, except where noted.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights to 
-// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-// the Software, and to permit persons to whom the Software is furnished to do
-// so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-// OTHER DEALINGS IN THE SOFTWARE.
-//
-#endregion
-
-using OpenTK.Graphics;
-
-namespace OpenTK.Platform.Dummy
-{
-    class DummyGLControl : IGLControl
-    {
-        #region IGLControl Members
-
-        public GraphicsContext CreateContext(int major, int minor, GraphicsContextFlags flags)
-        {
-            return new GraphicsContext(null, null);
-        }
-
-        public bool IsIdle
-        {
-            get { return false; }
-        }
-
-        public IWindowInfo WindowInfo
-        {
-            get { return new DummyWindowInfo(); }
-        }
-
-        #endregion
-    }
-}
+#region License
+//
+// The Open Toolkit Library License
+//
+// Copyright (c) 2006 - 2009 the Open Toolkit library, except where noted.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights to 
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+#endregion
+
+using System;
+using OpenTK.Graphics;
+using OpenTK.Platform;
+
+namespace OpenTK
+{
+    class DummyGLControl : IGLControl
+    {
+        #region IGLControl Members
+
+        public IGraphicsContext CreateContext(int major, int minor, GraphicsContextFlags flags)
+        {
+            return new GraphicsContext(null, null);
+        }
+
+        public bool IsIdle
+        {
+            get { return false; }
+        }
+
+        public IWindowInfo WindowInfo
+        {
+            get { return Utilities.CreateWindowInfo(null, IntPtr.Zero, true); }
+        }
+
+        #endregion
+    }
+}
diff --git a/Source/OpenTK/GLControl.Designer.cs b/Source/GLControl/GLControl.Designer.cs
similarity index 96%
rename from Source/OpenTK/GLControl.Designer.cs
rename to Source/GLControl/GLControl.Designer.cs
index c82b2d7b..8a009a78 100644
--- a/Source/OpenTK/GLControl.Designer.cs
+++ b/Source/GLControl/GLControl.Designer.cs
@@ -1,45 +1,45 @@
-namespace OpenTK
-{
-    partial class GLControl
-    {
-        /// <summary> 
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary> 
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Component Designer generated code
-
-        /// <summary> 
-        /// Required method for Designer support - do not modify 
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            this.SuspendLayout();
-            // 
-            // NewGLControl
-            // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.BackColor = System.Drawing.Color.Black;
-            this.Name = "NewGLControl";
-            this.ResumeLayout(false);
-
-        }
-
-        #endregion
-    }
-}
+namespace OpenTK
+{
+    partial class GLControl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.SuspendLayout();
+            // 
+            // NewGLControl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackColor = System.Drawing.Color.Black;
+            this.Name = "NewGLControl";
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+    }
+}
diff --git a/Source/OpenTK/GLControl.cs b/Source/GLControl/GLControl.cs
similarity index 77%
rename from Source/OpenTK/GLControl.cs
rename to Source/GLControl/GLControl.cs
index 5f66bc59..5fb77262 100644
--- a/Source/OpenTK/GLControl.cs
+++ b/Source/GLControl/GLControl.cs
@@ -1,291 +1,310 @@
-#region --- License ---
-/* Licensed under the MIT/X11 license.
- * Copyright (c) 2006-2008 the OpenTK Team.
- * This notice may not be removed from any source distribution.
- * See license.txt for licensing detailed licensing details.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Text;
-using System.Windows.Forms;
-
-using OpenTK.Platform;
-using OpenTK.Graphics;
-using System.Diagnostics;
-
-namespace OpenTK
-{
-    /// <summary>
-    /// Defines a UserControl with OpenGL rendering capabilities.
-    /// </summary>
-    public partial class GLControl : UserControl
-    {
-        IGraphicsContext context;
-        IGLControl implementation;
-        GraphicsMode format;
-        IWindowInfo window_info;
-        int major, minor;
-        GraphicsContextFlags flags;
-
-        #region --- Constructors ---
-
-        /// <summary>
-        /// Constructs a new GLControl.
-        /// </summary>
-        public GLControl()
-            : this(GraphicsMode.Default)
-        { }
-
-        /// <summary>
-        /// Constructs a new GLControl with the specified GraphicsMode.
-        /// </summary>
-        /// <param name="mode">The OpenTK.Graphics.GraphicsMode of the control.</param>
-        public GLControl(GraphicsMode mode)
-            : this(mode, 1, 0, GraphicsContextFlags.Default)
-        { }
-
-        /// <summary>
-        /// Constructs a new GLControl with the specified GraphicsMode.
-        /// </summary>
-        /// <param name="mode">The OpenTK.Graphics.GraphicsMode of the control.</param>
-        /// <param name="major">The major version for the OpenGL GraphicsContext.</param>
-        /// <param name="minor">The minor version for the OpenGL GraphicsContext.</param>
-        /// <param name="flags">The GraphicsContextFlags for the OpenGL GraphicsContext.</param>
-        public GLControl(GraphicsMode mode, int major, int minor, GraphicsContextFlags flags)
-        {
-            SetStyle(ControlStyles.Opaque, true);
-            SetStyle(ControlStyles.UserPaint, true);
-            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
-            DoubleBuffered = false;
-
-            InitializeComponent();
-
-            this.format = mode;
-            this.major = major;
-            this.minor = minor;
-            this.flags = flags;
-
-            // On Windows, you first need to create the window, then set the pixel format.
-            // On X11, you first need to select the visual, then create the window.
-            // On OSX, the pixel format needs to be selected before the GL context.
-            // Right now, pixel formats/visuals are selected during context creation. In the future,
-            // it would be better to decouple selection from context creation, which will allow us
-            // to clean up this hacky code. The best option is to do this along with multisampling
-            // support.
-            if (DesignMode)
-                implementation = new Platform.Dummy.DummyGLControl();
-            else
-                implementation = Platform.Factory.Default.CreateGLControl(mode, this);
-
-            this.CreateControl();
-        }
-
-        #endregion
-
-        #region --- Protected Methods ---
-
-        /// <summary>Raises the HandleCreated event.</summary>
-        /// <param name="e">Not used.</param>
-        protected override void OnHandleCreated(EventArgs e)
-        {
-            base.OnHandleCreated(e);
-
-            this.Context = implementation.CreateContext(major, minor, flags);
-
-            this.window_info = implementation.WindowInfo;
-            this.MakeCurrent();
-            ((IGraphicsContextInternal)this.Context).LoadAll();
-        }
-
-        /// <summary>Raises the HandleDestroyed event.</summary>
-        /// <param name="e">Not used.</param>
-        protected override void OnHandleDestroyed(EventArgs e)
-        {
-            base.OnHandleDestroyed(e);
-            if (this.Context != null)
-            {
-                this.Context.Dispose();
-                this.Context = null;
-            }
-            this.window_info.Dispose();
-            this.window_info = null;
-        }
-
-        /// <summary>
-        /// Raises the System.Windows.Forms.Control.Paint event.
-        /// </summary>
-        /// <param name="e">A System.Windows.Forms.PaintEventArgs that contains the event data.</param>
-        protected override void OnPaint(PaintEventArgs e)
-        {
-            if (DesignMode)
-                e.Graphics.Clear(BackColor);
-
-            base.OnPaint(e);
-        }
-
-        /// <summary>
-        /// Raises the Resize event.
-        /// </summary>
-        /// <param name="e">A System.EventArgs that contains the event data.</param>
-        protected override void OnResize(EventArgs e)
-        {
-            if (context != null)
-                context.Update(window_info);
-
-            base.OnResize(e);
-        }
-
-        /// <summary>
-        /// Raises the ParentChanged event.
-        /// </summary>
-        /// <param name="e">A System.EventArgs that contains the event data.</param>
-        protected override void OnParentChanged(EventArgs e)
-        {
-            if (context != null)
-                context.Update(window_info);
-
-            base.OnParentChanged(e);
-        }
-
-        #endregion
-
-        #region --- Public Methods ---
-
-        #region public void SwapBuffers()
-
-        /// <summary>
-        /// Swaps the front and back buffers, presenting the rendered scene to the screen.
-        /// </summary>
-        public void SwapBuffers()
-        {
-            Context.SwapBuffers();
-        }
-
-        #endregion
-
-        #region public void MakeCurrent()
-
-        /// <summary>
-        /// Makes the underlying this GLControl current in the calling thread.
-        /// All OpenGL commands issued are hereafter interpreted by this GLControl.
-        /// </summary>
-        public void MakeCurrent()
-        {
-            this.Context.MakeCurrent(this.window_info);
-        }
-
-        #endregion
-
-        #region public bool IsIdle
-
-        /// <summary>
-        /// Gets a value indicating whether the current thread contains pending system messages.
-        /// </summary>
-        [Browsable(false)]
-        public bool IsIdle
-        {
-            get { return implementation.IsIdle; }
-        }
-
-        #endregion
-
-        #region public IGraphicsContext Context
-
-        /// <summary>
-        /// Gets an interface to the underlying GraphicsContext used by this GLControl.
-        /// </summary>
-        [Browsable(false)]
-        public IGraphicsContext Context
-        {
-            get { return context; }
-            private set { context = value; }
-        }
-
-        #endregion
-
-        #region public float AspectRatio
-
-        /// <summary>
-        /// Gets the aspect ratio of this GLControl.
-        /// </summary>
-        [Description("The aspect ratio of the client area of this GLControl.")]
-        public float AspectRatio
-        {
-            get
-            {
-                return this.ClientSize.Width / (float)this.ClientSize.Height;
-            }
-        }
-
-        #endregion
-
-        #region public bool VSync
-
-        /// <summary>
-        /// Gets or sets a value indicating whether vsync is active for this GLControl.
-        /// </summary>
-        [Description("Indicates whether GLControl updates are synced to the monitor's refresh.")]
-        public bool VSync
-        {
-            get
-            {
-                if (Context != null)
-                    return Context.VSync;
-                return false;
-            }
-            set
-            {
-                if (Context != null)
-                    Context.VSync = value;
-            }
-        }
-
-        #endregion
-
-        #region public GraphicsMode GraphicsMode
-
-        /// <summary>
-        /// Gets the GraphicsMode of the GraphicsContext attached to this GLControl.
-        /// </summary>
-        /// <remarks>
-        /// To change the GraphicsMode, you must destroy and recreate the GLControl.
-        /// </remarks>
-        public GraphicsMode GraphicsMode
-        {
-            get { return Context.GraphicsMode; }
-        }
-
-        #endregion
-
-        #region public Bitmap GrabScreenshot()
-
-        /// <summary>Grabs a screenshot of the frontbuffer contents.</summary>
-        /// <returns>A System.Drawing.Bitmap, containing the contents of the frontbuffer.</returns>
-        /// <exception cref="OpenTK.Graphics.GraphicsContextException">
-        /// Occurs when no OpenTK.Graphics.GraphicsContext is current in the calling thread.
-        /// </exception>
-        [Obsolete]
-        public Bitmap GrabScreenshot()
-        {
-            throw new NotImplementedException();
-            //Bitmap bmp = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
-            //System.Drawing.Imaging.BitmapData data = 
-            //    bmp.LockBits(this.ClientRectangle, System.Drawing.Imaging.ImageLockMode.WriteOnly,
-            //                 System.Drawing.Imaging.PixelFormat.Format24bppRgb);
-            //GL.ReadPixels(0, 0, this.ClientSize.Width, this.ClientSize.Height, PixelFormat.Bgr, PixelType.UnsignedByte,
-            //              data.Scan0);
-            //bmp.UnlockBits(data);
-            //bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
-            //return bmp;
-        }
-
-        #endregion
-
-        #endregion
-    }
-}
+#region License
+//
+// The Open Toolkit Library License
+//
+// Copyright (c) 2006 - 2009 the Open Toolkit library, except where noted.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights to 
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+using OpenTK.Platform;
+using OpenTK.Graphics;
+using OpenTK.Graphics.OpenGL;
+
+namespace OpenTK
+{
+    /// <summary>
+    /// Defines a UserControl with OpenGL rendering capabilities.
+    /// </summary>
+    public partial class GLControl : UserControl
+    {
+        IGraphicsContext context;
+        IGLControl implementation;
+        GraphicsMode format;
+        IWindowInfo window_info;
+        int major, minor;
+        GraphicsContextFlags flags;
+
+        #region --- Constructors ---
+
+        /// <summary>
+        /// Constructs a new GLControl.
+        /// </summary>
+        public GLControl()
+            : this(GraphicsMode.Default)
+        { }
+
+        /// <summary>
+        /// Constructs a new GLControl with the specified GraphicsMode.
+        /// </summary>
+        /// <param name="mode">The OpenTK.Graphics.GraphicsMode of the control.</param>
+        public GLControl(GraphicsMode mode)
+            : this(mode, 1, 0, GraphicsContextFlags.Default)
+        { }
+
+        /// <summary>
+        /// Constructs a new GLControl with the specified GraphicsMode.
+        /// </summary>
+        /// <param name="mode">The OpenTK.Graphics.GraphicsMode of the control.</param>
+        /// <param name="major">The major version for the OpenGL GraphicsContext.</param>
+        /// <param name="minor">The minor version for the OpenGL GraphicsContext.</param>
+        /// <param name="flags">The GraphicsContextFlags for the OpenGL GraphicsContext.</param>
+        public GLControl(GraphicsMode mode, int major, int minor, GraphicsContextFlags flags)
+        {
+            SetStyle(ControlStyles.Opaque, true);
+            SetStyle(ControlStyles.UserPaint, true);
+            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+            DoubleBuffered = false;
+
+            InitializeComponent();
+
+            this.format = mode;
+            this.major = major;
+            this.minor = minor;
+            this.flags = flags;
+
+            // On Windows, you first need to create the window, then set the pixel format.
+            // On X11, you first need to select the visual, then create the window.
+            // On OSX, the pixel format needs to be selected before the GL context.
+            // Right now, pixel formats/visuals are selected during context creation. In the future,
+            // it would be better to decouple selection from context creation, which will allow us
+            // to clean up this hacky code. The best option is to do this along with multisampling
+            // support.
+            if (DesignMode)
+                implementation = new DummyGLControl();
+            else
+                implementation = new GLControlFactory().CreateGLControl(mode, this);
+
+            this.CreateControl();
+        }
+
+        #endregion
+
+        #region --- Protected Methods ---
+
+        /// <summary>Raises the HandleCreated event.</summary>
+        /// <param name="e">Not used.</param>
+        protected override void OnHandleCreated(EventArgs e)
+        {
+            base.OnHandleCreated(e);
+
+            this.Context = implementation.CreateContext(major, minor, flags);
+
+            this.window_info = implementation.WindowInfo;
+            this.MakeCurrent();
+            ((IGraphicsContextInternal)this.Context).LoadAll();
+        }
+
+        /// <summary>Raises the HandleDestroyed event.</summary>
+        /// <param name="e">Not used.</param>
+        protected override void OnHandleDestroyed(EventArgs e)
+        {
+            base.OnHandleDestroyed(e);
+            if (this.Context != null)
+            {
+                this.Context.Dispose();
+                this.Context = null;
+            }
+            this.window_info.Dispose();
+            this.window_info = null;
+        }
+
+        /// <summary>
+        /// Raises the System.Windows.Forms.Control.Paint event.
+        /// </summary>
+        /// <param name="e">A System.Windows.Forms.PaintEventArgs that contains the event data.</param>
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            if (DesignMode)
+                e.Graphics.Clear(BackColor);
+
+            base.OnPaint(e);
+        }
+
+        /// <summary>
+        /// Raises the Resize event.
+        /// </summary>
+        /// <param name="e">A System.EventArgs that contains the event data.</param>
+        protected override void OnResize(EventArgs e)
+        {
+            if (context != null)
+                context.Update(window_info);
+
+            base.OnResize(e);
+        }
+
+        /// <summary>
+        /// Raises the ParentChanged event.
+        /// </summary>
+        /// <param name="e">A System.EventArgs that contains the event data.</param>
+        protected override void OnParentChanged(EventArgs e)
+        {
+            if (context != null)
+                context.Update(window_info);
+
+            base.OnParentChanged(e);
+        }
+
+        #endregion
+
+        #region --- Public Methods ---
+
+        #region public void SwapBuffers()
+
+        /// <summary>
+        /// Swaps the front and back buffers, presenting the rendered scene to the screen.
+        /// </summary>
+        public void SwapBuffers()
+        {
+            Context.SwapBuffers();
+        }
+
+        #endregion
+
+        #region public void MakeCurrent()
+
+        /// <summary>
+        /// Makes the underlying this GLControl current in the calling thread.
+        /// All OpenGL commands issued are hereafter interpreted by this GLControl.
+        /// </summary>
+        public void MakeCurrent()
+        {
+            this.Context.MakeCurrent(this.window_info);
+        }
+
+        #endregion
+
+        #region public bool IsIdle
+
+        /// <summary>
+        /// Gets a value indicating whether the current thread contains pending system messages.
+        /// </summary>
+        [Browsable(false)]
+        public bool IsIdle
+        {
+            get { return implementation.IsIdle; }
+        }
+
+        #endregion
+
+        #region public IGraphicsContext Context
+
+        /// <summary>
+        /// Gets an interface to the underlying GraphicsContext used by this GLControl.
+        /// </summary>
+        [Browsable(false)]
+        public IGraphicsContext Context
+        {
+            get { return context; }
+            private set { context = value; }
+        }
+
+        #endregion
+
+        #region public float AspectRatio
+
+        /// <summary>
+        /// Gets the aspect ratio of this GLControl.
+        /// </summary>
+        [Description("The aspect ratio of the client area of this GLControl.")]
+        public float AspectRatio
+        {
+            get
+            {
+                return this.ClientSize.Width / (float)this.ClientSize.Height;
+            }
+        }
+
+        #endregion
+
+        #region public bool VSync
+
+        /// <summary>
+        /// Gets or sets a value indicating whether vsync is active for this GLControl.
+        /// </summary>
+        [Description("Indicates whether GLControl updates are synced to the monitor's refresh.")]
+        public bool VSync
+        {
+            get
+            {
+                if (Context != null)
+                    return Context.VSync;
+                return false;
+            }
+            set
+            {
+                if (Context != null)
+                    Context.VSync = value;
+            }
+        }
+
+        #endregion
+
+        #region public GraphicsMode GraphicsMode
+
+        /// <summary>
+        /// Gets the GraphicsMode of the GraphicsContext attached to this GLControl.
+        /// </summary>
+        /// <remarks>
+        /// To change the GraphicsMode, you must destroy and recreate the GLControl.
+        /// </remarks>
+        public GraphicsMode GraphicsMode
+        {
+            get { return Context.GraphicsMode; }
+        }
+
+        #endregion
+
+        #region public Bitmap GrabScreenshot()
+
+        /// <summary>Grabs a screenshot of the frontbuffer contents.</summary>
+        /// <returns>A System.Drawing.Bitmap, containing the contents of the frontbuffer.</returns>
+        /// <exception cref="OpenTK.Graphics.GraphicsContextException">
+        /// Occurs when no OpenTK.Graphics.GraphicsContext is current in the calling thread.
+        /// </exception>
+        [Obsolete("This method will be removed. Please provide your own code to capture framebuffer contents.")]
+        public Bitmap GrabScreenshot()
+        {
+            Bitmap bmp = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
+            System.Drawing.Imaging.BitmapData data =
+                bmp.LockBits(this.ClientRectangle, System.Drawing.Imaging.ImageLockMode.WriteOnly,
+                             System.Drawing.Imaging.PixelFormat.Format24bppRgb);
+            GL.ReadPixels(0, 0, this.ClientSize.Width, this.ClientSize.Height, PixelFormat.Bgr, PixelType.UnsignedByte,
+                          data.Scan0);
+            bmp.UnlockBits(data);
+            bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
+            return bmp;
+        }
+
+        #endregion
+
+        #endregion
+    }
+}
diff --git a/Source/OpenTK/GLControl.resx b/Source/GLControl/GLControl.resx
similarity index 100%
rename from Source/OpenTK/GLControl.resx
rename to Source/GLControl/GLControl.resx
diff --git a/Source/GLControl/GLControlFactory.cs b/Source/GLControl/GLControlFactory.cs
new file mode 100644
index 00000000..2077fb0b
--- /dev/null
+++ b/Source/GLControl/GLControlFactory.cs
@@ -0,0 +1,47 @@
+#region License
+//
+// The Open Toolkit Library License
+//
+// Copyright (c) 2006 - 2009 the Open Toolkit library, except where noted.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights to 
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using OpenTK.Graphics;
+
+namespace OpenTK
+{
+    // Constructs GLControls.
+    class GLControlFactory
+    {
+        public IGLControl CreateGLControl(GraphicsMode mode, Control control)
+        {
+            if (Configuration.RunningOnWindows) return new WinGLControl(mode, control);
+            else if (Configuration.RunningOnX11) return new X11GLControl(mode, control);
+            else if (Configuration.RunningOnMacOS) return new CarbonGLControl(mode, control);
+            else throw new PlatformNotSupportedException();
+        }
+    }
+}
diff --git a/Source/GLControl/IGLControl.cs b/Source/GLControl/IGLControl.cs
new file mode 100644
index 00000000..85904a9b
--- /dev/null
+++ b/Source/GLControl/IGLControl.cs
@@ -0,0 +1,43 @@
+#region License
+//
+// The Open Toolkit Library License
+//
+// Copyright (c) 2006 - 2009 the Open Toolkit library, except where noted.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights to 
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+using OpenTK.Graphics;
+using OpenTK.Platform;
+
+namespace OpenTK
+{
+    internal interface IGLControl
+    {
+        IGraphicsContext CreateContext(int major, int minor, GraphicsContextFlags flags);
+        bool IsIdle { get; }
+        IWindowInfo WindowInfo { get; }
+    }
+}
diff --git a/Source/GLControl/OpenTK.GLControl.csproj b/Source/GLControl/OpenTK.GLControl.csproj
new file mode 100644
index 00000000..8ff60d0e
--- /dev/null
+++ b/Source/GLControl/OpenTK.GLControl.csproj
@@ -0,0 +1,182 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8CC9D641-0000-0000-0000-000000000000}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>OpenTK.GLControl</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>
+    </AppDesignerFolder>
+    <RootNamespace>OpenTK.GLControl</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <StartArguments>
+    </StartArguments>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE;</DefineConstants>
+    <DocumentationFile>OpenTK.GLControl.xml</DocumentationFile>
+    <DebugSymbols>True</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>False</Optimize>
+    <OutputPath>..\..\Binaries\Debug\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>False</NoStdLib>
+    <NoWarn>
+    </NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;</DefineConstants>
+    <DocumentationFile>OpenTK.GLControl.xml</DocumentationFile>
+    <DebugSymbols>False</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>True</Optimize>
+    <OutputPath>..\..\Binaries\Release\</OutputPath>
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <RemoveIntegerChecks>False</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>False</NoStdLib>
+    <NoWarn>
+    </NoWarn>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.Xml</Name>
+      <Private>False</Private>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\OpenTK\OpenTK.csproj">
+      <Name>OpenTK</Name>
+      <Project>{2C035F6B-0000-0000-0000-000000000000}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CarbonGLControl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DummyGLControl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GLControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="GLControl.Designer.cs">
+      <DependentUpon>GLControl.cs</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GLControlFactory.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="IGLControl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="WinGLControl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="X11GLControl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/Source/GLControl/Properties/AssemblyInfo.cs b/Source/GLControl/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..106bebbb
--- /dev/null
+++ b/Source/GLControl/Properties/AssemblyInfo.cs
@@ -0,0 +1,38 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("OpenTK.GLControl")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("OpenTK.GLControl")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2009")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("5414b90b-d7be-4382-b0e1-f07ce154f7f7")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+
+[assembly: System.CLSCompliant(true)]
\ No newline at end of file
diff --git a/Source/GLControl/WinGLControl.cs b/Source/GLControl/WinGLControl.cs
new file mode 100644
index 00000000..b1f731e2
--- /dev/null
+++ b/Source/GLControl/WinGLControl.cs
@@ -0,0 +1,158 @@
+#region License
+//
+// The Open Toolkit Library License
+//
+// Copyright (c) 2006 - 2009 the Open Toolkit library, except where noted.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights to 
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+using OpenTK.Graphics;
+using OpenTK.Platform;
+
+namespace OpenTK
+{
+    class WinGLControl : IGLControl
+    {
+        #region P/Invoke declarations
+
+        #region Message
+
+        struct MSG
+        {
+            public IntPtr HWnd;
+            public uint Message;
+            public IntPtr WParam;
+            public IntPtr LParam;
+            public uint Time;
+            public POINT Point;
+            //internal object RefObject;
+
+            public override string ToString()
+            {
+                return String.Format("msg=0x{0:x} ({1}) hwnd=0x{2:x} wparam=0x{3:x} lparam=0x{4:x} pt=0x{5:x}", (int)Message, Message.ToString(), HWnd.ToInt32(), WParam.ToInt32(), LParam.ToInt32(), Point);
+            }
+        }
+
+        #endregion
+
+        #region Point
+
+        struct POINT
+        {
+            public int X;
+            public int Y;
+
+            public POINT(int x, int y)
+            {
+                this.X = x;
+                this.Y = y;
+            }
+
+            public System.Drawing.Point ToPoint()
+            {
+                return new System.Drawing.Point(X, Y);
+            }
+
+            public override string ToString()
+            {
+                return "Point {" + X.ToString() + ", " + Y.ToString() + ")";
+            }
+        }
+
+        #endregion
+
+        #region PeekMessage
+
+        [System.Security.SuppressUnmanagedCodeSecurity]
+        [System.Runtime.InteropServices.DllImport("User32.dll")]
+        static extern bool PeekMessage(ref MSG msg, IntPtr hWnd, int messageFilterMin, int messageFilterMax, int flags);
+
+        #endregion
+
+        #region
+
+        #endregion
+
+        #endregion
+
+        #region Fields
+
+        MSG msg = new MSG();
+        IWindowInfo window_info;
+        GraphicsMode mode;
+
+        #endregion
+
+        #region Constructors
+
+        public WinGLControl(GraphicsMode mode, Control control)
+        {
+            this.mode = mode;
+
+            control.HandleCreated += delegate(object sender, EventArgs e)
+            {
+                if (window_info != null)
+                    window_info.Dispose();
+                window_info = Utilities.CreateWindowInfo(mode, ((Control)sender).Handle, true);
+            };
+
+            control.HandleDestroyed += delegate(object sender, EventArgs e)
+            {
+                if (window_info != null)
+                {
+                    window_info.Dispose();
+                    window_info = null;
+                }
+            };
+        }
+
+        #endregion
+
+        #region IGLControl Members
+
+        public IGraphicsContext CreateContext(int major, int minor, GraphicsContextFlags flags)
+        {
+            return new GraphicsContext(mode, window_info, major, minor, flags);
+        }
+
+        public bool IsIdle
+        {
+            get { return !PeekMessage(ref msg, IntPtr.Zero, 0, 0, 0); }
+        }
+
+        public IWindowInfo WindowInfo
+        {
+            get
+            {
+                // This method forces the creation of the control. Beware of this side-effect!
+                return window_info;
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/Source/GLControl/X11GLControl.cs b/Source/GLControl/X11GLControl.cs
new file mode 100644
index 00000000..cbf75c73
--- /dev/null
+++ b/Source/GLControl/X11GLControl.cs
@@ -0,0 +1,67 @@
+#region --- License ---
+/* Licensed under the MIT/X11 license.
+ * Copyright (c) 2006-2008 the OpenTK Team.
+ * This notice may not be removed from any source distribution.
+ * See license.txt for licensing detailed licensing details.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Runtime.InteropServices;
+
+using OpenTK.Graphics;
+using OpenTK.Platform;
+
+namespace OpenTK
+{
+    class X11GLControl : IGLControl
+    {
+        #region P/Invokes
+
+        [DllImport("libX11")]
+        public extern static int XPending(IntPtr diplay);
+
+        #endregion
+
+        #region Fields
+
+        GraphicsMode mode;
+        Control control;
+        IWindowInfo window_info;
+
+        #endregion
+
+        internal X11GLControl(GraphicsMode mode, Control control)
+        {
+            this.mode = mode;
+            this.control = control;
+
+            window_info = Utilities.CreateWindowInfo(mode, control.Handle, true);
+        }
+
+        #region IGLControl Members
+
+        public IGraphicsContext CreateContext(int major, int minor, GraphicsContextFlags flags)
+        {
+            return new GraphicsContext(mode, this.WindowInfo, major, minor, flags);
+        }
+
+        public bool IsIdle
+        {
+            get { return XPending(((Platform.X11.X11WindowInfo)window_info).Display) == 0; }
+        }
+
+        public IWindowInfo WindowInfo
+        {
+            get
+            {
+                return window_info;
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/Source/OpenTK/Platform/Egl/EglContext.cs b/Source/OpenTK/Platform/Egl/EglContext.cs
index 2048b316..bbc9e4e9 100644
--- a/Source/OpenTK/Platform/Egl/EglContext.cs
+++ b/Source/OpenTK/Platform/Egl/EglContext.cs
@@ -118,18 +118,6 @@ namespace OpenTK.Platform.Egl
             }
         }
 
-        // Todo: implement this!
-        public bool ErrorChecking
-        {
-            get
-            {
-                return false;
-            }
-            set
-            {
-            }
-        }
-
         #endregion
 
         #region IGraphicsContextInternal Members
diff --git a/Source/OpenTK/Platform/Factory.cs b/Source/OpenTK/Platform/Factory.cs
index d070ddb3..2e67b8fe 100644
--- a/Source/OpenTK/Platform/Factory.cs
+++ b/Source/OpenTK/Platform/Factory.cs
@@ -89,11 +89,6 @@ namespace OpenTK.Platform
             return default_implementation.CreateNativeWindow(x, y, width, height, title, mode, options, device);
         }
 
-        public IGLControl CreateGLControl(GraphicsMode mode, GLControl owner)
-        {
-            return default_implementation.CreateGLControl(mode, owner);
-        }
-
         public IDisplayDeviceDriver CreateDisplayDeviceDriver()
         {
             return default_implementation.CreateDisplayDeviceDriver();
@@ -134,11 +129,6 @@ namespace OpenTK.Platform
                 throw new PlatformNotSupportedException(error_string);
             }
 
-            public IGLControl CreateGLControl(GraphicsMode mode, GLControl owner)
-            {
-                throw new PlatformNotSupportedException(error_string);
-            }
-
             public IDisplayDeviceDriver CreateDisplayDeviceDriver()
             {
                 throw new PlatformNotSupportedException(error_string);
diff --git a/Source/OpenTK/Platform/IGLControl.cs b/Source/OpenTK/Platform/IGLControl.cs
deleted file mode 100644
index 456dd93a..00000000
--- a/Source/OpenTK/Platform/IGLControl.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-#region --- License ---
-/* Licensed under the MIT/X11 license.
- * Copyright (c) 2006-2008 the OpenTK Team.
- * This notice may not be removed from any source distribution.
- * See license.txt for licensing detailed licensing details.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-using OpenTK.Graphics;
-
-namespace OpenTK.Platform
-{
-    internal interface IGLControl
-    {
-        GraphicsContext CreateContext(int major, int minor, GraphicsContextFlags flags);
-        bool IsIdle { get; }
-        IWindowInfo WindowInfo { get; }
-    }
-}
diff --git a/Source/OpenTK/Platform/IPlatformFactory.cs b/Source/OpenTK/Platform/IPlatformFactory.cs
index 3deb813d..f0678473 100644
--- a/Source/OpenTK/Platform/IPlatformFactory.cs
+++ b/Source/OpenTK/Platform/IPlatformFactory.cs
@@ -37,8 +37,6 @@ namespace OpenTK.Platform
     {
         INativeWindow CreateNativeWindow(int x, int y, int width, int height, string title, GraphicsMode mode, GameWindowFlags options, DisplayDevice device);
 
-        IGLControl CreateGLControl(GraphicsMode mode, GLControl owner);
-
         IDisplayDeviceDriver CreateDisplayDeviceDriver();
 
         IGraphicsContext CreateGLContext(GraphicsMode mode, IWindowInfo window, IGraphicsContext shareContext, bool directRendering, int major, int minor, GraphicsContextFlags flags);
diff --git a/Source/OpenTK/Platform/MacOS/AglContext.cs b/Source/OpenTK/Platform/MacOS/AglContext.cs
index ff2e1c46..86e901ed 100644
--- a/Source/OpenTK/Platform/MacOS/AglContext.cs
+++ b/Source/OpenTK/Platform/MacOS/AglContext.cs
@@ -228,7 +228,7 @@ namespace OpenTK.Platform.MacOS
                 windowPort = API.GetWindowPort(carbonWindow.WindowRef);
             return windowPort;
         }
-        public void Update(IWindowInfo window)      
+        public override void Update(IWindowInfo window)      
         {
             CarbonWindowInfo carbonWindow = (CarbonWindowInfo)window;
 
diff --git a/Source/OpenTK/Platform/MacOS/CarbonGLControl.cs b/Source/OpenTK/Platform/MacOS/CarbonGLControl.cs
deleted file mode 100644
index 48dd25bb..00000000
--- a/Source/OpenTK/Platform/MacOS/CarbonGLControl.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-
-namespace OpenTK.Platform.MacOS
-{
-    using Graphics;
-
-    class CarbonGLControl : IGLControl 
-    {
-        GraphicsMode mode;
-        Control control;
-
-        internal CarbonGLControl(GraphicsMode mode, Control owner)
-        {
-            this.mode = mode;
-            this.control = owner;
-        }
-
-        #region IGLControl Members
-
-        public GraphicsContext CreateContext(int major, int minor, GraphicsContextFlags flags)
-        {
-            return new GraphicsContext(mode, WindowInfo, major, minor, flags);
-        }
-
-        // TODO: Fix this
-        bool lastIsIdle = false;
-        public bool IsIdle
-        {
-            get 
-            { 
-                lastIsIdle = !lastIsIdle;
-                return lastIsIdle;
-            }
-        }
-
-        public IWindowInfo WindowInfo
-        {
-            get
-            {
-                control.CreateControl(); 
-                return new CarbonWindowInfo(control.Handle, false, true);
-            }
-        }
-
-        #endregion
-    }
-}
diff --git a/Source/OpenTK/Platform/MacOS/MacOSFactory.cs b/Source/OpenTK/Platform/MacOS/MacOSFactory.cs
index 756a03aa..02f3be41 100644
--- a/Source/OpenTK/Platform/MacOS/MacOSFactory.cs
+++ b/Source/OpenTK/Platform/MacOS/MacOSFactory.cs
@@ -42,11 +42,6 @@ namespace OpenTK.Platform.MacOS
             return new CarbonGLNative(x, y, width, height, title, mode, options, device);
         }
 
-        public virtual IGLControl CreateGLControl(GraphicsMode mode, GLControl owner)
-        {
-            return new CarbonGLControl(mode, owner);
-        }
-
         public virtual IDisplayDeviceDriver CreateDisplayDeviceDriver()
         {
             return new QuartzDisplayDeviceDriver();
diff --git a/Source/OpenTK/Platform/Utilities.cs b/Source/OpenTK/Platform/Utilities.cs
index 7efdaf1a..ee25db84 100644
--- a/Source/OpenTK/Platform/Utilities.cs
+++ b/Source/OpenTK/Platform/Utilities.cs
@@ -263,7 +263,7 @@ namespace OpenTK.Platform
         public static void CreateGraphicsContext(GraphicsMode mode, IntPtr cntrlHandle,
             out IGraphicsContext context, out IWindowInfo info)
         {
-            info = CreateWindowInfo(mode, cntrlHandle);
+            info = CreateWindowInfo(mode, cntrlHandle, true);
 
             context = new GraphicsContext(mode, info);
             context.MakeCurrent(info);
@@ -273,30 +273,19 @@ namespace OpenTK.Platform
 
         #region --- CreateWindowInfo ---
 
-        /// <summary>
-        /// Creates an object which implements the IWindowInfo interface for the platform
-        /// currently running on.  This will create a handle for the control, so it is not
-        /// recommended that this be called in the constructor of a custom control.
-        /// </summary>
-        /// <param name="mode">The desired GraphicsMode for this window.</param>
-        /// <param name="cntrl">A <see cref="System.Windows.Forms.Control"/> to get the IWindowInfo from.</param>
-        /// <returns></returns>
-        public static IWindowInfo CreateWindowInfo(GraphicsMode mode, Control cntrl)
-        {
-            return CreateWindowInfo(mode, cntrl.Handle);
-        }
         /// <summary>
         /// Creates an object which implements the IWindowInfo interface for the platform
         /// currently running on.  
         /// </summary>
         /// <param name="mode">The desired GraphicsMode for this window.</param>
         /// <param name="controlHandle">The handle to the control, obtained from Control.Handle.</param>
+        /// <param name="isControl">Set to true if this is a Windows.Forms control.</param>
         /// <returns></returns>
-        public static IWindowInfo CreateWindowInfo(GraphicsMode mode, IntPtr controlHandle)
+        public static IWindowInfo CreateWindowInfo(GraphicsMode mode, IntPtr controlHandle, bool isControl)
         {
             if (Configuration.RunningOnWindows) return CreateWinWindowInfo(controlHandle);
-            else if (Configuration.RunningOnX11) return CreateX11WindowInfo(mode, controlHandle);
-            else if (Configuration.RunningOnMacOS) return CreateMacOSCarbonWindowInfo(controlHandle);
+            else if (Configuration.RunningOnX11) return CreateX11WindowInfo(mode, controlHandle, isControl);
+            else if (Configuration.RunningOnMacOS) return CreateMacOSCarbonWindowInfo(controlHandle, isControl);
             else
                 throw new PlatformNotSupportedException("Refer to http://www.opentk.com for more information.");
         }
@@ -305,37 +294,42 @@ namespace OpenTK.Platform
 
         #region --- X11 Platform-specific implementation ---
 
-        private static IWindowInfo CreateX11WindowInfo(GraphicsMode mode, IntPtr controlHandle)
+        private static IWindowInfo CreateX11WindowInfo(GraphicsMode mode, IntPtr controlHandle, bool isControl)
         {
             Platform.X11.X11WindowInfo window = new OpenTK.Platform.X11.X11WindowInfo();
-
-            Type xplatui = Type.GetType("System.Windows.Forms.XplatUIX11, System.Windows.Forms");
-            if (xplatui == null) throw new PlatformNotSupportedException(
-                    "System.Windows.Forms.XplatUIX11 missing. Unsupported platform or Mono runtime version, aborting.");
-
             window.WindowHandle = controlHandle;
 
-            // get the required handles from the X11 API.
-            window.Display = (IntPtr)GetStaticFieldValue(xplatui, "DisplayHandle");
-            window.RootWindow = (IntPtr)GetStaticFieldValue(xplatui, "RootWindow");
-            window.Screen = (int)GetStaticFieldValue(xplatui, "ScreenNo");
+            if (isControl)
+            {
+                Type xplatui = Type.GetType("System.Windows.Forms.XplatUIX11, System.Windows.Forms");
+                if (xplatui == null) throw new PlatformNotSupportedException(
+                        "System.Windows.Forms.XplatUIX11 missing. Unsupported platform or Mono runtime version, aborting.");
 
-            // get the X11 Visual info for the display.
-            Platform.X11.XVisualInfo info = new Platform.X11.XVisualInfo();
+                // get the required handles from the X11 API.
+                window.Display = (IntPtr)GetStaticFieldValue(xplatui, "DisplayHandle");
+                window.RootWindow = (IntPtr)GetStaticFieldValue(xplatui, "RootWindow");
+                window.Screen = (int)GetStaticFieldValue(xplatui, "ScreenNo");
 
-            if (!mode.Index.HasValue)
-                throw new GraphicsModeException("Invalid or unsupported GraphicsMode.");
+                // get the X11 Visual info for the display.
+                Platform.X11.XVisualInfo info = new Platform.X11.XVisualInfo();
 
-            info.VisualID = mode.Index.Value;
-            int dummy;
-            window.VisualInfo = (Platform.X11.XVisualInfo)Marshal.PtrToStructure(
-                Platform.X11.Functions.XGetVisualInfo(window.Display, Platform.X11.XVisualInfoMask.ID,
-                                         ref info, out dummy), typeof(Platform.X11.XVisualInfo));
+                if (!mode.Index.HasValue)
+                    throw new GraphicsModeException("Invalid or unsupported GraphicsMode.");
 
-            // set the X11 colormap.
-            SetStaticFieldValue(xplatui, "CustomVisual", window.VisualInfo.Visual);
-            SetStaticFieldValue(xplatui, "CustomColormap",
-                Platform.X11.Functions.XCreateColormap(window.Display, window.RootWindow, window.VisualInfo.Visual, 0));
+                info.VisualID = mode.Index.Value;
+                int dummy;
+                window.VisualInfo = (Platform.X11.XVisualInfo)Marshal.PtrToStructure(
+                    Platform.X11.Functions.XGetVisualInfo(window.Display, Platform.X11.XVisualInfoMask.ID,
+                                             ref info, out dummy), typeof(Platform.X11.XVisualInfo));
+
+                // set the X11 colormap.
+                SetStaticFieldValue(xplatui, "CustomVisual", window.VisualInfo.Visual);
+                SetStaticFieldValue(xplatui, "CustomColormap",
+                    Platform.X11.Functions.XCreateColormap(window.Display, window.RootWindow, window.VisualInfo.Visual, 0));
+            }
+            else
+            {
+            }
 
             return window;
         }
@@ -351,9 +345,9 @@ namespace OpenTK.Platform
         #endregion
         #region --- Mac OS X Platform-specific implementation ---
 
-        private static IWindowInfo CreateMacOSCarbonWindowInfo(IntPtr controlHandle)
+        private static IWindowInfo CreateMacOSCarbonWindowInfo(IntPtr controlHandle, bool isControl)
         {
-            return new OpenTK.Platform.MacOS.CarbonWindowInfo(controlHandle, false, true);
+            return new OpenTK.Platform.MacOS.CarbonWindowInfo(controlHandle, false, isControl);
         }
 
         #endregion
diff --git a/Source/OpenTK/Platform/Windows/WinFactory.cs b/Source/OpenTK/Platform/Windows/WinFactory.cs
index 7766cfb8..abf23979 100644
--- a/Source/OpenTK/Platform/Windows/WinFactory.cs
+++ b/Source/OpenTK/Platform/Windows/WinFactory.cs
@@ -43,11 +43,6 @@ namespace OpenTK.Platform.Windows
             return new WinGLNative(x, y, width, height, title, options, device);
         }
 
-        public virtual IGLControl CreateGLControl(GraphicsMode mode, GLControl owner)
-        {
-            return new WinGLControl(mode, owner);
-        }
-
         public virtual IDisplayDeviceDriver CreateDisplayDeviceDriver()
         {
             return new WinDisplayDeviceDriver();
diff --git a/Source/OpenTK/Platform/Windows/WinGLControl.cs b/Source/OpenTK/Platform/Windows/WinGLControl.cs
deleted file mode 100644
index 8bd7fe22..00000000
--- a/Source/OpenTK/Platform/Windows/WinGLControl.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-#region --- License ---
-/* Licensed under the MIT/X11 license.
- * Copyright (c) 2006-2008 the OpenTK Team.
- * This notice may not be removed from any source distribution.
- * See license.txt for licensing detailed licensing details.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-
-using OpenTK.Graphics;
-
-namespace OpenTK.Platform.Windows
-{
-    class WinGLControl : IGLControl
-    {
-        MSG msg = new MSG();
-        GraphicsMode mode;
-        Control control;
-        WinWindowInfo window_info;
-
-        internal WinGLControl(GraphicsMode mode, Control control)
-        {
-            this.mode = mode;
-            this.control = control;
-            this.control.HandleCreated += delegate(object sender, EventArgs e)
-            {
-                if (window_info != null)
-                    window_info.Dispose();
-                window_info = new WinWindowInfo(this.control.Handle, null);
-            };
-            this.control.HandleDestroyed += delegate(object sender, EventArgs e)
-            {
-                if (window_info != null)
-                {
-                    window_info.Dispose();
-                    window_info = null;
-                }
-            };
-        }
-
-        #region --- IGLControl Members ---
-
-        public GraphicsContext CreateContext(int major, int minor, GraphicsContextFlags flags)
-        {
-            // Make sure the Control exists before create the context.
-            if (window_info == null)
-                window_info = new WinWindowInfo(control.Handle, null);
-
-            return new GraphicsContext(mode, window_info, major, minor, flags);
-        }
-
-        public bool IsIdle
-        {
-            get { return !OpenTK.Platform.Windows.Functions.PeekMessage(ref msg, IntPtr.Zero, 0, 0, 0); }
-        }
-
-        public IWindowInfo WindowInfo
-        {
-            get
-            {
-                // This method forces the creation of the control. Beware of this side-effect!
-                return window_info;
-            }
-        }
-
-        #endregion
-    }
-}
diff --git a/Source/OpenTK/Platform/X11/X11Factory.cs b/Source/OpenTK/Platform/X11/X11Factory.cs
index a6fcaf4c..c8714821 100644
--- a/Source/OpenTK/Platform/X11/X11Factory.cs
+++ b/Source/OpenTK/Platform/X11/X11Factory.cs
@@ -15,11 +15,6 @@ namespace OpenTK.Platform.X11
             return new X11GLNative(x, y, width, height, title, mode, options, device);
         }
 
-        public virtual IGLControl CreateGLControl(GraphicsMode mode, GLControl owner)
-        {
-            return new X11GLControl(mode, owner);
-        }
-
         public virtual IDisplayDeviceDriver CreateDisplayDeviceDriver()
         {
             return new X11XrandrDisplayDevice();
diff --git a/Source/OpenTK/Platform/X11/X11GLControl.cs b/Source/OpenTK/Platform/X11/X11GLControl.cs
deleted file mode 100644
index 49d2275c..00000000
--- a/Source/OpenTK/Platform/X11/X11GLControl.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-#region --- License ---
-/* Licensed under the MIT/X11 license.
- * Copyright (c) 2006-2008 the OpenTK Team.
- * This notice may not be removed from any source distribution.
- * See license.txt for licensing detailed licensing details.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-using System.Runtime.InteropServices;
-
-using OpenTK.Graphics;
-
-namespace OpenTK.Platform.X11
-{
-    class X11GLControl : IGLControl
-    {
-        GraphicsMode mode;
-        Control control;
-        IntPtr display;
-
-        internal X11GLControl(GraphicsMode mode, Control control)
-        {
-            if (!mode.Index.HasValue)
-                throw new GraphicsModeException("Invalid GraphicsMode.");
-
-            this.mode = mode;
-            this.control = control;
-
-            X11WindowInfo window = (X11WindowInfo)this.WindowInfo;
-            XVisualInfo info = new XVisualInfo();
-            
-            info.VisualID = mode.Index.Value;
-            int dummy;
-            window.VisualInfo = (XVisualInfo)Marshal.PtrToStructure(
-                Functions.XGetVisualInfo(window.Display, XVisualInfoMask.ID, ref info, out dummy), typeof(XVisualInfo));
-
-            Type xplatui = Type.GetType("System.Windows.Forms.XplatUIX11, System.Windows.Forms");
-            xplatui.GetField("CustomVisual", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic)
-                .SetValue(null, window.VisualInfo.Visual);
-            xplatui.GetField("CustomColormap", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic)
-                .SetValue(null, Functions.XCreateColormap(window.Display, window.RootWindow, window.VisualInfo.Visual, 0));
-        }
-
-        #region --- IGLControl Members ---
-
-        public GraphicsContext CreateContext(int major, int minor, GraphicsContextFlags flags)
-        {
-            return new GraphicsContext(mode, this.WindowInfo, major, minor, flags);
-        }
-
-        public bool IsIdle
-        {
-            get { return Functions.XPending(display) == 0; }
-        }
-
-        public IWindowInfo WindowInfo
-        {
-            get
-            {
-                Type xplatui = Type.GetType("System.Windows.Forms.XplatUIX11, System.Windows.Forms");
-                if (xplatui == null) throw new PlatformNotSupportedException(
-                        "System.Windows.Forms.XplatUIX11 missing. Unsupported platform or Mono runtime version, aborting.");
-
-                X11WindowInfo window = new X11WindowInfo();
-
-                if (control.IsHandleCreated)
-                    window.WindowHandle = control.Handle;
-                
-                display =
-                window.Display = (IntPtr)xplatui.GetField("DisplayHandle",
-                    System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).GetValue(null);
-                window.RootWindow = (IntPtr)xplatui.GetField("RootWindow",
-                    System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).GetValue(null);
-                window.Screen = (int)xplatui.GetField("ScreenNo",
-                    System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).GetValue(null);
-
-                if (control.IsHandleCreated)
-                    window.WindowHandle = control.Handle;
-
-                return window;
-            }
-        }
-
-        #endregion
-    }
-}
diff --git a/Source/OpenTK/Properties/Resources.Designer.cs b/Source/OpenTK/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..5d81e741
--- /dev/null
+++ b/Source/OpenTK/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.4918
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace OpenTK.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenTK.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}
diff --git a/Source/OpenTK/Properties/Resources.resx b/Source/OpenTK/Properties/Resources.resx
new file mode 100644
index 00000000..5ea0895e
--- /dev/null
+++ b/Source/OpenTK/Properties/Resources.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file