/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

                    Apache Karaf 2.2.5
                    ==================

  Overview
  --------
  This release of Apache Karaf is based off of the 2.2.x series branch, representing an
 update to Apache Karaf 2.2.4. It contains bug fixes identified in the prior release,
 and introduces improvements including; multiple JAAS support improvements, better support 
 for Linux systems with certain versions of libc, SCP support, and demos for extending 
 Karaf's console commands and using Karaf Archives (KARs). Several dependencies were also 
 updated, bringing Pax Web to version 1.0.8, Jetty to 7.5.4.v20111024, and Jasypt to 1.8.
  For more detail please see the change log below.

  Changelog
  ---------

** Bug
    * [KARAF-867] - Inconsistent deployment behavior between bundle installer and feature installer 
    * [KARAF-926] - JAAS: Properties backing engine doesn't respect encryptor prefix and suffix
    * [KARAF-939] - the realm set for JAASLoginService in jetty.xml should be karaf but not the default
    * [KARAF-951] - dev:create-dump raises a NullPointerException
    * [KARAF-952] - config:propdel doesn't delete the property in the cfg file
    * [KARAF-954] - Double quotes missing in generated karaf-wrapper.conf
    * [KARAF-959] - features:create-kar goal doesn't create a valid kar
    * [KARAF-985] - LDAPLoginModule generates a large number of DirContext objects
    * [KARAF-1003] - Karaf fails to start on a linux 32 bit system who's libc version is 2.3.4.
    * [KARAF-1015] - ConfigMBean should use a different config pid than the config shell
    * [KARAF-1020] - BundleWatcher should look for SNAPSHOT
    * [KARAF-1030] - Grep command breaks existing line formating
    * [KARAF-1064] - BootstrapLogManager does not reuse the instantiated Handler
    * [KARAF-1065] - TextDumpProvider.createDump(DumpDestination) does not flush OutputStreamWriter
    * [KARAF-1104] - Add plexus-utils dependency to features-maven-plugin to allow it to work with Maven 2.2.x to create KARs
    * [KARAF-1105] - Fix url in Command Demo Readme file.
    * [KARAF-1106] - Jetty feature should use ServiceMix Spec for activation
    * [KARAF-1108] - Features should use correct start-level
    * [KARAF-1110] - Archetypes don't work
    * [KARAF-1111] - Add documentation about archetypes
    * [KARAF-1114] - osgi shell blueprint bundle shouldn't use lazy default-activation

** Dependency upgrade
    * [KARAF-997] - Upgrade to Pax Web 1.0.8
    * [KARAF-998] - upgrade to jetty 7.5.4.v20111024
    * [KARAF-1092] - Upgrade to Jasypt 1.8
    * [KARAF-1107] - Karaf should use directly commons-* bundles

** Improvement
    * [KARAF-606] - JAAS: Allow LDAPLoginModule to supply role "DN" from LDAP group search
    * [KARAF-936] - Features info command should display the start level of a bundle if available.
    * [KARAF-940] - Align various bat and sh scripts
    * [KARAF-945] - Use singular for shell commands
    * [KARAF-956] - jaas module should throw generic FailedLoginException 
    * [KARAF-965] - Allow features-maven-plugin to handle multiple versions of the same feature
    * [KARAF-968] - Features file should require name attribute on features element
    * [KARAF-981] - Set kar as a boot feature
    * [KARAF-1013] - Less verbose in log when mistyped commands at INFO level
    * [KARAF-1014] - Make files specified by ${includes} optional
    * [KARAF-1019] - Set java memory options only when required
    * [KARAF-1022] - java.io.tmpdir system property should use $KARAF_DATA/tmp in place of $KARAF_BASE/tmp
    * [KARAF-1032] - Text improvements to Features XSD
    * [KARAF-1041] - create-kar goal should handle configfile
    * [KARAF-1057] - Update the list of supported execution environments
    * [KARAF-1087] - kar archetype
    * [KARAF-1088] - assembly archetype
    * [KARAF-1091] - Upgrade maven bundle plugin to 2.3.6
    * [KARAF-1112] - shell:sleep should be in seconds
    * [KARAF-1115] - Add a jre.properties.cxf with all changes required to run cxf

** New Feature
    * [KARAF-541] - Support JMX SSL via etc/org.apache.karaf.management.cfg 
    * [KARAF-934] - Provide a way to select which features are to be installed when dropping a descriptor to the deploy folder.
    * [KARAF-977] - config propset, propappend & propdel could use some autocompletion
    * [KARAF-980] - Add demo for extending Karaf's console commands
    * [KARAF-987] - Add scp support
    * [KARAF-1029] - Add completer support on option values
    * [KARAF-1085] - Add Kar deployer demo using features-maven-plugin
    * [KARAF-1109] - Provide archetypes for bundle, bundle-blueprint, web-bundle, war

** Task
    * [KARAF-976] - Update Apache Karaf 2.2.x documentation for Child Instances


                    Apache karaf 2.2.4
                    ==================

  Overview
  --------
  This release of Apache Karaf is based off of the 2.2.x series branch, representing an
 update to Apache Karaf 2.2.3. It contains bug fixes identified in the prior release,
 and introduces improvements including; significant improvements to KAR support, and new
 MBeans (such as Dev, HTTP, Log, OBR, Bundles, Services and System). Several dependencies
 were also updated, bringing Apache Felix Gogo to version 0.10.0, and Pax Web to 1.0.7.
  For more detail please see the change log below.

  Changelog
  ---------

** Bug
    * [KARAF-771] - KAR Deployer doesn't work
    * [KARAF-773] - KAR docu outdated
    * [KARAF-816] - Wrapper feature doesn't load security libraries
    * [KARAF-889] - dev:framework commands incorrect workflow
    * [KARAF-892] - EventAdmin events from Gogo not being sent from Karaf's console bundle
    * [KARAF-893] - Wrong URL in release notes [1]
    * [KARAF-894] - Kar deployment failed
    * [KARAF-895] - NPE during webconsole startup
    * [KARAF-896] - Karaf webconsole exports wrong version of Felix webconsole package
    * [KARAF-902] - Jaas: Properties backing engine doesn't remove users
    * [KARAF-904] - add jetty.port=8181 to jetty.xml so that configuration for jetty connector could take effect
    * [KARAF-905] - propdel() method in the ConfigMBean didn't work
    * [KARAF-914] - Add ICU4J in Jasypt bundle
    * [KARAF-915] - KAR deployment failed in the features XML is not the first entry of the KAR archive
    * [KARAF-917] - warn instead of info when failing to install a feature
    * [KARAF-919] - Kar redeployment failed
    * [KARAF-920] - Feature autoinstall from kar failed
    * [KARAF-921] - maven eclipse plugin 2.8 does not work correctly with karaf
    * [KARAF-922] - features-maven-plugin ignores repository tags in feature files
    * [KARAF-923] - features-maven-plugin#AddFeaturesToRepoMojo does not handle spaces in repository urls well
    * [KARAF-929] - MBean bundles should be seen as system bundles
    * [KARAF-932] - ConfigMBean raise a NPE when dictionnary is null

** Dependency upgrade
    * [KARAF-901] - Upgrade to Pax Web 1.0.7

** Improvement
    * [KARAF-756] - Add ability to have KeyStoreManager to wait for SSL keystore to be fully initialize by other bundle through timeout
    * [KARAF-762] - dev:watch should support multiple bundle IDs
    * [KARAF-786] - Add more MBeans
    * [KARAF-847] - Provide Karaf features covering all Spring bundles
    * [KARAF-851] - Upgrade Maven plugins in use
    * [KARAF-864] - obr:deploy command should provide a start option
    * [KARAF-881] - Make aliases to osgi:* commands to be more clear for the users
    * [KARAF-885] - StartBundle doesn't deploy all bundles if one failed
    * [KARAF-886] - Document security properties in the relevant configuration files
    * [KARAF-897] - Fixing text in bundle.info files
    * [KARAF-898] - Config delete operation should remove the pid.cfg file
    * [KARAF-899] - Upgrade to Apache Felix Gogo version 0.10.0
    * [KARAF-900] - Shutdown command should display the instance name
    * [KARAF-907] - Include 64 bits wrapper library
    * [KARAF-925] - Karaf config.properties doesn't define J2SE-1.6 and J2SE-1.7 execution environment
    * [KARAF-930] - Bundles MBean should mimic the BundleSelector like osgi:* commands

** New Feature
    * [KARAF-541] - Support JMX SSL via etc/org.apache.karaf.management.cfg 
    * [KARAF-657] - kar deployer should start the feature
    * [KARAF-845] - Add a jasypt based property placeholder to support encrypted values
    * [KARAF-912] - Add a goal to create a kar file

** Task
    * [KARAF-887] - Refer PrinceXML website in the manual


                    Apache Karaf 2.2.3
                    ==================

  Overview
  --------

  This release of Apache Karaf is based off of the 2.2.x series branch, representing an
 update to Apache Karaf 2.2.2. It contains bug fixes identified in the prior release,
 and introduces improvements including; Optional JDK 7 support, a spring-jms feature, 
 and a macro allowing users to identify the contents of a specific config file. Several
 dependencies were also updated, bringing Jetty to version 7.4.5.v20110725, Eclispe
 Equinox to 4.6.2.R36x_v20110210, and Pax web to 1.0.6. 
  For more detail please see the change log below.

  Changelog
  ---------

** Bug
    * [KARAF-281] - History using up arrow does not work on windows
    * [KARAF-706] - variable substitution doesn't work for system.properties
    * [KARAF-712] - Karaf's ls command does not represent URL objects correctly
    * [KARAF-718] - Grep doesn't work when piped from features:listurl
    * [KARAF-735] - java.util.NoSuchElementException if issue the first command as an empty command
    * [KARAF-753] - commandlist --help points to help for jaas:pending
    * [KARAF-760] - MInor time rendering bug
    * [KARAF-766] - Wrong help for features:install
    * [KARAF-769] - Update NOTICE file to mention JSW
    * [KARAF-776] - jclouds features require OSS Sonatype repository
    * [KARAF-796] - Editing Pax Web Configuration Via Karaf Console
    * [KARAF-800] - karaf does not start when using java7
    * [KARAF-809] - MainStartTest fails on WinXP
    * [KARAF-815] - Generic the Karaf manual link
    * [KARAF-820] - Karaf client.bat swallows commands to be passed to the Karaf instance
    * [KARAF-824] - Web demo folder in 2.2.2 release is missing content and README.txt has bugs
    * [KARAF-826] - KarArtifactInstaller should look for "features" classifier in place of "feature"
    * [KARAF-827] - Karaf Web deployer (Pax-Web) always tries to deploy the deploy/README file

