<!--
  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.
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Apache Tomcat @VERSION@</TITLE>
<META http-equiv=Content-Type content="text/html">
</HEAD>
<BODY>
<P>
<H3>Apache Tomcat @VERSION@</H3>
<P></P>
<p>Useful references:
<ul>
<li><a href="RELEASE-NOTES">Release notes</a>, with important information 
about known issues</li>
<li><a href="http://tomcat.apache.org/tomcat-5.5-doc/changelog.html">Changelog</a></li>
<li><a href="http://tomcat.apache.org/tomcat-5.5-doc/status.html">Status</a></li>
</ul>
</p>

<p><b>NOTE: The tar files in this distribution use GNU tar extensions, 
and must be untarred with a GNU compatible version of tar. The version 
of <CODE>tar</CODE> on Solaris and Mac OS X will not work with 
these files.</b></P>

<p><font color="red">Tomcat 5.5 requires JRE 5.0 by default.  Read the 
RELEASE-NOTES and the RUNNING.txt file in the distribution for more details.
</font></p>

<p>Packaging Details (or "What Should I Download?")
  <ul>
    <li>apache-tomcat-[version].zip or .tar.gz: base distro, all non-embedded users download this.</li>
    <li>apache-tomcat-[version].exe: Windows installer with base distro contents + Windows installation.</li>
    <li>apache-tomcat-[version]-admin.zip or .tar.gz: the Tomcat Administration webapp only.</li>
    <li>apache-tomcat-[version]-compat.zip or .tar.gz: required in addition to the base distro for using tomcat with a Java 1.4 environment.</li>
    <li>apache-tomcat-[version]-deployer.zip or .tar.gz: the standalone Tomcat Web Application Deployer.</li>
    <li>apache-tomcat-[version]-embed.zip or .tar.gz: for using Tomcat only as an embedded servlet container.</li>
  </ul>
</p>

<P>Thank you for using <A href="http://tomcat.apache.org/">Tomcat</A>!. 
</P>
<P><B>The Apache Tomcat Project</B> <BR><A 
href="http://tomcat.apache.org/">http://tomcat.apache.org/</A> </P>
<P>
<P></P></BODY></HTML>
