diff --git a/htdocs/api/class/api.class.php b/htdocs/api/class/api.class.php
index 27acf03dbe12d393ec16f726c1ce6f3372358f53..a1660be133d38d190c1fcdab6447b7e21c5e07af 100644
--- a/htdocs/api/class/api.class.php
+++ b/htdocs/api/class/api.class.php
@@ -1,5 +1,6 @@
 <?php
 /* Copyright (C) 2015   Jean-François Ferry     <jfefe@aternatik.fr>
+ * Copyright (C) 2016	Laurent Destailleur		<eldy@users.sourceforge.net>
  *
  * 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
diff --git a/htdocs/api/class/api_access.class.php b/htdocs/api/class/api_access.class.php
index bebf9a6667bffe78912262d54ed521403c4ddad7..68ec526ec7e0e4f0156104810ea13ee7f0ca6fd4 100644
--- a/htdocs/api/class/api_access.class.php
+++ b/htdocs/api/class/api_access.class.php
@@ -1,5 +1,6 @@
 <?php
 /* Copyright (C) 2015   Jean-François Ferry     <jfefe@aternatik.fr>
+ * Copyright (C) 2016	Laurent Destailleur		<eldy@users.sourceforge.net>
  *
  * 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
diff --git a/htdocs/api/class/api_dictionnarycountries.class.php b/htdocs/api/class/api_dictionnarycountries.class.php
index 77e8f63f2588dc9e4bdb64eddebd2a349db1a471..0243d27c81b635444cce6023d30d6096e815e0b2 100644
--- a/htdocs/api/class/api_dictionnarycountries.class.php
+++ b/htdocs/api/class/api_dictionnarycountries.class.php
@@ -1,6 +1,6 @@
 <?php
-/*
- * Copyright (C) 2016 Xebax Christy <xebax@wanadoo.fr>
+/* Copyright (C) 2016   Xebax Christy           <xebax@wanadoo.fr>
+ * Copyright (C) 2016	Laurent Destailleur		<eldy@users.sourceforge.net>
  *
  * 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
@@ -89,7 +89,7 @@ class DictionnaryCountries extends DolibarrApi
 
         if ($result) {
             $num = $this->db->num_rows($result);
-            for ($i = 0; $i < $num; $i++) {
+            for ($i = 0; $i < min($num, ($limit <= 0 ? $num : $limit)); $i++) {
                 $obj = $this->db->fetch_object($result);
                 $country = new Ccountry($this->db);
                 if ($country->fetch($obj->rowid) > 0) {
diff --git a/htdocs/api/class/api_dictionnarytowns.class.php b/htdocs/api/class/api_dictionnarytowns.class.php
index a08d4387edce908a6f65624638cbfa39be457b98..b028ff4af0396b37444228fcd653ef4b47a97555 100644
--- a/htdocs/api/class/api_dictionnarytowns.class.php
+++ b/htdocs/api/class/api_dictionnarytowns.class.php
@@ -1,6 +1,6 @@
 <?php
-/*
- * Copyright (C) 2016 Xebax Christy <xebax@wanadoo.fr>
+/* Copyright (C) 2016   Xebax Christy           <xebax@wanadoo.fr>
+ * Copyright (C) 2016	Laurent Destailleur		<eldy@users.sourceforge.net>
  *
  * 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
@@ -83,7 +83,7 @@ class DictionnaryTowns extends DolibarrApi
 
         if ($result) {
             $num = $this->db->num_rows($result);
-            for ($i = 0; $i < $num; $i++) {
+            for ($i = 0; $i < min($num, ($limit <= 0 ? $num : $limit)); $i++) {
                 $list[] = $this->db->fetch_object($result);
             }
         } else {
diff --git a/htdocs/api/class/api_login.class.php b/htdocs/api/class/api_login.class.php
index 4748416cb3c8e118193e13a7dfa6fe79b170b636..3617eb899b1aec1674e5fc2cb98ce7b2a843acae 100644
--- a/htdocs/api/class/api_login.class.php
+++ b/htdocs/api/class/api_login.class.php
@@ -1,5 +1,6 @@
 <?php
 /* Copyright (C) 2015   Jean-François Ferry     <jfefe@aternatik.fr>
+ * Copyright (C) 2016	Laurent Destailleur		<eldy@users.sourceforge.net>
  *
  * 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
diff --git a/htdocs/api/index.php b/htdocs/api/index.php
index 0bf56be1899721ed5a0df4cbd1e87e8b1597e665..80cfb5485df80275a7a1ac07cca61819abc932ca 100644
--- a/htdocs/api/index.php
+++ b/htdocs/api/index.php
@@ -1,5 +1,6 @@
 <?php
 /* Copyright (C) 2015   Jean-François Ferry     <jfefe@aternatik.fr>
+ * Copyright (C) 2016	Laurent Destailleur		<eldy@users.sourceforge.net>
  *
  * 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
@@ -96,6 +97,9 @@ foreach ($modulesdir as $dir)
                 elseif ($module == 'adherent') {
                     $moduledirforclass = 'adherents';
                 }
+                elseif ($module == 'banque') {
+                    $moduledirforclass = 'compta/bank';
+                }
                 elseif ($module == 'categorie') {
                     $moduledirforclass = 'categories';
                 }
diff --git a/htdocs/commande/class/api_orders.class.php b/htdocs/commande/class/api_orders.class.php
index 07cf9f8febed925dba9ff1bbbc4511c9d65daf8c..5e000165bed1f5884872996b2a9dd1d507ebde56 100644
--- a/htdocs/commande/class/api_orders.class.php
+++ b/htdocs/commande/class/api_orders.class.php
@@ -1,5 +1,6 @@
 <?php
 /* Copyright (C) 2015   Jean-François Ferry     <jfefe@aternatik.fr>
+ * Copyright (C) 2016	Laurent Destailleur		<eldy@users.sourceforge.net>
  *
  * 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
@@ -142,7 +143,7 @@ class Orders extends DolibarrApi
         if ($result)
         {
             $num = $db->num_rows($result);
-            while ($i < min($limit, $num))
+            while ($i < min($num, ($limit <= 0 ? $num : $limit)))
             {
                 $obj = $db->fetch_object($result);
                 $commande_static = new Commande($db);
@@ -442,7 +443,7 @@ class Orders extends DolibarrApi
      * @param   int $id             Order ID
      * @param   int $idwarehouse    Warehouse ID
      * @param   int $notrigger      1=Does not execute triggers, 0= execute triggers
-     * 
+     *
      * @url POST    {id}/validate
      *  
      * @return  array
diff --git a/htdocs/compta/bank/class/api_bankaccounts.class.php b/htdocs/compta/bank/class/api_bankaccounts.class.php
new file mode 100644
index 0000000000000000000000000000000000000000..250faea5a5d3f5c4b8622d16e05bd25a2716d394
--- /dev/null
+++ b/htdocs/compta/bank/class/api_bankaccounts.class.php
@@ -0,0 +1,373 @@
+<?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.'/compta/bank/class/account.class.php';
+
+/**
+ * API class for accounts
+ *
+ * @access protected
+ * @class DolibarrApiAccess {@requires user,external}
+ */
+class BankAccounts extends DolibarrApi
+{
+
+    /**
+     * array $FIELDS Mandatory fields, checked when creating an object
+     */
+    static $FIELDS = array(
+        'ref',
+        'label',
+        'type',
+        'currency_code',
+        'country_id'
+    );
+
+    /**
+     * Constructor
+     */
+    function __construct()
+    {
+        global $db;
+        $this->db = $db;
+    }
+
+    /**
+     * Get the list of accounts.
+     *
+     * @param string    $sortfield  Sort field
+     * @param string    $sortorder  Sort order
+     * @param int       $limit      Limit for list
+     * @param int       $page       Page number
+     * @return array List of account objects
+     *
+     * @throws RestException
+     */
+    function index($sortfield = "rowid", $sortorder = 'ASC', $limit = 0, $page = 0)
+    {
+        $list = array();
+
+        if(! DolibarrApiAccess::$user->rights->banque->lire) {
+            throw new RestException(401);
+        }
+
+        $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."bank_account";
+
+        $nbtotalofrecords = 0;
+        if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
+        {
+            $result = $this->db->query($sql);
+            $nbtotalofrecords = $this->db->num_rows($result);
+        }
+        
+        $sql.= $this->db->order($sortfield, $sortorder);
+        if ($limit)    {
+            if ($page < 0)
+            {
+                $page = 0;
+            }
+            $offset = $limit * $page;
+        
+            $sql.= $this->db->plimit($limit + 1, $offset);
+        }
+        
+        $result = $this->db->query($sql);
+
+        if ($result) {
+            $num = $this->db->num_rows($result);
+            for ($i = 0; $i < min($num, ($limit <= 0 ? $num : $limit)); $i++) {
+                $obj = $this->db->fetch_object($result);
+                $account = new Account($this->db);
+                if ($account->fetch($obj->rowid) > 0) {
+                    $list[] = $this->_cleanObjectDatas($account);
+                }
+            }
+        } else {
+            throw new RestException(503, 'Error when retrieving list of accounts: ' . $account->error);
+        }
+
+        return $list;
+    }
+
+    /**
+     * Get account by ID.
+     *
+     * @param int    $id    ID of account
+     * @return array Account object
+     *
+     * @throws RestException
+     */
+    function get($id)
+    {
+        if (! DolibarrApiAccess::$user->rights->banque->lire) {
+            throw new RestException(401);
+        }
+
+        $account = new Account($this->db);
+        $result = $account->fetch($id);
+        if (! $result) {
+            throw new RestException(404, 'account not found');
+        }
+
+        return $this->_cleanObjectDatas($account);
+    }
+
+    /**
+     * Create account object
+     *
+     * @param array $request_data    Request data
+     * @return int ID of account
+     */
+    function post($request_data = null)
+    {
+        if (! DolibarrApiAccess::$user->rights->banque->configurer) {
+            throw new RestException(401);
+        }
+        // Check mandatory fields
+        $result = $this->_validate($request_data);
+
+        $account = new Account($this->db);
+        foreach ($request_data as $field => $value) {
+            $account->$field = $value;
+        }
+        // Date of the initial balance (required to create an account).
+        $account->date_solde = time();
+        // courant and type are the same thing but the one used when
+        // creating an account is courant
+        $account->courant = $account->type;
+
+        if ($account->create(DolibarrApiAccess::$user) < 0) {
+            throw new RestException(503, 'Error when creating account: ' . $account->error);
+        }
+        return $account->id;
+    }
+
+    /**
+     * Update account
+     *
+     * @param int    $id              ID of account
+     * @param array  $request_data    data
+     * @return int
+     */
+    function put($id, $request_data = null)
+    {
+        if (! DolibarrApiAccess::$user->rights->banque->configurer) {
+            throw new RestException(401);
+        }
+
+        $account = new Account($this->db);
+        $result = $account->fetch($id);
+        if (! $result) {
+            throw new RestException(404, 'account not found');
+        }
+
+        foreach ($request_data as $field => $value) {
+            $account->$field = $value;
+        }
+
+        if ($account->update(DolibarrApiAccess::$user) > 0)
+            return $this->get($id);
+
+        return false;
+    }
+
+    /**
+     * Delete account
+     *
+     * @param int    $id    ID of account
+     * @return array
+     */
+    function delete($id)
+    {
+        if (! DolibarrApiAccess::$user->rights->banque->configurer) {
+            throw new RestException(401);
+        }
+        $account = new Account($this->db);
+        $result = $account->fetch($id);
+        if (! $result) {
+            throw new RestException(404, 'account not found');
+        }
+
+        if ($account->delete(DolibarrApiAccess::$user) < 0) {
+            throw new RestException(401, 'error when deleting account');
+        }
+
+        return array(
+            'success' => array(
+                'code' => 200,
+                'message' => 'account deleted'
+            )
+        );
+    }
+
+    /**
+     * Validate fields before creating an object
+     *
+     * @param array $data    Data to validate
+     * @return array
+     *
+     * @throws RestException
+     */
+    function _validate($data)
+    {
+        $account = array();
+        foreach (Accounts::$FIELDS as $field) {
+            if (! isset($data[$field]))
+                throw new RestException(400, "$field field missing");
+            $account[$field] = $data[$field];
+        }
+        return $account;
+    }
+
+    /**
+     * Clean sensible object datas
+     *
+     * @param object    $object    Object to clean
+     * @return array Array of cleaned object properties
+     */
+    function _cleanObjectDatas($object)
+    {
+        $object = parent::_cleanObjectDatas($object);
+
+        unset($object->rowid);
+
+        return $object;
+    }
+
+    /**
+     * Get the list of lines of the account.
+     *
+     * @param int $id ID of account
+     * @return array Array of AccountLine objects
+     *
+     * @throws RestException
+     *
+     * @url GET {id}/lines
+     */
+    function getLines($id)
+    {
+        $list = array();
+
+        if (! DolibarrApiAccess::$user->rights->banque->lire) {
+            throw new RestException(401);
+        }
+
+        $account = new Account($this->db);
+        $result = $account->fetch($id);
+        if (! $result) {
+            throw new RestException(404, 'account not found');
+        }
+
+        $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."bank ";
+        $sql .= " WHERE fk_account = ".$id;
+        $sql .= " ORDER BY rowid";
+
+        $result = $this->db->query($sql);
+
+        if ($result) {
+            $num = $this->db->num_rows($result);
+            for ($i = 0; $i < $num; $i++) {
+                $obj = $this->db->fetch_object($result);
+                $accountLine = new AccountLine($this->db);
+                if ($accountLine->fetch($obj->rowid) > 0) {
+                    $list[] = $this->_cleanObjectDatas($accountLine);
+                }
+            }
+        } else {
+            throw new RestException(503, 'Error when retrieving list of account lines: ' . $accountLine->error);
+        }
+
+        return $list;
+    }
+
+    /**
+     * Add a line to an account
+     *
+     * @param int    $id            ID of account
+     * @param int    $date          Payment date (timestamp) {@from body} {@type timestamp}
+     * @param string $type          Payment mode (TYP,VIR,PRE,LIQ,VAD,CB,CHQ...) {@from body}
+     * @param string $label         Label {@from body}
+     * @param float  $amount        Amount (may be 0) {@from body}
+     * @param int    $category      Category
+     * @param string $cheque_number Cheque numberl {@from body}
+     * @param string $cheque_writer Name of cheque writer {@from body}
+     * @param string $cheque_bank   Bank of cheque writer {@from body}
+     * @return int  ID of line
+     *
+     * @url POST {id}/lines
+     */
+    function addLine($id, $date, $type, $label, $amount, $category=0, $cheque_number='', $cheque_writer='', $cheque_bank='')
+    {
+        if (! DolibarrApiAccess::$user->rights->banque->modifier) {
+            throw new RestException(401);
+        }
+
+        $account = new Account($this->db);
+        $result = $account->fetch($id);
+        if (! $result) {
+            throw new RestException(404, 'account not found');
+        }
+
+        $result = $account->addline($date, $type, $label, $amount, $cheque_number, $category,
+                                    DolibarrApiAccess::$user, $cheque_writer, $cheque_bank);
+        if ($result < 0) {
+            throw new RestException(503, 'Error when adding line to account: ' . $account->error);
+        }
+        return $result;
+    }
+
+    /**
+     * Add a link to an account line
+     *
+     * @param int    $account_id    ID of account
+     * @param int    $line_id       ID of account line
+     * @param int    $url_id        ID to set in the URL {@from body}
+     * @param string $url           URL of the link {@from body}
+     * @param string $label         Label {@from body}
+     * @param string $type          Type of link ('payment', 'company', 'member', ...) {@from body}
+     * @return int  ID of link
+     *
+     * @url POST {account_id}/lines/{line_id}/links
+     */
+    function addLink($account_id, $line_id, $url_id, $url, $label, $type)
+    {
+        if (! DolibarrApiAccess::$user->rights->banque->modifier) {
+            throw new RestException(401);
+        }
+
+        $account = new Account($this->db);
+        $result = $account->fetch($account_id);
+        if (! $result) {
+            throw new RestException(404, 'account not found');
+        }
+
+        $accountLine = new AccountLine($this->db);
+        $result = $accountLine->fetch($line_id);
+        if (! $result) {
+            throw new RestException(404, 'account line not found');
+        }
+
+        $result = $account->add_url_line($line_id, $url_id, $url, $label, $type);
+        if ($result < 0) {
+            throw new RestException(503, 'Error when adding link to account line: ' . $account->error);
+        }
+        return $result;
+    }
+}