diff --git a/htdocs/adherents/class/api_members.class.php b/htdocs/adherents/class/api_members.class.php
new file mode 100644
index 0000000000000000000000000000000000000000..3d27dd30d5d28cc6215540f60c4916c311582cd4
--- /dev/null
+++ b/htdocs/adherents/class/api_members.class.php
@@ -0,0 +1,369 @@
+<?php
+/* Copyright (C) 2016   Xebax Christy           <xebax@wanadoo.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+use Luracast\Restler\RestException;
+
+require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
+require_once DOL_DOCUMENT_ROOT.'/adherents/class/cotisation.class.php';
+
+/**
+ * API class for members
+ *
+ * @access protected
+ * @class  DolibarrApiAccess {@requires user,external}
+ */
+class Members extends DolibarrApi
+{
+    /**
+     * @var array   $FIELDS     Mandatory fields, checked when create and update object
+     */
+    static $FIELDS = array(
+        'morphy',
+        'typeid'
+    );
+
+    /**
+     * Constructor
+     */
+    function __construct()
+    {
+        global $db, $conf;
+        $this->db = $db;
+    }
+
+    /**
+     * Get properties of a member object
+     *
+     * Return an array with member informations
+     *
+     * @param     int     $id ID of member
+     * @return    array|mixed data without useless information
+     *
+     * @throws    RestException
+     */
+    function get($id)
+    {
+        if(! DolibarrApiAccess::$user->rights->adherent->lire) {
+            throw new RestException(401);
+        }
+
+        $member = new Adherent($this->db);
+        $result = $member->fetch($id);
+        if( ! $result ) {
+            throw new RestException(404, 'member not found');
+        }
+
+        if( ! DolibarrApi::_checkAccessToResource('adherent',$member->id)) {
+            throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
+        }
+
+        return $this->_cleanObjectDatas($member);
+    }
+
+    /**
+     * List members
+     *
+     * Get a list of members
+     *
+     * @param string    $typeid     ID of the type of member
+     * @param string    $login      To filter the members by login
+     * @param string    $name       To filter the members by name (firstname, lastname or company name matching the filter)
+     * @param string    $sortfield  Sort field
+     * @param string    $sortorder  Sort order
+     * @param int       $limit      Limit for list
+     * @param int       $page       Page number
+     * @return array Array of member objects
+     *
+     * @throws RestException
+     */
+    function index($typeid = '', $login = '', $name = '', $sortfield = "a.rowid", $sortorder = 'ASC', $limit = 0, $page = 0) {
+        global $db, $conf;
+
+        $obj_ret = array();
+
+        if(! DolibarrApiAccess::$user->rights->adherent->lire) {
+            throw new RestException(401);
+        }
+
+        $sql = "SELECT a.rowid";
+        $sql.= " FROM ".MAIN_DB_PREFIX."adherent as a";
+        $sql.= ' WHERE a.entity IN ('.getEntity('adherent', 1).')';
+        if (!empty($typeid))
+        {
+            $sql.= ' AND a.fk_adherent_type='.$typeid;
+        }
+        if (!empty($login)) {
+            $sql .= " AND a.login LIKE '%".$login."%'";
+        }
+        if (!empty($name)) {
+            $sql .= " AND (a.firstname LIKE '%".$name."%' OR a.lastname LIKE '%".$name."%' OR a.societe LIKE '%".$name."%')";
+        }
+
+        $nbtotalofrecords = 0;
+        if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
+        {
+            $result = $db->query($sql);
+            $nbtotalofrecords = $db->num_rows($result);
+        }
+
+        $sql.= $db->order($sortfield, $sortorder);
+        if ($limit)    {
+            if ($page < 0)
+            {
+                $page = 0;
+            }
+            $offset = $limit * $page;
+
+            $sql.= $db->plimit($limit + 1, $offset);
+        }
+
+        $result = $db->query($sql);
+        if ($result)
+        {
+            $i=0;
+            $num = $db->num_rows($result);
+            while ($i < $num)
+            {
+                $obj = $db->fetch_object($result);
+                $member = new Adherent($this->db);
+                if($member->fetch($obj->rowid)) {
+                    $obj_ret[] = $this->_cleanObjectDatas($member);
+                }
+                $i++;
+            }
+        }
+        else {
+            throw new RestException(503, 'Error when retrieve member list : '.$member->error);
+        }
+        if( ! count($obj_ret)) {
+            throw new RestException(404, 'No member found');
+        }
+
+        return $obj_ret;
+    }
+
+    /**
+     * Create member object
+     *
+     * @param array $request_data   Request data
+     * @return int  ID of member
+     */
+    function post($request_data = null)
+    {
+        if(! DolibarrApiAccess::$user->rights->adherent->creer) {
+            throw new RestException(401);
+        }
+        // Check mandatory fields
+        $result = $this->_validate($request_data);
+
+        $member = new Adherent($this->db);
+        foreach($request_data as $field => $value) {
+            $member->$field = $value;
+        }
+        if($member->create(DolibarrApiAccess::$user) < 0) {
+            throw new RestException(503, 'Error when create member : '.$member->error);
+        }
+        return $member->id;
+    }
+
+    /**
+     * Update member
+     *
+     * @param int   $id             ID of member to update
+     * @param array $request_data   Datas
+     * @return int
+     */
+    function patch($id, $request_data = null)
+    {
+        if(! DolibarrApiAccess::$user->rights->adherent->creer) {
+            throw new RestException(401);
+        }
+
+        $member = new Adherent($this->db);
+        $result = $member->fetch($id);
+        if( ! $result ) {
+            throw new RestException(404, 'member not found');
+        }
+
+        if( ! DolibarrApi::_checkAccessToResource('member',$member->id)) {
+            throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
+        }
+
+        foreach($request_data as $field => $value) {
+            // Process the status separately because it must be updated using
+            // the validate() and resiliate() methods of the class Adherent.
+            if ($field == 'statut') {
+                if ($value == '0') {
+                    $result = $member->resiliate(DolibarrApiAccess::$user);
+                    if ($result < 0) {
+                        throw new RestException(500, 'Error when resiliating member: '.$member->error);
+                    }
+                } else if ($value == '1') {
+                    $result = $member->validate(DolibarrApiAccess::$user);
+                    if ($result < 0) {
+                        throw new RestException(500, 'Error when validating member: '.$member->error);
+                    }
+                }
+            } else {
+                $member->$field = $value;
+            }
+        }
+
+        // If there is no error, update() returns the number of affected rows
+        // so if the update is a no op, the return value is zero.
+        if($member->update(DolibarrApiAccess::$user) >= 0)
+            return $this->get($id);
+
+        return false;
+    }
+
+    /**
+     * Delete member
+     *
+     * @param int $id   member ID
+     * @return array
+     */
+    function delete($id)
+    {
+        if(! DolibarrApiAccess::$user->rights->adherent->supprimer) {
+            throw new RestException(401);
+        }
+        $member = new Adherent($this->db);
+        $result = $member->fetch($id);
+        if( ! $result ) {
+            throw new RestException(404, 'member not found');
+        }
+
+        if( ! DolibarrApi::_checkAccessToResource('member',$member->id)) {
+            throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
+        }
+
+        // The Adherent::delete() method uses the global variable $user.
+        global $user;
+        $user = DolibarrApiAccess::$user;
+
+        if (! $member->delete($member->id)) {
+            throw new RestException(401,'error when deleting member');
+        }
+
+        return array(
+            'success' => array(
+                'code' => 200,
+                'message' => 'member deleted'
+            )
+        );
+    }
+
+    /**
+     * Validate fields before creating an object
+     *
+     * @param array $data   Data to validate
+     * @return array
+     *
+     * @throws RestException
+     */
+    function _validate($data)
+    {
+        $member = array();
+        foreach (Members::$FIELDS as $field) {
+            if (!isset($data[$field]))
+                throw new RestException(400, "$field field missing");
+            $member[$field] = $data[$field];
+        }
+        return $member;
+    }
+
+    /**
+     * Clean sensible object datas
+     *
+     * @param   object  $object    Object to clean
+     * @return    array    Array of cleaned object properties
+     *
+     * @todo use an array for properties to clean
+     *
+     */
+    function _cleanObjectDatas($object) {
+
+        $object = parent::_cleanObjectDatas($object);
+
+        // Remove the subscriptions because they are handled as a subresource.
+        unset($object->subscriptions);
+
+        return $object;
+    }
+
+    /**
+     * List subscriptions of a member
+     *
+     * Get a list of subscriptions
+     *
+     * @param int $id ID of member
+     * @return array Array of subscription objects
+     *
+     * @throws RestException
+     *
+     * @url GET {id}/subscriptions
+     */
+    function getSubscriptions($id)
+    {
+        $obj_ret = array();
+
+        if(! DolibarrApiAccess::$user->rights->adherent->cotisation->lire) {
+            throw new RestException(401);
+        }
+
+        $member = new Adherent($this->db);
+        $result = $member->fetch($id);
+        if( ! $result ) {
+            throw new RestException(404, 'member not found');
+        }
+
+        $obj_ret = array();
+        foreach ($member->subscriptions as $subscription) {
+            $obj_ret[] = $this->_cleanObjectDatas($subscription);
+        }
+        return $obj_ret;
+    }
+
+    /**
+     * Add a subscription for a member
+     *
+     * @param int $id               ID of member
+     * @param int $start_date       Start date {@from body} {@type timestamp}
+     * @param int $end_date         End date {@from body} {@type timestamp}
+     * @param float $amount         Amount (may be 0) {@from body}
+     * @param string $label         Label {@from body}
+     * @return int  ID of subscription
+     *
+     * @url POST {id}/subscriptions
+     */
+    function createSubscription($id, $start_date, $end_date, $amount, $label='')
+    {
+        if(! DolibarrApiAccess::$user->rights->adherent->cotisation->creer) {
+            throw new RestException(401);
+        }
+
+        $member = new Adherent($this->db);
+        $result = $member->fetch($id);
+        if( ! $result ) {
+            throw new RestException(404, 'member not found');
+        }
+
+        return $member->cotisation($start_date, $amount, 0, '', $label, '', '', '', $end_date);
+    }
+
+}
diff --git a/htdocs/api/index.php b/htdocs/api/index.php
index 549e164abdec0fc1fd714e7f04488785a6f6cc8b..0bf56be1899721ed5a0df4cbd1e87e8b1597e665 100644
--- a/htdocs/api/index.php
+++ b/htdocs/api/index.php
@@ -89,16 +89,19 @@ foreach ($modulesdir as $dir)
                 if ($module == 'propale') {
                     $moduledirforclass = 'comm/propal';
                     $moduleforperm='propal';
-				}
+                }
                 elseif ($module == 'agenda') {
                     $moduledirforclass = 'comm/action';
-				}
+                }
+                elseif ($module == 'adherent') {
+                    $moduledirforclass = 'adherents';
+                }
                 elseif ($module == 'categorie') {
                     $moduledirforclass = 'categories';
-				}
+                }
                 elseif ($module == 'facture') {
                     $moduledirforclass = 'compta/facture';
-				}
+                }
 
                 // Defined if module is enabled
                 $enabled=true;