** Dependency upgrade
    * [KARAF-757] - upgrade to jetty 7.4.4.v20110707
    * [KARAF-768] - Upgrade to Eclipse Equinox 3.6.2.R36x_v20110210
    * [KARAF-775] - upgrade to pax web 1.0.5
    * [KARAF-789] - Upgrade jetty to 7.4.5.v20110725
    * [KARAF-790] - Upgrade paxurl to 1.2.8
    * [KARAF-792] - Upgrade pax-runner to 1.6.2
    * [KARAF-833] - Upgrade to Pax Web 1.0.6
    * [KARAF-834] - Upgrade to Spring 3.0.6 - in std. features.xml

** Improvement
    * [KARAF-645] - Add a flag to suppress --help Option output on 
    * [KARAF-667] - Improve error message when OBR resolution fails due to invalid URLs
    * [KARAF-698] - Technical edits to User's Guide
    * [KARAF-699] - Grammar fixes to source code files
    * [KARAF-700] - Updates to developer's guide
    * [KARAF-722] - throw more meaningful exception but not NPE when the BUNDLE_SYMBOLICNAME is null
    * [KARAF-729] - Karaf Maven Plugin source code cleanup
    * [KARAF-733] - Doc fixes to the quick start guide and overview page
    * [KARAF-752] - Editorial fixes to the assemblies/ configuration files
    * [KARAF-755] - Recommended improvements to help commands
    * [KARAF-764] - Correct links to ops4j in documentation
    * [KARAF-784] - Add date in the default Karaf log
    * [KARAF-795] - Kar builder uses a different version for easymock then the rest of the project
    * [KARAF-802] - Upgrade mail bundle version to 1.4.4.
    * [KARAF-803] - Add JDK7 compile support to 2.2.x source build
    * [KARAF-807] - Add a features name to the karaf-cellar features.xml
    * [KARAF-808] - Remove author attribute tags from Karaf source code
    * [KARAF-813] - Install Pax URL OBR with the OBR feature
    * [KARAF-817] - Allow to set Karaf window name via parameter
    * [KARAF-818] - Allow JAVA_MAX_MEM, JAVA_PERM_MEM, JAVA_MIN_MEM, JAVA_MAX_PERM_MEM the same way as for linux startup file
    * [KARAF-829] - Support of Java 7
    * [KARAF-840] - specify javax.annotation packages version to 1.1.0 for jre-1.6 as Annotation 1.1 Spec is used for Java 6

** New Feature
    * [KARAF-696] - Add a macro allowing users to identify the contents of a specific config file.
    * [KARAF-835] - Provide a spring-jms feature

** Task
    * [KARAF-673] - Page failover.html contains invalid configuration properties


                    Apache Karaf 2.2.2
                    ==================

  Overview
  --------

  This release of Apache Karaf is based off of the 2.2.x series branch, representing an
 update to Apache Karaf 2.2.1. It contains bug fixes identified in the prior release, 
 and introduces improvements including; improved behavior for the OracleDB locking 
 mechanism and http feature jetty port usage. Several improvements to the shell have 
 been incorporated, such as completion for shell aliases and a warning on osgi:shutdown
 to avoid inadvertently shutting down the container. There has also been a few small 
 dependency upgrades to felix event admin, Pax URL, and jetty.
  For more detail please see the change log below.

  Changelog
  ---------

** Bug
    * [KARAF-496] - Karaf prompt displayed twice
    * [KARAF-622] - Jaas Cancel command is not working
    * [KARAF-633] - NOTICE distribution file still refers Apache Felix Karaf
    * [KARAF-634] - README file refers an incorrect contribution URL
    * [KARAF-637] - Update branding-console documentation to include the changes to custom.properties
    * [KARAF-648] - maven-enforcer-plugin configuration not used
    * [KARAF-653] - Karaf minimal is missing the feature files. 
    * [KARAF-655] - Remove http://repository.ops4j.org/maven2 from org.apache.karaf.management.cfg
    * [KARAF-656] - kar deployer service not exported
    * [KARAF-670] - Missing ${karaf.base}/system cause NullPointerException
    * [KARAF-686] - introduce an override flag to configfile element so that we get chance to not override the finalname if it already exist
    * [KARAF-689] - Karaf instance can wrongly obtain a lock when the locking table is empty on a Oracle DB
    * [KARAF-690] - install http feature will start both 8080 and 8181 jetty port

** Dependency upgrade
    * [KARAF-672] - Upgrade to felix event admin 1.2.12
    * [KARAF-680] - Upgrade to Pax URL 1.2.7
    * [KARAF-682] - upgrade to jetty 7.4.2.v20110526

** Improvement
    * [KARAF-445] - Add completion for shell aliases
    * [KARAF-573] - Print out that karaf has to be restarted if using framework with new framework
    * [KARAF-614] - Add warning to osgi:shutdown to avoid inadvertently shutting down the container
    * [KARAF-618] - Align Cellar major version with the Karaf one
    * [KARAF-651] - features-maven-plugin should "embed" the Karaf features descriptor
    * [KARAF-654] - Merge jetty feature with jetty-jaas feature
    * [KARAF-661] - Typing ^D should behave as on Unix
    * [KARAF-662] - Clarify relationship of config.properties and custom.properties
    * [KARAF-663] - features-maven-plugin add-features-to-repo should embed Karaf core features descriptor

** Task
    * [KARAF-543] - Add manual section around log custom appenders
    * [KARAF-619] - Add Cellar manual
    * [KARAF-620] - Cellar should use the parent Karaf POM
    * [KARAF-646] - Upgrade to Jetty 7.4.1.v20110513
    * [KARAF-694] - Upgrade to Pax-Logging 1.6.3
    * [KARAF-695] - Upgrade to Pax-Web 1.0.4

** Test
    * [KARAF-683] - use filter ${karaf.version} instead of the hard code one to fix archetypes/itests failure

                    Apache Karaf 2.2.1
                    ==================

  Overview
  --------

  This release of Apache Karaf is based off of the 2.2.x series branch, representing an
 update to Apache Karaf 2.2.0. It contains bug fixes identified in the prior release, 
 and introduces improvements including; updates to pax-logging, pax-runner, pax-web, 
 jetty, and felix versions. The config commands have has been updated, and kar features 
 are now in features-maven-plugin.
  For more detail please see the change log below. 

  Changelog
  ---------

** Bug
    * [KARAF-456] - Artifact versions named in the documentation are not replaced with the version of the current project
    * [KARAF-493] - Various site fixes
    * [KARAF-494] - Include the .kar features in 2.2.1
    * [KARAF-504] - Features Maven Plugin does not work with Maven 3
    * [KARAF-506] - The config shell commands offer no way to delete a command
    * [KARAF-507] - The config shell completer does not allow completion of factory based pids
    * [KARAF-508] - The config:edit create does not allow the creation of factory configs
    * [KARAF-509] - The config:update command does not save factory configurations to the correct file
    * [KARAF-512] - WebConsole installation failed due to missing jetty-jaas feature
    * [KARAF-518] - Unable to load features.xml with included schema attribute
    * [KARAF-521] - Executing complex scripts is extremely difficult
    * [KARAF-525] - Bundles listed in etc/startup.properties should only installed the first time
    * [KARAF-527] - The console bundle should indicate it provides the gogo related services
    * [KARAF-528] - Error while using correct feature descriptor in features-maven-plugin
    * [KARAF-534] - Startlevel: Strange deployment behaviour 
    * [KARAF-535] - Description for List command incorrectly claims Threshold default is -1
    * [KARAF-537] - admin.bat prints stacktraces to standard out
    * [KARAF-546] - Null point exception when executing log:display on an empty log
    * [KARAF-547] - Missing features file in the system directory of the distribution
    * [KARAF-557] - Feature: Failed to check to not install a bundle with the symbolic name contains attributes
    * [KARAF-558] - Boot feature from configuration file, can contain some spaces; the name should be trimmed
    * [KARAF-559] - AdminService loses root flag for instances
    * [KARAF-562] - Config properties defined in <config> tag (features.xml) are loaded during each refresh
    * [KARAF-568] - minimal assembly: zip and tar.gz do differ in content
    * [KARAF-569] - Installing and uninstalling the jetty feature leaves Karaf in an ususable state
    * [KARAF-577] - Cannot Run WAR From Root Context
    * [KARAF-580] - Kar installer in 2.2 uses feature instead of features as classifier
    * [KARAF-585] - When connected to a remote instance, Ctrl-C closes the connection instead of simply interrupting the command
    * [KARAF-589] - Shell console ExampleSubclassMain unit test is broken
    * [KARAF-599] - Archetypes CommandArchetypeTest unit test fails
    * [KARAF-600] - "Extending the console" documentation still refers to org.osgi.service.command
    * [KARAF-610] - Can't input the path string completely via karaf shell
    * [KARAF-621] - features-maven-plugin:2.2.0:generate-features-xml fails with NullPointerException
    * [KARAF-625] - Missing property 'log4j.appender.out.file' in the file org.ops4j.pax.logging.cfg caused a NPE
    * [KARAF-626] - admin:connect always fails with "Authentication failed"
    * [KARAF-629] - CommandArchetypeTest test case failure, expected START_TAG or END_TAG not TEXT.
    * [KARAF-630] - SpringDeploymentListenerTest fails on IBM JDK builds with No Class Def Found Error
    * [KARAF-632] - Itests failures

** Dependency upgrade
    * [KARAF-590] - Upgrade to pax-logging 1.6.2
    * [KARAF-591] - Upgrade aopalliance ServiceMix bundle to 1.0_5
    * [KARAF-592] - Upgrade asm ServiceMix bundle to 3.3_2
    * [KARAF-593] - Upgrade cglib ServiceMix bundle to 2.1_3_7
    * [KARAF-594] - Upgrade commons-codec ServiceMix bundle to 1.3_4
    * [KARAF-595] - Upgrade commons-collections ServiceMix bundle to 3.2.1_2
    * [KARAF-596] - Upgrade commons-lang ServiceMix bundle to 2.4_5
    * [KARAF-597] - Upgrade jasypt ServiceMix bundle to 1.7_3
    * [KARAF-598] - Upgrade junit ServiceMix bundle to 4.7_3
    * [KARAF-613] - Upgrade to Blueprint 0.3.1

