public EncryptedDeck requestEncDeck(User reqUser, EncryptedDeck encDeck)
			throws IOException, InterruptedException {

		Notification not = new Notification();
		encryptedDeck = null;
		final Subscription encSub = elvin.subscribe(NOT_TYPE + " == '"
				+ ENCRYPT_DECK_REPLY + "' && " + GAME_ID + " == '"
				+ gameHost.getID() + "'");

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

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

				try {
					encryptedDeck = (EncryptedDeck) Passable
							.readObject(tmpBytes);
				} catch (Exception e1) {
					shutdown();
					System.exit(-2);
				}

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

			}
		});

		// construct the notification to send
		not.set(NOT_TYPE, ENCRYPT_DECK_REQUEST);
		not.set(GAME_ID, gameHost.getID());
		not.set(REQ_USER, reqUser.getID());
		not.set(ENCRYPTED_DECK, encDeck.writeObject());

		synchronized (encSub) {
			// send notification
			elvin.send(not);
			System.out.println("Sending encrypt deck request to user - "
					+ reqUser.getID());

			// wait until received reply
			encSub.wait();
		}

		encSub.remove();

		return encryptedDeck;
	}