Changes from 1.11.0 to 1.11.2
    * FELIX-5997 Remove hashcode and equals from AbstractCapabilityRequirement to deal with fragment

Changes from 1.10.4 to 1.11.0
-----------------------------
** New Functionality
    * FELIX-5838 Add OSGi Resource implementations to Felix Utils
    * FELIX-5839 Add xml and json repositories implemenation

Changes from 1.10.2 to 1.10.4
----------------------------
** Bug
    * [FELIX-5691] - Fix whitespace handling in TypedProperties
    * [FELIX-5692] - TypedProperties is missing a method to add a raw value

Changes from 1.10.0 to 1.10.2
----------------------------
** Bug
    * [FELIX-4743] - Have to escape '=' characters in quoted values in *.config files
    * [FELIX-5145] - FileInstall writes .config files back with backslashes escaping spaces in config values
    * [FELIX-5306] - User friendly syntax for floats and doubles in FileInstall
    * [FELIX-5675] JSONParser needs a little bit more context when reporting an error
    * [FELIX-5688] - TypedProperties#put method is not idempotent

Changes from 1.9.0 to 1.10.0
----------------------------
** New Feature
    * [FELIX-5608 New TypedProperties object to support typed properties file

** Bug
    * [FELIX-5555] JSONParser is not handling escape char properly
    * [FELIX-5577] JSONParser is not able to parse an array as root object] 


Changes from 1.8.6 to 1.9.0
---------------------------
** Improvement
    * [FELIX-5534] - Add simple JSONWriter
    * [FELIX-5508] - Add simple JSON Parser


Changes from 1.8.4 to 1.8.6
---------------------------
** Improvement
    * [FELIX-5474] - Do not call no-arg Bundle.getHeaders() method
    * [FELIX-5434] - Add an update method to Properties
** Bug
    * [FELIX-5487] - Utils code requires Java 6 - should be Java 5


Changes from 1.8.4 to 1.8.6
---------------------------
** Bug
    * [FELIX-5370] - Error parsing clauses with values containing ':='


Changes from 1.8.0 to 1.8.2
---------------------------
** Bug
    * [FELIX-5156] - Felix Properties doesn't handle multi value properties correctly

Changes from 1.6.0 to 1.8.0
---------------------------
** Bug
    * [FELIX-4761] - Modifications on Properties#entrySet() are not properly reflected in the layout

** Improvement
    * [FELIX-4708] - Provide more substitution options
    * [FELIX-4820] - Optimize version range parsing a bit

** New Feature
    * [FELIX-4759] - Support env:XXX subtitution for environment variables
    * [FELIX-4760] - Support default/alternate values for variable substitution

Changes from 1.4.2 to 1.6.0
---------------------------
** Improvement
    * [FELIX-4433] - Provide more control over the substitution
    * [FELIX-4434] - Require JDK 5
    * [FELIX-4435] - Add a method to do substitution without any callback

Changes from 1.4.0 to 1.4.2
---------------------------
** Bug
    * [FELIX-4326] - Possible Invalid BundleContext exception when shutting down the extender
    * [FELIX-4341] - The Properties object does not follow the spec wrt spaces
    * [FELIX-4342] - Substitution is dependent on the order of the map

** Improvement
    * [FELIX-4339] - Make the use of escape characters deterministic

Changes from 1.2.0 to 1.4.0
---------------------------
** Bug
  * [FELIX-3752] Compilation failure in utils subproject on AIX
  * Fix bad copyright
  * Add a isStopping() method on the extender. Fix comparison of system bundle (see ARIES-1031)
  * [FELIX-3779] InterpolationHelperTest.testBasicSubstitution fails with JDK7 on Windows
  
** New features
  * [FELIX-3997] Provide an abstract bundle extender

Changes from 1.1.4 to 1.2.0
---------------------------

** Improvement
    * Variables are not preserved during write-back if they are
      defined as framework properties

** New features
    * Add a BaseManagedServiceFactory to help writing such factories

Changes from 1.1.2 to 1.1.0
---------------------------

** Bug
    * Access to system properties should be done in a priviledged
      block.
    * The manifest parser does not correctly handle empty strings.

** Improvement
    * Add java.util.Properties backward compatibility methods
    * Allow the substitution methods to receive a callback to 
      obtain custom values

Changes from 1.0.0 to 1.1.0
---------------------------

** New Feature
    * New org.apache.felix.utils.collections.DictionaryAsMap class 
      to wrap a Dictionary as a Map
    * New org.apache.felix.utils.properties.InterpolationHelper to
      interpolate a Map of properties using ${xx} replacements
    * New org.apache.felix.utils.properties.Properties class to
      load/save properties and allow editing them without loosing
      the user formatting
