       Establish Apache OpenEJB Project

       WHEREAS, the Board of Directors deems it to be in the best
       interests of the Foundation and consistent with the Foundation's
       purpose to establish a Project Management Committee charged with
       enterprise application containers and object distribution
       services based on, but not limited to the Enterprise JavaBeans
       Specification.

       NOW, THEREFORE, BE IT RESOLVED, that a Project Management
       Committee (PMC), to be known as the "The Apache OpenEJB Project",
       be and hereby is established pursuant to Bylaws of the
       Foundation; and be it further

       RESOLVED, that The Apache OpenEJB Project be and hereby is
       responsible for enterprise application containers and object
       distribution services based on, but not limited to the Enterprise
       JavaBeans Specification; and be it further

       RESOLVED, that the office of "Vice President, Apache OpenEJB
       Project" be and hereby is created, the person holding such office
       to serve at the direction of the Board of Directors as the chair
       of The Apache OpenEJB Project, and to have primary responsibility
       for management of the projects within the scope of responsibility
       of The Apache OpenEJB Project; and be it further

       RESOLVED, that the persons listed immediately below be and
       hereby are appointed to serve as the initial members of The
       Apache OpenEJB Project:

         * David Blevins       (dblevins@apache.org)
         * Alan Cabrera        (adc@apache.org)
         * David Jencks        (djencks@apache.org)
         * Jacek Laskowski     (jlaskowski@apache.org)
         * Brett Porter        (brett@apache.org)
         * Dain Sundstrom      (dain@apache.org)

       NOW, THEREFORE, BE IT FURTHER RESOLVED, that David Blevins be
       appointed to the office of Vice President, Apache OpenEJB
       Project, to serve in accordance with and subject to the direction
       of the Board of Directors and the Bylaws of the Foundation until
       death, resignation, retirement, removal or disqualification, or
       until a successor is appointed; and be it further

       RESOLVED, that the initial Apache OpenEJB Project be and hereby
       is tasked with the migration and rationalization of the Apache
       Incubator OpenEJB podling; and be it further

       RESOLVED, that all responsibility pertaining to the Apache
       Incubator OpenEJB podling encumbered upon the Apache Incubator
       PMC are hereafter discharged.
