/*
 * 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 6.1.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 6.1.2 is a new patch release, which includes a few bug fixes and
 a new version of Apache CXF, Apache Camel and Apache Karaf.
 This release includes:

 - Apache ActiveMQ 5.12.3 (http://activemq.apache.org)
 - Apache Camel 2.16.3 (http://camel.apache.org)
 - Apache CXF 3.1.5 (http://cxf.apache.org)
 - Apache Karaf 3.0.7 (http://karaf.apache.org)

  Changelog
  ---------

** Bug
    * [SM-2729] - Broken link to docs for 6.x.
    * [SM-2805] - Vulnerable Apache Commons Collection still installed?
    * [SM-2976] - stax-ex-1.7.6.jar is under CDDL+GPL  license
    * [SM-2984] - Correct the shutdown command in branding.properties
    * [SM-2991] - ServiceMix doesn't start in offline environment

** Task
    * [SM-2924] - Release Apache ServiceMix 6.1.2
    * [SM-2934] - Upgrade to Apache Camel 2.16.3 and Apache CXF 3.1.5
    * [SM-2937] - Upgrade Xalan bundle to 2.7.2_3
    * [SM-2946] - Upgrade to Pax Exam 4.9.0
    * [SM-2953] - Upgrade to Pax Exam 4.9.1
    * [SM-2989] - Upgrade maven-remote-resources-plugin configuration
    * [SM-2990] - Update maven plugins
    * [SM-3019] - Upgrade to Apache Karaf 3.0.7


                       Apache ServiceMix 6.1.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 6.1.1 is a new patch release, which includes a few bug fixes and
 a new version of Apache ActiveMQ, Apache Camel and Apache Karaf.
 This release includes:

 - Apache ActiveMQ 5.12.3 (http://activemq.apache.org)
 - Apache Camel 2.16.2 (http://camel.apache.org)
 - Apache CXF 3.1.4 (http://cxf.apache.org)
 - Apache Karaf 3.0.6 (http://karaf.apache.org)

  Changelog
  ---------

** Bug
    * [SM-2251] - Intermittent test failure in JMSAppenderTest
    * [SM-2824] - Missing dependencies in system folder
    * [SM-2848] - cxf-wsn-client client fails due to wrong slf4j version
    * [SM-2850] -  JMSAppenderTest.testReconnectToBroker fails
    * [SM-2851] - Some itests fail accidentally with NPE
    * [SM-2854] - Doclint for Javadoc fails on JDK 8
    * [SM-2864] - Update example README.txt files for new Karaf commands

** Improvement
    * [SM-2395] - Download pages should correctly refer the documentation pages

** Task
    * [SM-2751] - Release Apache ServiceMix 6.1.1
    * [SM-2752] - Upgrade to depends-maven-plugin 1.3.1
    * [SM-2753] - Use maven properties like `${project.build.outputDirectory}` instead of `target/classes`
    * [SM-2763] - Upgrade to Activiti 5.19.0.1
    * [SM-2778] - Upgrade to Apache ActiveMQ 5.12.2
    * [SM-2803] - Refactor the assembly creation
    * [SM-2806] - Ensure ServiceMix uses Apache Commons Collections 3.2.2
    * [SM-2807] - Upgrade to Apache POM 17
    * [SM-2808] - Avoid warnings about 'parent.relativePath' during the maven build
    * [SM-2819] - Upgrade to Pax Exam 4.8.0
    * [SM-2821] - Upgrade to Apache Camel 2.16.2
    * [SM-2822] - Upgrade Maven-bundle-plugin to version 3.0.1
    * [SM-2826] - Upgrade to ServiceMix Specs 2.6.0
    * [SM-2844] - Upgrade to Activiti 5.19.0.2
    * [SM-2849] - Upgrade to Jackson 2.6.3
    * [SM-2858] - Upgrade to Apache ActiveMQ 5.12.3
    * [SM-2861] - Upgrade to Apache Karaf 3.0.6


                      Apache ServiceMix 6.1.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 6.1.0 is a new minor release of the project, which includes:

- Apache ActiveMQ 5.12.1 (http://activemq.apache.org)
- Apache Camel 2.16.1 (http://camel.apache.org)
- Apache CXF 3.1.4 (http://cxf.apache.org)
- Apache Karaf 3.0.5 (http://karaf.apache.org)

 Changelog
 ---------

** Task
    * [SM-2700] - Increase the java compilance level to 1.7
    * [SM-2707] - Upgrade to Activiti 5.19.0
    * [SM-2716] - Upgrade to Apache Camel 2.16.0
    * [SM-2717] - Upgrade to Apache CXF 3.1.2
    * [SM-2727] - Upgrade to Jackson 2.6.2
    * [SM-2728] - Release Apache ServiceMix 6.1.0
    * [SM-2739] - Upgrade to maven-release-plugin 2.5.3
    * [SM-2741] - Upgrade to Apache Camel 2.16.1 and Apache CXF 3.1.4


                      Apache ServiceMix 6.0.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 6.0.1 is a new patch 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.12.1 (http://activemq.apache.org)
- Apache Camel 2.15.3 (http://camel.apache.org)
- Apache CXF 3.0.6 (http://cxf.apache.org)
- Apache Karaf 3.0.3 (http://karaf.apache.org)

 Changelog
 ---------

** Bug
    * [SM-2595] - Error message while installing activiti feature
    * [SM-2679] - Remove duplicate xalan libraries from endorsed libraries

** Task
    * [SM-2548] - Provide CXF Rest Service example for Drools 6
    * [SM-2617] - Release Apache ServiceMix 6.0.1
    * [SM-2621] - Upgrade to Apache Camel 2.15.3 and CXF 3.0.6
    * [SM-2653] - Upgrade to Apache ActiveMQ 5.11.2
    * [SM-2671] - Upgrade to Karaf 3.0.5
    * [SM-2675] - Upgrade to depends-maven-plugin 1.3.0
    * [SM-2696] - Upgrade to maven-bundle-plugin 3.0.0
    * [SM-2697] - Upgrade to Pax Exam 4.6.0
    * [SM-2701] - Upgrade to ActiveMQ 5.12.1

See the README file for more general information about ServiceMix 6.

Thanks you for downloading ServiceMix.  Enjoy !

The ServiceMix Team
http://servicemix.apache.org/community/team.html

