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