public Msg process(Msg msg)
	{
		System.out.println("MSG TYPE:"+msg.get_msg_tp());
		Msg ret_msg = new Msg();
		if (msg.get_msg_tp() == MESSAGE_TYPE.LOOKUP)
		{
			String name = msg.getObj_name();
			
			// suppose the remote object is in the registry
			if (reg.get(name) != null)
			{
				
				ret_msg.setRemote_ref(reg.get(name));	
				ret_msg.set_msg_tp(MESSAGE_TYPE.RET_LOOKUP);
				
				return ret_msg;
			}
			
		}
		else if (msg.get_msg_tp() == MESSAGE_TYPE.REBIND)
		{
			String host = msg.getIp() + ":" + Integer.toString(msg.getPort());
			
			reg.put(msg.getObj_name(), msg.getRemote_ref());
			
			reg_server.put(msg.getObj_name(), host);
			System.out.println(" > Rebinding remote object "+msg.getObj_name());
			
			ret_msg.set_msg_tp(MESSAGE_TYPE.RET_REBIND);
		}
		else if (msg.get_msg_tp() == MESSAGE_TYPE.BIND)
		{
			String host = msg.getIp() + ":" + Integer.toString(msg.getPort());
			reg.put(msg.getObj_name(), msg.getRemote_ref());
			
			reg_server.put(msg.getObj_name(), host);
			System.out.println(" > Binding remote object "+msg.getObj_name());
			
			ret_msg.set_msg_tp(MESSAGE_TYPE.RET_BIND);
		}
		else if (msg.get_msg_tp() == MESSAGE_TYPE.LIST)
		{	
			Vector<String> list = new Vector<String>();
			for (String key : reg.keySet()) 
			{
			    list.add(key);
			}
			ret_msg.set_list(list);
			ret_msg.set_msg_tp(MESSAGE_TYPE.RET_BIND);
		}
		
		else if (msg.get_msg_tp() == MESSAGE_TYPE.UNBIND)
		{	
		    String url = msg.getObj_name();
		    this.reg.remove(url);
		    this.reg_server.remove(url);

		    ret_msg.set_msg_tp(MESSAGE_TYPE.RET_UNBIND);
		}
		
		
		return ret_msg;
	}