diff --git a/htdocs/compta/localtax/quadri_detail.php b/htdocs/compta/localtax/quadri_detail.php
index a4eaccba35bb6bb68674b6812933489c6c048962..175ff6cf98fff115dad9f00c49a434edb71a820a 100644
--- a/htdocs/compta/localtax/quadri_detail.php
+++ b/htdocs/compta/localtax/quadri_detail.php
@@ -196,8 +196,8 @@ $total = 0;
 $i=0;
 
 // Load arrays of datas
-$x_coll= local_by_date($db, 0, 0, $date_start, $date_end, $modetax, 'sell', $local);
-$x_paye = local_by_date($db, 0, 0, $date_start, $date_end, $modetax, 'buy', $local);
+$x_coll = vat_by_date($db, 0, 0, $date_start, $date_end, $modetax, 'sell');
+$x_paye = vat_by_date($db, 0, 0, $date_start, $date_end, $modetax, 'buy');
 
 
 echo '<table class="noborder" width="100%">';
@@ -220,9 +220,9 @@ else
 	foreach(array_keys($x_coll) as $my_coll_rate)
 	{
 		$x_both[$my_coll_rate]['coll']['totalht'] = $x_coll[$my_coll_rate]['totalht'];
-		$x_both[$my_coll_rate]['coll']['vat']     = $x_coll[$my_coll_rate]['vat'];
+		$x_both[$my_coll_rate]['coll']['localtax'.$local]     = $x_coll[$my_coll_rate]['localtax'.$local];
 		$x_both[$my_coll_rate]['paye']['totalht'] = 0;
-		$x_both[$my_coll_rate]['paye']['vat'] = 0;
+		$x_both[$my_coll_rate]['paye']['localtax'.$local] = 0;
 		$x_both[$my_coll_rate]['coll']['links'] = '';
 		$x_both[$my_coll_rate]['coll']['detail'] = array();
 		foreach($x_coll[$my_coll_rate]['facid'] as $id=>$dummy)
@@ -637,6 +637,5 @@ else
 	$i++;
 }
 
-$db->close();
-
 llxFooter();
