2.6.3
- Bugfixes
  - Prevent buffer overflow if digest realm too long
  - Ensure path starts with '/' in client data endpoint
  - Java bindings build fix
  - Fix SSL library, usage is not thread safe (vcrhonek)
  - Improve NetBSD and OSX builds (apjanke)
  - Install winrs with correct name and permissions

2.6.2
- Features
  - Install winrs.rb (Windows Remote Shell) to /usr/bin
  - New package: winrs
- Bugfixes
  - Make iniparser thread-safe (Emil Bartczak)
  - Fix excessive RPM rebuilds (Olaf Hering)
  - Fix selector extraction from URI query (Markus Kolb)
  - Fix RPM building on older distributions
  - Fix RPM building on Fedora 22

2.6.1
- Features
  - Add curlopt_nosignal option to openwsman_client.conf to prevent
    CURL crashes in multithreaded client applications
  - Limit EnvelopeSize to 32767 if wsman:MaxEnvelopeSize not set in
    request (WS-Man 1.2 compatibility) (Prabhakar Pujeri)
- Bugfixes
  - fix memory leaks (Vitezslav Crhonek)
  - honor client:agent from openwsman_client.conf
  - fix possible crash in dictionary_get()

2.6.0
- Features
  - Implement DSP 0226 Section 6.3 wsman:Locale
    (wsmc_set_locale, wsmc_get_locale)
  - set transport timeout for c++ binding (prabhakar_pujeri@dell.com)
  - print CIMError code in HTTP header (prabhakar_pujeri@dell.com)

2.5.2
- Features
  - build native Python package (Ahmad Jagot)
- Cleanup
  - remove (unused) 'min_threads' config option (Vitezslav Crhonek)

2.5.1
- Features
  - Allow ';' as separator for URI selectors
    (RFC 1866 section 8.2.1)
  - Warn if ',' is used as selector separator

