public void processMulticast(MultiCastMessage msg)
        {
	       	System.out.println("!! Multicast Processing:" );
        	switch (msg.getControlType()) 
	       	{
		       	case NORMAL:
		       	{	
		       		System.out.println("case normal");
		   	    	String sender = msg.getSource();
		   	    	int senderSeq = msg.getMulticastSeq();
		   	    	String groupID = msg.getGroupID();
		   	    	if( checkOne(sender, msg, senderSeq) == 1 && checkACKs(msg) == true)
		   	    	{
		   	    		//Put msg in recvQueue for causal checking
		   	    		recvQueue.offer(new MultiCastMessage(msg));
		   	    		//Put msg in recvCache
		   	    		recvMessageCache.get(groupID).get(sender).put(senderSeq % CacheSize, new MultiCastMessage(msg));
			       		System.out.println("multicast in order, seq->"+senderSeq);
			       		recvSeqTracker.get(groupID).put(sender,new AtomicInteger(senderSeq) );
			       		
			       		checkHoldBackQueue(groupID, sender);
			       		
			       		causalOrder();
		   	    	}
		   	    	else if(checkOne(sender, msg, senderSeq) == 2 || checkACKs(msg) == false)
		   	    	{
		   	    		System.out.println("msg out of order based on sender seq");
		   	    		recvHoldBackQueue.offer(new MultiCastMessage(msg));
		   	    	}
		   	    	break;
		       			
		       	}
		       	
		       	case NACK:
		       		
		       		NACKRequest nackReq = (NACKRequest) msg.data;
		       		String requester = msg.getSource();
		       		String groupID = msg.getGroupID();
		       		String source = nackReq.getSource();
		       		
		       		System.out.println("NACK recved, resending to "+msg.getSource());
		       		for(Integer seq=nackReq.getFirstSeqNum(); seq <= nackReq.getLastSeqNum() ; seq++ )
		       		{
		       			MultiCastMessage tsM = (MultiCastMessage)recvMessageCache.get(groupID).get(source).get(seq);
		       			if(tsM != null)
		       			{
			       			MultiCastMessage reply = new MultiCastMessage(tsM);
			       			
			       			reply.setDest(requester);
			       			
			       			try {
								InternalSend(reply);
							} catch (UnknownHostException e) {
								e.printStackTrace();
							}
		       			}
		       			
		       		}
		       		
		       	   // to do, where to find the sent multicast msg??
		       		break;
		       		
		       	default:
		       		break;
	        }
	       	
        }