diff --git a/src/OpenGL/libGL/Context.cpp b/src/OpenGL/libGL/Context.cpp
index 9285738..3d4d477 100644
--- a/src/OpenGL/libGL/Context.cpp
+++ b/src/OpenGL/libGL/Context.cpp
@@ -130,9 +130,9 @@
     // In order that access to these initial textures not be lost, they are treated as texture
     // objects all of whose names are 0.
 
-    mTexture2DZero.set(new Texture2D(0));
-    mTextureCubeMapZero.set(new TextureCubeMap(0));
-    mTextureExternalZero.set(new TextureExternal(0));
+    mTexture2DZero = new Texture2D(0);
+    mTextureCubeMapZero = new TextureCubeMap(0);
+    mTextureExternalZero = new TextureExternal(0);
 
     mState.activeSampler = 0;
     bindArrayBuffer(0);
@@ -193,27 +193,27 @@
     {
         for(int sampler = 0; sampler < MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++)
         {
-            mState.samplerTexture[type][sampler].set(NULL);
+            mState.samplerTexture[type][sampler] = NULL;
         }
     }
 
     for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
     {
-        mState.vertexAttribute[i].mBoundBuffer.set(NULL);
+        mState.vertexAttribute[i].mBoundBuffer = NULL;
     }
 
 	for(int i = 0; i < QUERY_TYPE_COUNT; i++)
     {
-        mState.activeQuery[i].set(NULL);
+        mState.activeQuery[i] = NULL;
     }
 
-    mState.arrayBuffer.set(NULL);
-    mState.elementArrayBuffer.set(NULL);
-    mState.renderbuffer.set(NULL);
+    mState.arrayBuffer = NULL;
+    mState.elementArrayBuffer = NULL;
+    mState.renderbuffer = NULL;
 
-    mTexture2DZero.set(NULL);
-    mTextureCubeMapZero.set(NULL);
-    mTextureExternalZero.set(NULL);
+    mTexture2DZero = NULL;
+    mTextureCubeMapZero = NULL;
+    mTextureExternalZero = NULL;
 
     delete mVertexDataManager;
     delete mIndexDataManager;
@@ -677,10 +677,10 @@
     switch(target)
     {
     case GL_ANY_SAMPLES_PASSED_EXT:
-        queryObject = mState.activeQuery[QUERY_ANY_SAMPLES_PASSED].get();
+        queryObject = mState.activeQuery[QUERY_ANY_SAMPLES_PASSED];
         break;
     case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
-        queryObject = mState.activeQuery[QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE].get();
+        queryObject = mState.activeQuery[QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE];
         break;
     default:
         ASSERT(false);
@@ -707,7 +707,7 @@
 void Context::setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type, bool normalized,
                                    GLsizei stride, const void *pointer)
 {
-    mState.vertexAttribute[attribNum].mBoundBuffer.set(boundBuffer);
+    mState.vertexAttribute[attribNum].mBoundBuffer = boundBuffer;
     mState.vertexAttribute[attribNum].mSize = size;
     mState.vertexAttribute[attribNum].mType = type;
     mState.vertexAttribute[attribNum].mNormalized = normalized;
@@ -921,35 +921,35 @@
 {
     mResourceManager->checkBufferAllocation(buffer);
 
-    mState.arrayBuffer.set(getBuffer(buffer));
+    mState.arrayBuffer = getBuffer(buffer);
 }
 
 void Context::bindElementArrayBuffer(unsigned int buffer)
 {
     mResourceManager->checkBufferAllocation(buffer);
 
-    mState.elementArrayBuffer.set(getBuffer(buffer));
+    mState.elementArrayBuffer = getBuffer(buffer);
 }
 
 void Context::bindTexture2D(GLuint texture)
 {
     mResourceManager->checkTextureAllocation(texture, TEXTURE_2D);
 
-    mState.samplerTexture[TEXTURE_2D][mState.activeSampler].set(getTexture(texture));
+    mState.samplerTexture[TEXTURE_2D][mState.activeSampler] = getTexture(texture);
 }
 
 void Context::bindTextureCubeMap(GLuint texture)
 {
     mResourceManager->checkTextureAllocation(texture, TEXTURE_CUBE);
 
-    mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler].set(getTexture(texture));
+    mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler] = getTexture(texture);
 }
 
 void Context::bindTextureExternal(GLuint texture)
 {
     mResourceManager->checkTextureAllocation(texture, TEXTURE_EXTERNAL);
 
-    mState.samplerTexture[TEXTURE_EXTERNAL][mState.activeSampler].set(getTexture(texture));
+    mState.samplerTexture[TEXTURE_EXTERNAL][mState.activeSampler] = getTexture(texture);
 }
 
 void Context::bindReadFramebuffer(GLuint framebuffer)
