public void multicast(String groupName, TimeStampedMessage message, boolean includeSelf) {
		if (!(clockService instanceof VectorClock)) {
			System.out.println("Please use vector clock to use multicast feature.");
			return;
		}
		List<String> destinationNodeNames = groupMembers.get(groupName);
		VectorClock groupClock = clockServiceGroups.get(groupName);

		// Increment sequence number
		sequenceNumber.incrementAndGet();
		if (includeSelf) {
			// Increment timestamp
			groupClock.incrementAndGetTimeStamp();
			printTimeStamp();
		}

		/*
		 * Multicast to the target group by sequentially send messages to
		 * everyone in the list (with same message sequence number)
		 */
		// CO-deliver itself
		if (includeSelf) {
			TimeStampedMessage newMessage = new TimeStampedMessage(message);
			newMessage.setSource(localName);
			newMessage.setSequenceNumber(sequenceNumber.get());
			newMessage.setDestination(localName);
			newMessage.setTimeStamp(groupClock.getTimeStamp());
			handleReceiveMulticastMessage(newMessage);
		}
		for (String nodeName : destinationNodeNames) {
			if (!nodeName.equals(localName)) {
				TimeStampedMessage newMessage = new TimeStampedMessage(message);
				newMessage.setSource(localName);
				newMessage.setSequenceNumber(sequenceNumber.get());
				newMessage.setDestination(nodeName);
				newMessage.setTimeStamp(groupClock.getTimeStamp());
				send(newMessage, getNodeIndex(nodeName), true);
			}
		}
		// Print a command line if it is called from CO-multicast
		if (!includeSelf) {
			System.out.print(commandPrompt);
		}
	}