** Improvement
    * [KARAF-461] - dev:create-dump command should generate a cleaner zip file name
    * [KARAF-476] - The admin-command should be extended to handle RMI-server-port settings
    * [KARAF-483] - pax-web jetty.xml configfile should contain default security realm 
    * [KARAF-484] - Upgrade to Felix Framework 3.0.9
    * [KARAF-487] - Improve --help information for obr:list
    * [KARAF-488] - obr:list should also include the bundle-symbolic-name of the packages it lists as this is used to execute other OBR commands
    * [KARAF-495] - Add a Tutorials section to the website.
    * [KARAF-497] - Resolve mvn: urls in <descriptor/> element for features-maven-plugin:add-features-to-repo
    * [KARAF-513] - The ssh:ssh and admin:connect command do not allow passing a command to execute
    * [KARAF-514] - When starting a child instance, there's no way to wait until it's started 
    * [KARAF-517] - Upgrade to pax-runner 1.6.1
    * [KARAF-533] - Improve depdencny handling to manual
    * [KARAF-539] - Document configfile xml tag of features
    * [KARAF-542] - Support of next line with '>' character
    * [KARAF-551] - Implement the shell:source command
    * [KARAF-554] - Add karaf version in system properties and display in shell:info command output
    * [KARAF-563] - Adjustable PermSize and MaxPermSize in karaf script
    * [KARAF-564] - Allow configuring features OBR resolver to resolve optional imports as well
    * [KARAF-574] - Re-introduce export version in packages:exports command
    * [KARAF-576] - introduce start-level attribute for feature element in features.xml
    * [KARAF-588] - Some fixes to Karaf Site
    * [KARAF-603] - Add 'karaf-framework' feature to describe core Karaf bundles
    * [KARAF-606] - JAAS: Allow LDAPLoginModule to supply role "DN" from LDAP group search

** New Feature
    * [KARAF-463] - Add chapter for Pax Web and the OSGi HttpService
    * [KARAF-605] - Add param to Gogo Argument and Option to override default value with specific value

** Task
    * [KARAF-489] - Upgrade pax-logging to 1.6.1
    * [KARAF-492] - Upgrade Karaf to version 1.0.2 of pax-web
    * [KARAF-500] - Upgrade to Jetty 7.3.1
    * [KARAF-501] - Upgrade to PAX Exam 1.2.4
    * [KARAF-516] - Upgrade to felix eventadmin 1.2.10
    * [KARAF-552] - Upgrade to Pax URL 1.2.6
    * [KARAF-566] - Build: Remove duplicate entries from build artefacts.
    * [KARAF-567] - org.apache.karaf.jaas.config.impl accidentally exported?
    * [KARAF-578] - Upgrade to PAX-WEB 1.0.3 


                    Apache Karaf 2.2.0
                    ==================

  Overview
  --------

  This release of Apache Karaf contains a multitude of new features, improvements, and
bug fixes.  Some highlights include many new or updated commands, a LDAP JAAS module
with login support, an updated feature service, a feature for Aries transaction, JPA &
JNDI modules, expanded documentation, and new versions of most dependencies.  The help
system and manual have also undergone major updates. Please note that if you are using 
pax-exam with scanFeatures that you also have to upgrade pax-exam to the latest version.
  For more detail please see the change log below.

  Changelog
  ---------

** Sub-task
    * [KARAF-272] - Update Release Notes in kit and online. 
    * [KARAF-392] - Ability to use features-maven-plugin:add-features-to-repo without specifying features
    * [KARAF-393] - Ability to use features-maven-plugin:add-features-to-repo with explicitly specified remote maven repositories
    * [KARAF-441] - Add Karaf-2.2.x to Hudson
    * [KARAF-462] - Update SCM section in main pom.xml to reference branch 2.2.x instead of trunk.

** Bug
    * [KARAF-8] - Improve error reporting for features installer
    * [KARAF-17] - ANSI support not properly initialized when creating an Karaf instances from WebConsole or JMX
    * [KARAF-156] - command dev:dynamic-import does not work
    * [KARAF-221] - When starting a bare karaf, a single bundle is displayed when using osgi:list, we should display none
    * [KARAF-230] - 2.1.0 Wrapper doesn't work and if hacked no SSH
    * [KARAF-232] - validate goal of features-maven-plugin should support wrap jar
    * [KARAF-236] - Command Features:info with tree switch displays partial information
    * [KARAF-238] - SLF4J Duplicate bindings warning when using Equinox
    * [KARAF-239] - Equinox Framework Extensions
    * [KARAF-241] - Shell commands are not registered in OSGi
    * [KARAF-244] - features-maven-plugin does not work with maven 3
    * [KARAF-254] - Web configmanager did not list all available configurations
    * [KARAF-261] - Cannot run command admin on cygwin.
    * [KARAF-262] - The command admin create new instance cannot create good script in bash language on cygwin
    * [KARAF-265] - add-features-to-repo goal of features-maven-plugin should support wrap jar with additional instructions
    * [KARAF-268] - When installing a bundle from a feature with blancks before  / after the bundle url, those bundles are not loaded on restart (on felix)
    * [KARAF-270] - karaf-service scripts tries to create "data" directory in wrong location 
    * [KARAF-273] - java.lang.NullPointerException: Inflater has been closed
    * [KARAF-282] - The shell:exec does not always capture the whole output
    * [KARAF-285] - The bin/shell script should not read the input stream when a command is passed
    * [KARAF-286] - When running in the plain shell console (using bin/shell), tab completion prints lots of exceptions
    * [KARAF-288] - Shell history doesn't work anymore (at leas on windows)
    * [KARAF-292] - Maven filtering issue for Windows batch files in kit
    * [KARAF-295] - Webconsole - Configuration Admin, shows multiple entries for FileInstall after restart
    * [KARAF-299] - [patch] miscellaneous cleanups
    * [KARAF-300] - Incorrect behavior of backspace/delete keys in web console Gogo plugin
    * [KARAF-304] - Startup problems: javax.naming.NoInitialContextException: Unable to determine caller'sBundleContext
    * [KARAF-311] - Deploying a sample application in the User's Guide is missing a command
    * [KARAF-313] - feature.xml is not read correct if it contains linebreaks
    * [KARAF-321] - karaf shell script does not work with mingw and whitespaces in path
    * [KARAF-324] - Shell/Console tests fail in windows
    * [KARAF-326] - eclipse:eclipse importing error
    * [KARAF-327] - Graceful shutdown of Windows service, revisited
    * [KARAF-330] - Removal of a JAAS realm service actually remove the wrong reference in the internal storage
    * [KARAF-331] - Failure to execute script against Karaf sshd. 
    * [KARAF-335] - The lib folder should be optional
    * [KARAF-344] - Deploying a new JAAS config requires to restart the framework
    * [KARAF-347] - org.ops4j.pax.url.mvn.cfg contains incorrect comment on last property
    * [KARAF-357] - shell.bat won't start with NoClassDefFoundError and NPE
    * [KARAF-358] - When the feature service calls refresh(), it should wait for the refresh to happen before returning
    * [KARAF-360] - Empty comment in some config files
    * [KARAF-384] - Cannot find some jar in ext directory
    * [KARAF-389] - Remove transitive dependencies from features-maven-plugin
    * [KARAF-398] - Features schema is not correct
    * [KARAF-414] - The apache-karaf-2.1.99-SNAPSHOT-minimal.tar.gz generated contains unresolved dependencies
    * [KARAF-415] - Config commands do not support the use of Managed Service Factories
    * [KARAF-421] - StringCompleter extension cannot return own strings
    * [KARAF-425] - Info command shows duplicated sections
    * [KARAF-428] - obr:addurl/removeurl generate incorrect "obr.repository.url" property
    * [KARAF-429] - Configuration not found warning in wrap deployer
    * [KARAF-436] - Typo mistake in the FeaturesServiceMBean
    * [KARAF-440] - features-maven-plugin throws NullPointerException maven 3.0.2
    * [KARAF-442] - Wrong EventType called in FeaturesService.uninstallFeature
    * [KARAF-453] - Manual war contains two web.xml files - cannot be served by pax-web
    * [KARAF-458] - Fix the karaf shell to look nice within Eclipse console
    * [KARAF-472] - features-maven-plugin: TAB-characters in feature-repository lead to resolution-errors in add-features-to-repo
    * [KARAF-480] - Minor ansi issue with admin:rename command
    * [KARAF-481] - Karaf 2.2.x manuals do not get signature files created
    * [KARAF-485] - Karaf MBeans are not registered

