Apache Marmotta
Copyright 2012-2014 The Apache Software Foundation

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

Portions of this software were originally based on the following:

    Copyright 2008-2012 Salzburg Research Forschungsgesellschaft mbH

These have been licensed to the Apache Software Foundation under a software grant.

This product also includes some third-party source components:

 * The module commons/marmotta-commons contains a modified and reduced version
   of the Javolution library. Javolution has copyright (c) 2012, Javolution and
   is licensed under BSD license. The original source code is available from
   http://javolution.org
