diff --git a/src/Common/Socket.cpp b/src/Common/Socket.cpp
index a0ac3f4..a19f574 100644
--- a/src/Common/Socket.cpp
+++ b/src/Common/Socket.cpp
@@ -1,106 +1,109 @@
-// 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.
-//
-
-#include "Socket.hpp"
-
-#if defined(_WIN32)
-	#include <ws2tcpip.h>
-#else
-	#include <unistd.h>
-	#include <netdb.h>
-	#include <netinet/in.h>
-#endif
-
-namespace sw
-{
-	Socket::Socket(SOCKET socket) : socket(socket)
-	{
-	}
-
-	Socket::Socket(const char *address, const char *port)
-	{
-		#if defined(_WIN32)
-			socket = INVALID_SOCKET;
-		#else
-			socket = -1;
-		#endif
-
-		addrinfo hints = {};
-		hints.ai_family = AF_INET;
-		hints.ai_socktype = SOCK_STREAM;
-		hints.ai_protocol = IPPROTO_TCP;
-		hints.ai_flags = AI_PASSIVE;
-
-		addrinfo *info = 0;
-		getaddrinfo(address, port, &hints, &info);
-
-		if(info)
-		{
-			socket = ::socket(info->ai_family, info->ai_socktype, info->ai_protocol);
-			bind(socket, info->ai_addr, (int)info->ai_addrlen);
-		}
-	}
-
-	Socket::~Socket()
-	{
-		#if defined(_WIN32)
-			closesocket(socket);
-		#else
-			close(socket);
-		#endif
-	}
-
-	void Socket::listen(int backlog)
-	{
-		::listen(socket, backlog);
-	}
-
-	bool Socket::select(int us)
-	{
-		fd_set sockets;
-		FD_ZERO(&sockets);
-		FD_SET(socket, &sockets);
-		
-		timeval timeout = {us / 1000000, us % 1000000};
-
-		return ::select(FD_SETSIZE, &sockets, 0, 0, &timeout) >= 1;
-	}
-
-	Socket *Socket::accept()
-	{
-		return new Socket(::accept(socket, 0, 0));
-	}
-
-	int Socket::receive(char *buffer, int length)
-	{
-		return recv(socket, buffer, length, 0);
-	}
-
-	void Socket::send(const char *buffer, int length)
-	{
-		::send(socket, buffer, length, 0);
-	}
-
-	void Socket::startup()
-	{
-		#if defined(_WIN32)
-			WSADATA winsockData;
-			WSAStartup(MAKEWORD(2, 2), &winsockData);
-		#endif
-	}
-
-	void Socket::cleanup()
-	{
-		#if defined(_WIN32)
-			WSACleanup();
-		#endif
-	}
-}
+// 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.
+
+#include "Socket.hpp"
+
+#if defined(_WIN32)
+	#include <ws2tcpip.h>
+#else
+	#include <unistd.h>
+	#include <netdb.h>
+	#include <netinet/in.h>
+#endif
+
+namespace sw
+{
+	Socket::Socket(SOCKET socket) : socket(socket)
+	{
+	}
+
+	Socket::Socket(const char *address, const char *port)
+	{
+		#if defined(_WIN32)
+			socket = INVALID_SOCKET;
+		#else
+			socket = -1;
+		#endif
+
+		addrinfo hints = {};
+		hints.ai_family = AF_INET;
+		hints.ai_socktype = SOCK_STREAM;
+		hints.ai_protocol = IPPROTO_TCP;
+		hints.ai_flags = AI_PASSIVE;
+
+		addrinfo *info = 0;
+		getaddrinfo(address, port, &hints, &info);
+
+		if(info)
+		{
+			socket = ::socket(info->ai_family, info->ai_socktype, info->ai_protocol);
+			bind(socket, info->ai_addr, (int)info->ai_addrlen);
+		}
+	}
+
+	Socket::~Socket()
+	{
+		#if defined(_WIN32)
+			closesocket(socket);
+		#else
+			close(socket);
+		#endif
+	}
+
+	void Socket::listen(int backlog)
+	{
+		::listen(socket, backlog);
+	}
+
+	bool Socket::select(int us)
+	{
+		fd_set sockets;
+		FD_ZERO(&sockets);
+		FD_SET(socket, &sockets);
+
+		timeval timeout = {us / 1000000, us % 1000000};
+
+		return ::select(FD_SETSIZE, &sockets, 0, 0, &timeout) >= 1;
+	}
+
+	Socket *Socket::accept()
+	{
+		return new Socket(::accept(socket, 0, 0));
+	}
+
+	int Socket::receive(char *buffer, int length)
+	{
+		return recv(socket, buffer, length, 0);
+	}
+
+	void Socket::send(const char *buffer, int length)
+	{
+		::send(socket, buffer, length, 0);
+	}
+
+	void Socket::startup()
+	{
+		#if defined(_WIN32)
+			WSADATA winsockData;
+			WSAStartup(MAKEWORD(2, 2), &winsockData);
+		#endif
+	}
+
+	void Socket::cleanup()
+	{
+		#if defined(_WIN32)
+			WSACleanup();
+		#endif
+	}
+}
