public void broadcastPQ(final BigInteger p, final BigInteger q,
			final int numUsers) throws InterruptedException, IOException {

		final Subscription pqSub = elvin.subscribe(NOT_TYPE + " == '"
				+ BROADCAST_PQ_REPLY + "' && " + GAME_ID + " == '"
				+ gameHost.getID() + "'");
		Notification pqnot = new Notification();
		numResponses = 1;

		pqSub.addListener(new NotificationListener() {
			public void notificationReceived(NotificationEvent e) {

				numResponses++;
				if (numResponses >= numUsers) {
					synchronized (pqSub) {
						pqSub.notify();
					}
				}
			}
		});

		pqnot.set(GAME_ID, gameHost.getID());
		pqnot.set(NOT_TYPE, BROADCAST_PQ);
		pqnot.set("p", p.toString());
		pqnot.set("q", q.toString());
		elvin.send(pqnot);

		synchronized (pqSub) {
			elvin.send(pqnot);
			// wait until received reply
			pqSub.wait();
		}

		// short sleep before returning
		Thread.sleep(100);

		return;
	}