Apache Felix Karaf
Copyright 2010 The Apache Software Foundation


I. Included Software

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
Licensed under the Apache License 2.0.

This product includes software from http://www.json.org.
Copyright (c) 2002 JSON.org

This product includes software written by
Antony Lesuisse.
Licensed under Public Domain.


II. Used Software

This product uses software developed at
The OSGi Alliance (http://www.osgi.org/).
Copyright (c) OSGi Alliance (2000, 2010).
Licensed under the Apache License 2.0.


III. License Summary
- Apache License 2.0
- JSON License
- Public Domain
