Apache Taverna Language
Copyright 2014-2018 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 2010-2014 University of Manchester, UK
These have been licensed to the Apache Software Foundation under a software grant.

-----------------------------------------------------------------------------------
	
./taverna-robundle/src/main/resources/ontologies/ro.owl
./taverna-scufl2-wfdesc/src/main/java/org/apache/taverna/scufl2/wfdesc/ontologies/Wf4ever.java
./taverna-scufl2-wfdesc/src/main/java/org/apache/taverna/scufl2/wfdesc/ontologies/Wfdesc.java
./taverna-scufl2-wfdesc/src/main/java/org/apache/taverna/scufl2/wfdesc/ontologies/Wfprov.java
./taverna-scufl2-wfdesc/src/main/java/org/apache/taverna/scufl2/wfdesc/ontologies/Roterms.java

This work (Java classes) are derivatives from original OWL ontologies:

	Wf4Ever Research Object Model 1.0
	https://w3id.org/ro/
	
	wfdesc ontology
	https://w3id.org/ro/wfdesc
	
	wfprov ontology
	https://w3id.org/ro/wfprov
	
	roterms ontology
	http://purl.org/wf4ever/roterms
	
	wf4ever ontology
	https://w3id.org/ro/wf4ever
	
	Copyright (c) 2011-2014
	  Stian Soiland-Reyes, University of Manchester
	  Sean Bechhofer, University of Manchester
	  Khalid Belhajjame, University of Manchester
	  Graham Klyne, University of Oxford
	  Daniel Garijo, UPM
	  Oscar Corcho, UPM
	  Esteban Garcia Cuesta, iSOCO
	  Raul Palma, PSNC
	
	Original work used according to 
	Creative Commons Attribution 3.0 License.
	http://creativecommons.org/licenses/by/3.0/

-----------------------------------------------------------------------------------
