public EncryptedHand waitEncryptedHand()
			throws InvalidSubscriptionException, IOException,
			InterruptedException {
		
		final Subscription eSub = elvin.subscribe(NOT_TYPE + " == '"
				+ SEND_ENCRYPTED_HAND + "' && " + GAME_ID + " == '"
				+ gameHost.getID() + "' && " + REQ_USER + " == '"
				+ user.getID() + "'");
		encryptedHand = null;
		System.out.println("Waiting for encrypted hand - "
				+ new String(user.getID()));

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

				System.out.println("Got waitEncryptedHand request.");

				byte[] tmpBytes = (byte[]) e.notification.get(ENCRYPTED_HAND);

				try {
					encryptedHand = (EncryptedHand) Passable
							.readObject(tmpBytes);
					if (!sigServ.validateSignature(encryptedHand,
							gameHost.getPublicKey())) {
						// sig failed!
						callCheat(SIGNATURE_FAILED);
					}
				} catch (Exception e1) {
					e1.printStackTrace();
				}

				// notify the waiting thread that a message has arrived
				synchronized (eSub) {
					eSub.notify();
				}

			}
		});

		synchronized (eSub) {
			// wait until received reply
			eSub.wait();
		}

		eSub.remove();
		return encryptedHand;
	}