** Improvement
    * [KARAF-5] - [karaf] admin:create should support a -r, --rmi-registry-port option to allow the RMI registry port to be configured 
    * [KARAF-53] - Provide XML Schema for feature descriptors and support it's validation
    * [KARAF-58] - Improve terminal height / width support
    * [KARAF-60] -  Improve history support by using the !
    * [KARAF-197] - The SSH layer should dynamically handle configuration changes
    * [KARAF-202] - Create la alias in shell.init.script
    * [KARAF-214] - Print a nice error when a command is not found
    * [KARAF-215] - Upgrade to latest jline2 /  jansi
    * [KARAF-224] - Improve log:display command to display colored log events
    * [KARAF-227] - The shell/log commands should use a dynamic configuration
    * [KARAF-228] - The jaas/modules should use a dynamic configuration
    * [KARAF-229] - The management bundle should use a dynamic config
    * [KARAF-234] - validate goal of features-maven-plugin should support spring/blueprint/feature protocol prefix
    * [KARAF-237] - print importer bundle in packages:imports
    * [KARAF-240] - Cleanup Karaf pom to use version and groupId from the parent pom
    * [KARAF-243] - Provide InfoProvider that will collect information from bundle MANIFEST.MF 
    * [KARAF-247] - Add J2SE-1.2 to org.osgi.framework.executionenvironment
    * [KARAF-251] - Allow the use of version ranges on dependant features
    * [KARAF-252] - Add a dependency boolean attribute on features' bundles and allow specifiying an optional resolver
    * [KARAF-253] - changing the default JMX service uri to be more enterprise frendly
    * [KARAF-255] - Move Karaf manual generation out of standard install to its own profile
    * [KARAF-259] - Upgrade dependencies to their latest version
    * [KARAF-266] - Upgrade Karaf encryption to use Jasypt 1.7
    * [KARAF-267] - Use ServiceMix ASM 3.1.0 bundle in place of the springsource one
    * [KARAF-274] - Upgrade to JLine 2.5
    * [KARAF-283] - Make Vm options for child karaf server persistent and part of the configuration
    * [KARAF-289] - Webconsole - Admin should look like the other webconsole plugins
    * [KARAF-291] - Webconsole - Features should look like the other webconsole plugins
    * [KARAF-297] - Spring Features should provide spring-web bundles
    * [KARAF-302] - Features for Jetty-JAAS
    * [KARAF-306] - Improve documentation on creating commands with completers
    * [KARAF-309] - Provide jetty.xml with preconfigured JAAS Authentication.
    * [KARAF-314] - feature-maven-plugin does not fail if component couldn't be found
    * [KARAF-316] - Add head/tail commands
    * [KARAF-318] - JdbcBackingEngine should acquire schema configuration from JdbcLoginModule
    * [KARAF-320] - Missing svn:ignores
    * [KARAF-329] - improve test-util methods
    * [KARAF-332] - Add log tail command
    * [KARAF-336] - Make sure users using console / shell / webconsole have a known role 
    * [KARAF-338] - Upgrade Karaf to version 1.0.0 of pax-web
    * [KARAF-340] - When the webconsole is invoked, the code should be run under the credentials of the authenticated user
    * [KARAF-341] - When a ssh console is invoked, the code should be run under the credentials of the authenticated user
    * [KARAF-343] - Upgrade to fileinstall 3.1.10
    * [KARAF-346] - make features:install more verbose
    * [KARAF-349] - Upgrade to SLF4j 1.5.8
    * [KARAF-353] - features commands should allow more than 1 argument
    * [KARAF-356] - The main console should run under the user's subject
    * [KARAF-362] - Add documentation how to build a custom karaf distribution including branding
    * [KARAF-375] - features-maven-plugin always uses transitive features
    * [KARAF-385] - Upgrade to felix framework 3.0.8
    * [KARAF-386] - Add a debug argument on the bin/karaf shell script to start karaf using remote debugging
    * [KARAF-387] - Create an assembly mmaven module under feature to generate basic and enterprise features xml file
    * [KARAF-388] - allow specifying a version for a boot feature in etc/org.apache.karaf.features.cfg
    * [KARAF-394] - Add aries-application in features enterprise file + made small enhancements
    * [KARAF-395] - Modify org.apache.karaf.features.cfg to use features files standard and enterprise
    * [KARAF-396] - Upgrade to Pax-Logging 1.6.0 (providing slf4j 1.6.x support)
    * [KARAF-403] - Improve Bundle-Description header display
    * [KARAF-404] - Upgrade to felix maven-bundle-plugin 2.3.4
    * [KARAF-405] - Force JDK 1.5 compiler
    * [KARAF-409] - Use the new Karaf Logo on Webconsole
    * [KARAF-412] - Documentation: Add notes on how to make multiple configuration files available to the bundle context.
    * [KARAF-416] - All PaxAppenders should be automatically called instead of having to configure them explicitely
    * [KARAF-417] - Move extractNameVersionType() method into Karaf utils
    * [KARAF-420] - Automatically import paxlogging packages when deploying a war
    * [KARAF-422] - If no version was found, features-maven-plugin try to create an artifact with a null version
    * [KARAF-423] - KarafJaasPasswordAuthenticator should log reason for authentication failure.
    * [KARAF-443] - Most of the blueprint bundles should be lazy by default
    * [KARAF-446] - Upgrade to Felix webconsole 3.1.8
    * [KARAF-455] - Improve the confluence output for commands

** New Feature
    * [KARAF-151] - Implement an assembly 'extract' deployment option, with automatic detection of feature repositories
    * [KARAF-188] - Provide commands to manage users, passwords and roles
    * [KARAF-209] - Allow the info command to display custom information such as Apache ServiceMix version number
    * [KARAF-211] - osgi:list to other command to display context-path for web applications or a new war command for that
    * [KARAF-213] - create an automatic completer if an @Argument is a File by using the current working directory and completing on files. I wonder if we could provide an optional filter method maybe to restrict available files?
    * [KARAF-218] - Add a more pager command
    * [KARAF-225] - FeaturesService should publish OSGi events
    * [KARAF-233] - Add a log:clear command
    * [KARAF-257] - Features - Add description attribute and have it listed in the features overview
    * [KARAF-290] - Optional feature event-admin
    * [KARAF-293] - Feature for Aries Transaction,JPA & JNDI modules.
    * [KARAF-307] - Ldap jaas login module
    * [KARAF-310] - Add LDAP JAAS module
    * [KARAF-348] - Add admin:rename command
    * [KARAF-350] - Add KARAF_OPTS param to startup scripts
    * [KARAF-373] - Add option to features-maven-plugin to automatically include <descriptors> into <repository>
    * [KARAF-380] - Add .jar deployer autowrapping non-bundle-jar files dropped to deploy folder
    * [KARAF-391] - Ability to use features-maven-plugin:add-features-to-repo without specifying features
    * [KARAF-426] - Manage Karaf shell.name by branding
    * [KARAF-473] - Support version resolving in FeatureService#getFeatures(name/version)
    * [KARAF-477] - Karaf console should gracefully handle errors due to the history file being read only
    * [KARAF-478] - Subclasses of Console should be able to change the history file

** Task
    * [KARAF-42] - Use an svn based mechanism  for Karaf's manual
    * [KARAF-43] - Use overriden properties instead of configuring the maven bundle plugin in each module
    * [KARAF-219] - Upgrade to latest gogo
    * [KARAF-235] - Upgrade to latest Aries JMX / Blueprint
    * [KARAF-258] - Use the org.osgi groupId for core and compendium specs
    * [KARAF-276] - upgrade to pax-url 1.2.1
    * [KARAF-287] - Bump the jaas xsd / namespace handler as it has changed
    * [KARAF-301] - Create integration tests for the distribution itself
    * [KARAF-333] - Update karaf to use pax-url-mvn ver 1.2.4
    * [KARAF-345] - upgrade to spring 3.0.5.RELEASE
    * [KARAF-351] - Upgrade to pax-exam 1.2.3
    * [KARAF-390] - Upgrade to event admin 1.2.8
    * [KARAF-410] - Upgrade to spring-dm 1.2.1
    * [KARAF-411] - Upgrade to jetty 7.2.2.v20101205
    * [KARAF-427] - Use slf4j as default logger
    * [KARAF-431] - Add documentation around remote management via JMX
    * [KARAF-433] - Add documentation about KAR archive format and deployer
    * [KARAF-434] - Add wrap deployer description in the deployer section of the Karaf user guide
    * [KARAF-435] - Add diagnostic documentation (dev:create-dump, etc) in the Karaf User Guide
    * [KARAF-437] - Document jre.properties tuning
    * [KARAF-438] - Upgrade to Aries 0.3
    * [KARAF-439] - Provide documentation about the Karaf wrapper
    * [KARAF-444] - Upgrade to latest version of pax-url
    * [KARAF-454] - Upgrade Karaf to version 1.0.1 of pax-web


                    Apache Karaf 2.1.4
                    ==================

  Overview
  --------

  This release of Apache Karaf is based off of the 2.1.x series branch, representing an update to Apache Karaf 2.1.3. It contains several bug fixes identified in the prior release, and introduces several improvements including; better behavior of the features-maven-plugin, documentation for making multiple configuration files available to the bundle context, and a more efficient bundle description for header display. For more detail please see the change log below.

  Changelog
  ---------

** Bug
    * [KARAF-8] - Improve error reporting for features installer
    * [KARAF-384] - Cannot find some jar in ext directory
    * [KARAF-421] - StringCompleter extension cannot return own strings
    * [KARAF-428] - obr:addurl/removeurl generate incorrect "obr.repository.url" property
    * [KARAF-436] - Typo mistake in the FeaturesServiceMBean
    * [KARAF-440] - features-maven-plugin throws NullPointerException maven 3.0.2
    * [KARAF-442] - Wrong EventType called in FeaturesService.uninstallFeature

** Improvement
    * [KARAF-375] - features-maven-plugin always uses transitive features
    * [KARAF-388] - allow specifying a version for a boot feature in etc/org.apache.karaf.features.cfg
    * [KARAF-403] - Improve Bundle-Description header display
    * [KARAF-412] - Documentation: Add notes on how to make multiple configuration files available to the bundle context.
    * [KARAF-422] - If no version was found, features-maven-plugin try to create an artifact with a null version
    * [KARAF-430] - don't force a karaf deploy to have a lib directory

** New Feature
    * [KARAF-373] - Add option to features-maven-plugin to automatically include <descriptors> into <repository>


                    Apache Karaf 2.1.3
                    ==================

  Overview
  --------

  This release of Apache Karaf is based off of the 2.1.x series branch, representing an update to Apache Karaf 2.1.2. It contains several bug fixes identified in the prior release, and updates the versions of SLF4j, pax-url-mvn, spring, and pax-exam. For more detail please see the change log below.

  Changelog
  ---------

** Bug
    * [KARAF-244] - features-maven-plugin does not work with maven 3
    * [KARAF-282] - The shell:exec does not always capture the whole output
    * [KARAF-292] - Maven filtering issue for Windows batch files in kit
    * [KARAF-299] - [patch] miscellaneous cleanups
    * [KARAF-300] - Incorrect behavior of backspace/delete keys in web console Gogo plugin
    * [KARAF-304] - Startup problems: javax.naming.NoInitialContextException: Unable to determine caller'sBundleContext
    * [KARAF-313] - feature.xml is not read correct if it contains linebreaks
    * [KARAF-319] - Pom hierarchy error
    * [KARAF-321] - karaf shell script does not work with mingw and whitespaces in path
    * [KARAF-326] - eclipse:eclipse importing error
    * [KARAF-327] - Graceful shutdown of Windows service, revisited
    * [KARAF-331] - Failure to execute script against Karaf sshd. 
    * [KARAF-344] - Deploying a new JAAS config requires to restart the framework
    * [KARAF-347] - org.ops4j.pax.url.mvn.cfg contains incorrect comment on last property
    * [KARAF-357] - shell.bat won't start with NoClassDefFoundError and NPE
    * [KARAF-358] - When the feature service calls refresh(), it should wait for the refresh to happen before returning
    * [KARAF-360] - Empty comment in some config files

