public GPSOffice(String[] args) throws IOException, NotBoundException {
		// Parse command line arguments
		if (args.length != 5) {
			throw new IllegalArgumentException(
					"Usage: java Start GPSOffice <hostName> <portNumber> <officeName> <X> <Y>");
		}
		hostName = args[0];
		portNumber = parseInt(args[1], "portNumber");
		officeName = args[2];
		X = parseDouble(args[3], "X-Coordinate");
		Y = parseDouble(args[4], "Y-Coordinate");

		// Get a proxy for the Registry Server.
		registry = new RegistryProxy(hostName, portNumber);

		threadPool = Executors.newSingleThreadScheduledExecutor();

		// Prepare to generate remote events.
		eventGenerator = new RemoteEventGenerator<TrackPackage>();

		// Export this GPSOffice node.
		UnicastRemoteObject.exportObject(this, 0);

		// Bind this GPSOffice node into the Registry Server.
		try {
			registry.bind(officeName, this);

			// Fetches the list of nodes bound in the registry and updates the
			// neighbor of each GPSOffice.
			List<String> listOfOffices1 = registry.list();
			Iterator<String> iter1 = listOfOffices1.iterator();

			while (iter1.hasNext()) {

				GPSOfficeRef neighbor1 = (GPSOfficeRef) registry.lookup(iter1
						.next());
				neighbor1.updateNeighbors();
			}

		} catch (AlreadyBoundException e) {
			try {
				UnicastRemoteObject.unexportObject(this, true);
			} catch (NoSuchObjectException e1) {

			}
			throw new IllegalArgumentException("GPSOffice(): <officeName> = "
					+ officeName + " already exists");
		} catch (RemoteException e) {

			try {
				UnicastRemoteObject.unexportObject(this, true);
			} catch (NoSuchObjectException e1) {

			}
			throw e;
		}
	}