////
   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.   
////
= Apache OpenNLP project team
:jbake-type: page
:jbake-tags: maven
:jbake-status: published
:idprefix:

The OpenNLP team currently consists of:

* Jörn Kottmann (joern) **Chair** (C-P)
* Grant Ingersoll (gsingers) (C-P)
* Isabel Drost (isabel) (P)
* James Kosin (jkosin) (C-P)
* Jason Baldridge (jbaldrid) (C-P)
* Thomas Morton (tsmorton) (C-P)
* William Silva (colen) (C-P)
* Rodrigo Agerri (ragerri) (C-P)
* Aliaksandr Autayeu (autayeu) ( C )
* Boris Galitsky (bgalitsky) ( C )
* Mark Giaconia ( C ) 
* Tommaso Teofili (tommaso) (C-P)
* Vinh Khuc (vkhuc) ( C )
* Anthony Beylerian (beylerian) ( C )
* Mondher Bouazizi (mondher) ( C )
* Chris Mattmann (mattmann) ( C )
* Anastasija Mensikova (anastasijam) ( C )
* Suneel Marthi (smarthi) (C-P)
* Daniel Russ (druss) (C-P)
* Peter Thygesen (thygesen) ( C-P )
* Koji Sekiguchi (koji) ( C-P )
* Bruno P. Kinoshita (kinow) (C-P)
* Jeffrey Zemerick (jzemerick) ( C-P )

These people contributed to OpenNLP:

* Thilo Goetz (twgoetz)
* Gann Bierner
* Eric Friedman
* Joao Cavalcanti
* Hyosup Shim

*C* indicates a commiter and *P* a PMC member.
 