** Improvement
    * [KARAF-314] - feature-maven-plugin does not fail if component couldn't be found
    * [KARAF-320] - Missing svn:ignores
    * [KARAF-329] - improve test-util methods
    * [KARAF-349] - Upgrade to SLF4j 1.5.8

** Task
    * [KARAF-333] - Update karaf to use pax-url-mvn ver 1.2.4
    * [KARAF-345] - upgrade to spring 3.0.5.RELEASE
    * [KARAF-351] - Upgrade to pax-exam 1.2.3


                    Apache Karaf 2.1.2
                    ==================

  Overview
  --------

  This release of Apache Karaf is based off of the 2.1.x series branch, representing an update to Apache Karaf 2.1.1. It contains several bug fixes identified in the prior release, and updates the pax-url version. For more detail please see the change log below.

  Changelog
  ---------

** Bug
    * [KARAF-270] - karaf-service scripts tries to create "data" directory in wrong location 
    * [KARAF-273] - java.lang.NullPointerException: Inflater has been closed
    * [KARAF-277] - The bin/client script does not work anymore
    * [KARAF-262] - The command admin create new instance cannot create good script in bash language on cygwin
    * [KARAF-284] - Remove snapshot dependency on org.apache.karaf.shell.console in archetypes/command/src/main/resources/archetype-resources/pom.xml
    * [KARAF-285] - The bin/shell script should not read the input stream when a command is passed
    * [KARAF-286] - When running in the plain shell console (using bin/shell), tab completion prints lots of exceptions
    * [KARAF-292] - Maven filtering issue for Windows batch file in kit.

** Task
    * [KARAF-276] - upgrade to pax-url 1.2.1


                    Apache Karaf 2.1.1
                    ==================

  Overview
  --------

  This release of Apache Karaf is based off of the 2.1.x series branch, representing an update to Apache Karaf 2.1.0. It contains multiple bug fixes, while introducing a minimal number of changes to dependencies from our last release. For more detail please see the change log below.

  Changelog
  ---------

** Sub-task
    * KARAF-269 - Update jetty bundle version in main karaf 2.1.1 pom.

** Bug
    * KARAF-17 - ANSI support not properly initialized when creating an Karaf instances from WebConsole or JMX
    * KARAF-156 - command dev:dynamic-import does not work
    * KARAF-221 - When starting a bare karaf, a single bundle is displayed when using osgi:list, we should display none
    * KARAF-232 - validate goal of features-maven-plugin should support wrap jar
    * KARAF-238 - SLF4J Duplicate bindings warning when using Equinox
    * KARAF-239 - Equinox Framework Extensions
    * KARAF-261 - Cannot run command admin on cygwin.
    * KARAF-265 - add-features-to-repo goal of features-maven-plugin should support wrap jar with additional instructions
    * KARAF-268 - When installing a bundle from a feature with blancks before / after the bundle url, those bundles are not loaded on restart (on felix)

** Improvement
    * KARAF-234 - validate goal of features-maven-plugin should support spring/blueprint/feature protocol prefix
    * KARAF-247 - Add J2SE-1.2 to org.osgi.framework.executionenvironment
    * KARAF-263 - Upgrade to Spring 3.0.4.RELEASE
    * KARAF-264 - Upgrade to Jetty 6.1.25

** New Feature
    * KARAF-225 - FeaturesService should publish OSGi events


                    Apache Karaf 2.1.0
                    ==================

  Overview
  --------

   New to this release of Apache Karaf is a JAAS Database Login Module, a way to store
 passwords in a secured way, a mechanism that allows a karaf application to distinguish 
 between UserPrincipal and RolePrincipal without depending from the Karaf JAAS Module. 
   The shell console has been enhanced to be available in a plain non-OSGi environment and
 smart tab completion has been improved, along with various commands. 
   We have also resolved a number of outstanding issues, and improved support on OS X and 
 IBM Java based systems. For more detail please see the change log below.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** Bug
    * [KARAF-13] - javax.annotation not exported
    * [KARAF-19] - Exception in pax-web when shutting down karaf
    * [KARAF-125] - Webconsole can't concat strings?
    * [KARAF-133] - NPE when installing a bundle with a MANIFEST.MF not in the first entry of the zip
    * [KARAF-134] - The sort command does not work when trying to sort on the last field
    * [KARAF-136] - should override equals method for FeaturesListener to handle the proxy compared to wrapped object case
    * [KARAF-137] - IOException on web demo when trying to connect through SSH
    * [KARAF-138] - WarDeploymentListener: checks for manifest osgi entries but fails if no manifest is found
    * [KARAF-142] - NPE at org.apache.felix.webconsole.internal.servlet.OsgiManager.service - karaf started in server mode
    * [KARAF-143] - Setting "karaf.instances" system property has no effect
    * [KARAF-145] - Reading Properties like karaf.framework should be trimmed before reusage
    * [KARAF-150] - Config admin contains 2 configurations for SSH port in Karaf
    * [KARAF-162] - need exactly specify the import jline package version for webconsole.gogo
    * [KARAF-167] - Creating a new config using the shell commands lead to a FileNotFoundException instead of the file being created
    * [KARAF-169] - Do not use the ClassPath manifest header for the karaf client jar
    * [KARAF-178] - When the karaf runtime is launched under JSW, the bin/client script fails to connect
    * [KARAF-189] - Java endorsed dirs on AIX (IBM JVM)
    * [KARAF-190] - karaf-wrapper.conf is incorrect
    * [KARAF-199] - WarDeploymentListener: doesn't handle the default Webapp-Context correct on a Windows System
    * [KARAF-204] - Ctrl+D needs to be followed by another character to be recognized (at least when using the karaf client)
    * [KARAF-206] - The converter used for converting commands arguments and options can't convert objects to String

** Improvement
    * [KARAF-106] - Provide a more minimal / static disitrbution of karaf
    * [KARAF-130] - Allow a repository URL to be added to feature repository URL list even though it is an invalid one
    * [KARAF-135] - The package:export command should have more option to control the output
    * [KARAF-139] - Add a Shell Console branding demo
    * [KARAF-140] - Modifying properties and saving them via the Config Console removes comments in the original file
    * [KARAF-141] - Tests should be able to be run without any internet connections
    * [KARAF-146] - osgi:list should only print out 'system' bundles above a certain level, by default, this should be 50, but it should be configurable
    * [KARAF-148] - features:listUrl should print the repository names as well as the Url. 
    * [KARAF-152] - when using the @Argument annotation, if there is no name specified it would be nice to reuse the name of the field, rather than use VAL
    * [KARAF-155] - optional @Argument values (and I guess @Option values) can have default values which could be displayed in the help screen by reflecting into the value and finding non-zero/null values
    * [KARAF-157] - [PATH] minor patch to make it easier to reuse the Karaf command line console from outside Karaf specialising the user and application
    * [KARAF-158] - better display of errors when running a non-osgi command line outside of the shell
    * [KARAF-159] - when a bad command is typed (e.g. invalid command, argument, option) we should use some kind of syntax highlighting for the name of the command/argument/option in the error message
    * [KARAF-161] - provide an easy implementation of "public static void main(String[] args)" for a single command (i.e. for non-shells)
    * [KARAF-163] - Generate Features XML should handle artifact types
    * [KARAF-164] - Allow sub classes of Main to override the META-INF path used to discover commands
    * [KARAF-168] - Upgrade to latest Felix framework
    * [KARAF-170] - Main --help should behave like Main someCommand --help and list all the possible sub commands when outside of OSGi
    * [KARAF-171] - provide a default "help" sub command in shells used outside of OSGi
    * [KARAF-173] - Make it easier to configure the Karaf Main shell by subclassing.
    * [KARAF-174] - tab completion of sub commands not working in the non-osgi shell
    * [KARAF-175] - Upgrade to Java Service Wrapper 3.2.3
    * [KARAF-176] - Improve integration to provide a clean shutdown when running as a service
    * [KARAF-177] - Support 64 bits platforms for Java Service Wrapper on OS X
    * [KARAF-181] - Allow the cmdhelp maven plugin to generate output in confluence format
    * [KARAF-182] - Upgrade to Aries 0.2-incubating
    * [KARAF-184] - Enhance the dev:framework command to display or set the OSGi framework name
    * [KARAF-185] - Have a 'clean' parameter on the main shell script to clean the working folder
    * [KARAF-186] - Upgrade to pax-logging 1.5.3
    * [KARAF-187] - The completers do not work when several commands are on the same line separated by a column or pipe
    * [KARAF-191] - Create a Karaf Util module gathering all util classes
    * [KARAF-192] - Completion does not work on options, or even on arguments if an option is specified
    * [KARAF-193] - It should be possible to load a Command description from a text file
    * [KARAF-196] - Improve the output of osgi:headers command
    * [KARAF-198] - Remove dependency upon org.slf4j.helpers.MessageFormatter
    * [KARAF-200] - Upgrade to latest pax-runner and pax-exam
    * [KARAF-202] - Create la alias in shell.init.script
    * [KARAF-207] - The webconsole feature should not depend on the admin bundles
    * [KARAF-208] - when reusing the karaf shell outside of OSGi where there's only one shell scope, it would be nice to avoid prefixing the command names with the scope or with "*:" which is confusing
    * [KARAF-210] - Allow to specific context-path when installing a war file using the war url handler

** New Feature
    * [KARAF-26] - have restart clean command/API
    * [KARAF-144] - Allow using the console and commands outside of OSGi
    * [KARAF-147] - We should have a features:listVersions command that lists all the known versions of a feature
    * [KARAF-149] - Add a features:removeRepository command
    * [KARAF-166] - Allow subclasses of org.apache.karaf.shell.console.Main to be used as sub shells
    * [KARAF-172] - Implement a mechanism that would allow a karaf application to distingush between UserPrincipal & RolePrincipal without depending from Karaf JAAS Modules
    * [KARAF-180] - JAAS Database Login Module
    * [KARAF-212] - provide a simple annotation, say,@CompleterValues which can be used on methods on an action to provide a list of available values for an argument for tab completion

