@Override
	public boolean transferAccount(String pUsername, String pPassword, String pOldIPAddress, String pNewIPAddress) 
	{
		if((pUsername.charAt(0) > 'Z' && pUsername.charAt(0) < 'a') || pUsername.charAt(0) < 'A' || pUsername.charAt(0) > 'z')
		{
			aLog.info("Error Transferring Account : Username cannot start with " + pUsername.charAt(0));
			return false;
		}
		Account tmpAccount = getAccount(pUsername);
		if(tmpAccount == null)
		{
			aLog.info("Error Transferring Account : Username Was Not Found");
			tmpAccount = null;
			return false;
		}
		if(!tmpAccount.getPassword().equals(pPassword))
		{
			aLog.info("Error Transferring Account : Incorrect Password");
			tmpAccount = null;
			return false;
		}
		if(!validate(pOldIPAddress))
		{
			aLog.info("Error Transferring Account : Invalid IP-address");
			tmpAccount = null;
			return false;
		}
		if(!tmpAccount.getIPAddress().equals(pOldIPAddress))
		{
			aLog.info("Error Transferring Account : Nonmatching IP-address");
			tmpAccount = null;
			return false;
		}
		if(!validate(pNewIPAddress))
		{
			aLog.info("Error Transferring Account : Invalid New IP-address");
			tmpAccount = null;
			return false;
		}
			synchronized(this)
			{
				if(aDatabase.get(String.valueOf(pUsername.toUpperCase().charAt(0))).remove(tmpAccount))
				{
					aLog.info("Player Account Deleted :\nUsername \"" +  pUsername +  "\", Password \"" + pPassword + "\", IP-address \"" + pOldIPAddress + "\"");
					DatagramSocket datagramSocket;
					DatagramPacket requestToTransfer;
					byte [] message;
					String data;
					int aPortNumber;
					// Send the request to transfer to the geo location specified by the given pNewIPAddress
					if(pNewIPAddress.length() >= 3 && pNewIPAddress.substring(0,3).equals(Parameters.GeoLocationOfGameServerNA))
						aPortNumber = Parameters.UDP_PORT_REPLICA_A_NA;
					else if(pNewIPAddress.length() >= 2 && pNewIPAddress.substring(0,2).equals(Parameters.GeoLocationOfGameServerEU))
						aPortNumber = Parameters.UDP_PORT_REPLICA_A_EU;
					else if(pNewIPAddress.length() >= 3 && pNewIPAddress.substring(0,3).equals(Parameters.GeoLocationOfGameServerAS))
						aPortNumber = Parameters.UDP_PORT_REPLICA_A_AS;
					else
					{
						aLog.info("Error Transferring Account : Invalid GeoLocation");
						return false;
					}
					try 
					{
						datagramSocket = new DatagramSocket();
						data = Parameters.METHOD_CODE.TRANSFER_ACCOUNT.name() + Parameters.UDP_PARSER +
									tmpAccount.getFirstName() + Parameters.UDP_PARSER +
									tmpAccount.getLastName() + Parameters.UDP_PARSER +
									Integer.toString(tmpAccount.getAge()) + Parameters.UDP_PARSER +
									pUsername + Parameters.UDP_PARSER +
									pPassword + Parameters.UDP_PARSER +
									pNewIPAddress;
						message = data.getBytes();
						requestToTransfer = new DatagramPacket(message, message.length, InetAddress.getByName("localhost"), aPortNumber);
						datagramSocket.send(requestToTransfer);
						datagramSocket.close();
					} catch (SocketException e) {
						aLog.info("Error Transferring Account : removal faild");
						return false;
					} catch (IOException e) {
						aLog.info("Error Transferring Account : removal faild");
						return false;
					}
				}
			}		
			aLog.info("Player Account Transferred :\nUsername \"" +  pUsername +  "\", Password \"" + pPassword + "\", IP-address \"" + pNewIPAddress + "\"");
			return true;
	}