@@ -974,7 +974,7 @@
 
 void Context::bindRenderbuffer(GLuint renderbuffer)
 {
-    mState.renderbuffer.set(getRenderbuffer(renderbuffer));
+    mState.renderbuffer = getRenderbuffer(renderbuffer);
 }
 
 void Context::useProgram(GLuint program)
@@ -1018,7 +1018,7 @@
     //       no query may be active for either if glBeginQuery targets either.
     for(int i = 0; i < QUERY_TYPE_COUNT; i++)
     {
-        if(mState.activeQuery[i].get() != NULL)
+        if(mState.activeQuery[i] != NULL)
         {
             return error(GL_INVALID_OPERATION);
         }
@@ -1052,7 +1052,7 @@
     }
 
     // Set query as active for specified target
-    mState.activeQuery[qType].set(queryObject);
+    mState.activeQuery[qType] = queryObject;
 
     // Begin query
     queryObject->begin();
@@ -1074,7 +1074,7 @@
         ASSERT(false);
     }
 
-    Query *queryObject = mState.activeQuery[qType].get();
+    Query *queryObject = mState.activeQuery[qType];
 
     if(queryObject == NULL)
     {
@@ -1083,7 +1083,7 @@
 
     queryObject->end();
 
-    mState.activeQuery[qType].set(NULL);
+    mState.activeQuery[qType] = NULL;
 }
 
 void Context::setFramebufferZero(Framebuffer *buffer)
@@ -1094,7 +1094,7 @@
 
 void Context::setRenderbufferStorage(RenderbufferStorage *renderbuffer)
 {
-    Renderbuffer *renderbufferObject = mState.renderbuffer.get();
+    Renderbuffer *renderbufferObject = mState.renderbuffer;
     renderbufferObject->setStorage(renderbuffer);
 }
 
@@ -1148,12 +1148,12 @@
 
 Buffer *Context::getArrayBuffer()
 {
-    return mState.arrayBuffer.get();
+    return mState.arrayBuffer;
 }
 
 Buffer *Context::getElementArrayBuffer()
 {
-    return mState.elementArrayBuffer.get();
+    return mState.elementArrayBuffer;
 }
 
 Program *Context::getCurrentProgram()
@@ -1184,14 +1184,14 @@
     {
         switch (type)
         {
-        case TEXTURE_2D: return mTexture2DZero.get();
-        case TEXTURE_CUBE: return mTextureCubeMapZero.get();
-        case TEXTURE_EXTERNAL: return mTextureExternalZero.get();
+        case TEXTURE_2D: return mTexture2DZero;
+        case TEXTURE_CUBE: return mTextureCubeMapZero;
+        case TEXTURE_EXTERNAL: return mTextureExternalZero;
         default: UNREACHABLE();
         }
     }
 
-    return mState.samplerTexture[type][sampler].get();
+    return mState.samplerTexture[type][sampler];
 }
 
 bool Context::getBooleanv(GLenum pname, GLboolean *params)
@@ -1964,7 +1964,7 @@
 // Applies the indices and element array bindings
 GLenum Context::applyIndexBuffer(const void *indices, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo)
 {
-    GLenum err = mIndexDataManager->prepareIndexData(type, count, mState.elementArrayBuffer.get(), indices, indexInfo);
+    GLenum err = mIndexDataManager->prepareIndexData(type, count, mState.elementArrayBuffer, indices, indexInfo);
 
     if(err == GL_NO_ERROR)
     {
@@ -2596,19 +2596,19 @@
 
     if(mState.arrayBuffer.name() == buffer)
     {
-        mState.arrayBuffer.set(NULL);
+        mState.arrayBuffer = NULL;
     }
 
     if(mState.elementArrayBuffer.name() == buffer)
     {
-        mState.elementArrayBuffer.set(NULL);
+        mState.elementArrayBuffer = NULL;
     }
 
     for(int attribute = 0; attribute < MAX_VERTEX_ATTRIBS; attribute++)
     {
         if(mState.vertexAttribute[attribute].mBoundBuffer.name() == buffer)
         {
-            mState.vertexAttribute[attribute].mBoundBuffer.set(NULL);
+            mState.vertexAttribute[attribute].mBoundBuffer = NULL;
         }
     }
 }
@@ -2625,7 +2625,7 @@
         {
             if(mState.samplerTexture[type][sampler].name() == texture)
             {
-                mState.samplerTexture[type][sampler].set(NULL);
+                mState.samplerTexture[type][sampler] = NULL;
             }
         }
     }
