code: public void addAddressHeader(String name, Address addr, boolean first)
  			throws IllegalArgumentException {
  
  		checkCommitted();
  		String hName = getFullHeaderName(name);
  
  		if (logger.isDebugEnabled()) {
  			logger.debug("Adding address header [" + hName + "] as first ["
  					+ first + "] value [" + addr + "]");
  		}
  
  		//we should test for
  		//This method can be used with headers which are defined to contain one
  		//or more entries matching (name-addr | addr-spec) *(SEMI generic-param) as defined in RFC 3261
  //		if (!isAddressTypeHeader(hName)) {
  //			logger.error("Header [" + hName + "] is not address type header");
  //			throw new IllegalArgumentException("Header[" + hName
  //					+ "] is not of an address type");
  //		}
  
  		if (isSystemHeaderAndNotGruu(getModifiableRule(hName), (Parameterable)addr.getURI())) {
  			logger.error("Error, can't add system header [" + hName + "]");
  			throw new IllegalArgumentException("Header[" + hName
  					+ "] is system header, cant add, modify it!!!");
  		}
  
  		if (hName.equalsIgnoreCase("From") || hName.equalsIgnoreCase("To")) {
  			logger.error("Error, can't add From or To header [" + hName + "]");
  			throw new IllegalArgumentException(
  					"Can't add From or To header, see JSR 289 Section 4.1.2");
  		}
  
  		try {
  			String nameToAdd = getCorrectHeaderName(hName);
  			Header h = SipFactoryImpl.headerFactory.createHeader(nameToAdd, addr.toString());
  
  			if (first) {
  				this.message.addFirst(h);
  			} else {
  				this.message.addLast(h);
  			}
  		} catch (Exception e) {
  			throw new IllegalArgumentException("Error adding header", e);
  		}
  
  	}
docs: /*
  (non-Javadoc)
  @see javax.servlet.sip.SipServletMessage#addAddressHeader(java.lang.String, javax.servlet.sip.Address, boolean)