<?xml version="1.0" encoding="UTF-8"?>
<!--
  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.    
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by Apache Maven Doxia at Apr 19, 2012 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Team list</title>
    <style type="text/css" media="all">
      @import url("./css/james.css");
      @import url("./css/maven-base.css");
      @import url("./css/maven-theme.css");
      @import url("./css/site.css");
      @import url("./js/jquery/css/custom-theme/jquery-ui-1.8.5.custom.css");
      @import url("./js/jquery/css/print.css");
      @import url("./js/fancybox/jquery.fancybox-1.3.4.css");
    </style>
    <script type="text/javascript" src="./js/jquery/js/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="./js/jquery/js/jquery-ui-1.8.5.custom.min.js"></script>
    <script type="text/javascript" src="./js/fancybox/jquery.fancybox-1.3.4.js"></script>
    <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
    <meta name="Date-Revision-yyyymmdd" content="20120419" />
    <meta http-equiv="Content-Language" content="en" />
                                                    
<link title="DOAP" rel="meta" type="application/rdf+xml" href="http://james.apache.org//doap_james-project.rdf"/>
                      
          <!-- Google Analytics -->
    <script type="text/javascript">
    
      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-1384591-1']);
      _gaq.push(['_trackPageview']);

      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script').item(0); s.parentNode.insertBefore(ga, s);
      })();

    </script>
    </head>
  <body class="composite">
    <div id="banner">
                                      <a href="index.html" id="bannerLeft" title="james-project-logo.gif">
              
                                                                            
        <img src="images/logos/james-project-logo.gif" alt="James Project" />
                </a>
                              <a href="http://www.apache.org/index.html" id="bannerRight">
              
                                        
        <img src="images/logos/asf-logo-reduced.gif" alt="The Apache Software Foundation" />
                </a>
            <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="breadcrumbs">
            
                
                <div class="xleft">
        <span id="publishDate">Last Published: 2012-04-19</span>
                      </div>
            <div class="xright">                    <a href="index.html" title="Home">Home</a>
            |
                        <a href="server/index.html" title="Server">Server</a>
            |
                        <a href="hupa/index.html" title="Hupa">Hupa</a>
            |
                        <a href="protocols/index.html" title="Protocols">Protocols</a>
            |
                        <a href="mailet/index.html" title="Mailets">Mailets</a>
            |
                        <a href="mailbox/index.html" title="Mailbox">Mailbox</a>
            |
                        <a href="mime4j/index.html" title="Mime4J">Mime4J</a>
            |
                        <a href="jsieve/index.html" title="jSieve">jSieve</a>
            |
                        <a href="jspf/index.html" title="jSPF">jSPF</a>
            |
                        <a href="jdkim/index.html" title="jDKIM">jDKIM</a>
            |
                        <a href="mpt/index.html" title="MPT">MPT</a>
            |
                        <a href="postage/index.html" title="Postage">Postage</a>
              
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="leftColumn">
      <div id="navcolumn">
             
                
                                <h5>About James</h5>
                  <ul>
                  <li class="none">
                          <a href="index.html" title="Overview">Overview</a>
            </li>
                  <li class="none">
                          <a href="newsarchive.html" title="News">News</a>
            </li>
                  <li class="none">
                          <a href="mail.html" title="Mailing Lists">Mailing Lists</a>
            </li>
                  <li class="none">
                          <a href="contribute.html" title="Contributing">Contributing</a>
            </li>
                  <li class="none">
                          <a href="guidelines.html" title="Guidelines">Guidelines</a>
            </li>
                  <li class="none">
                          <a href="http://wiki.apache.org/james" title="Wiki">Wiki</a>
            </li>
                  <li class="none">
            <strong>Who We Are</strong>
          </li>
                  <li class="none">
                          <a href="license.html" title="License">License</a>
            </li>
          </ul>
                       <h5>Download</h5>
                  <ul>
                  <li class="none">
                          <a href="download.cgi" title="Releases">Releases</a>
            </li>
                  <li class="none">
                          <a href="https://repository.apache.org/content/repositories/snapshots/org/apache/james/" title="Snapshots">Snapshots</a>
            </li>
          </ul>
        <h5>Apache Software Foundation</h5>
  <ul>
    <li>
      <strong>
        <a title="ASF" href="http://www.apache.org/">ASF</a>
      </strong>
    </li>
    <li>
      <a title="Get Involved" href="http://www.apache.org/foundation/getinvolved.html">Get Involved</a>
    </li>
    <li>
      <a title="FAQ" href="http://www.apache.org/foundation/faq.html">FAQ</a>
    </li>
    <li>
      <a title="License" href="http://www.apache.org/licenses/" >License</a>
    </li>
    <li>
      <a title="Sponsorship" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
    </li>
    <li>
      <a title="Thanks" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
    </li>
    <li>
      <a title="Security" href="http://www.apache.org/security/">Security</a>
    </li>
  </ul>
                       <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
        <img class="poweredBy" alt="Built by Maven" src="./images/logos/maven-feather.png" />
      </a>
                   
                
            </div>
    </div>
    <div id="bodyColumn">
      <div id="contentBox">
        <div class="section"><h2>This list<a name="This_list"></a></h2><a name="This_list"></a><p>A successful project requires many people to play many roles. Some members write code or documentation, while others are valuable as testers, submitting patches and suggestions.</p><p>The team is comprised of Members and Contributors. Members have direct access to the source of a project and actively evolve the code-base. Contributors improve the project through submission of patches and suggestions to the Members. The number of Contributors to the project is unbounded. Get involved today. All contributions to the project are greatly appreciated.<br /><br />Special thanks go to the following people for their contributions to this project. We also appreciate documentation, feedback, and bug reports.</p><div class="section"><h3>Active Committers<a name="Active_Committers"></a></h3><a name="Active_Committers"></a><p>The following is a list of developers with commit privileges that have directly contributed to the project in one way or another.</p><table border="0" class="bodyTable"><tr class="a"><th>Id</th><th>Name</th><th>Email</th><th>Organization</th><th>Organization URL</th><th>Roles</th><th>Time Zone</th><th>Actual Time (GMT)</th><th>Properties</th></tr><tr class="b"><td><a name="bago"></a>bago</td><td>Stefano Bagnara</td><td><a class="externalLink" href="mailto:bago@apache.org">bago@apache.org</a></td><td>-</td><td>-</td><td>Developer, PMC Member</td><td>2</td><td><span id="developer-0">2</span></td><td>-</td></tr><tr class="a"><td><a name="norman"></a>norman</td><td>Norman Maurer</td><td><a class="externalLink" href="mailto:norman@apache.org">norman@apache.org</a></td><td>-</td><td>-</td><td>Developer, PMC Chair</td><td>2</td><td><span id="developer-1">2</span></td><td>-</td></tr><tr class="b"><td><a name="serge"></a>serge</td><td>Serge Knystautas</td><td><a class="externalLink" href="mailto:sergek@lokitech.com">sergek@lokitech.com</a></td><td>-</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-2">-</span></td><td>Donator=Serge was the original donator of the James code, which has since been massively
                    improved by people smarter than him. He tries to answer questions on the listserv and make
                    code
                    contributions when he does get a rare bit of free time.</td></tr><tr class="a"><td><a name="benrdf"></a>benrdf</td><td>Bernd Fondermann</td><td><a class="externalLink" href="mailto:bf_jak@brainlounge.de">bf_jak@brainlounge.de</a></td><td>-</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-3">-</span></td><td>-</td></tr><tr class="b"><td><a name="sbrewin"></a>sbrewin</td><td>Steve Brewin</td><td><a class="externalLink" href="mailto:sbrewin@synsys.com">sbrewin@synsys.com</a></td><td>-</td><td>-</td><td>Developer, PMC Member</td><td>-</td><td><span id="developer-4">-</span></td><td>-</td></tr><tr class="a"><td><a name="hilmer"></a>hilmer</td><td>S&#xf8;ren Hilmer</td><td><a class="externalLink" href="mailto:sh@widetrail.dk">sh@widetrail.dk</a></td><td>-</td><td>-</td><td>Developer, PMC Member</td><td>-</td><td><span id="developer-5">-</span></td><td>-</td></tr><tr class="b"><td><a name="noel"></a>noel</td><td>Noel J. Bergman</td><td><a class="externalLink" href="mailto:noel@devtech.com">noel@devtech.com</a></td><td>-</td><td>-</td><td>Developer, PMC Member</td><td>-</td><td><span id="developer-6">-</span></td><td>-</td></tr><tr class="a"><td><a name="danny"></a>danny</td><td>Danny Angus</td><td><a class="externalLink" href="mailto:danny@apache.org">danny@apache.org</a></td><td>Student Loans Company ltd</td><td><a class="externalLink" href="http://www.slc.co.uk">http://www.slc.co.uk</a></td><td>Developer, PMC Member</td><td>-</td><td><span id="developer-7">-</span></td><td>Description=Danny is a member of the Apache Software Foundation and married father
                    of two by night, and by day works as lead technical consultant for the Student Loans
                    Company ltd.</td></tr><tr class="b"><td><a name="adc"></a>adc</td><td>Alan D. Cabrera</td><td><a class="externalLink" href="mailto:list@toolazydogs.com">list@toolazydogs.com</a></td><td>-</td><td>-</td><td>Developer</td><td>-8</td><td><span id="developer-8">-8</span></td><td>-</td></tr><tr class="a"><td><a name="hbedi"></a>hbedi</td><td>Harmeet Bedi</td><td><a class="externalLink" href="mailto:harmeet@kodemuse.com">harmeet@kodemuse.com</a></td><td>-</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-9">-</span></td><td>-</td></tr><tr class="b"><td><a name="jasonw"></a>jasonw</td><td>Jason Webb</td><td><a class="externalLink" href="mailto:jw@inovem.com">jw@inovem.com</a></td><td>-</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-10">-</span></td><td>-</td></tr><tr class="a"><td><a name="vincenzo"></a>vincenzo</td><td>Vincenzo Gianferrari Pini</td><td><a class="externalLink" href="mailto:vincenzo.gianferraripini@praxis.it">vincenzo.gianferraripini@praxis.it</a></td><td>-</td><td>-</td><td>Developer, PMC Member</td><td>-</td><td><span id="developer-11">-</span></td><td>-</td></tr><tr class="b"><td><a name="rdonkin"></a>rdonkin</td><td>Robert Burrell Donkin</td><td><a class="externalLink" href="mailto:rdonkin@apache.org">rdonkin@apache.org</a></td><td>-</td><td>-</td><td>Developer, PMC Member</td><td>-</td><td><span id="developer-12">-</span></td><td>-</td></tr><tr class="a"><td><a name="niklas"></a>niklas</td><td>Niklas Therning</td><td><a class="externalLink" href="mailto:niklas@apache.org">niklas@apache.org</a></td><td>Trillian AB</td><td>-</td><td>Developer, PMC Member</td><td>-</td><td><span id="developer-13">-</span></td><td>-</td></tr><tr class="b"><td><a name="jcheng"></a>jcheng</td><td>Joe Cheng</td><td><a class="externalLink" href="mailto:joe@joecheng.com">joe@joecheng.com</a></td><td>-</td><td>-</td><td>-</td><td>-</td><td><span id="developer-14">-</span></td><td>Description=Former author to the mime4j product</td></tr><tr class="a"><td><a name="mwiederkehr"></a>mwiederkehr</td><td>Markus Wiederkehr</td><td><a class="externalLink" href="mailto:mwiederkehr@apache.org">mwiederkehr@apache.org</a></td><td>-</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-15">-</span></td><td>-</td></tr><tr class="b"><td><a name="olegk"></a>olegk</td><td>Oleg Kalnichevski</td><td><a class="externalLink" href="mailto:olegk@apache.org">olegk@apache.org</a></td><td>-</td><td>-</td><td>Developer, PMC Member</td><td>-</td><td><span id="developer-16">-</span></td><td>-</td></tr><tr class="a"><td><a name="manolo"></a>manolo</td><td>Manuel Carrasco Monino</td><td><a class="externalLink" href="mailto:manolo@apache.org">manolo@apache.org</a></td><td>-</td><td>-</td><td>Developer, PMC Member</td><td>-</td><td><span id="developer-17">-</span></td><td>-</td></tr><tr class="b"><td><a name="eric"></a>eric</td><td>Eric Charles</td><td><a class="externalLink" href="mailto:eric@apache.org">eric@apache.org</a></td><td>-</td><td>-</td><td>Developer, PMC Member</td><td>-</td><td><span id="developer-18">-</span></td><td>-</td></tr><tr class="a"><td><a name="felixk"></a>felixk</td><td>Felix Knecht</td><td><a class="externalLink" href="mailto:felixk@apache.org">felixk@apache.org</a></td><td>-</td><td>-</td><td>Developer, PMC Member</td><td>1</td><td><span id="developer-19">1</span></td><td>-</td></tr><tr class="b"><td><a name="ieugen"></a>ieugen</td><td>Ioan Eugen Stan</td><td><a class="externalLink" href="mailto:ieugen@apache.org">ieugen@apache.org</a></td><td>-</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-20">-</span></td><td>-</td></tr></table></div><div class="section"><h3>Alumni and Other Contributors<a name="Alumni_and_Other_Contributors"></a></h3><a name="Alumni_and_Other_Contributors"></a><p>Many people have had a hand in James' success over the years, here we'd like to give credit to those who have made a difference and to those who have left.</p><table border="0" class="bodyTable"><tr class="a"><th>Name</th><th>Email</th><th>Properties</th></tr><tr class="b"><td>Rob Oxspring</td><td>-</td><td>Contribution=Contributed to the mime4j product</td></tr><tr class="a"><td>Roger Fullerton</td><td>-</td><td>Contribution=Wrote spfjava, the first spf implementation in java</td></tr><tr class="b"><td>Alan D. Cabrera [ADC]</td><td><a class="externalLink" href="mailto:list@toolazydogs.com">list@toolazydogs.com</a></td><td>-</td></tr><tr class="a"><td>Darrell DeBoer (DD)</td><td>-</td><td>-</td></tr><tr class="b"><td>Stephen J. McConnell (SJM)</td><td><a class="externalLink" href="mailto:mcconnell@apache.org">mcconnell@apache.org</a></td><td>-</td></tr><tr class="a"><td>Peter M. Goldstein (PG)</td><td><a class="externalLink" href="mailto:farsight@alum.mit.edu">farsight@alum.mit.edu</a></td><td>-</td></tr><tr class="b"><td>Pete Donald (PD)</td><td>-</td><td>-</td></tr><tr class="a"><td>Charles Benett (CB)</td><td><a class="externalLink" href="mailto:charles@benett1.demon.co.uk">charles@benett1.demon.co.uk</a></td><td>-</td></tr><tr class="b"><td>Federico Barbieri (FB)</td><td><a class="externalLink" href="mailto:scoobie@systemy.it">scoobie@systemy.it</a></td><td>-</td></tr><tr class="a"><td>Stuart Roebuck (SR)</td><td><a class="externalLink" href="mailto:stuart.roebuck@adolos.co.uk">stuart.roebuck@adolos.co.uk</a></td><td>-</td></tr><tr class="b"><td>Ivan Seskar (IS)</td><td><a class="externalLink" href="mailto:iseskar@upsideweb.com">iseskar@upsideweb.com</a></td><td>-</td></tr><tr class="a"><td>Prasanna Uppaladadium (PU)</td><td><a class="externalLink" href="mailto:prasanna@vayusphere.com">prasanna@vayusphere.com</a></td><td>-</td></tr><tr class="b"><td>Gabriel Bucher (GB)</td><td><a class="externalLink" href="mailto:gabriel.bucher@razor.ch">gabriel.bucher@razor.ch</a></td><td>-</td></tr><tr class="a"><td>Matthew Pangaro (MP)</td><td><a class="externalLink" href="mailto:mattp@lokitech.com">mattp@lokitech.com</a></td><td>-</td></tr><tr class="b"><td>Jason Borden (JB)</td><td><a class="externalLink" href="mailto:jborden@javasense.com">jborden@javasense.com</a></td><td>-</td></tr><tr class="a"><td>Randy Stanard (RS)</td><td><a class="externalLink" href="mailto:rstanard@lokitech.com">rstanard@lokitech.com</a></td><td>Contribution=Contributed the James logo</td></tr><tr class="b"><td>Samuel Sadek (SS)</td><td><a class="externalLink" href="mailto:Samuel.Sadek@kpmg.co.uk">Samuel.Sadek@kpmg.co.uk</a></td><td>-</td></tr><tr class="a"><td>Stephan Schiessling (SS2)</td><td><a class="externalLink" href="mailto:s@rapi.com">s@rapi.com</a></td><td>-</td></tr><tr class="b"><td>Eung-ju Park (EP)</td><td><a class="externalLink" href="mailto:colus@apache.org">colus@apache.org</a></td><td>-</td></tr><tr class="a"><td>Paul Hammant (PH)</td><td><a class="externalLink" href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a></td><td>-</td></tr><tr class="b"><td>Jeff Keyser (JK)</td><td><a class="externalLink" href="mailto:JKeyser@telocity.com">JKeyser@telocity.com</a></td><td>-</td></tr><tr class="a"><td>Andrei Ivanov (AI)</td><td><a class="externalLink" href="mailto:myfam@surfeu.fi">myfam@surfeu.fi</a></td><td>-</td></tr><tr class="b"><td>Brad Walker (BW)</td><td><a class="externalLink" href="mailto:bwalker@studentadvantage.com">bwalker@studentadvantage.com</a></td><td>-</td></tr><tr class="a"><td>Christian Buchegger (CB2)</td><td>-</td><td>email=christian.buchegger@planet-interkom.de</td></tr><tr class="b"><td>Shilpa Dalmia (SD)</td><td><a class="externalLink" href="mailto:shilpa@postx.com">shilpa@postx.com</a></td><td>-</td></tr><tr class="a"><td>Steve Short (SS3)</td><td><a class="externalLink" href="mailto:sshort@postx.com">sshort@postx.com</a></td><td>-</td></tr><tr class="b"><td>Aaron Knauf (AK)</td><td><a class="externalLink" href="mailto:aknauf@xtra.co.nz">aknauf@xtra.co.nz</a></td><td>-</td></tr><tr class="a"><td>Serge &quot;Sergei&quot; Sozonoff (SS4)</td><td><a class="externalLink" href="mailto:serge@globalbeach.com">serge@globalbeach.com</a></td><td>-</td></tr><tr class="b"><td>Kai Londenberg [KL]</td><td>-</td><td>email=kai.londenberg@my-vwclub.de</td></tr><tr class="a"><td>Mark Imel [MI]</td><td><a class="externalLink" href="mailto:james@imelshire.com">james@imelshire.com</a></td><td>-</td></tr><tr class="b"><td>Kevin Schmidt [KS]</td><td><a class="externalLink" href="mailto:ktschmidt@earthlink.net">ktschmidt@earthlink.net</a></td><td>-</td></tr><tr class="a"><td>Hontvari Jozsef [HJ]</td><td><a class="externalLink" href="mailto:hontvari2@solware.com">hontvari2@solware.com</a></td><td>-</td></tr><tr class="b"><td>Cesar Bonadio [CB3]</td><td><a class="externalLink" href="mailto:bonadio@picture.com.br">bonadio@picture.com.br</a></td><td>-</td></tr><tr class="a"><td>Marco Tedone [MT]</td><td><a class="externalLink" href="mailto:mtedone@jemos.org">mtedone@jemos.org</a></td><td>-</td></tr><tr class="b"><td>Tim Stephenson [TS]</td><td><a class="externalLink" href="mailto:tim@thestephensons.me.uk">tim@thestephensons.me.uk</a></td><td>-</td></tr><tr class="a"><td>Richard O. Hammer [ROH]</td><td><a class="externalLink" href="mailto:rohammer@earthlink.net">rohammer@earthlink.net</a></td><td>-</td></tr></table><script type="text/javascript">
function offsetDate(id, offset) {
    var now = new Date();
    var nowTime = now.getTime();
    var localOffset = now.getTimezoneOffset();
    var developerTime = nowTime + ( offset * 60 * 60 * 1000 )+ ( localOffset * 60 * 1000 );
    var developerDate = new Date(developerTime);

    document.getElementById(id).innerHTML = developerDate;
}

function init(){
    offsetDate('developer-0', '2');
    offsetDate('developer-1', '2');
    offsetDate('developer-8', '-8');
    offsetDate('developer-19', '1');
}

window.onLoad = init();
</script></div></div>
      </div>
    </div>
    <div class="clear">
      <hr/>
    </div>
    <div id="footer">
      <div class="xright">Copyright &#169;                    2006-2012
                        <a href="http://www.apache.org/">The Apache Software Foundation</a>.
            All Rights Reserved.      
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
  </body>
</html>
