/*
 * 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 ServiceMix 5.2.2
                  ================================
 Overview
 --------

Apache ServiceMix is a flexible, open-source integration container that unifies the
features and functionality of Apache ActiveMQ, Camel, CXF, and Karaf into a powerful
runtime platform you can use to build your own integrations solutions.

Apache ServiceMix 5.2.2 is a new minor release, which includes a few bug fixes and
a new version of Apache karaf, Apache Camel and Apache CXF. This release includes:

- Apache ActiveMQ 5.10.2 (http://activemq.apache.org)
- Apache Camel 2.14.3 (http://camel.apache.org)
- Apache CXF 3.0.5 (http://cxf.apache.org)
- Apache Karaf 2.3.11 (http://karaf.apache.org)


 Changelog
 ---------

** Bug
    * [SM-2551] - Drools6ExamplesTest fails on Jenkins

** Task
    * [SM-2405] - Remove workaround for SM-2396
    * [SM-2495] - Upgrade to Karaf 2.3.11
    * [SM-2572] - Upgrade to Apache Camel 2.14.3 and CXF 3.0.5
    * [SM-2594] - Release Apache ServiceMix 5.2.2


                      Apache ServiceMix 5.2.1
                  ================================
 Overview
 --------

Apache ServiceMix is a flexible, open-source integration container that unifies the
features and functionality of Apache ActiveMQ, Camel, CXF, and Karaf into a powerful
runtime platform you can use to build your own integrations solutions.

Apache ServiceMix 5.2.1 is a new minor release, which includes a few bug fixes and
a new version of Apache karaf, Apache ActiveMQ, Apache Camel and Apache CXF. 
This release includes:

- Apache ActiveMQ 5.10.2 (http://activemq.apache.org)
- Apache Camel 2.14.2 (http://camel.apache.org)
- Apache CXF 3.0.4 (http://cxf.apache.org)
- Apache Karaf 2.3.10 (http://karaf.apache.org)


 Changelog
 ---------

** Bug
    * [SM-2317] - activemq:browse no more working
    * [SM-2335] - installing both webconsole and activemq-web-console causes hang
    * [SM-2422] - Multiple JMS connection factories found for amq-broker
    * [SM-2425] - Compilation of examples included in distribution fails
    * [SM-2464] - Unable to install the bundle created using the servicemix-cxf-code-first-osgi-bundle and servicemix-cxf-wsdl-first-osgi-bundle archetype
    * [SM-2492] - Wrong sample keystore format in examples contained in the assembly

** Task
    * [SM-2413] - Release Apache ServiceMix 5.2.1
    * [SM-2421] - Upgrade to ActiveMQ 5.10.1
    * [SM-2426] - Add missing maven plugin versions to examples parent pom in the distribution
    * [SM-2431] - Upgrade to Karaf 2.3.10
    * [SM-2432] - Upgrade to ActiveMQ 5.10.2
    * [SM-2438] - Upgrade to Camel 2.14.2
    * [SM-2473] - Consistent usage of joda-time bundle
    * [SM-2474] - Consistent usage of scala bundle
    * [SM-2487] - Upgrade to Scala 2.10.4
    * [SM-2488] - Upgrade to Jackson 2.3.3
    * [SM-2490] - Upgrade to CXF 3.0.4

                      Apache ServiceMix 5.2.0
                  ================================
 Overview
 --------

Apache ServiceMix is a flexible, open-source integration container that unifies the
features and functionality of Apache ActiveMQ, Camel, CXF, and Karaf into a powerful
runtime platform you can use to build your own integrations solutions.

Apache ServiceMix 5.2.0 is a new major release of the project, which includes:

- Apache ActiveMQ 5.10.0 (http://activemq.apache.org)
- Apache Camel 2.14.1 (http://camel.apache.org)
- Apache CXF 3.0.2 (http://cxf.apache.org)
- Apache Karaf 2.3.9 (http://karaf.apache.org)


 Changelog
 ---------

** Bug
* [SM-2301] - Problem installing activiti feature after upgrade to ActiveMQ 5.9.1
* [SM-2319] - Connector feature not in sync with transaction
* [SM-2326] - Route deployed in deploy directory using activemq does not start after ServiceMix restart 
* [SM-2346] - Can not resolve feature: camel-avro
* [SM-2361] - cxf feature should be present as a boot feature
* [SM-2376] - Incorrect javax.annotation version for java7
* [SM-2396] - CXF WSN sample installation fails

** Improvement
* [SM-2388] - Add "update-strategy" to camel-blueprint example


** New Feature
* [SM-2381] - Web Script Console Plugin

** Task
* [SM-2223] - Incorrect Information on Remote-debugging ServiceMix in Eclipse
* [SM-2320] - Upgrade to Karaf 2.3.6
* [SM-2347] - Release Apache ServiceMix 5.2.0
* [SM-2354] - Upgrade to maven-bundle-plugin 2.5.0
* [SM-2359] - Upgrade to Pax Exam 4.1.0
* [SM-2362] - Require JDK 7 for build
* [SM-2365] - Upgrade to Karaf 2.3.7
* [SM-2368] - Upgrade to Camel 2.14.0 and CXF 3.0.2
* [SM-2371] - Upgrade to Karaf 2.3.8
* [SM-2373] - Downgrade to Pax Exam 3.5.0
* [SM-2380] - Create a overview page with servicemix roadmap
* [SM-2393] - Upgrade to Activiti 5.16.4
* [SM-2397] - Upgrade to Karaf 2.3.9
* [SM-2398] - Upgrade maven plugins
* [SM-2399] - Upgrade to Apache POM 15 
* [SM-2400] - Upgrade to Felix maven-bundle-plugin 2.5.3
* [SM-2402] - Use correct cxf.codegen-plugin version
* [SM-2403] - Upgrade to maven-surefire-plugin 2.18
* [SM-2411] - Upgrade to Camel 2.14.1


See the README file for more general information about ServiceMix 5.

Thanks you for downloading ServiceMix.  Enjoy !

The ServiceMix Team
http://servicemix.apache.org/community/team.html

