
	  TOP LEVEL PROJECT RESOLUTION FOR APACHE USERGRID


       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 the creation and maintenance of
       open-source software related to the Usergrid BaaS software,
       for distribution at no charge to the public.

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

       RESOLVED, that the Apache Usergrid Project be and hereby is
       responsible for the creation and maintenance of open-source
       software related to the Usergrid BaaS software; and be it further

       RESOLVED, that the office of "Vice President, Usergrid" 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 Usergrid Project, and to have primary responsibility for
       management of the projects within the scope of responsibility
       of the Apache Usegrid 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 Usegrid Project:

           * Tim Anglade      <timanglade@apache.org>
           * Askhat Asanaliev <aasanaliev@apache.org>
           * John D. Ament    <johndament@apache.org>
           * Ed Anuff         <edanuff@apache.org>
           * Furkan Bıçak     <fbicak@apache.org>
           * Ryan Bridges     <ryanb@apache.org>
           * Scott Ganyo      <scottganyo@apache.org>
           * Sungju Jin       <sungju@apache.org>
           * Dave Johnson     <snoopdave@apache.org>
           * Alex Karasulu    <akarasulu@apache.org>
           * Salih Kardan     <skardan@apache.org>
           * Shaozhuang Liu   <stliu@apache.org>
           * Nate McCall      <zznate@apache.org>
           * John Mcgibbney   <lewismc@apache.org>
           * Alex Muramoto    <amuramoto@apache.org>
           * Todd Nine        <toddnine@apache.org>
           * Luciano Resende  <lresende@apache.org>
           * Yiğit Şaplı      <yigits@apache.org>
           * Rod Simpson      <rockerston@apache.org>
           * Jeff West        <jeffreyawest@apache.org>

       NOW, THEREFORE, BE IT FURTHER RESOLVED, that Todd Nine
       be appointed to the office of Vice President, Usergrid, 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 Usergrid Project be and hereby
       is tasked with the creation of a set of bylaws intended to
       encourage open development and increased participation in the
       Usergrid Project; and be it further

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

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

