public String passQuery(int otherServer, String query) {
		String server = my_tm.serverList.get(otherServer).getAddress();
		int port = my_tm.serverList.get(otherServer).getPort();
		Message msg = null;
		try {
			// Check SocketList for an existing socket, else create and add new
			if (!sockList.hasSocket(otherServer)) {
				// Create new socket, add it to SocketGroup
				System.out.println("Connecting to " + server +
								   " on port " + port);
				Socket sock = new Socket(server, port);
				sockList.addSocketObj(otherServer, new SocketObject(sock,
																	new ObjectOutputStream(sock.getOutputStream()),	
																	new ObjectInputStream(sock.getInputStream())));
				// If pushing updates for view consistency testing, do it now
				if (!hasUpdated && (my_tm.validationMode == 1 || my_tm.validationMode == 2)) {
					// Instead of contacting the Policy Server to force an
					// update, in deferred proofs we merely need at least one
					// server to have a differing policy version.
					if (my_tm.policyPush == 1) { // if policyPush == 0, no push
						transactionPolicyVersion++;
					}
					hasUpdated = true; // This only needs to be done once
				}
			}

			// Send query
			msg = new Message(query);
			latencySleep(); // Simulate latency to other server
			sockList.get(otherServer).output.writeObject(msg);
			msg = (Message)sockList.get(otherServer).input.readObject();
			System.out.println("Server " + otherServer +
							   " says: " + msg.theMessage +
							   " for passed query " + query);
			// else it is an ABORT, no need to log, will be handled by RobotThread
			return msg.theMessage;
		}
		catch (ConnectException ce) {
			System.err.println(ce.getMessage() +
							   ": Check server address and port number.");
			ce.printStackTrace(System.err);
		}
		catch (Exception e) {
			System.err.println("Error during passQuery(): " + e.getMessage());
			e.printStackTrace(System.err);
		}
		return "FAIL";
	}