** Task
    * [KARAF-40] - Create a maven archetype for creating shell commands


                    Apache Karaf 2.0.0
                    ==================

  Overview
  --------

 The Apache Karaf 2.0.0 is the first release since the move of Apache Felix Karaf to Apache Karaf.
 This release brings new features, improvements and bug fixes. The changelog below contains the whole
 list of changes.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** New Feature
    * [KARAF-31] - Use OBR if available to compute the transitive closure of karaf features
    * [KARAF-110] - Provide a placeholder for overriding the configuration properties
    * [KARAF-111] - Allow includes of additional configuration files through a custom property when loading the main configuration files

** Improvement
    * [KARAF-45] - Improve war deployer in order to provide the WebApp-context
    * [KARAF-54] - Minimum default properties
    * [KARAF-59] - Introduce a ${karaf.data} system property to be able to easily move the data directory to a different location
    * [KARAF-67] - Change the webconsole config in the features descriptor to specifiy the realm and not the username/password which aren't used anymore
    * [KARAF-95] - Upgrade Spring to 3.x
    * [KARAF-96] - Enhance the features to support the start level
    * [KARAF-97] - Upgrade to Felix framework 3.x
    * [KARAF-98] - Upgrade to equinox 3.6.0
    * [KARAF-103] - add a spring-dm feature which use spring 2.5.6 inside
    * [KARAF-105] - Remove dependencies on the preference service
    * [KARAF-107] - Improve default log configuration with a rolling file appender
    * [KARAF-108] - Change 'storage.location' system property to 'karaf.instances' for better homogeneity
    * [KARAF-109] - Split the JVM packages from the main config.properties file for easier maintenance
    * [KARAF-112] - Free the org.osgi.framework.system.packages.extra property for users
    * [KARAF-117] - refactor tooling/testing/Helper to accomodate recent changes in config.properties
    * [KARAF-118] - Update Pax Url Wrap to version 1.1.3
    * [KARAF-120] - Some jars are not included in our system repository
    * [KARAF-121] - Better exception handling in JaasSecurityProvider
    * [KARAF-127] - Enahnce features mechanism to allow to stop/start bundle

** Bug
    * [KARAF-4] - [Karaf] If features:refreshUrl reads an incorrect <features> definition, it deletes the old version
    * [KARAF-16] - The JRE provided ciphers are not used on ubuntu server
    * [KARAF-65] - NPE in StandardEmitterMBean on JDK 6
    * [KARAF-99] - new spring 3.0.3.RELEASE feature miss some bundles
    * [KARAF-100] - The list of OBR repositories is not persisted
    * [KARAF-101] - features:refreshUrl doesn't auto complete!
    * [KARAF-102] - The client jar does not work when given a command to execute on the command line
    * [KARAF-122] - Webconsole login doesn't work with karaf.framework set to equinox
    * [KARAF-123] - File jre.properties is not copied and so it is not possible to start a second karaf instance
    * [KARAF-124] - Karaf start script doesn't correctly include jre/lib/ext directory
    * [KARAF-126] - Password: Error executing command: Failed to get the session.
    * [KARAF-128] - java.lang.IndexOutOfBoundsException during generation of User Guide pdf blocking release build.

** Task
    * [KARAF-113] - Change the namespace of the two blueprint schemas

** Sub-task
    * [KARAF-115] - Document Karaf Release Guide
    * [KARAF-119] - Establish KEYS file.


                    Apache Felix Karaf 1.6.0
                    ========================

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** Bug
    * [FELIX-2129] - [Karaf] Possible hang with slave instances of Karaf when using Oracle JDBC lock.
    * [FELIX-2130] - [Karaf] Failover Clustering Mechanism - Database shutdown / loss results in all Karaf instances becoming Active on restart of that DB
    * [FELIX-2169] - Improve dev:show-tree performance and avoid NPE for installed bundle
    * [FELIX-2191] - Drop-in deployment of feature descriptor with spring-dm bundles fails
    * [FELIX-2196] - Karaf uses old version of Aries artifacts
    * [FELIX-2270] - Don't install jaas.boot bundle, its in the startup classpath
    * [FELIX-2295] - Referenced service throws UndeclaredThrowableException instead of real one
    * [FELIX-2311] - Remove the Bootstrap class which is not needed anymore
    * [FELIX-2319] - The order of the list of boot features is not used when installing the features
    * [FELIX-2326] - NullPointerException thrown from PropertiesLoginModule if a user doesn't exist in the properties file
    * [FELIX-2343] - Features maven plugin does not honor local and remote repository overrides
    * [FELIX-2347] - Configurations on features should not override existing configurations

** Improvement
    * [FELIX-1921] - Provide a way to configure the host used for karaf ssh server
    * [FELIX-2058] - The Oracle, MySql and default jdbc lock classes should inherit from a common base class
    * [FELIX-2109] - OBR should support matching resources for a given requirement
    * [FELIX-2110] - The resolver should be able to resolve for some requirements in addition to resources
    * [FELIX-2113] - Add obr:find and obr:resolve to find matching resources and show the resolution output
    * [FELIX-2193] - add-features-to-repo goal of features-maven-plugin should be able to download dependencies if necessary
    * [FELIX-2237] - ^C should interrupt the thread
    * [FELIX-2239] - features-maven-plugin validate goal should be able to use configurable config.properties
    * [FELIX-2278] - refactor features-maven-plugin to use Parser/Clause/VersionRange from utils
    * [FELIX-2280] - To much code duplication in DefaultJDBCLock, OracleJDBCLock and MySQLJDBCLock
    * [FELIX-2293] - features-maven-plugin validate should support  specify the feature repositories from the maven plugin configure
    * [FELIX-2297] - features-maven-plugin validate goal should be able to use configurable jre version
    * [FELIX-2312] - Support for ext and endorsed directories
    * [FELIX-2314] - Improve logging support
    * [FELIX-2315] - Upgrade to felix web console 3.0.0
    * [FELIX-2320] - Override default Karaf shell prompt
    * [FELIX-2327] - Disable and delay Jline terminal initialization
    * [FELIX-2329] - Improve the URL handling in features-maven-plugin regarding the add-features-to-repo goal
    * [FELIX-2330] - Uninstall, refresh, and resolve osgi shell commands do not support multiple bundle ids

** Task
    * [FELIX-1990] - Use aries blueprint / jmx


                    Apache Felix Karaf 1.4.0
                    ========================

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:


** Bug
    * [FELIX-1768] - should catch exception for FeaturesServiceImpl.internalAddRepository per uri
    * [FELIX-1843] - Karaf shell doens't work properly under windows
    * [FELIX-1932] - Possible NullPointerException when itest fails
    * [FELIX-1939] - [karaf] Ssh client out put is poorly formatted.
    * [FELIX-1964] - Unable to choose the framework using system properties
    * [FELIX-1970] - The stop script should always work even if the default user / password / host has been changed
    * [FELIX-1994] - Web Console admin,features and gogo plugins do not work with Equinox
    * [FELIX-1995] - Spring status does not show properly after osgi:list command
    * [FELIX-2012] - NullPointerException when some links clicked if karaf.framework=equinox
    * [FELIX-2025] - grep -v doesn't filter linefeed on Windows
    * [FELIX-2026] - Remove org.ops4j.pax.logging.DefaultServiceLog.level from system.properties
    * [FELIX-2027] - The custom deployers leveraging url handlers must not be registered before the url handler is actually registered in the osgi framework
    * [FELIX-2032] - file host.key is not correctly written for a new instance(s)
    * [FELIX-2043] - When launching Karaf with equinox, the osgi framework state is not written until 30s after the boot
    * [FELIX-2044] - System bundles are started out of order if the karaf.lock.level is > 1
    * [FELIX-2045] - Restarting the framework from the web console (or using update on the system bundle) does not work
    * [FELIX-2053] - Completion does not reprint previous characters in some circumstances
    * [FELIX-2054] - Logo is garbled when connecting using putty
    * [FELIX-2063] - [karaf] hardcoding org.ops4j.pax.exam.rbc.rmi.port property in raw pax runner --vmOptions is problematic when 1099 is not the next free port
    * [FELIX-2065] - BootstrapLogManager doesn't load etc/org.ops4j.pax.logging.cfg file
    * [FELIX-2072] - [Karaf]  OracleJDBCLock filling UNDO segment.
    * [FELIX-2074] - Bring back the history command

** Improvement
    * [FELIX-1914] - Add a development subshell to ease troubleshooting classloading/resolution issues
    * [FELIX-1947] - [Karaf] Remove import java.util.* from karaf.main.StringMap and replace with proper import list.
    * [FELIX-2001] - Add more info to log and console when feature bundles fail to resolve
    * [FELIX-2018] - features-maven-plugin add-features-to-repo should suport the bundle start with wrap: in features.xml
    * [FELIX-2028] - Upgrade to preferences services 1.0.4
    * [FELIX-2046] - Upgrade web bundles to their latest version (jetty, pax-web, felix console)
    * [FELIX-2049] - extend org.apache.felix.karaf.testing.Helper to emit a karaf-specific execution environment file for pax-runner
    * [FELIX-2055] - Use a nicer shutdown mechanism when stopping a managed instance
    * [FELIX-2061] - [karaf] use waitForFrameworkStartup pax-exam option in the integration tests
    * [FELIX-2070] - Upgrade to felix framework 2.0.3
    * [FELIX-2075] - Add a "new" command to create java objects from the command line
    * [FELIX-2084] - Make the display of exception stack traces available through a variable in the shell
    * [FELIX-2182] - An improved "list" command implementation that correctly displays Spring column status

** New Feature
    * [FELIX-1815] - Introduce 'shell:logout' command to close the current shell
    * [FELIX-1975] - [Karaf] Add oracle database support to Karaf jdbc locking feature.
    * [FELIX-2033] - Provide an easy to use layer for writing pax-exam test for Karaf
    * [FELIX-2047] - Support for WAR files

