<?xml version="1.0" encoding="UTF-8"?>
<document>
  <properties>
    <title>The Apache Velocity Project</title>
    <author email="dev@velocity.apache.org">
      Velocity Documentation Team
    </author>
  </properties>

  <body>
    <section name="The Apache Velocity Project">
      <p>
        Velocity is a project of the
        <a href="http://www.apache.org/">Apache Software Foundation</a>,
        charged with the creation and maintenance of open-source
        software related to the
        <a href="engine/index.html">Apache Velocity Engine</a>
        . All software created at the Velocity project is available
        under the
        <a href="http://www.apache.org/licenses/LICENSE-2.0.txt">Apache Software License</a>
        and free of charge for the public.
      </p>
    </section>

    <section name="Apache Software Foundation">
      <p>
        The Apache Software Foundation provides support for the Apache
        community of open-source software projects. The
        <a href="http://projects.apache.org/">Apache projects</a>
        are characterized by a collaborative, consensus based
        development process, an open and pragmatic
        <a href="http://www.apache.org/foundation/licence-FAQ.html">software license</a>,
        and a desire to create high quality software that leads the
        way in its field.
      </p>
    </section>

    <section name="Apache Velocity projects">
      <p>Apache Velocity offers the following projects:</p>
      <dl>
        <dt><a href="engine/index.html">Velocity Engine</a></dt>
        <dd>
          This is the actual templating engine which does all the work.
          If you came here because you heard about Velocity somewhere on
          the web, this is probably the right place to start.
        </dd>

        <dt><a href="tools/index.html">Velocity Tools</a></dt>
        <dd>
          This project contains tools and other useful infrastructure
          to build web- and non-web application using the Velocity
          engine. You will find e.g. code for
          <a href="http://struts.apache.org/">Struts</a>
          integration or the standalone Velocity View Servlet here.
        </dd>

        <dt><a href="dvsl/">Velocity DVSL</a></dt>
        <dd>
          DVSL (Declarative Velocity Style Language) is a tool modeled
          after XSLT and is intended for general XML transformations
          using the Velocity Template Language as the transformation
          language.
        </dd>
      </dl>
    </section>


    <section name="Release status">

      <p>These are the current releases of all Apache Velocity projects:</p>
      <table>
        <tr>
          <th>Project</th>
          <th>Release Version</th>
          <th>Alpha/Beta/RC Release version</th>
        </tr>

        <tr>
          <td>Velocity Engine</td>
          <td>
            <a href="engine/releases/1.4/index.html">1.4</a>
          </td>
          <td>
            <a href="engine/releases/1.5-beta2/index.html">1.5-beta2</a>
          </td>
        </tr>

        <tr>
          <td>Velocity Tools</td>
          <td>
            <a href="releases/tools/1.2/">1.2</a>
          </td>
          <td>(currently none available)</td>
        </tr>

        <tr>
          <td>DVSL</td>
          <td>(currently none available)</td>
          <td>(currently none available)</td>
        </tr>
      </table>
      <p>
        The release distribution is available as a combined
        source/binary distribution in tar.gz and zip formats, and can be
        downloaded from
        <a href="download.html">our download page</a>.
      </p>
    </section>

    <section name="More information">
      <p>
        For more information about the Apache Velocity Project, see

        <ul>
          <li>
            <a href="how-it-works.html">How the Apache Velocity project works</a>
          </li>
          <li>
            <a href="guidelines.html">General guidelines and rules that we adhere to</a>
          </li>
          <li>
            <a href="who-we-are.html">Who are the people behind the Apache Velocity project</a>
          </li>
          <li>
            <a href="get-involved.html">Find out how to get involved with the Apache Velocity
              project</a>
          </li>
          <li>
            <a href="contact.html">Contact the Apache Velocity project</a>
          </li>
        </ul>
      </p>

      <p>
        For more information about the Apache Software Foundation, see

        <ul>
          <li>
            <a href="http://www.apache.org/">Foundation Home page</a>
          </li>
          <li>
            <a href="http://www.apache.org/foundation/licence-FAQ.html">Apache License and Distribution FAQ</a>
          </li>
        </ul>
      </p>
    </section>
  </body>
</document>
