Apache Axis2/C Team is pleased to announce the release of Apache Axis2/C 
version 1.5.0.

You can download this release from http://ws.apache.org/axis2/c/download.cgi

Key Features
============

   1. Support for one-way messaging (In-Only) and 
      request response messaging (In-Out)
   
   2. Client APIs : Easy to use service client API and 
   	  more advanced operation client API

   3. Transports supported : HTTP
          * Inbuilt HTTP server called simple axis server
          * Apache2 httpd module called mod_axis2 for server side
          * IIS module for server side. Supports IIS 5.1, 6 and 7.
          * Client transport with ability to enable SSL support
          * Basic HTTP Authentication
          * Digest HTTP Authentication
          * libcurl based client transport

   4. Transports supported : HTTPS
          * HTTPS Transport implementation using OpenSSL

   5. Transports supported : TCP
          * for both client and server side

   6. Transports supported : AMQP
          * AMQP Transport implementation using Apache Qpid
	    * Available only in Linux platforms.	
	    * At an experimental stage. Please refer the INSTALL file to build this.

   7. Transport proxy support (HTTP)
          * Proxy Authentication (Basic/Digest)

   8. Module architecture, mechanism to extend the SOAP processing model.

   9. WS-Addressing support, both the submission (2004/08) and 
   	  final (2005/08) versions, implemented as a module.

  10. MTOM/XOP support.

  11. AXIOM, an XML object model optimized for SOAP 1.1/1.2 messages; 
      This has complete XML infoset support.

  12. XML parser abstraction
          * Libxml2 wrapper
          * Guththila pull parser support

  13. Both directory based and archive based deployment models for deploying 
      services and modules

  14. Description hierarchy providing access to static data of Axis2/C runtime 
  	  (configuration, service groups, services, operations and messages)

  15. Context hierarchy providing access to dynamic 
      Axis2/C runtime information (corresponding contexts to map to 
	  each level of description hierarchy)

  16. Message receiver abstraction
          * Inbuilt raw XML message receiver

  17. Code generation tool for stub and skeleton generation for a given 
      WSDL (based on Java tool)
          *  Axis Data Binding (ADB) support

  18. REST support (more POX like) using HTTP POST, GET, HEAD, PUT and DELETE
          *  Support for RESTful Services

  19. Comprehensive documentation
          * Axis2/C Manual

  20. WS-Policy implementation called Neethi/C, with WS-SecurityPolicy extension


Major Changes Since Last Release
================================

   1. AMQP Transport implementation using Apache Qpid
   2. IIS 6 & 7 Support.
   3. A JScript file for editing registry configurations for IIS module.
   4. Improvements to Guththila
   5. Improvements to TCPMon
   6. Many bug fixes.
   7. Memory leak fixes

We welcome your early feedback on this implementation.

Thanks for your interest in Axis2/C !!!

-- Apache Axis2/C Team -- 


