diff --git a/src/OpenGL/libGLESv2/Fence.cpp b/src/OpenGL/libGLESv2/Fence.cpp
index 31c3bf6..17a2228 100644
--- a/src/OpenGL/libGLESv2/Fence.cpp
+++ b/src/OpenGL/libGLESv2/Fence.cpp
@@ -1,132 +1,135 @@
-// SwiftShader Software Renderer
-//
-// Copyright(c) 2005-2012 TransGaming Inc.
-//
-// All rights reserved. No part of this software may be copied, distributed, transmitted,
-// transcribed, stored in a retrieval system, translated into any human or computer
-// language by any means, or disclosed to third parties without the explicit written
-// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
-// or implied, including but not limited to any patent rights, are granted to you.
-//
-
-// Fence.cpp: Implements the Fence class, which supports the GL_NV_fence extension.
-
-#include "Fence.h"
-
-#include "main.h"
-#include "Common/Thread.hpp"
-
-namespace es2
-{
-
-Fence::Fence()
-{ 
-    mQuery = false;
-    mCondition = GL_NONE;
-    mStatus = GL_FALSE;
-}
-
-Fence::~Fence()
-{
-    mQuery = false;
-}
-
-GLboolean Fence::isFence()
-{
-    // GL_NV_fence spec:
-    // A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an existing fence.
-    return mQuery;
-}
-
-void Fence::setFence(GLenum condition)
-{
-    if(condition != GL_ALL_COMPLETED_NV)
-    {
-        return error(GL_INVALID_VALUE);
-    }
-
-    mQuery = true;
-    mCondition = condition;
-    mStatus = GL_FALSE;
-}
-
-GLboolean Fence::testFence()
-{
-    if(!mQuery)
-    {
-        return error(GL_INVALID_OPERATION, GL_TRUE);
-    }
-
-    // The current assumtion is that no matter where the fence is placed, it is
-    // done by the time it is tested, which is similar to Context::flush(), since
-    // we don't queue anything without processing it as fast as possible.
-    mStatus = GL_TRUE;
-
-    return mStatus;
-}
-
-void Fence::finishFence()
-{
-    if(!mQuery)
-    {
-        return error(GL_INVALID_OPERATION);
-    }
-
-    while(!testFence())
-    {
-        sw::Thread::yield();
-    }
-}
-
-void Fence::getFenceiv(GLenum pname, GLint *params)
-{
-    if(!mQuery)
-    {
-        return error(GL_INVALID_OPERATION);
-    }
-
-    switch (pname)
-    {
-    case GL_FENCE_STATUS_NV:
-		{
-			// GL_NV_fence spec:
-			// Once the status of a fence has been finished (via FinishFenceNV) or tested and the returned status is TRUE (via either TestFenceNV
-			// or GetFenceivNV querying the FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
-			if(mStatus)
-			{
-				params[0] = GL_TRUE;
-				return;
-			}
-            
-			mStatus = testFence();
-
-			params[0] = mStatus;            
-			break;
-		}
-    case GL_FENCE_CONDITION_NV:
-        params[0] = mCondition;
-        break;
-    default:
-        return error(GL_INVALID_ENUM);
-        break;
-    }
-}
-
-FenceSync::FenceSync(GLuint name, GLenum condition, GLbitfield flags) : NamedObject(name), mCondition(condition), mFlags(flags)
-{
-}
-
-FenceSync::~FenceSync()
-{
-}
-
-GLenum FenceSync::clientWait(GLbitfield flags, GLuint64 timeout)
-{
-	return GL_TRUE;
-}
-
-void FenceSync::serverWait(GLbitfield flags, GLuint64 timeout)
-{
-}
-
-}
+// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Fence.cpp: Implements the Fence class, which supports the GL_NV_fence extension.
+
+#include "Fence.h"
+
+#include "main.h"
+#include "Common/Thread.hpp"
+
+namespace es2
+{
+
+Fence::Fence()
+{
+	mQuery = false;
+	mCondition = GL_NONE;
+	mStatus = GL_FALSE;
+}
+
+Fence::~Fence()
+{
+	mQuery = false;
+}
+
+GLboolean Fence::isFence()
+{
+	// GL_NV_fence spec:
+	// A name returned by GenFencesNV, but not yet set via SetFenceNV, is not the name of an existing fence.
+	return mQuery;
+}
+
+void Fence::setFence(GLenum condition)
+{
+	if(condition != GL_ALL_COMPLETED_NV)
+	{
+		return error(GL_INVALID_VALUE);
+	}
+
+	mQuery = true;
+	mCondition = condition;
+	mStatus = GL_FALSE;
+}
+
+GLboolean Fence::testFence()
+{
+	if(!mQuery)
+	{
+		return error(GL_INVALID_OPERATION, GL_TRUE);
+	}
+
+	// The current assumtion is that no matter where the fence is placed, it is
+	// done by the time it is tested, which is similar to Context::flush(), since
+	// we don't queue anything without processing it as fast as possible.
+	mStatus = GL_TRUE;
+
+	return mStatus;
+}
+
+void Fence::finishFence()
+{
+	if(!mQuery)
+	{
+		return error(GL_INVALID_OPERATION);
+	}
+
+	while(!testFence())
+	{
+		sw::Thread::yield();
+	}
+}
+
+void Fence::getFenceiv(GLenum pname, GLint *params)
+{
+	if(!mQuery)
+	{
+		return error(GL_INVALID_OPERATION);
+	}
+
+	switch(pname)
+	{
+	case GL_FENCE_STATUS_NV:
+		{
+			// GL_NV_fence spec:
+			// Once the status of a fence has been finished (via FinishFenceNV) or tested and the returned status is TRUE (via either TestFenceNV
+			// or GetFenceivNV querying the FENCE_STATUS_NV), the status remains TRUE until the next SetFenceNV of the fence.
+			if(mStatus)
+			{
+				params[0] = GL_TRUE;
+				return;
+			}
+
+			mStatus = testFence();
+
+			params[0] = mStatus;
+			break;
+		}
+	case GL_FENCE_CONDITION_NV:
+		params[0] = mCondition;
+		break;
+	default:
+		return error(GL_INVALID_ENUM);
+		break;
+	}
+}
+
+FenceSync::FenceSync(GLuint name, GLenum condition, GLbitfield flags) : NamedObject(name), mCondition(condition), mFlags(flags)
+{
+}
+
+FenceSync::~FenceSync()
+{
+}
+
+GLenum FenceSync::clientWait(GLbitfield flags, GLuint64 timeout)
+{
+	return GL_TRUE;
+}
+
+void FenceSync::serverWait(GLbitfield flags, GLuint64 timeout)
+{
+}
+
+}
