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.

