I. Included Third-Party Software

This product includes software developed at
The OSGi Alliance (http://www.osgi.org/).
Copyright (c) OSGi Alliance (2000, 2012).
Licensed under the Apache License 2.0. 

II. Used Third-Party Software

This product uses software developed at
The OSGi Alliance (http://www.osgi.org/).
Copyright (c) OSGi Alliance (2000, 2012).
Licensed under the Apache License 2.0. 

This product uses software developed at
The Codehaus (http://www.codehaus.org)
Licensed under the Apache License 2.0.

This product uses software developed at
Open Participation Software for Java (http://www.ops4j.org)
Licensed under the Apache License 2.0.

III. License Summary
- Apache License 2.0

