<!--
  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.
-->
<document>
  <properties>
    <title>Developer guide for Apache Commons Testing</title>
  </properties>
  <body>

    <section name='Developer guide for Apache Commons Testing'>

      <h1>
        The Apache Commons
        <em>Testing</em>
        Component
      </h1>
      <h2>Developers Guide</h2>
      <br />
      <a href="#Introduction">[Introduction]</a>
      <a href="#PackageStructure">[Package Structure]</a>
      <a href="#UtilityClasses">[Utility Classes]</a>
      <a href="#Javadoc">[Javadoc]</a>
      <a href="#Building">[Building]</a>
      <br />
      <br />

      <a name="Introduction"></a>
      <h3>1. INTRODUCTION</h3>

      <a name="PackageStructure"></a>
      <h3>2. PACKAGE STRUCTURE</h3>

      <a name="UtilityClasses"></a>
      <h3>3. UTILITY CLASSES</h3>

      <a name="Javadoc"></a>
      <h3>4. JAVADOC</h3>

      <a name="Building"></a>
      <h3>5.BUILDING</h3>
      <h4>Building a Release</h4>
      <p>
        Commons Testing targets Java 7.
      </p>
    </section>
  </body>
</document>
