/*
 * 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 7.0.0.M2
                  ================================
 Overview
 --------

  !! This is a technology preview release of Apache ServiceMix, and should NOT be considered production ready !!

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 7.0.0 will be the first release based on Karaf 4.0.x, which includes numerous new features. 
We ask that users provide the community with their feed back so that the full Apache ServiceMix 7.0.0 release 
can be as feature complete and stable as possible.

Apache ServiceMix 7.0.0.M2 is a new preview release of the project, which includes:

- Apache ActiveMQ 5.13.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 4.0.5 (http://karaf.apache.org)


 Changelog
 ---------

** Bug
    * [SM-2850] -  JMSAppenderTest.testReconnectToBroker fails
    * [SM-2863] - Test failure when building examples
    * [SM-2864] - Update example README.txt files for new Karaf commands
    * [SM-2867] - Intermittent test failures in ActivitiExamplesTest
    * [SM-2883] - Intermittent test failures in CamelDrools5ExamplesTest
    * [SM-2976] - stax-ex-1.7.6.jar is under CDDL+GPL  license
    * [SM-2978] - Jackson 2.7.0 in ServiceMix 7.0.0.M1 throws java.lang.NoSuchMethodError
    * [SM-2984] - Correct the shutdown command in branding.properties
    * [SM-2991] - ServiceMix doesn't start in offline environment

** Improvement
    * [SM-2395] - Download pages should correctly refer the documentation pages

** Task
    * [SM-2852] - Upgrade to Apache ActiveMQ 5.13.1
    * [SM-2866] - Release Apache ServiceMix 7.0.0.M2
    * [SM-2895] - Upgrade to Apache ActiveMQ 5.13.2
    * [SM-2931] - Upgrade to Apache Karaf 4.0.5
    * [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-2947] - Migrate itests to Java
    * [SM-2953] - Upgrade to Pax Exam 4.9.1
    * [SM-2955] - Upgrade to Apache ActiveMQ 5.13.3
    * [SM-2989] - Upgrade maven-remote-resources-plugin configuration
    * [SM-2990] - Update maven plugins


                      Apache ServiceMix 7.0.0.M1
                  ================================
 Overview
 --------

  !! This is a technology preview release of Apache ServiceMix, and should NOT be considered production ready !!

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 7.0.0 will be the first release based on Karaf 4.0.x, which includes numerous new features. 
We ask that users provide the community with their feed back so that the full Apache ServiceMix 7.0.0 release 
can be as feature complete and stable as possible.

Apache ServiceMix 7.0.0.M1 is a new preview release of the project, which includes:

- Apache ActiveMQ 5.13.0 (http://activemq.apache.org)
- Apache Camel 2.16.2 (http://camel.apache.org)
- Apache CXF 3.1.4 (http://cxf.apache.org)
- Apache Karaf 4.0.4 (http://karaf.apache.org)


 Changelog
 ---------

** Bug
    * [SM-2251] - Intermittent test failure in JMSAppenderTest
    * [SM-2698] - ActiveMQ web console fails on J8
    * [SM-2786] - Drools 5 examples fail due to missing Eclipse JDT
    * [SM-2787] - Test failures in CxfWsnExamplesTest
    * [SM-2813] - Drools6CamelServiceExamplesTest fails with error
    * [SM-2814] - Drools6ExamplesTest fails with error
    * [SM-2818] - ServiceMix installs randomly spring 3.1.4.RELEASE feature
    * [SM-2823] - ActivitiExamplesTest fails accidentally 
    * [SM-2824] - Missing dependencies in system folder
    * [SM-2825] - Installation of CXF WSN sample fails
    * [SM-2845] - Installation of the cxf-wsn feature fails accidentally
    * [SM-2848] - cxf-wsn-client client fails due to wrong slf4j version
    * [SM-2851] - Some itests fail accidentally with NPE
    * [SM-2854] - Doclint for Javadoc fails on JDK 8

** Task
    * [SM-2355] - Remove the workaround jaxrs-api feature
    * [SM-2759] - Upgrade to Apache ActiveMQ 5.13.0
    * [SM-2763] - Upgrade to Activiti 5.19.0.1
    * [SM-2768] - Upgrade to Apache Karaf 4
    * [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-2820] - Upgrade to Apache Karaf 4.0.4
    * [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-2846] - Upgrade maven-compiler-plugin to 3.3
    * [SM-2847] - Upgrade maven-eclipse-plugin to 2.10
    * [SM-2849] - Upgrade to Jackson 2.6.3
    * [SM-2853] - Release Apache ServiceMix 7.0.0.M1

See the README file for more general information about ServiceMix 7.

Thanks you for downloading ServiceMix.  Enjoy !

The ServiceMix Team
http://servicemix.apache.org/community/team.html

