The following volunteers have contributed code, documentation, testing and/or support to the Apache Edgent(incubating).

Apache Edgent(incubating) 1.1.0
---------------------
Cazen Lee
Dale LaBossiere
Daniel John Debrunner
Justin Mclean
Katherine Marsden
Susan L. Cline
Victor Dogaru
William Marshall
Yaoling Chen

Apache Edgent(incubating) 1.0.0
---------------------
Alex Glikson
Alexander Cook
BJ Hargrave
Cazen Lee
Dale LaBossiere
Daniel John Debrunner
Daniel Takamori
James Mullineux
Julian Hyde
Justin Mclean
Katherine Marsden
Kathy Saunders
Luciano Resende
May Wone
Michael Dye
Mike Spicer
Queenie Ma
Saurabh Jinturkar
Sergey Vlasov
Susan L. Cline
Victor Dogaru
William Marshall
Yaoliang Chen

Many other people have contributed in other ways to the Apache Edgent(incubating) project
by helping out on the mailing list, maintaining the website, adding and editing wiki content,
raising bugs in JIRA, and with many other tasks.

Please check the Apache Edgent website [1], Apache Edgent wiki [2], dev mailing list [3],
Apache Edgent JIRA [4], GitHub mirror [5] for some of these contributions.

If you've missing from any of these lists please get in touch and you'll appear
in future versions of this document.

1. http://edgent.incubator.apache.org/
2. https://cwiki.apache.org/confluence/display/Edgent/Apache+Edgent+Wiki+Home
3. dev@edgent.incubator.apache.org
4. https://issues.apache.org/jira/browse/EDGENT
5. https://github.com/apache/incubator-edgent