2.5.0
- Features
  - Rewrite selector and property handling to keep
    them in order (#49)
    Selectors and properties can now handle EndpointReferences
    as values. This increases compatibility with Intel AMT 7.0
    and later.
  - ABI change, .so version 3
  - Ruby: Add EndPointReference#to_s

2.4.15
- Features
  - Ruby: Add Fault#to_s
  - Ruby: Enable ClientOptions#properties=
  - Cim: New config option "cim_client_cql' to select CQL query
    identifier ('CQL' - default, 'DMTF:CQL' - standards-compliant)
- Bugfixes
  - Fix segfault in wsmc_add_property
  - Fix memleak in xpath handling
  - Fix typo in parsing max_connections_per_thread (vcrhonek)
  - Ruby: ClientOptions#properties=

2.4.14
- Features
  - Improved C++ bindings (Peter Hatina)
- Bugfixes
  - Build fixes for Fedora21, RHEL7, and CentOS7
  - option parser accepts '-?' and '--help' as valid

2.4.13
- Features
  - Support Ruby 2.2
- Bugfixes
  - Parsing of vendor namespaces (#48, #38)
  - Client getters memory leaks (#47)
  - Keep order of 'invoke' parameters (#49)

2.4.12
- Features
  - New config option 'ssl_disable_protocols'. Pre-set to disable
    SSLv2 and v3 in SSL mode
  - Ruby: support Ruby 2.1 threading API
- Bugfixes
  - Fix memory corruption due to a malloc made with the wrong size
  - iniparser: dictionary_set' must return a value (David Holm)

2.4.11
- Features
  - Bindings: EndPointReference.selector_names() for Python
- Bugfixes
  - URI parsing: Disallow comma to separate selectors in resource uri,
      only ampersand is allowed. (issue #38)
  - Bindings: Fix Ruby doc generation

2.4.10
- Features
  - Allow to pass EndPointReference instances as invoke() parameters
    via ClientOptions.add_property

2.4.9
- Bugfixes
  - make finding libssl.so.* more robust

2.4.8
- Features
  - Add Fujitsu namespace, cim schema SVS
- Bugfixes
  - client: copy key/value data for options, selectors, and properties
  - fix .spec file for RHEL/Fedora builds

2.4.7
- Bugfixes
  - file authenticator: allow password hash of up to 128 characters
  - libu: don't exit() on malloc errors

2.4.6
- Features
  - Support large hashes (like SHA512) in file authentication
  - use constant-time password compare to prevent brute-force attacks
  - Create server-plugin-ruby as separate RPM
  - Add Unisys namespace and CIM class prefix 'SPAR'
  - Alias openwsman and openwsmand systemd services
  - Also create respective rc-commands: rcopenwsman, rcopenwsmand
    (SUSE only)
- Bugfixes
  - Fix crash on invalide resource URI  
  - Fix resource namespace for DCIM_ classes

2.4.5
- Features
  - enforce SSL operation in systemd service
  - Add /usr/sbin/rcopenwsman for systemd environments
  - New environment variable 'OPENWSMAN_CURL_TRANSPORT_SSLVERSION' to
    select SSL protocol version. Set it to 'tlsv1.2' for TLS-v1.2
    (anstein)
- Bugfixes
  - Fix memory leaks in redirect plugin (Praveen K Paladugu)
  - shttpd: Improve error reporting if SSL context fails
  - Builds on Fedora 20 now

2.4.4
- Security update
  - ws_xml_make_default_prefix() can overflow buf parameter via sprintf()
  - ws_xml_make_default_prefix() can overflow buf parameter via sprintf()
  - wsmc_create_request() potential buf[20] overflow via WSMAN_ACTION_RENEW
  - LocalSubscriptionOpUpdate() unchecked fopen()
  - Incorrect order of sanity guards in wsman_get_fault_status_from_doc()
  - Unchecked memory allocation in wsman_init_plugins(), p->ifc
  - Unchecked memory allocation in mem_double(), newptr
  - Unchecked memory allocation in dictionary_new(), d, d->val, d->key, d->hash
  - Unchecked memory allocation in u_error_new(), *error
  - sighup_handler() in wsmand.c uses unsafe functions in a signal handler
- Features
  - add rcopenwsman command to systemd environments
  - add rcopenwsmand command for backwards compatibility
- Bindings
  - support rdoc 2.1 in Ruby bindings
  - cmake: use PYTHON_INCLUDE_DIRS

2.4.3
- Bugfixes
  - Fix bindings for Java 1.5
  - Raise exception if client creation fails (bindings)

2.4.2
- Standards compliance
  - Honor WS-Management 1.1.1 standard (line 739)
    Disable multiple MessageID checks
- Bugfixes
  - Fix crash in redirect module (typo)

2.4.1
- Build fixes
  - Builds now on SLES11 (cmake 2.4), Fedora 18
  - Fedora 19
    - needs rubypick package
    - has empty ruby_version in CONFIG
  - fix Ruby gem, include version.rb

2.4.0
- Features
  - Add support for OptionSet in SOAP header (breaks ABI)
  - Increase soversion of libwsman_client to 2.0.0
  - new function wsmc_add_option
  - Redirect plugin: Added facilities to import the redirection
    details from an included file (Praveen K Paladugu)
- Bugfixes
  - wsman_transport_set_verify_host passed wrong values to CURL
  - recognize 'Msvc' (Hyper V) and 'DCIM' (Dell Drac) CIM schemata
  - xml_parser_element_dump: fix pointer (github issue #8)
- Bindings
  - Ruby: Fix Ruby 1.9 threading locks for wsmc_action_* functions
  - Ruby: API change: Transport.verify_{host,peer}? return Boolean now
      Transport.verify_peer -> Transport.verify_peer?
      Transport.verify_host -> Transport.verify_host?
  - Support for OptionSet
    - ClientOptions#add_option
    - ClientOptions#options= (Ruby)
  - XmlDoc#to_s returns non-indented xml representation
  - Ruby: Accessors for OptionSet, Selectors, and Properties
    - ClientOptions#options
    - ClientOptions#properties
    - ClientOptions#selectors
  - Define security delivery modes (WSMAN_DELIVERY_SEC_*)
  - Vastly improved bindings documentation
  - Generate documenation with rdoc 1.9
  - Windows Remote Shell client implementation (see ruby/tests/winrs.rb)

2.3.7
- Bugfixes
  - Generate pkgconfig (.pc) files correctly
  - Require SWIG > 2.0.4 for building

2.3.6
- Features
  - Plugins: Ability to redirect requests to a different WS-Management
    server (Praveen Paladugu)
- Bugfixes
  - Fix xml namespace in Fault message (Praveen Paladugu)
  - Pass correct key values when creating a Cim_IndicationSubscription
    (Santosh Bidaralli)
  - verify_class_namespace: properly check for 'CIM' class schema
    (Mayur Bhosle)
  - Fix MaxElements namespace in Pull context (Praveen Paladugu)
- Bindings
  - Ruby: fix crash in Options destructor
  - Ruby: mark passing arrays via invoke as unsupported
- Building
  - new cmake option: BUILD_BINDINGS (defaults to yes)
  - honor BUILD_TESTS for all test directories 
  - fix MaxcOS build (Dan Villiom Podlaski Christiansen)
          
2.3.5
- Bugfixes
  - Release serializer lock only after use (Satya Chittidi)

2.3.4
- Bugfixes
  - Adapt to Swig 2.0.5 bugfix for renamed construtors/destructors.
- Bindings
  - SwigClass.. variables are static now

2.3.3
- Bugfixes
  - Assume 'XPath' as default filter dialect, not 'WQL' (Zoltan Micskei)
  - Fixed enumeration with selector filter returning only one instance. (Zoltan Micskei)
  - mark XPath filtering as not supported (in sfcc)
- Bindings
  - Adapt to Ruby 1.9
  - Disable RDoc for Ruby 1.9
  - WsXmlDoc.to_xml - enforce utf-8 encoding
  - Properly create AssociationInstances(CIM References) /
    AssociatedInstances(CIM Associations) filter
  
2.3.2
- Bugfixes
  - Assume 'XPath' as default filter dialect, not 'WQL' (Zoltan Micskei)
- Bindings
  - Add ClientOptions#flags() (read) and ClientOptions#reset_flags()
  - Add Openwsman#uri_prefix
  - Add Openwsman#create_doc_from_string
  - Provide full EndPointReference handling

2.3.1
- Features
  - switch default CIMOM connection to https on port 5989
    with PAM authentication (this now reflects the default sfcb config)
- Bindings
  - Ruby: Add Openwsman#epr_uri_for
- Bugfixes
  - Fix build issues in .spec file

2.3.0
- Features
  - openSUSE: support systemd
  - provider getter functions for all client and client option string
    values
  - Add ssl-related config options in [cim] section, see openwsman.conf
    ssl = yes/no
    verify_cert = yes/no
    trust_store = /etc/ssl/certs
- Bugfixes
  - Enum/Pull: Fix envelope maxsize handling, return partial result
  - Fix memleaks in client and client option string setters
    (Matthias Bolte)
  - All string value getters (for client and client_opt) return
    copies now
    (found by Matthias Bolte)
  - Define and use PLUGIN_API_VERSION for the server-side plugins
  - Handle optional arguments propertly during client endpoint URI
    creation (Matthias Bolte)
  - Make calls to 'identify' repeatable
  - Destroy serializer lock and client mutex at exit (Bing Liu)
  - Fix leak in wsmc_release (Sanjeev Putta)
  - Allow to reset transport credentials to NULL (Matthias Bolte)
  - Plug memory leaks in wsman-client-transport (Found by Suneet
    Chandok, improved by Matthias Bolte)
  - print warning if event delivery fails
- Bindings
  - Provide Ruby bindings also as GEM
    (-> https://rubygems.org/gems/openwsman)
  - Add Openwsman#create_doc_from_file to read xml files
  - Add XmlNode#next to iterate over children with identical name
  - Add Openwsman#erb_prefix_for to return EPR uri prefixes for
    different CIM schema
  - Ruby: Provide a default implementation of auth_request_callback
  - Ruby: Support Ruby 1.9
  - Expose Openwsman version as OPENWSMAN_VERSION, OPENWSMAN_MAJOR,
    OPENWSMAN_MINOR, OPENWSMAN_PATCH
  - Ruby: expand XmlNode#each to iterate over multiple children of
    same name
  - new test tool: winenum.rb, to enumerate WINRM instances
  - update documentation: Add note about escaping selector values

2.2.7
- Features
  - Rename openwsman-client to libwsman_clientpp since it only
    includes C++ bindings. Split off libwsman_clientpp-devel.
    Move openwsman_client.conf to libwsman1.
  - Performance improvements for Enum (optimized) and Pull requests
    (Srinivas Thirumalaa)
- Bindings
  - Fix all tests
  - Enhance client function documentation
  - Add max_elements, max_envelope_size, fragment, and timeout
    to Options
  - Use optimized enumeration in tests
- Bugfixes
  - Fix memory leaks in wsmc_action_enumerate_and_pull and wsmc_release
    (Matthias Bolte)
  - Fix possible corruption in ws_serializer_free_mem
    (Matthias Bolte)
  - Fix recognition of ntlm and gss-negotiate auth methods when checking
    server-requested vs. client-offered methods.
- Developer
  - Enable client tests
  - Improve Windows build (Matthias Bolte)
  - Reduce libu exposure in the public API (Matthias Bolte)

2.2.6
- Features
  - Add array support for indications (Suresh Sundriyal)
  - Add indication_baseclass_namespace (Till Steinbach, Suresh Sundriyal)
- Bugfix
  - Correctly prefix /etc when CMAKE_INSTALL_PREFIX is not /usr (Chris Poblete)

2.2.5
- Features
  - Clean up cmake variable names (kkaempf)
  - Add --version option to display version and build timestamp (Chris Poblete)
  - Support array representation in XML bindings (multiple children with same name) (kkaempf)
  - Support array type in PUT operation (Chris Poblete)
- Bindings
  - more Ruby examples to access winrm (kkaempf)
  - replace to_s with to_xml when a XML representation is returned (kkaempf)
- Bugfixes
  - Always return the current instance representation after PUT (Chris Poblete)
  - Issue wsman:MaxElements only for Enumerate and OptimizeEnumeration (Chris Poblete)
  - Ensure all array elements have same type on invoke (Chris Poblete)
  - Compile with -DNO_SSL_CALLBACK on Fedora [curl-Bugs-1924441] (Vitezslav Crhonek)

2.2.4
- Features
  - Build with cmake (kkaempf)
    building with 'autotools' is now deprecated and will be
    removed in future versions
  - Java client bindings (kkaempf)
  - enforce manual creation of certificate (to get sufficient
    entropy for randomness) (Praveen Paladugu)
- Bugfixes
  - fix pam config on RHEL/Fedora (kkaempf

2.2.3.9
- Bugfix release:
  - bindings (kkaempf)
    - make all constants uppercase
    - optionally pass code, code_detail, and message to WsmanStatus()
      constructor
    - Pass XmlDoc to Fault() constructor
    - Fix exceptions for Perl and Python
    - Ruby: Alias XmlDoc.foo to XmlDoc.body.foo
    - Ruby: Create bindings documentation
    - Java: Enable and fix for jdk 1.6.0 (unpackaged)
    - fix pam config on RHEL/Fedora
  - Fix Fedora/RH build (kkaempf)
  - Use floor() instead of round() (Suresh Sundriyal)
  - Reuse username/password if auth_request_func is not set (Arun Venkatachalam)
  - Catch invalid reference parameters (report bad EPR values) (kkaempf)
  - fix Windows build (Trevor Witten)
  - fix ssl (certificate thumbprint) callback check (Arun Venkatachalam)

2.2.3 final
- Bugfix release:
  - cleanup: access CMPIString by macro, not by casted direct member access 
  - fix connection error msg: rc.msg is a CMPIString, not a char* (kkaempf)
  - fix for OperationTimeout parsing (Chris Poblete)

2.2.3pre
- Bugfix release:
  - fix Windows build (forum.openwsman.org)
  - fix to build with non-standard subscriptions dir (Chris Poblete)
  - accept OperationTimeout values as outlined in Section 3.2.6.1
    of http://www.w3.org/TR/xmlschema-2 (Chris Poblete)
  - fall back to IPv4 if IPv6 unsupported (Arun Venkatachalam)
  - make IPv4 vs. IPv6 configurable (kkaempf)
  - support invoking a method with array type parameter/arguments
    (Chris Poblete, bnc#581414)
  - include instance namespace in the EPR response (Chris Poblete)
  - fix crash in (unhandled) Array argument (Suresh Sundriyal)
  - handle MaxElements in Pull operations (Chris Poblete, kkaempf, bnc#581731)
  - fix building with ssl when openssl/ssl.h is available (Chris Poblete)
  - make plugin directory configurable (Chris Poblete)
  - fix "WXF Invalid Representation" error when sending a Create instance request
    using the WinRm client (Trevor Witten)
  - add ExcludeNilProperties option to suppress nil properties per request
    (Chris Poblete, kkaempf)

2.2.2
- Bugfix release:
  - fix init.d script to run on non-LSB systems (bnc#571873, Chandrasekhar_R@Dell.com)
  - Clean up CMake build (kkaempf)
  - Fix build for RHEL5, Fedora 11+12, CentOS 5
  - Fix host certificate check in eventing, enable only if the
    verify_host flag is set (bnc#569611, A_Venkatachalam@Dell.com)
  - adapt bindings/ruby/helpers.c to Swig 1.3.40 class variable name
    change
  - fix bindings to accept ints (enums can't be expressed)

2.2.1-1
- fix NULL pointer dereference in PullResponse (bnc#572553, Suresh Sundriyal)

2.2.1
- Major changes:
  - Enumeration timeout fixed, resulting in --enum-idle-timeout option
    to openwsmand taking seconds (instead of miliseconds) now
  - Client side CRL (certificate revocation list) support
    (Arun Venkatachalam)
  - split off client config as /etc/openwsman/openwsman_client.conf
  - Fix upper limit check for threads and their stack usage (Suresh Sundriyal)
    (Allowing to confine memory usage in the 10-20MB range!)
    Reintroduce max_thread config file parameter and two new parameters
    * max_connections_per_thread
    * thread_stack_size
- Minor changes:
  - require swig 1.3.30 or later (rhel5 users: upgrade !)
  - clean up fault generation in CIM backend (Suresh Sundriyal)
  - fix various memory leaks (Suresh Sundriyal)
  - fix Python bindings build (kkaempf)
  - Fix security risk when listing indication subscriptions (Suresh Sundriyal)
  - Fix xml namespace for enumeration and subscription filters (kkaempf)
  - Fix class names for swig bindings, makes Python bindings
    operational (kkaempf)
  - Use same encoding for faults as in incoming msg (bug305, kkaempf)
  - Make WS-Enumeration pull response comply to WS-Enumeration sequence
    ordering (Suresh Sundriyal)

2.2.0
- Major changes:
  - Adapt IANA ports of 5985 (http) and 5986 (https)
  - Change the Ruby bindings module name to 'Openwsman'
  - Change the Ruby plugin module name to 'Openwsman'
  - IPv6 support (A_Venkatachalam@Dell.com)
  - preliminary support for wbem intrinsic operations
    'EnumerateClassNames' and 'GetClass' (kkaempf@suse.de)
    (needs fixed sblim-sfcc, see www.openwsman.org for details)
- Minor changes:
  - Perl example code added (by warptrosse@gmail.com)
  - Fixes to the CMake build environment
  - Fixes to the sfcc backend (argument handling, xml escaping)
  - Fix segfault when HTTP Content-Type not set (ssundriy@vmware.com)
  - Many other bug fixes, e.g.
    297: More detailed http status codes
    309: Use correct namespace for detecting Filter node
    288: CIM Provider Faults not getting propagated to client 
    279: Openwsman server is adding extra CRLF

2.1.1
- Support SUNpro C compiler
- Add SWIG server-side plugin support (Klaus Kaempf)
- Add Perl client bindings (Klaus Kaempf)
- Client bindings cleanup and improvements (Klaus Kaempf)

2.1.0
- Security related fixes
- Many bug fixes related to http stack
- GSSAPI support (thanks to Paul Moore)

2.0.1
- Added Java bindings
- Set proxy in C++ bindings
- Fixed SelectorSet Filter 
- Added SelectorSet filter support to C++ interface
- SelecorFilter does not need __cimnamespace


2.0.0
- minor bug fixes

2.0.0b2
 * Support SelectorSet Dialect
 * Improved Filter API
 * Improved EPR API
 * Enahnced bindings to support filters
 * Initial cmake support (Thanks to Klaus Kaempf)
 * Many other bug fixes

2.0.0b1

 * Use latest shttpd code base
 * Fixed SSL related issues with shttpd.
 * Ruby bindings using swig now and part of openwsman
 * Python bindings update
 * serialize/de-serialize APIs updated. 
   Make serialize/de-serialize APIs independent of server related structure; 
   New APIs of 
	do_serialize_real32, 
	do_serialize_real64, 
	do_serialize_int8 , 
	do_serialize_int16, 
	do_serialize_int32 and 
	do_serialize_int64 added.
 * secure eventing delivery support in WS-Eventing server code and related
   options added in client code. 
 * WS-Eventing client interfaces updated to make it more general.
 * Source indication namespace configuration supported so that the 
   namespace of subscription related classes can be different from that of indication class.
 * Anonymous identify and custom identify file supported. 
 * Many other bug fixings. 

1.5.1

    * Fixed compilation client library on windows
    * Fixed crash in CIM plugin
    * Fixed serialization in client library 

1.5.0

Openwsman 1.5 is an interim stable release toward 2.0 with all completed features since 1.0. This release serves as a checkpoint to evaluate implemented and outstanding features and to take care of bugs instead of waiting until the beta phase of 2.0.

    * Structure Improvements
          o New file structure. Header files separated from source file
          o wsman_util library integrated into main library
          o CIM client library (relying on SFCC) is part of the CIM plugin now 
    * Openwsman Server:
          o Rename server binary to openwsmand to avoid conflicts (wsmand is very generic)
          o Accept indications 
    * Openwsman Client:
          o Added --encoding options to choose encoding type of sent and received messages
          o Added options to support eventing
          o Load custom method parameters from external file 
    * WS-Eventing Phase 1
          o Subscribe, Unsubscribe, Renew commands supported
          o Heartbeat message supported. The granularity is 1 second.
          o Four kinds of delivery modes supported: Push, PushWithAck, Pull, Events
          o Extensible subscription storage mechanism and local subscription storage implemented
          o If the delivery mode is PushWithAck or Events and there is no acknowledgment response from the event sink, the subscription will be terminated.
          o Expired subscription will be deleted from the storage.
          o Subscription with no expiry time will be kept until the service restarts. When the service restarts, all expired and non-expiry subscriptions will be deleted.
          o If the delivery mode is set to Pull, the number of events kept in the service is limited. Any events over that limit will be discarded.
          o Initial CIM indication support in the CIM plugin 
    * XML abstraction layer and parser improvements
    * Language Bindings:
          o Python 
    * Better support for windows authentication and client API support on windows
    * Windows Client-side WS-Eventing support:
    * C++ Bindings (Interface use mostly on windows)
          o Connect using proxy server.
          o Support replacing user name without the need to call constructor. Added api - void SetUserName?(const char *user_name)
          o Support replacing password without the need to call constructor. Added api - void SetPassword?(const char *password)
          o Add mechanism to extract error message (as string) using the error code inside the GeneralWsmanExeption?.
          o Fixed bugs related to Kerberos communication in windows transport client 
    * Integration with CIMOMs:
          o Sfc Broker (Support local and CIMXML communication): Now it is possible to choose backend in the configuration file
          o Openwbem (External Request handler) 

    * Many many other fixes and improvements 

1.2.0

    * Fixed memory leaks in client, cpp client
    * cleanup API to support external plugins and openwbem request handler
    * General cleanup and minor fixes 
1.1.0 

Thread saftey: Moved static variables to client struct
TLS Support: Support mutual authentication on Linux and Windows
C++ client improvements
API changes: Fixed long names and modified prefix of client API function
Filtering: Assoc./References Support improved 

1.0.0 

First major release
0.7.5

Bug fix release
0.7.4

Bug fix release
0.7.3

Bug fix release
0.7.2

Bug fix release
0.7.1

Bug fix release
0.7.0

    * Enumeration Expiry support and timeout handler added
    * C++ Wrapper library added
    * Enhanced low-level API to support different types of data, now operations and actions requiring input (payload) accept:
          o Text
          o XML
          o Serialized data 
    * Simple C API with Sessions support added
    * Serialization, Reworked and enhanced, added the following:
          o Date/Time Serialization
          o EPR Serialization 
    * Create and Delete are now supported on the server level and the CIM plugin
    * Namespace and resource URI handling is now stricter now allowing the use of random namespaces (they have to be defined in the configuration file)
    * Transport using native interface on windows (not curl)
    * Unified error handling for Windows and Linux
    * Enahncements to make client compile and work on Windows
    * Single Client API header
    * Many bugs and spec conformance issues fixed 

0.6.1

The updates in this version of Openwsman have been focused on WS-CIM and WS-Management specification compliance.

Interoperability with other WS-Management implementations was done at the Management Developers Conference (MDC) 2006. The issues found at the MDC have been corrected in this release.
0.6.0
0.5.1

0.5.0

0.4.2
    * Removed env_t and replaced it with SoapH
    * removing iWsDoc. Using WsXmlDocH everywhere
    * improved create request routine for transfer put

0.4.1
    * 
    
0.4.0
    * Standalone http server (replace libsoup), libsoup server still available using config options, however it will no longer be supported
    * Support for both Basic and Diegst at the same time
    * Command line client
	* Client now uses curl
	* Added additional debuging options( save output to file, step operatings)
    * WS-CIM Compliance
	- Added support for namespaces as selectors
	- Full polymorphism support
    * CIM Plugin
	- Authentication with CIMOM using basic authentication
	- Multiple vendor namespace now supported
	- Vendor namespaces are configured in master config file
	- Default CIM namespace configurable in master config file
    * PAM Support
    * Removed dependency on Glib2
    * New command line parser for client and server
    * Improved client interface
    * Test clients added
    * CUnit testing added (more tests to follow)
    * Functional testing scripts added (more comliance tests to follow)
    * Compliance with WS-Management specification
	- Authenticate with same credentials when enumerating
	- More Header checks
    * Updated Fault table
    * Many memory leak fixes
    * Plugin reads configuration data from master config file
	
0.3.2

    * Parse SSL port correctly
    * Invoke CIM methods with right variables. 

0.3.1

    * fixed bug with null array value in cim access library: #24 

0.3.0

    * Code Cleanup
    * Optimize code size
    * RPM Support using SUSE build services
    * Further modularization
    * More WS-Management specification conformance
    * Utility Library (glib replacement in core library)
    * Basic CIM Binding support (Polymorphism)
    * Many bug fixes, see report for more details. 

0.2.0

    * This is a cleanup release with many bug fixes and the following additional features:
    * RPM support
    * Core library split into functional sub libraries for server, client and utility functions.

0.1.0 
    * This is the first release defaulting to support the WS-management specification from the DMTF (version 1.0, currently draft). Support for the June 2005 specification has been disabled. You will not be able to send requests to Windows 2003 R2 or Vista with WS-Man support unless those have the new WS-Management stack from Microsoft.

    * This release also added some new options to the client and removed many command line options from the service. Those options are now part of the configuration file used for the service. 
0.09:
    * Support DMTF draft specification (Work in Progress)
    * Optimized enumeration
    * EPR enumeration
    * EPR And Object Enumeration
    * Estimate Item Count in Enumeration
    
0.07:
    * Various fixes to generic CIM plugin
    * Eliminated memory leaks in various location
    * Removed obsolete code which was inherited from the reference implementation this project is based on
    * Added support for custom methods: It is now possible to invoke custom methods (Extrinsic CIM operations).
    * Capture errors and status codes from the CIM library as WS-Management faults
    * Moved all CIM client library dependencies to the cim client interface library to be able to support other client libraries (i.e. OpenWBEM client interface ) in the future.
    * Changed command line options for the client to accomodate new actions and custom methods.