diff --git a/src/OpenGL/libGL/Framebuffer.cpp b/src/OpenGL/libGL/Framebuffer.cpp
index dce0160..50002ed 100644
--- a/src/OpenGL/libGL/Framebuffer.cpp
+++ b/src/OpenGL/libGL/Framebuffer.cpp
@@ -31,9 +31,9 @@
 
 Framebuffer::~Framebuffer()
 {
-	mColorbufferPointer.set(NULL);
-	mDepthbufferPointer.set(NULL);
-	mStencilbufferPointer.set(NULL);
+	mColorbufferPointer = NULL;
+	mDepthbufferPointer = NULL;
+	mStencilbufferPointer = NULL;
 }
 
 Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const
@@ -64,19 +64,19 @@
 void Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer)
 {
 	mColorbufferType = (colorbuffer != 0) ? type : GL_NONE;
-	mColorbufferPointer.set(lookupRenderbuffer(type, colorbuffer));
+	mColorbufferPointer = lookupRenderbuffer(type, colorbuffer);
 }
 
 void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer)
 {
 	mDepthbufferType = (depthbuffer != 0) ? type : GL_NONE;
-	mDepthbufferPointer.set(lookupRenderbuffer(type, depthbuffer));
+	mDepthbufferPointer = lookupRenderbuffer(type, depthbuffer);
 }
 
 void Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer)
 {
 	mStencilbufferType = (stencilbuffer != 0) ? type : GL_NONE;
-	mStencilbufferPointer.set(lookupRenderbuffer(type, stencilbuffer));
+	mStencilbufferPointer = lookupRenderbuffer(type, stencilbuffer);
 }
 
 void Framebuffer::detachTexture(GLuint texture)
@@ -84,19 +84,19 @@
 	if(mColorbufferPointer.name() == texture && IsTextureTarget(mColorbufferType))
 	{
 		mColorbufferType = GL_NONE;
-		mColorbufferPointer.set(NULL);
+		mColorbufferPointer = NULL;
 	}
 
 	if(mDepthbufferPointer.name() == texture && IsTextureTarget(mDepthbufferType))
 	{
 		mDepthbufferType = GL_NONE;
-		mDepthbufferPointer.set(NULL);
+		mDepthbufferPointer = NULL;
 	}
 
 	if(mStencilbufferPointer.name() == texture && IsTextureTarget(mStencilbufferType))
 	{
 		mStencilbufferType = GL_NONE;
-		mStencilbufferPointer.set(NULL);
+		mStencilbufferPointer = NULL;
 	}
 }
 
@@ -105,19 +105,19 @@
 	if(mColorbufferPointer.name() == renderbuffer && mColorbufferType == GL_RENDERBUFFER)
 	{
 		mColorbufferType = GL_NONE;
-		mColorbufferPointer.set(NULL);
+		mColorbufferPointer = NULL;
 	}
 
 	if(mDepthbufferPointer.name() == renderbuffer && mDepthbufferType == GL_RENDERBUFFER)
 	{
 		mDepthbufferType = GL_NONE;
-		mDepthbufferPointer.set(NULL);
+		mDepthbufferPointer = NULL;
 	}
 
 	if(mStencilbufferPointer.name() == renderbuffer && mStencilbufferType == GL_RENDERBUFFER)
 	{
 		mStencilbufferType = GL_NONE;
-		mStencilbufferPointer.set(NULL);
+		mStencilbufferPointer = NULL;
 	}
 }
 