** Task
    * [FELIX-1902] - [karaf] sanitize web demo README of references to FUSE SNAPSHOT version
    * [FELIX-1915] - [karaf] allow overridding of etc/system.properties via environment


                    Apache Felix Karaf 1.2.0
                    ========================

  Overview
  --------

 This release is mostly a bug fix release and contains a lot of bug fixes and improvements in the console,
 commands, features service, instance administration.  The binary distribution now also includes the user's
 manual in pdf and html formats.

  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

** Sub-task
    * [FELIX-1701] - Aggregate all the Karaf related pages in one single Confluence page using the include macro

** Bug
    * [FELIX-1620] - Script for running the created Karaf instances with a console
    * [FELIX-1626] - Configuration loaded from the etc/ directory are only available after a delay
    * [FELIX-1638] - [karaf] The branding properties load can't find the external branding file
    * [FELIX-1642] - osgi:shutdown just hang when use karaf-client.jar
    * [FELIX-1660] - karaf should not hardcode the "system" location of its maven-like repository
    * [FELIX-1681] - Bundles of webconsole feature are not assembled into distribution packages
    * [FELIX-1705] - [Karaf] Hot undeploy does not work after a Karaf restart
    * [FELIX-1715] - osgi:update on xml deployments will cause ZIPExceptions
    * [FELIX-1717] - osgi:list column for spring is sometimes filled and sometimes not
    * [FELIX-1723] - [Karaf] Slave instances on same host as Master instance does not properly lock.
    * [FELIX-1728] - Karaf itest fail on IBM JDK due to Pax Exam annotations not found
    * [FELIX-1730] - When displaying help for commands, arguments are not ordered correctly
    * [FELIX-1745] - Unable to alter/unset a log level after it has been set from the console
    * [FELIX-1751] - [karaf] admin:start silently fails to launch new instance
    * [FELIX-1766] - Refactor and enable AdminServiceMBean
    * [FELIX-1768] - should catch exception for FeaturesServiceImpl.internalAddRepository per uri
    * [FELIX-1771] - Feature deployer is broken on windows
    * [FELIX-1777] - Hitting backspace beyond last character causes LOUD BEEP
    * [FELIX-1778] - instances/myinst/bin/karaf.bat leaks environment variables to shell
    * [FELIX-1779] - The port for the jmx server needs to be configured at two locations
    * [FELIX-1784] - install one feature failed in org.apache.felix.karaf.features.cfg featuresBoot list shouldn't block install other features in this list
    * [FELIX-1786] - The features deployment listener tacks installed bundles and force their resolution
    * [FELIX-1793] - ensure launch karaf java process from KARAF_BASE folder
    * [FELIX-1799] - Hot-deployment does not work on admin:create'd instances
    * [FELIX-1801] - Case insensitive grep outputs all uppercase in match results
    * [FELIX-1802] - Grep command line prefix (-n) not working properly
    * [FELIX-1803] - Unable to edit or backspace on multiline commands
    * [FELIX-1805] - Upgrade equinox to 3.5.1
    * [FELIX-1817] - Backspace does not work anymore when connecting from the karaf-client
    * [FELIX-1818] - Ctrl-C kills the karaf-client, but it should be sent to the server
    * [FELIX-1855] - exec command eats first keystroke of subsequent commands
    * [FELIX-1857] - Backspace not working when using admin:connect
    * [FELIX-1858] - Remote commands via ssh only work once per restart
    * [FELIX-1869] - Need better UI feedback when features commands fail
    * [FELIX-1877] - karaf.main.BootstrapLogManager possible resource leak and ignored exception in open method.
    * [FELIX-1878] - karaf.main.Main possible resource leaks and ignored exceptions from mkdirs().
    * [FELIX-1887] - The stop script can't be used if the user or password has been changed
    * [FELIX-1888] - The karaf client hangs if the authentication fails
    * [FELIX-1899] - Karaf itest (CoreTest) fails on slower CI machines

** Improvement
    * [FELIX-1064] - New goal for the features-maven-plugin: validate a features xml file
    * [FELIX-1207] - [PATCH] Ignore files generated by mvn:eclipse
    * [FELIX-1643] - Improvements / Fixes for Karaf commands and their helps
    * [FELIX-1655] - Provide an additional argument to the Karaf admin:create command that specifies the featuresBoot
    * [FELIX-1675] - karaf web demo README references old servicemix-client.jar
    * [FELIX-1682] - The newly installed bundles for a feature should be uninstalled when feature install failed
    * [FELIX-1689] - When deploying a feature, we need to refresh some bundles to cope with newly resolved optional dependencies
    * [FELIX-1693] - [karaf][shell] Make "system bundles" start level configurable via properties
    * [FELIX-1694] - [karaf][shell] Do not print stack traces on exceptions
    * [FELIX-1700] - Create quality PDF manual for Karaf
    * [FELIX-1706] - Highlight grep matches
    * [FELIX-1707] - Add OSGi framework information to InfoAction
    * [FELIX-1718] - karaf shell config:update command should persist / override configurations from the etc/ folder
    * [FELIX-1729] - The if / each commands are not available in the console
    * [FELIX-1737] - Upgrade to fileinstall 2.0.4
    * [FELIX-1744] - Add a -C/--context option to shell:grep
    * [FELIX-1748] - Make the command history persistent across restarts
    * [FELIX-1749] - Improve log:set command - add auto-completion for log levels and support lower case level
    * [FELIX-1752] - [Karaf] Extend DefaultJDBCLock to support MySQL out of the box.
    * [FELIX-1755] - Provide a script file that would be loaded when starting a new shell (to create closures, etc...)
    * [FELIX-1757] - Completer for session scopes
    * [FELIX-1759] - Upgrade to latest webconsole
    * [FELIX-1772] - Upgrade to felix framework 2.0.1
    * [FELIX-1791] - Update to the karaf web demo readme.
    * [FELIX-1810] - Improvements to Main startup class
    * [FELIX-1882] - [karaf] karaf-client should have the option to retry connection establishment

** New Feature
    * [FELIX-1656] - new Shell command: shell:clear

