/*
 * 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.
 */

Welcome to Apache ServiceMix!
======================
Apache ServiceMix is an open source distributed Enterprise Service Bus (ESB) and SOA toolkit built from the ground up 
on the semantics and APIs of the Java Business Integration (JBI) specification JSR 208 and released under 
the Apache 2.0 license.

Apache ServiceMix is lightweight and easily embeddable, has integrated Spring support and can be run at the edge of 
the network (inside a client or server), as a standalone ESB provider or as a service within another ESB. 
You can use ServiceMix in Java SE or a Java EE application server.


Incubation Disclaimer
=====================
Apache ServiceMix is an effort undergoing incubation at the Apache Software Foundation (ASF), sponsored by the Geronimo PMC. 
Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, 
communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. 

While incubation status is not necessarily a reflection of the completeness or stability of the code, it does 
indicate that the project has yet to be fully endorsed by the ASF.


Getting Started
===============
To find out how to get started try this
http://incubator.apache.org/servicemix/getting-started-guide.html

If you need more help try talking to us on our mailing lists
http://incubator.apache.org/servicemix/mailing-lists.html


We welcome contributions
http://incubator.apache.org/servicemix/contributing.html

Many thanks for using Apache ServiceMix.


The ServiceMix Team
http://incubator.apache.org/servicemix/team.html
