/*
 * 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.
 */

Exit Criteria
(put an X next to item when it is complete):

Copyrights & Licensing

X -- Do all the software in the codebase has its copyright assigned to The
     Apache Software Foundation?
     Yes

X -- Do All the software in the codebase, are licensed (or multi-licensed) under the
     Apache licence?
     Yes

X -- Do all the software in the codebase,are compliant with the
     Specifications set by Java Community Process?(Wherever applicable)
     * This criteria has been superceded by the Exit Milestone below

Distribution rights

X -- For all code included with the distribution that is not under the
     Apache license, do we have the right to combine with Apache-licensed
     code and redistribute?
     Yes

X -- Is all source code distributed by the project covered by one or more
     of the following approved licenses:  Apache, BSD, Artistic, MIT/X,
     MIT/W3C, MPL 1.1, or something with essentially the same terms?
     Yes

Infrastructure

X -- SVN modules created and committers added to avail file?
     Yes:       https://svn.apache.org/repos/asf/incubator/servicemix

X -- Are the developer,commit and user mailing lists set up and archived?
     Yes:       http://incubator.apache.org/servicemix/mailing-lists.html

X -- Bug tracking system enabled?
     Yes:       http://issues.apache.org/activemq/browse/SM

X -- wiki based documentation site enabled?
     Yes:       http://goopen.org/confluence/display/SM/Home

X -- Has the project migrated to our infrastructure?
     Yes

Committers:

X -- Have all of the active long-term volunteers been identified
     and acknowledged as committers on the project?
     Yes

X -- Have all the commiters signed the CLA?
     Yes.

X -- Do they have accounts on cvs.apache.org?
     Yes

X -- Are there three or more independent committers?
     Yes

Collaborative Development:

X -- Are project decisions being made in public by the committers?
     Yes

X -- Are the decision-making guidelines published and agreed to by
     all of the committers?
     Yes

X -- Does the documentation site has enough information on the architecure, design decisions and
     modules?
     Yes

X -- Has the community, the graduation/new PMC of the project to which the codebase and community
     will move at the end of incubation (if any), and the Incubator PMC, decided the
     expected time frame of stay in incubator?
     Yes - when the Exit Milestone below has been achieved

X -- Has the community adopted the Apache voting rules and is otherwise following the Apache
     guidelines?
     Yes

Exit Milestone:
X -- v3.0-M1

organisational acceptance:

  -- Has the board accepted moving to a existing/new PMC?


Incubator sign-off:

  -- Has the Incubator decided that the project has accomplished all
     of the above tasks?