** Task
    * [FELIX-1091] - Re-enable gshell integration tests on windows
    * [FELIX-1761] - Include felix as a platform for the karaf integration tests
    * [FELIX-1762] - Upgrade to pax-web 0.7.1
    * [FELIX-1763] - Upgrade to latest pax-url
    * [FELIX-1848] - Include instance name in the JMX ObjectName for AdminService and FeaturesService MBeans
    * [FELIX-1849] - Provide Instance details for root instance via AdminServiceMBean.getInstances() attribute
    * [FELIX-1850] - Expose additional isRoot attribute on AdminServiceMBean
    * [FELIX-1892] - Upgrade to sshd-0.3.0, mina-2.0.0-RC1, gogo-0.2.2, jansi-1.1



                    Apache Felix Karaf 1.0.0
                    ========================

  Overview
  --------

 The Apache Felix Karaf 1.0.0 release is the first release since the move of ServiceMix Kernel to Apache Felix.
 This release brings a lot of new features:
  * Switch from Spring-DM to Blueprint for the default Dependency Injection container (Spring-DM is still
       fully supported and easy to install through the features service)
  * Switch from Geronimo GShell to Felix Gogo
      This changes is a bit disruptive for the command line syntax, but offers much more features such
      as closures
  * Integration with the Felix Web Console (easily installed using the features service).
  * Built-in support for Equinox
  * Upgrade to OSGi 4.2 frameworks (both Felix and Equinox)
 This release also contains a lot of small improvements and bug fixes.  The changelog below contains the whole
 list of changes.


  Changelog
  ---------

 The following list shows the bug fixes and enhancements included in this release:

 ** Bug
     * [FELIX-1087] - Unable to log into ServiceMix Kernel using Windows putty SSH client
     * [FELIX-1097] - ServiceMix -> Karaf in base directory notices
     * [FELIX-1100] - Cat Command fails to display ?wsdl files
     * [FELIX-1125] - "features/list -i" returns "ERROR CommandLineExecutionFailed: org.apache.geronimo.gshell.command.CommandException: java.lang.ArrayStoreException: org.apache.servicemix.kernel.gshell.features.internal.FeatureImpl"
     * [FELIX-1128] - Features installed via the deploy directory aren't listed by the "features/list" command
     * [FELIX-1152] - wrapper scripts fail to start Karaf
     * [FELIX-1153] - change parent artifact id from kernel to karaf in some modules to make the build pass from clean local maven repo
     * [FELIX-1161] - Stange classloading issues when using compendium services
     * [FELIX-1192] - KARAF: Locking error in DefaultJDBCLock, also contains an eventual OutOfMemory error on locked processes.
     * [FELIX-1199] - Karaf: closing IO stream, removal of minor file descriptor leak.
     * [FELIX-1212] - Possible infinit loop when a remote ssh connection is closed
     * [FELIX-1218] - Existing configurations are not retrieved when installing a feature
     * [FELIX-1222] - [features-maven-plugin:add-features-to-repo] Incorrect parsing of pax mvn url string
     * [FELIX-1243] - Change the default port for the OSGI HTTP Service from 8080 to 8181
     * [FELIX-1253] - Cursor is blocked when the correct syntax is not displaed
     * [FELIX-1265] - The command refreshUrl does not work if the features.xml file is embedded in a Jar. The JVM caches jar entries
     * [FELIX-1274] - Spring deployer fails when bean class is from java.* packages
     * [FELIX-1315] - Karaf console is garbled on Windows
     * [FELIX-1320] - Authentication failed connecting via ssh on Windows
     * [FELIX-1361] - Issue with import/export version of the package : org.osgi.util.tracker in Apache Felix Karaf
     * [FELIX-1373] - featuresBoot in etc/org.apache.felix.karaf.featues no longer works
     * [FELIX-1375] - [Karaf] There's no 'help' command
     * [FELIX-1378] - Optional branding does not work in new gogo console
     * [FELIX-1391] - Unable to create new ConfigAdmin PID through karaf console
     * [FELIX-1423] - karaf fails to start in cygwin bash
     * [FELIX-1431] - Add a web console plugin to have access to the gogo shell
     * [FELIX-1449] - Tab completion doesn't work on Windows
     * [FELIX-1454] - install --help throws exception
     * [FELIX-1458] - 'servicemix server' and servicemix client' not working properly on windows
     * [FELIX-1459] - bin/karaf may fail to start when CDPATH is set (on POSIX shells)
     * [FELIX-1465] - Make symbolic names of Karaf webconsole bundles consistent with other bundles
     * [FELIX-1466] - org.apache.felix.karaf.features.FeaturesServiceTest fails
     * [FELIX-1468] - wrapper:install and admin:create prints old ansi output that need to be converted to real ansi
     * [FELIX-1472] - Better handling of configurations from the deployer and feature service
     * [FELIX-1515] - Entering an illegal command has an unusual effect
     * [FELIX-1517] - Manually deleting an instance breaks admin:list
     * [FELIX-1519] - Karaf Failover does not work with PostgreSQL and Oracle
     * [FELIX-1529] - The console does not work anymore when connecting to another karaf instance
     * [FELIX-1564] - Authentication failed when using admin:connect to connect to a newly created instance
     * [FELIX-1566] - Possible NPE when uninstalling a feature
     * [FELIX-1567] - When dropping an empty xml file (i.e. just an empty file with an xml extension) in the deploy folder, errors are printed to the console
     * [FELIX-1575] - The JMX connector can not be registered because of a clash in the name in the RMI registry
     * [FELIX-1576] - The features service should do a PackageAdmin.refresh() after uninstalling a feature
     * [FELIX-1602] - Unable to configure boot features on admin:create-d instance
     * [FELIX-1618] - in spring-dm feature, optional imports in spring-context won't get resolved

 ** Improvement
     * [FELIX-1062] - Upgrade to latest Felix Runtime
     * [FELIX-1063] - Upgrade to latest Felix Bundle Repository
     * [FELIX-1092] - The client jar / ssh deamon should support direct commands
     * [FELIX-1102] - Make gshell-core really independant of the MainService
     * [FELIX-1104] - Allow osgi/stop command to specify more than one bundle per command entry.
     * [FELIX-1107] - Make org.apache.servicemix.kernel.gshell.features dependency on org.apache.servicemix.kernel.filemonitor optional
     * [FELIX-1110] - Refactor filemonitor / deployers inside a deployer sub module
     * [FELIX-1112] - [PATCH] Allow osgi/start command to specify more than one bundle per command entry
     * [FELIX-1115] - Use better version ranges for imports
     * [FELIX-1121] - Add feature for installing Felix Web Console
     * [FELIX-1126] - No errors are generated for a bad URL passed to the "features/addUrl", "features/refreshUrl", or "features/list" commands.
     * [FELIX-1127] - Add a name for a repository
     * [FELIX-1133] - Allow usage of fragments in Karaf features
     * [FELIX-1149] - Describe ConfigAdmin configurations using metatype
     * [FELIX-1150] - Upgrade to SpringDM and SpringFramework
     * [FELIX-1172] - Rebrand Karaf locking mechanism.
     * [FELIX-1180] - Improve Karaf DefaultJDBCLock to use proper logging mechanism instead of System err prints.
     * [FELIX-1196] - Felix Web Console can't list Karaf features
     * [FELIX-1204] - Fix the karaf client to allow direct execution of commands
     * [FELIX-1220] - Remove unnecssary parts of a filter
     * [FELIX-1276] - There is no way to get all the Feature information from the FeaturesService
     * [FELIX-1303] - add an osgi/imports and osgi/exports to show a pretty-printed output of the imports/exports packages for a bundle
     * [FELIX-1450] - Karaf branding and plugins for Felix webconsole
     * [FELIX-1455] - OSGi Storage is hardcoded to be data/cache
     * [FELIX-1457] - Externalize and refactory management layer for FeatureService to be more scalable and more consistent with the OSGi management (using open mbeans)
     * [FELIX-1463] - Switch to Felix Fileinstall instead of our own file deployer
     * [FELIX-1467] - Add Karaf to top-level build files
     * [FELIX-1469] - Add svn:ignore property to a few Karaf projects
     * [FELIX-1528] - [karaf] Use a defined location for storing the list of managed instances create by the admin service
     * [FELIX-1555] - The osgi:list command should print spring-dm bundle state if spring-dm has been deployed
     * [FELIX-1558] - use com.sun.* instead of com.sun.management* for boot delegation
     * [FELIX-1594] - include blueprint bundle in karaf kit system folder

 ** New Feature
     * [FELIX-1109] - Deployer for blueprint applications
     * [FELIX-1111] - Ability to run Karaf on Equinox
     * [FELIX-1206] - [PATCH] config/propappend
     * [FELIX-1261] - Install/Uninstall Karaf Features from Felix WebConsole
     * [FELIX-1485] - Admin commands support in Karaf webconsole
     * [FELIX-1524] - Implement a better tac command
     * [FELIX-1547] - OS shell level admin commands for Karaf

 ** Task
     * [FELIX-1098] - Switch from spring-dm to blueprint
     * [FELIX-1099] - Switch from spring-dm integration tests to pax-exam
     * [FELIX-1116] - Rename to Apache Felix Karaf
     * [FELIX-1200] - Move features-maven-plugin into Karaf
     * [FELIX-1312] - Switch from gshell to gogo
     * [FELIX-1523] - Fix Karaf version to 0.9.0-SNAPSHOT as next release will be 1.0.0

 ** Sub-task
     * [FELIX-1117] - Update branding
     * [FELIX-1118] - Update shell scripts
     * [FELIX-1132] - Get rid of the JMX spring stuff in gshell-features




                    Apache ServiceMix Kernel 1.1.0
                    ==============================

  Overview
  --------

 The Apache ServiceMix Kernel 1.1.0 release brings a lot of new features enhancements and bug fixes:
  * remote connection using SSH protocol
  * provisioning enhancements: versioning / hot deployment of features
  * new commands, including OSGi related commands for the Configuration Admin and Package Admin services
  * improved spring integration: upgrade to spring 2.5.6 and spring-dm 1.2.0-m2, the osgi/list command
       now displays spring applications status
  * container level locking for master / slave deployments
  * support for JAXP 1.4 on all platforms
  * improved JMX support for managing the OSGi framework and features
 Note that the commands syntax has changed due to the upgrade to the latest gshell version.

  Known issues
  ============

     * [SMX4KNL-141] - The config/edit command changes does not takes precedence over configuration files in the etc folder at restart
     * [SMX4KNL-183] - features/uninstall behaves different in version selection than features/install
     * [SMX4KNL-189] - Shell completion works only in the root shell
     * [SMX4KNL-200] - The client jar / ssh daemon should support direct commands
     * [SMX4KNL-227] - Full support of fragment bundles
     * [SMX4KNL-228] - Warning messages when using OpenSSH 5.1 to connect to ServiceMix Kernel
     * [SMX4KNL-231] - Unable to log into ServiceMix Kernel using OpenSolaris SSH client
     * [SMX4KNL-232] - Unable to log into ServiceMix Kernel using Windows putty SSH client

  Changelog
  ---------

  The following list shows the bug fixes and enhancements included in this release:

 ** Bug
     * [SMX4KNL-72] - If there is no etc/startup.properties, the kernel hangs without displaying any error
     * [SMX4KNL-79] - When starting the kernel, a log entry states "Can not install feature ''"
     * [SMX4KNL-86] - When running integration tests, the container classpath contains all the test bundles which may cause problems
     * [SMX4KNL-87] - Problems with batch files on windows
     * [SMX4KNL-95] - kernel build failed in testing/itests
     * [SMX4KNL-96] - package missing for felix.config.properties
     * [SMX4KNL-97] - Dissociate the name and the location of ServiceMix Kernel instances managed by the admin shell
     * [SMX4KNL-100] - The client does not close when running "osgi shutdown" command
     * [SMX4KNL-102] - The file monitor should use ${servicemix.base} for default polling locations
     * [SMX4KNL-104] - When using a remote connection, errors are not reported correctly
     * [SMX4KNL-105] - Features are reinstalled on restart of servicemix
     * [SMX4KNL-112] - gshell pom needs to include gshell-config and gshell-packages modules
     * [SMX4KNL-115] - config.properties for SMX-Kernel needs to be updated
     * [SMX4KNL-117] - The Smx testing platform should take into account the boot delegation packages specified in the configuration file
     * [SMX4KNL-118] - The configuration file for felix comes from 3 different places in the svn tree, only one copy should be used
     * [SMX4KNL-122] - When using the client and trying to connect to another instance using the "admin connect" command, the console hangs
     * [SMX4KNL-123] - XML parsing does not work on non Sun JVMs and Sun's SAAJ bundle requires Sun's JAXP implementation
     * [SMX4KNL-124] - Issuing command "log d" fails with NullPointerException on AIX.
     * [SMX4KNL-126] - The user is no more authenticated with the new gshell integration
     * [SMX4KNL-128] - Remove OBR support from default distribution
     * [SMX4KNL-132] - osgi/list command should display the spring application state
     * [SMX4KNL-133] - jaxp-ri bundle miss javax.xml.datatype.DatatypeFactory factoryId under META-INF/services
     * [SMX4KNL-134] - XPathFactoryFinder in jaxp api should use factoryId to load the spi class in osgi enviroment
     * [SMX4KNL-135] - Remote shell missing help resources
     * [SMX4KNL-138] - No command history with Shell console
     * [SMX4KNL-140] - Shell commands references not cleaned up when bundle uninstalled
     * [SMX4KNL-142] - Starting a new instance that was created with admin on windows fails to start
     * [SMX4KNL-145] - java.lang.IllegalStateException: Streams not registered for thread
     * [SMX4KNL-148] - OPS4J maven repo missing form default search list
     * [SMX4KNL-149] - Build failure due to new sshd snapshot
     * [SMX4KNL-150] - Shell group name variable doesn't resolve
     * [SMX4KNL-151] - Update displayed version in Shell to be 1.1.0-SNAPSHOT for trunk
     * [SMX4KNL-153] - Stopping one of the "core" bundles of the servicemix engine block the server
     * [SMX4KNL-155] - Error changing manifest while bundle is deployed
     * [SMX4KNL-162] - The default jaas realm uses the config admin to store clear password
     * [SMX4KNL-164] - features/removeUrl does not remove the repository
     * [SMX4KNL-165] - Initial provisioning using features is very slow especially when using snapshots
     * [SMX4KNL-170] - Unknown protoc
