private void processMessage(Message message) throws Exception {

			messageCount++;
			int myUID = Integer.parseInt(nodeID);
			int incomingUID = Integer.parseInt(message.senderUId);

			if (message.type == MessageType.ELECTED) {
				overseer.reportCount(++messageCount);
				log("killing self");
				relayElected();
				LocateRegistry.getRegistry(IOverseer.REG_PORT).unbind(nodeID);
				if (nodeState == NodeState.LEADER)
					overseer.ringDestroyed();
				System.exit(0);
				return;
			}

			// Eat up messages meant for inferior nodes if you have moved on to
			// the next round.
			if (round > message.round && myUID > incomingUID)
				return;

			switch (message.direction) {
			case LEFT:
				doAction(message, myUID, incomingUID, leftStub, rightStub);
				break;
			case RIGHT:
				doAction(message, myUID, incomingUID, rightStub, leftStub);
			}

			if (inCount == 2 && nodeState == NodeState.READY) {
				inCount = 0;
				round += 1;
				invoke(leftStub,
						new Message(nodeID, round, (int) Math.pow(2, round),
								MessageType.SEND, Direction.RIGHT));
				invoke(rightStub,
						new Message(nodeID, round, (int) Math.pow(2, round),
								MessageType.SEND, Direction.LEFT));
			}
		}