Changes With Apache Tuscany SCA 2.0-M2 April 2009
=================================================

Highlights include:
- OSGi Enhancements including support for <implementation.osgi> and a new OSGi RFC119 prototype
- Many updates towards support for OASIS OpenCSA specification and the use OASIS namespaces and schemas
- Start to implement the SCA policy framework 1.1 spec draft from OASIS OpenCSA
- New Endpoint and EndpoitReference structures
- Webapps integration support including <implementation.web> and the web application composite along 
- with support for various web technologies and frameworks including JSP support, JSF support with
- Apache MyFaces, and integration with the Stripes Web Framework
- New Maven Archetypes to make developing SCA applications easier, 
  see http://cwiki.apache.org/confluence/display/TUSCANYWIKI/Tuscany+Maven+Archetypes

Changes With Apache Tuscany SCA 2.0-M1 February 2009
====================================================

  The first milestone release for the 2.0 codebase 

  Features and/or Enhancements

  * SCA Specification support
    - The change over from OSOA SCA specification support to OASIS SCA 
      specification support is now in progress. As such we don't claim to 
      support either the OSOA or OASIS SCA specifications in the 
      2.0 codebase yet. 

  * Core
    - Enable Tuscany to run inside an OSGi runtime
    - Updated SCA API package names. 
     
  * Other Extensions
    - Binding RMI
	- RMI Binding
    - Binding WS
        - WebServices Binding

  * Samples/Tutorial/Demos
	- binding-ws-calculator/
	- calculator/
	- calculator-equinox/
	- calculator-osgi/
	- calculator-rmi-reference/
	- calculator-rmi-service/
	- implementation-java-calculator
