diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index be7de8e..30a1d7e 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -130,10 +130,10 @@
     // 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));
-	mTexture3DZero.set(new Texture3D(0));
-    mTextureCubeMapZero.set(new TextureCubeMap(0));
-    mTextureExternalZero.set(new TextureExternal(0));
+    mTexture2DZero = new Texture2D(0);
+	mTexture3DZero = new Texture3D(0);
+    mTextureCubeMapZero = new TextureCubeMap(0);
+    mTextureExternalZero = new TextureExternal(0);
 
     mState.activeSampler = 0;
     bindArrayBuffer(0);
@@ -194,28 +194,28 @@
     {
         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);
-	mTexture3DZero.set(NULL);
-    mTextureCubeMapZero.set(NULL);
-    mTextureExternalZero.set(NULL);
+    mTexture2DZero = NULL;
+	mTexture3DZero = NULL;
+    mTextureCubeMapZero = NULL;
+    mTextureExternalZero = NULL;
 
     delete mVertexDataManager;
     delete mIndexDataManager;
@@ -679,10 +679,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);
@@ -709,7 +709,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;
@@ -923,42 +923,42 @@
 {
     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::bindTexture3D(GLuint texture)
 {
 	mResourceManager->checkTextureAllocation(texture, TEXTURE_3D);
 
-	mState.samplerTexture[TEXTURE_3D][mState.activeSampler].set(getTexture(texture));
+	mState.samplerTexture[TEXTURE_3D][mState.activeSampler] = getTexture(texture);
 }
 
 void Context::bindReadFramebuffer(GLuint framebuffer)
@@ -983,7 +983,7 @@
 
 void Context::bindRenderbuffer(GLuint renderbuffer)
 {
-    mState.renderbuffer.set(getRenderbuffer(renderbuffer));
+    mState.renderbuffer = getRenderbuffer(renderbuffer);
 }
 
 void Context::useProgram(GLuint program)
@@ -1027,7 +1027,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);
         }
@@ -1061,7 +1061,7 @@
     }
 
     // Set query as active for specified target
-    mState.activeQuery[qType].set(queryObject);
+    mState.activeQuery[qType] = queryObject;
 
     // Begin query
     queryObject->begin();
@@ -1083,7 +1083,7 @@
         ASSERT(false);
     }
 
-    Query *queryObject = mState.activeQuery[qType].get();
+    Query *queryObject = mState.activeQuery[qType];
 
     if(queryObject == NULL)
     {
@@ -1092,7 +1092,7 @@
 
     queryObject->end();
 
-    mState.activeQuery[qType].set(NULL);
+    mState.activeQuery[qType] = NULL;
 }
 
 void Context::setFramebufferZero(Framebuffer *buffer)
@@ -1103,7 +1103,7 @@
 
 void Context::setRenderbufferStorage(RenderbufferStorage *renderbuffer)
 {
-    Renderbuffer *renderbufferObject = mState.renderbuffer.get();
+    Renderbuffer *renderbufferObject = mState.renderbuffer;
     renderbufferObject->setStorage(renderbuffer);
 }
 
@@ -1157,12 +1157,12 @@
 
 Buffer *Context::getArrayBuffer()
 {
-    return mState.arrayBuffer.get();
+    return mState.arrayBuffer;
 }
 
 Buffer *Context::getElementArrayBuffer()
 {
-    return mState.elementArrayBuffer.get();
+    return mState.elementArrayBuffer;
 }
 
 Program *Context::getCurrentProgram()
@@ -1198,15 +1198,15 @@
     {
         switch (type)
         {
-        case TEXTURE_2D: return mTexture2DZero.get();
-		case TEXTURE_3D: return mTexture3DZero.get();
-        case TEXTURE_CUBE: return mTextureCubeMapZero.get();
-        case TEXTURE_EXTERNAL: return mTextureExternalZero.get();
+        case TEXTURE_2D: return mTexture2DZero;
+		case TEXTURE_3D: return mTexture3DZero;
+        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)
@@ -2001,7 +2001,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)
     {
@@ -2717,19 +2717,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;
         }
     }
 }
@@ -2746,7 +2746,7 @@
         {
             if(mState.samplerTexture[type][sampler].name() == texture)
             {
-                mState.samplerTexture[type][sampler].set(NULL);
+                mState.samplerTexture[type][sampler] = NULL;
             }
         }
     }
diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp
index 5e7a7c7..a604563 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/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,7 +401,7 @@
 
 GLenum Framebuffer::getImplementationColorReadFormat()
 {
-	Renderbuffer *colorbuffer = mColorbufferPointer.get();
+	Renderbuffer *colorbuffer = mColorbufferPointer;
 	
 	if(colorbuffer)
 	{
@@ -423,7 +423,7 @@
 
 GLenum Framebuffer::getImplementationColorReadType()
 {
-	Renderbuffer *colorbuffer = mColorbufferPointer.get();
+	Renderbuffer *colorbuffer = mColorbufferPointer;
 	
 	if(colorbuffer)
 	{
@@ -445,11 +445,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/libGLESv2/Renderbuffer.cpp b/src/OpenGL/libGLESv2/Renderbuffer.cpp
index 221352b..d250869 100644
--- a/src/OpenGL/libGLESv2/Renderbuffer.cpp
+++ b/src/OpenGL/libGLESv2/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 @@
 
 RenderbufferTexture3D::RenderbufferTexture3D(Texture3D *texture)
 {
-	mTexture3D.set(texture);
+	mTexture3D = texture;
 }
 
 RenderbufferTexture3D::~RenderbufferTexture3D()
 {
-	mTexture3D.set(NULL);
+	mTexture3D = NULL;
 }
 
 // Textures need to maintain their own reference count for references via
@@ -206,12 +206,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/libGLESv2/VertexDataManager.cpp b/src/OpenGL/libGLESv2/VertexDataManager.cpp
index 37875c0..800ddfa 100644
--- a/src/OpenGL/libGLESv2/VertexDataManager.cpp
+++ b/src/OpenGL/libGLESv2/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)
                 {
