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


Export Notice
============================
This distribution includes cryptographic software.  The country in 
which you currently reside may have restrictions on the import, 
possession, use, and/or re-export to another country, of 
encryption software.  BEFORE using any encryption software, please 
check your country's laws, regulations and policies concerning the
import, possession, or use, and re-export of encryption software, to 
see if this is permitted.  See <http://www.wassenaar.org/> for more
information.

The U.S. Government Department of Commerce, Bureau of Industry and
Security (BIS), has classified this software as Export Commodity 
Control Number (ECCN) 5D002.C.1, which includes information security
software using or performing cryptographic functions with asymmetric
algorithms.  The form and manner of this Apache Software Foundation
distribution makes it eligible for export under the License Exception
ENC Technology Software Unrestricted (TSU) exception (see the BIS 
Export Administration Regulations, Section 740.13) for both object 
code and source code.

The following provides more details on the included cryptographic
software:
   http://xml.apache.org/security/
   http://www.bouncycastle.org/
   http://ws.apache.org/wss4j/


Getting Started
===============
To find out how to get started try this
http://servicemix.apache.org/1-quick-start.html

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


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

Many thanks for using Apache ServiceMix.


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