public void retrieveParty(byte world, int id, EventBus eventBus, Handler<Party> doneHandler) {
		Byte worldKey = EventAddresses.worldKey(world);
		Integer idKey = EventAddresses.partyKey(id);
		Map<Integer, Party> worldParties = loadedParties.get(worldKey);
		boolean registerWorld = false;
		if (worldParties == null) {
			registerWorld = true;
			worldParties = new HashMap<>();
			loadedParties.put(worldKey, worldParties);
		}

		Party p = worldParties.get(idKey);
		if (p != null) {
			p.addOnLoaded(doneHandler);
		} else {
			Party newParty = new Party();
			worldParties.put(idKey, newParty);
			Map<String, Object> txBson = new HashMap<>();
			txBson.put("op", "load");
			txBson.put("id", idKey);

			eventBus.sendWithTimeout(String.format(EventAddresses.PARTY_REQUEST, worldKey), txBson, TIMEOUT, (AsyncResult<Message<Buffer>> result) -> {
				//send a request to other threads to obtain party info
				if (result.succeeded()) {
					Map<String, Object> rxBson = BSON.decode(result.result().body());
					// TODO: load party information from rxBson
					newParty.setLoaded(true);
				} else {
					//no one else has the party
					//TODO: load party information from database
					newParty.setLoaded(true);
				}
				doneHandler.handle(newParty);
			});
			if (registerWorld)
				//if we haven't already, register a party request handler for this world
				registerWorld(eventBus, worldKey);
		}
	}