<!--

  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.

-->

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

Apache Edgent(incubating) 1.3.0
---------------------
Dale LaBossiere
Christofer Dutz
Vino Yang

Apache Edgent(incubating) 1.2.0
---------------------
Christofer Dutz
Dale LaBossiere
John Ament
Justin Mclean
Thomas Cristanis

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