+$db->close();
diff --git a/htdocs/core/lib/tax.lib.php b/htdocs/core/lib/tax.lib.php
index 6054a32c692e95453c3681dd1b1c21af077a2db9..93b4b480dde157375ed28c39730eee8e9d73ff6f 100644
--- a/htdocs/core/lib/tax.lib.php
+++ b/htdocs/core/lib/tax.lib.php
@@ -2,7 +2,7 @@
 /* Copyright (C) 2004-2009 Laurent Destailleur	<eldy@users.sourceforge.net>
  * Copyright (C) 2006-2007 Yannick Warnier		<ywarnier@beeznest.org>
  * Copyright (C) 2011	   Regis Houssin		<regis.houssin@capnetworks.com>
- * Copyright (C) 2012	   Juanjo Menent		<jmenent@2byte.es>
+ * Copyright (C) 2012-2016 Juanjo Menent		<jmenent@2byte.es>
  * Copyright (C) 2012      Cédric Salvador      <csalvador@gpcsolutions.fr>
  * Copyright (C) 2012-2014 Raphaël Doursenaud   <rdoursenaud@gpcsolutions.fr>
  * Copyright (C) 2015      Marcos García        <marcosgdf@gmail.com>
@@ -178,342 +178,6 @@ function vat_by_thirdparty($db, $y, $date_start, $date_end, $modetax, $direction
     }
 }
 
-/**
- *  Gets LocalTaxes to collect for the given year (and given quarter or month)
- *  The function gets the LocalTaxes in split results, as the LocalTaxes declaration asks
- *  to report the amounts for different LocalTaxes rates as different lines.
- *
- *  @param	DoliDB	$db          	Database handler object
- *  @param  int		$y           	Year
- *  @param  int		$q           	Quarter
- *  @param  string	$date_start  	Start date
- *  @param  string	$date_end    	End date
- *  @param  int		$modetax     	0 or 1 (option on debit)
- *  @param  int		$direction   	'sell' (customer invoice) or 'buy' (supplier invoices)
- *  @param  int     $local          1 for LocalTax1, 2 for LocalTax2
- *  @param  int		$m           	Month
- *  @return array       			List of quarters with LocalTaxes
- */
-function local_by_date($db, $y, $q, $date_start, $date_end, $modetax, $direction, $local, $m=0)
-{
-    global $conf;
-
-    $list=array();
-
-    if ($direction == 'sell')
-    {
-        $invoicetable='facture';
-        $invoicedettable='facturedet';
-        $fk_facture='fk_facture';
-        $fk_facture2='fk_facture';
-        $fk_payment='fk_paiement';
-        $total_tva='total_tva';
-        $total_localtax1='total_localtax1';
-        $total_localtax2='total_localtax2';
-        $paymenttable='paiement';
-        $paymentfacturetable='paiement_facture';
-        $invoicefieldref='facnumber';
-        $localtax_tx=$local==1?'localtax1_tx':'localtax2_tx';
-    }
-    if ($direction == 'buy')
-    {
-        $invoicetable='facture_fourn';
-        $invoicedettable='facture_fourn_det';
-        $fk_facture='fk_facture_fourn';
-        $fk_facture2='fk_facturefourn';
-        $fk_payment='fk_paiementfourn';
-        $total_tva='tva';
-        $total_localtax1='total_localtax1';
-        $total_localtax2='total_localtax2';
-        $paymenttable='paiementfourn';
-        $paymentfacturetable='paiementfourn_facturefourn';
-        $invoicefieldref='ref';
-        $localtax_tx=$local==1?'localtax1_tx':'localtax2_tx';
-    }
-
-    // BIENS
-
-    // Define sql request
-    $sql='';
-    if ($modetax == 1)  // Option on delivery for goods (payment) and debit invoice for services
-    {
-
-        // Count on delivery date (use invoice date as delivery is unknown)
-        $sql = "SELECT d.rowid, d.product_type as dtype, d.".$fk_facture." as facid, d.tva_tx as rate, d.".$localtax_tx." as localtax_tx,";
-        $sql.= " d.total_ht as total_ht, d.total_ttc as total_ttc, d.".$total_tva." as total_vat, d.description as descr,";
-        $sql.= " d.".$total_localtax1." as total_localtax1, d.".$total_localtax2." as total_localtax2, ";
-        $sql.= " d.date_start as date_start, d.date_end as date_end,";
-        $sql.= " f.".$invoicefieldref." as facnum, f.type, f.total_ttc as ftotal_ttc,";
-        $sql.= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype,";
-        $sql.= " 0 as payment_id, 0 as payment_amount";
-        $sql.= " FROM ".MAIN_DB_PREFIX.$invoicetable." as f,";
-        $sql.= " ".MAIN_DB_PREFIX.$invoicedettable." as d" ;
-        $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
-        $sql.= " WHERE f.entity = " . $conf->entity;
-        $sql.= " AND f.fk_statut in (1,2)"; // Validated or paid (partially or completely)
-        if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $sql.= " AND f.type IN (0,1,2,5)";
-        else $sql.= " AND f.type IN (0,1,2,3,5)";
-        $sql.= " AND f.rowid = d.".$fk_facture;
-        if ($y && $m)
-        {
-            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,$m,false))."'";
-            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,$m,false))."'";
-        }
-        else if ($y)
-        {
-            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,1,false))."'";
-            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,12,false))."'";
-        }
-        if ($q) $sql.= " AND (date_format(f.datef,'%m') > ".(($q-1)*3)." AND date_format(f.datef,'%m') <= ".($q*3).")";
-        if ($date_start && $date_end) $sql.= " AND f.datef >= '".$db->idate($date_start)."' AND f.datef <= '".$db->idate($date_end)."'";
-        $sql.= " AND (d.product_type = 0";                              // Limit to products
-        $sql.= " AND d.date_start is null AND d.date_end IS NULL)";     // enhance detection of service
-        $sql.= " ORDER BY d.rowid, d.".$fk_facture;
-
-    }
-    else    // Option on delivery for goods (payments) and payments for services
-    {
-        // Count on delivery date (use invoice date as delivery is unknown)
-        $sql = "SELECT d.rowid, d.product_type as dtype, d.".$fk_facture." as facid, d.tva_tx as rate, d.".$localtax_tx." as localtax_tx, d.total_ht as total_ht, d.total_ttc as total_ttc, d.".$total_tva." as total_vat, d.description as descr,";
-        $sql .=" d.".$total_localtax1." as total_localtax1, d.".$total_localtax2." as total_localtax2, ";
-        $sql.= " d.date_start as date_start, d.date_end as date_end,";
-        $sql.= " f.".$invoicefieldref." as facnum, f.type, f.total_ttc as ftotal_ttc,";
-        $sql.= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype,";
-        $sql.= " 0 as payment_id, 0 as payment_amount";
-        $sql.= " FROM ".MAIN_DB_PREFIX.$invoicetable." as f,";
-        $sql.= " ".MAIN_DB_PREFIX.$invoicedettable." as d" ;
-        $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
-        $sql.= " WHERE f.entity = " . $conf->entity;
-        $sql.= " AND f.fk_statut in (1,2)"; // Validated or paid (partially or completely)
-        if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $sql.= " AND f.type IN (0,1,2,5)";
-        else $sql.= " AND f.type IN (0,1,2,3,5)";
-        $sql.= " AND f.rowid = d.".$fk_facture;
-        if ($y && $m)
-        {
-            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,$m,false))."'";
-            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,$m,false))."'";
-        }
-        else if ($y)
-        {
-            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,1,false))."'";
-            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,12,false))."'";
-        }
-        if ($q) $sql.= " AND (date_format(f.datef,'%m') > ".(($q-1)*3)." AND date_format(f.datef,'%m') <= ".($q*3).")";
-        if ($date_start && $date_end) $sql.= " AND f.datef >= '".$db->idate($date_start)."' AND f.datef <= '".$db->idate($date_end)."'";
-        $sql.= " AND (d.product_type = 0";                              // Limit to products
-        $sql.= " AND d.date_start is null AND d.date_end IS NULL)";     // enhance detection of service
-        $sql.= " ORDER BY d.rowid, d.".$fk_facture;
-
-    }
-
-    if (! $sql) return -1;
-
-    dol_syslog("Tax.lib.php::vat_by_date sql=".$sql);
-
-    $resql = $db->query($sql);
-    if ($resql)
-    {
-        $lt=-1;
-        $oldrowid='';
-        while($assoc = $db->fetch_array($resql))
-        {
-            if (! isset($list[$assoc['localtax_tx']]['totalht']))  $list[$assoc['localtax_tx']]['totalht']=0;
-            if (! isset($list[$assoc['localtax_tx']]['vat']))      $list[$assoc['localtax_tx']]['vat']=0;
-            if (! isset($list[$assoc['localtax_tx']]['localtax1']))      $list[$assoc['localtax_tx']]['localtax1']=0;
-            if (! isset($list[$assoc['localtax_tx']]['localtax2']))      $list[$assoc['localtax_tx']]['localtax2']=0;
-
-            if ($assoc['rowid'] != $oldrowid)       // Si rupture sur d.rowid
-            {
-                $oldrowid=$assoc['rowid'];
-                $list[$assoc['localtax_tx']]['totalht']  += $assoc['total_ht'];
-                $list[$assoc['localtax_tx']]['vat']      += $assoc['total_vat'];
-                $list[$assoc['localtax_tx']]['localtax1']      += $assoc['total_localtax1'];
-                $list[$assoc['localtax_tx']]['localtax2']      += $assoc['total_localtax2'];
-            }
-
-            $list[$assoc['localtax_tx']]['localtax1_tx'] = $assoc['localtax1_tx'];
-            $list[$assoc['localtax_tx']]['localtax2_tx'] = $assoc['localtax2_tx'];
-
-            $list[$assoc['localtax_tx']]['dtotal_ttc'][] = $assoc['total_ttc'];
-            $list[$assoc['localtax_tx']]['dtype'][] = $assoc['dtype'];
-            $list[$assoc['localtax_tx']]['ddate_start'][] = $db->jdate($assoc['date_start']);
-            $list[$assoc['localtax_tx']]['ddate_end'][] = $db->jdate($assoc['date_end']);
-
-            $list[$assoc['localtax_tx']]['facid'][] = $assoc['facid'];
-            $list[$assoc['localtax_tx']]['facnum'][] = $assoc['facnum'];
-            $list[$assoc['localtax_tx']]['type'][] = $assoc['type'];
-            $list[$assoc['localtax_tx']]['ftotal_ttc'][] = $assoc['ftotal_ttc'];
-            $list[$assoc['localtax_tx']]['descr'][] = $assoc['descr'];
-
-            $list[$assoc['localtax_tx']]['totalht_list'][] = $assoc['total_ht'];
-            $list[$assoc['localtax_tx']]['vat_list'][] = $assoc['total_vat'];
-            $list[$assoc['localtax_tx']]['localtax1_list'][] = $assoc['total_localtax1'];
-            $list[$assoc['localtax_tx']]['localtax2_list'][]  = $assoc['total_localtax2'];
-
-            $list[$assoc['localtax_tx']]['pid'][] = $assoc['pid'];
-            $list[$assoc['localtax_tx']]['pref'][] = $assoc['pref'];
-            $list[$assoc['localtax_tx']]['ptype'][] = $assoc['ptype'];
-
-            $list[$assoc['localtax_tx']]['payment_id'][] = $assoc['payment_id'];
-            $list[$assoc['localtax_tx']]['payment_amount'][] = $assoc['payment_amount'];
-
-            $lt = $assoc['localtax_tx'];
-        }
-    }
-    else
-    {
-        dol_print_error($db);
-        return -3;
-    }
-
-    // CAS DES SERVICES
-
-    // Define sql request
-    $sql='';
-    if ($modetax == 1)  // Option vat on delivery for goods (payment) and debit invoice for services
-    {
-
-        // Count on invoice date
-        $sql = "SELECT d.rowid, d.product_type as dtype, d.".$fk_facture." as facid, d.tva_tx as rate, d.".$localtax_tx." as localtax_tx, d.total_ht as total_ht, d.total_ttc as total_ttc, d.".$total_tva." as total_vat, d.description as descr,";
-        $sql .=" d.".$total_localtax1." as total_localtax1, d.".$total_localtax2." as total_localtax2, ";
-        $sql.= " d.date_start as date_start, d.date_end as date_end,";
-        $sql.= " f.".$invoicefieldref." as facnum, f.type, f.total_ttc as ftotal_ttc,";
-        $sql.= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype,";
-        $sql.= " 0 as payment_id, 0 as payment_amount";
-        $sql.= " FROM ".MAIN_DB_PREFIX.$invoicetable." as f,";
-        $sql.= " ".MAIN_DB_PREFIX.$invoicedettable." as d" ;
-        $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
-        $sql.= " WHERE f.entity = " . $conf->entity;
-        $sql.= " AND f.fk_statut in (1,2)"; // Validated or paid (partially or completely)
-        if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $sql.= " AND f.type IN (0,1,2,5)";
-        else $sql.= " AND f.type IN (0,1,2,3,5)";
-        $sql.= " AND f.rowid = d.".$fk_facture;
-        if ($y && $m)
-        {
-            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,$m,false))."'";
-            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,$m,false))."'";
-        }
-        else if ($y)
-        {
-            $sql.= " AND f.datef >= '".$db->idate(dol_get_first_day($y,1,false))."'";
-            $sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,12,false))."'";
-        }
-        if ($q) $sql.= " AND (date_format(f.datef,'%m') > ".(($q-1)*3)." AND date_format(f.datef,'%m') <= ".($q*3).")";
-        if ($date_start && $date_end) $sql.= " AND f.datef >= '".$db->idate($date_start)."' AND f.datef <= '".$db->idate($date_end)."'";
-        $sql.= " AND (d.product_type = 1";                              // Limit to services
-        $sql.= " OR d.date_start is NOT null OR d.date_end IS NOT NULL)";       // enhance detection of service
-        $sql.= " ORDER BY d.rowid, d.".$fk_facture;
-
-    }
-    else    // Option vat on delivery for goods (payments) and payments for services
-    {
-
-        // Count on payments date
-        $sql = "SELECT d.rowid, d.product_type as dtype, d.".$fk_facture." as facid, d.tva_tx as rate, d.".$localtax_tx." as localtax_tx, d.total_ht as total_ht, d.total_ttc as total_ttc, d.".$total_tva." as total_vat, d.description as descr,";
-        $sql .=" d.".$total_localtax1." as total_localtax1, d.".$total_localtax2." as total_localtax2, ";
-        $sql.= " d.date_start as date_start, d.date_end as date_end,";
-        $sql.= " f.".$invoicefieldref." as facnum, f.type, f.total_ttc as ftotal_ttc,";
-        $sql.= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype,";
-        $sql.= " pf.".$fk_payment." as payment_id, pf.amount as payment_amount";
-        $sql.= " FROM ".MAIN_DB_PREFIX.$invoicetable." as f,";
-        $sql.= " ".MAIN_DB_PREFIX.$paymentfacturetable." as pf,";
-        $sql.= " ".MAIN_DB_PREFIX.$paymenttable." as pa,";
-        $sql.= " ".MAIN_DB_PREFIX.$invoicedettable." as d";
-        $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p on d.fk_product = p.rowid";
-        $sql.= " WHERE f.entity = " . $conf->entity;
-        $sql.= " AND f.fk_statut in (1,2)"; // Paid (partially or completely)
-        if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $sql.= " AND f.type IN (0,1,2,5)";
-        else $sql.= " AND f.type IN (0,1,2,3,5)";
-        $sql.= " AND f.rowid = d.".$fk_facture;;
-        $sql.= " AND pf.".$fk_facture2." = f.rowid";
-        $sql.= " AND pa.rowid = pf.".$fk_payment;
-        if ($y && $m)
-        {
-            $sql.= " AND pa.datep >= '".$db->idate(dol_get_first_day($y,$m,false))."'";
-            $sql.= " AND pa.datep <= '".$db->idate(dol_get_last_day($y,$m,false))."'";
-        }
-        else if ($y)
-        {
-            $sql.= " AND pa.datep >= '".$db->idate(dol_get_first_day($y,1,false))."'";
-            $sql.= " AND pa.datep <= '".$db->idate(dol_get_last_day($y,12,false))."'";
-        }
-        if ($q) $sql.= " AND (date_format(pa.datep,'%m') > ".(($q-1)*3)." AND date_format(pa.datep,'%m') <= ".($q*3).")";
-        if ($date_start && $date_end) $sql.= " AND pa.datep >= ".$db->idate($date_start)." AND pa.datep <= ".$db->idate($date_end);
-        $sql.= " AND (d.product_type = 1";                              // Limit to services
-        $sql.= " OR d.date_start is NOT null OR d.date_end IS NOT NULL)";       // enhance detection of service
-        $sql.= " ORDER BY d.rowid, d.".$fk_facture.", pf.rowid";
-
-    }
-
-    if (! $sql)
-    {
-        dol_syslog("Tax.lib.php::local_by_date no accountancy module enabled".$sql,LOG_ERR);
-        return -1;
-    }
-
-    dol_syslog("Tax.lib.php::local_by_date sql=".$sql);
-    $resql = $db->query($sql);
-    if ($resql)
-    {
-        $lt = -1;
-        $oldrowid='';
-        while($assoc = $db->fetch_array($resql))
-        {
-            if (! isset($list[$assoc['localtax_tx']]['totalht']))  $list[$assoc['localtax_tx']]['totalht']=0;
-            if (! isset($list[$assoc['localtax_tx']]['vat']))      $list[$assoc['localtax_tx']]['vat']=0;
-            if (! isset($list[$assoc['localtax_tx']]['localtax1']))      $list[$assoc['localtax_tx']]['localtax1']=0;
-            if (! isset($list[$assoc['localtax_tx']]['localtax2']))      $list[$assoc['localtax_tx']]['localtax2']=0;
-
-            if ($assoc['rowid'] != $oldrowid)
-            {
-                $oldrowid=$assoc['rowid'];
-                $list[$assoc['localtax_tx']]['totalht']  += $assoc['total_ht'];
-                $list[$assoc['localtax_tx']]['vat']      += $assoc['total_vat'];
-                $list[$assoc['localtax_tx']]['localtax1']	 += $assoc['total_localtax1'];
-                $list[$assoc['localtax_tx']]['localtax2']	 += $assoc['total_localtax2'];
-            }
-
-            $list[$assoc['localtax_tx']]['localtax1_tx'] = $assoc['localtax1_tx'];
-            $list[$assoc['localtax_tx']]['localtax2_tx'] = $assoc['localtax2_tx'];
-
-            $list[$assoc['localtax_tx']]['dtotal_ttc'][] = $assoc['total_ttc'];
-            $list[$assoc['localtax_tx']]['dtype'][] = $assoc['dtype'];
-            $list[$assoc['localtax_tx']]['ddate_start'][] = $db->jdate($assoc['date_start']);
-            $list[$assoc['localtax_tx']]['ddate_end'][] = $db->jdate($assoc['date_end']);
-
-            $list[$assoc['localtax_tx']]['facid'][] = $assoc['facid'];
-            $list[$assoc['localtax_tx']]['facnum'][] = $assoc['facnum'];
-            $list[$assoc['localtax_tx']]['type'][] = $assoc['type'];
-            $list[$assoc['localtax_tx']]['ftotal_ttc'][] = $assoc['ftotal_ttc'];
-            $list[$assoc['localtax_tx']]['descr'][] = $assoc['descr'];
-
-            $list[$assoc['localtax_tx']]['totalht_list'][] = $assoc['total_ht'];
-            $list[$assoc['localtax_tx']]['vat_list'][] = $assoc['total_vat'];
-            $list[$assoc['localtax_tx']]['localtax1_list'][] = $assoc['total_localtax1'];
-            $list[$assoc['localtax_tx']]['localtax2_list'][] = $assoc['total_localtax2'];
-
-            $list[$assoc['localtax_tx']]['pid'][] = $assoc['pid'];
-            $list[$assoc['localtax_tx']]['pref'][] = $assoc['pref'];
-            $list[$assoc['localtax_tx']]['ptype'][] = $assoc['ptype'];
-
-            $list[$assoc['localtax_tx']]['payment_id'][] = $assoc['payment_id'];
-            $list[$assoc['localtax_tx']]['payment_amount'][] = $assoc['payment_amount'];
-
-            $lt = $assoc['localtax_tx'];
-        }
-    }
-    else
-    {
-        dol_print_error($db);
-        return -3;
-    }
-
-    return $list;
-
-
-}
-
-
 /**
  *  Gets VAT to collect for the given year (and given quarter or month)
  *  The function gets the VAT in split results, as the VAT declaration asks