Title: Celebrating a Decade of Open Source Leadership
license: https://www.apache.org/licenses/LICENSE-2.0

( [Plain Text Version](pr_2009_11_04.txt) )
<h2>Subversion Submitted to Become a Project at The Apache Software
Foundation</h2>
Award-Winning Open Source Version Control and Software Configuration
Management Tool to Benefit from Stewardship, Technology, and Community
Synergies

OAKLAND, Calif., APACHECON US 2009, Nov. 4, 2009 — The
CollabNet-sponsored Subversion project and The Apache Software Foundation
(ASF) announced today that the award-winning Open Source project has
formally submitted itself to the Apache Incubator in order to become part
of the Foundation's efforts.

The incubation of Subversion is the first step to becoming an ASF Top-Level
Project. The Subversion community will join more than 130 Open Source
initiatives overseen by the ASF, and will benefit from the Foundation’s
widely-emulated meritocratic process, stewardship, outreach, support, and
community events.

The Subversion project and Apache Software Foundation have a long and
intertwined history: many of the same people founded and continue to
actively contribute to both organizations. The communities also work
closely together, often utilizing capabilities of their respective
products: all of the ASF's projects use Subversion for source code version
control, and Subversion itself relies on many Apache projects such as
Apache Portable Runtime (APR) and HTTP Web Server. For nearly a decade, the
communities have benefited from open feedback channels, where requirements
from the Subversion project have helped drive new features to various
Apache projects, and vice versa.

"We are happy to welcome the Subversion development community to the Apache
Incubator," said Justin Erenkrantz, President of The Apache Software
Foundation. "Since its inception, the Subversion community has modeled
itself using many of the Foundation's principles, including the Apache
license, our voting structure, and building upon a diverse range of
contributors. Through organizational, legal, financial, and infrastructure
support, the ASF's proven framework will help the Subversion community to
do what it does best: provide valuable software to millions of developers
around the globe. It's a natural fit."

While Subversion is undergoing incubation at the ASF, CollabNet will
continue to host the project at http://subversion.tigris.org. In addition,
third party-certified binaries of the software configuration management
system will continue to be available from CollabNet, as well as from other
vendors, both during and after the incubation period.

"Becoming an Apache incubating project is a terrific move for our growing
developer community," said Subversion Corporation President Hyrum Wright.
"We are grateful to CollabNet for their long-standing support over the past
ten years, and look forward to continuing to work together as we further
expand Subversion as part of the ASF."

Many companies use Subversion, along with popular Apache projects such as
Ant and Maven, as part of their overall application lifecycle management
strategy. As the Subversion architecture complements so many Apache
projects, it is fitting that the project be stewarded by the same
organization and governed under the same processes.

"The Apache Tomcat / Subversion / Apache Maven stack has become the leading
code and build management stack for the Java community," said Bill
Portelli, chief executive officer, CollabNet. "There is a natural synergy
between the Subversion project and the ASF, and we anticipate expanded
developer contributions and deeper integrations with other Apache projects,
benefiting developers worldwide."

CollabNet is a Silver Sponsor of ApacheCon US 2009, being held November
2-6, 2009 in Oakland, CA. For more information about Subversion, visit the
CollabNet booth at the conference Expo Hall.

To download and experience Subversion, please visit
http://subversion.tigris.org. Further information on the Apache Incubator
is available at http://incubator.apache.org/.

### About The Apache Software Foundation (ASF) ###

Established in 1999, the all-volunteer Foundation oversees more than
seventy leading Open Source projects, including Apache HTTP Server — the
world's most popular Web server software. Through The ASF's meritocratic
process known as "The Apache Way," nearly 300 individual Members and 2,000
Committers successfully collaborate to develop freely available
enterprise-grade software, benefiting millions of users worldwide:
thousands of software solutions are distributed under the Apache License;
and the community actively participates in ASF mailing lists, mentoring
initiatives, and ApacheCon, the Foundation’s official user conference,
trainings, and expo. The ASF is funded by individual donations and
corporate sponsors including Google, HP, Microsoft, Progress Software,
SpringSource, and Yahoo! For more information, visit
http://www.apache.org/.

### About CollabNet ###

CollabNet is the leader in application lifecycle management (ALM) platforms
for distributed software development teams. CollabNet TeamForge is the
industry’s most open ALM platform, supporting every environment,
methodology, and technology. With an integrated suite of easy-to-use tools
that share a centralized repository, it is the only ALM platform that
enables a culture of collaboration, improving productivity 10-50% and
reducing the cost of software development by up to 80%. As the corporate
sponsor of the open source Subversion project, the best version control and
software configuration management (SCM) solution for distributed teams,
collaborative development is in CollabNet’s DNA. Millions of users at
more than 800 organizations, including Applied Biosystems, Capgemini,
Deutsche Bank, Oracle, Reuters, and the U.S. Department of Defense, have
transformed the way they develop software with CollabNet. For more
information, visit www.collab.net.

