Apache jUDDI
Copyright 2004-2009 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

This product also includes schemas and specification developed by:
      - the W3C consortium (http://www.w3c.org)
      (http://www.w3.org/XML/1998/namespace)

This product includes schemas and specification developed by Oasis:
      Copyright (c) 2000-2002 by Accenture, Ariba, Inc., Commerce One, Inc.
		Fujitsu Limited, Hewlett-Packard Company, i2 Technologies, Inc., Intel
		Corporation, International Business Machines Corporation, Microsoft
		Corporation, Oracle Corporation, SAP AG, Sun Microsystems, Inc., and
		VeriSign, Inc. All Rights Reserved. Copyright (c) OASIS Open
		2002-2004. 
		
		All Rights Reserved. Version 3.0.2 This document and
		translations of it may be copied and furnished to others, and
		derivative works that comment on or otherwise explain it or assist in
		its implementation may be prepared, copied, published and distributed,
		in whole or in part, without restriction of any kind, provided that
		the above copyright notice and this paragraph are included on all such
		copies and derivative works. However, this document itself may not be
		modified in any way, such as by removing the copyright notice or
		references to OASIS, except as needed for the purpose of developing
		OASIS specifications, in which case the procedures for copyrights
		defined in the OASIS Intellectual Property Rights document must be
		followed, or as required to translate it into languages other than
		English.

This product uses JUnit, which is offered up under the BSD license.