@@ -125,7 +125,7 @@
 // caller must Release() the returned surface
 egl::Image *Framebuffer::getRenderTarget()
 {
-	Renderbuffer *colorbuffer = mColorbufferPointer.get();
+	Renderbuffer *colorbuffer = mColorbufferPointer;
 
 	if(colorbuffer)
 	{
@@ -139,11 +139,11 @@
 // caller must Release() the returned surface
 egl::Image *Framebuffer::getDepthStencil()
 {
-	Renderbuffer *depthstencilbuffer = mDepthbufferPointer.get();
+	Renderbuffer *depthstencilbuffer = mDepthbufferPointer;
 	
 	if(!depthstencilbuffer)
 	{
-		depthstencilbuffer = mStencilbufferPointer.get();
+		depthstencilbuffer = mStencilbufferPointer;
 	}
 
 	if(depthstencilbuffer)
@@ -156,17 +156,17 @@
 
 Renderbuffer *Framebuffer::getColorbuffer()
 {
-	return mColorbufferPointer.get();
+	return mColorbufferPointer;
 }
 
 Renderbuffer *Framebuffer::getDepthbuffer()
 {
-	return mDepthbufferPointer.get();
+	return mDepthbufferPointer;
 }
 
 Renderbuffer *Framebuffer::getStencilbuffer()
 {
-	return mStencilbufferPointer.get();
+	return mStencilbufferPointer;
 }
 
 GLenum Framebuffer::getColorbufferType()
@@ -401,11 +401,11 @@
 
 DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
 {
-	mColorbufferPointer.set(new Renderbuffer(0, colorbuffer));
+	mColorbufferPointer = new Renderbuffer(0, colorbuffer);
 
 	Renderbuffer *depthStencilRenderbuffer = new Renderbuffer(0, depthStencil);
-	mDepthbufferPointer.set(depthStencilRenderbuffer);
-	mStencilbufferPointer.set(depthStencilRenderbuffer);
+	mDepthbufferPointer = depthStencilRenderbuffer;
+	mStencilbufferPointer = depthStencilRenderbuffer;
 
 	mColorbufferType = GL_RENDERBUFFER;
 	mDepthbufferType = (depthStencilRenderbuffer->getDepthSize() != 0) ? GL_RENDERBUFFER : GL_NONE;
diff --git a/src/OpenGL/libGL/Renderbuffer.cpp b/src/OpenGL/libGL/Renderbuffer.cpp
index cd6f485..48dd238 100644
--- a/src/OpenGL/libGL/Renderbuffer.cpp
+++ b/src/OpenGL/libGL/Renderbuffer.cpp
@@ -70,12 +70,12 @@
 
 RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture)
 {
-	mTexture2D.set(texture);
+	mTexture2D = texture;
 }
 
 RenderbufferTexture2D::~RenderbufferTexture2D()
 {
-	mTexture2D.set(NULL);
+	mTexture2D = NULL;
 }
 
 // Textures need to maintain their own reference count for references via
@@ -138,12 +138,12 @@
 
 RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target) : mTarget(target)
 {
-	mTextureCubeMap.set(texture);
+	mTextureCubeMap = texture;
 }
 
 RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
 {
-	mTextureCubeMap.set(NULL);
+	mTextureCubeMap = NULL;
 }
 
 // Textures need to maintain their own reference count for references via
diff --git a/src/OpenGL/libGL/VertexDataManager.cpp b/src/OpenGL/libGL/VertexDataManager.cpp
index ff88a6d..9dd0119 100644
--- a/src/OpenGL/libGL/VertexDataManager.cpp
+++ b/src/OpenGL/libGL/VertexDataManager.cpp
@@ -55,7 +55,7 @@
 
 unsigned int VertexDataManager::writeAttributeData(StreamingVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute)
 {
-    Buffer *buffer = attribute.mBoundBuffer.get();
+    Buffer *buffer = attribute.mBoundBuffer;
 
     int inputStride = attribute.stride();
     int elementSize = attribute.typeSize();
@@ -139,7 +139,7 @@
         {
             if(attribs[i].mArrayEnabled)
             {
-                Buffer *buffer = attribs[i].mBoundBuffer.get();
+                Buffer *buffer = attribs[i].mBoundBuffer;
 
                 if(!buffer && attribs[i].mPointer == NULL)
                 {
