~~ 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.

    -----------------------
     Project Mailing Lists
    -----------------------

Project Mailing Lists

  The Apache Axiom project doesn't have dedicated mailing lists. Please use the
  {{{http://ws.apache.org/mail-lists.html}mailing lists of the Web Services project}}.
  When posting messages to these lists, please prefix the subject with [Axiom].
  
  Note that the Axiom project formerly used the <<<commons-dev@ws.apache.org>>> mailing
  list, which no longer exists. However, the archives of that list can still be consulted
  {{{http://mail-archives.apache.org/mod_mbox/ws-commons-dev/}here}}.
