THE APACHE GROUP INCORPORATES TO BECOME THE APACHE SOFTWARE FOUNDATION

Non-profit corporation provides organizational assistance and
development frameworks for the Apache open-source projects,
including the world's leading Web server

For Immediate Release --

Contact: Sally Khudairi
 ZOT Group
 +1.617.818.0177 <sk@zotgroup.com>

http://www.apache.org/  -- June 30, 1999 -- The Apache Group today
announced the creation of the Apache Software Foundation (ASF), to
formally shepherd the development of the #1 Web server
worldwide -- the Apache HTTP Server Project -- and other projects
under the Apache umbrella. This international volunteer effort is
dedicated to the support of open-source software projects based on
the collaborative model of the Apache HTTP Server Project. "This
is an important step forward for the Apache projects," said
Roy T. Fielding, ASF Chairman and co-founder of the Apache HTTP
Server Project. "The Apache Software Foundation will protect the
efforts of the community of developers working on our open-source
projects, while providing a pillar of strength and stability for
our customers."

COMMITMENT TO COLLABORATIVE DEVELOPMENT

The Apache Software Foundation will provide organizational, legal,
and financial support for the Apache open-source software
projects. The Foundation ensures the continuity of Apache projects
beyond the participation of individual volunteers, enables
contributions of intellectual property and financial support on a
sound basis, and provides a vehicle for limiting legal exposure
while participating in open-source projects.

Although the Foundation will oversee all Apache activities, the
technical aspects of each project will be governed by its own
project team. The ASF requires that all its projects remain open
to new contributors via Internet collaboration, and limits the
distribution of software under its name to a set of approved
open-source licenses, but does not interfere with the day-to-day
operations of each project.

"IBM is pleased to be a part of today's announcement, which really
helps to further drive collaborative, open source development
within the broader community," said Robert LeBlanc, Vice President,
IBM Software Strategy. "IBM will also be providing code and a
dedicated team of programmers to the Apache Software Foundation,
including the Jakarta Project and will use the resulting code in
its commercial products, similar to its use of the Apache Web
Server today. Setting up the Foundation ensures that both
commercial software customers and the community will benefit from
the broad range of skills and partners in the marketplace."

CONTINUED LEADERSHIP BY COMMUNITY MEMBERS

ASF membership is open to individuals by invitation. Candidates
are judged by their technical contributions and skills, and must
be active collaborators on one or more of the Foundation's
projects. At present, only individuals may become members; however,
companies may be represented in the Foundation by individual
participants.

"We hope that the open-source community, especially Apache software
users, will view this new corporate structure in the spirit that we
held when working toward its existence," said Randy Terbush,
CEO/CTO of Covalent Technologies. "Our ultimate goal was to preserve
the longevity of the Apache open-source development efforts while
extending the same benefits to other open-source projects that
fit logically under the Apache Software Foundation umbrella."

The members of the Apache Software Foundation have elected a Board
of Directors to oversee the corporation and ensure its responsiveness
to the needs of its projects. The Board is comprised of
widely-recognized contributors to the original Apache Group:

 Brian Behlendorf (O'Reilly and Associates)
 Ken Coar (IBM Corporation)
 Roy T. Fielding (University of California, Irvine)
 Ben Hyde (Gensym)
 Jim Jagielski (jaguNET Access Services)
 Ben Laurie (A.L. Digital Ltd.)
 Sameer Parekh (C2Net)
 Randy Terbush (Covalent Technologies)
 Dirk-Willem van Gulik (WebWeaving Consultancy)

"The Foundation will be guided by the same people who have
maintained the vision, principles and continuity of the Apache
projects over the past four years," added Fielding.

APACHE OPEN-SOURCE SOFTWARE PROJECTS

Projects overseen by the Apache Software Foundation carry forth
the commitment to open collaboration, active participation from
the Internet developer community, and freely available software.

The Apache HTTP Server Project, the Foundation's best-known
project, was founded in 1995 as a collaborative effort to produce
an open-source, commercial-grade Web server in sync with the
Internet standards for the Hypertext Transfer Protocol [HTTP].
Software produced by the Apache HTTP Server Project serves over
61% of all public Internet websites, according to the June 1999
Netcraft Web Server Survey [http://www.netcraft.com/survey/].
Hundreds of users have contributed ideas, code, and documentation
to the project. Every eight seconds another Apache-based website
joins the existing 3.5 million on the Web.

"Apache has had 'sister' projects for quite some time. We are now
formalizing that relationship, and ensuring that these projects benefit
from the same operating framework that the HTTP Server Project has
and will continue to have," explained Brian Behlendorf, ASF President.

One such sister project is the recently announced Jakarta
Project -- the collaboration between Sun Microsystems, IBM,
Oracle, and the server-side Java development community. Sun
Microsystems is donating a significant amount of code to this
project, and plans to use code from Jakarta in their commercial
products and services.

"There's a lot of trust in the Apache name, and we want to
maintain that," added Behlendorf. "We want to do what we can to
make the open-source development model really work."

ABOUT THE APACHE SOFTWARE FOUNDATION

The Apache Software Foundation provides organizational, legal, and
financial support for the Apache open-source software projects.
Formerly known as the Apache Group, the Foundation incorporated as
a membership-based, not-for-profit corporation to ensure that the
Apache projects continue to exist beyond the participation of
individual volunteers, to enable contributions of intellectual
property and financial support, and to provide a vehicle for
limiting legal exposure while participating in open-source
projects. For more information on the Apache Software Foundation,
please see http://www.apache.org/
