public void multiSend(TimeStampedMessage message, String groupID) throws IllegalArgumentException
    {   
    	List<String> groupList = conf.groupMap.get(groupID);
    	Iterator<String> it = groupList.iterator();
    	if (message == null ) {
            return;
        }
        
        // check and update configuration file
        checkReloadConf();
        
        // set Seq and Src
        this.currentSeqNum++;
        message.set_seqNum(this.currentSeqNum);
        message.set_source(this.local_name);
    	//Check if node is part of group
    	if(!groupList.contains(local_name))
    		throw new IllegalArgumentException("Not Part of Group");
    	
    	//Increment sendSeqNumber for this group
    	groupSendSeqTracker.put(groupID, groupSendSeqTracker.get(groupID) + 1 );
    	
    	//Update This group's clock
    	multiVectorClockMap.get(groupID).updateClockOnSend();
    	
    	//Add Clock to message
    	message.setTimeStamp(multiVectorClockMap.get(groupID).getCurrentTimeStamp());

    	
    	//Send MultiCastMessage to each node in group including yourself
    	while(it.hasNext())
    	{
    		message.setDest(it.next());
    		MultiCastMessage M = new MultiCastMessage(message);
    		//System.out.println("## in mutlsend: M \t"+M.toString());
    		M.setGroupID(groupID);
    		M.setACKs(new HashMap<String,AtomicInteger>(recvSeqTracker.get(groupID)));
    		M.setMessageType(MessageType.MULTICAST);
    		M.setControlType(ControlType.NORMAL);
    		M.setMulticastSeq(groupSendSeqTracker.get(groupID).intValue());
    		try {
				InternalSend(M);
				System.out.println(M.toString());
			} catch (UnknownHostException e) 
			{
				System.out.println("Remote Peer Unknown");
				e.printStackTrace();
			}
    	}
    	
    	message.setDest("none");
		MultiCastMessage M = new MultiCastMessage(message);
		M.setGroupID(groupID);
		M.setACKs(recvSeqTracker.get(groupID));
    	sentMessageCache.get(groupID).put(groupSendSeqTracker.get(groupID) % CacheSize, M);
    }