diff --git a/htdocs/commande/commande.class.php b/htdocs/commande/commande.class.php
index bdfdff374eb456f8629f35ff59e9e4aec614d691..8e2718790595880d8eec8602eba6fdab1c849028 100644
--- a/htdocs/commande/commande.class.php
+++ b/htdocs/commande/commande.class.php
@@ -656,7 +656,7 @@ class Commande extends CommonObject
 			// qty, pu, remise_percent et txtva
 			// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker 
 			// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
-			$tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type);
+			$tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
 			$total_ht  = $tabprice[0];
 			$total_tva = $tabprice[1];
 			$total_ttc = $tabprice[2];
@@ -1827,9 +1827,10 @@ class Commande extends CommonObject
    *  \param     qty              Quantit�
    *  \param     remise_percent   Pourcentage de remise de la ligne
    *  \param     tva_tx           Taux TVA
+   *  \param     info_bits        Miscellanous informations on line
    *  \return    int              < 0 si erreur, > 0 si ok
    */
-  function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $txtva, $price_base_type='HT')
+  function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $txtva, $price_base_type='HT', $info_bits=0)
   {
     dolibarr_syslog("Commande::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $txtva");
     include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
@@ -1849,7 +1850,7 @@ class Commande extends CommonObject
 	// qty, pu, remise_percent et txtva
 	// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker 
 	// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
-	$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type);
+	$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
 	$total_ht  = $tabprice[0];
 	$total_tva = $tabprice[1];
 	$total_ttc = $tabprice[2];
diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php
index 47b96f7ffb0120d04a31f9815a2a60375183d5df..a2cfe225cdb87f2be50db4ee8e75c39b1defca71 100644
--- a/htdocs/compta/facture.php
+++ b/htdocs/compta/facture.php
@@ -798,7 +798,8 @@ if (($_POST['action'] == 'addligne' || $_POST['action'] == 'addligne_predef') &&
             $prod->fetch($_POST['idprod']);
 
             $tva_tx = get_default_tva($mysoc,$fac->client,$prod->tva_tx);
-
+			$tva_npr = get_default_npr($mysoc,$fac->client,$prod->tva_tx);
+			
             // On defini prix unitaire
             if ($conf->global->PRODUIT_MULTIPRICES == 1)
             {
@@ -834,9 +835,13 @@ if (($_POST['action'] == 'addligne' || $_POST['action'] == 'addligne_predef') &&
         else
         {
 	        $pu_ht=$_POST['pu'];
-	        $tva_tx=$_POST['tva_tx'];
+	        $tva_tx=eregi_replace('\*','',$_POST['tva_tx']);
+			$tva_npr=eregi('\*',$_POST['tva_tx'])?1:0;
 	        $desc=$_POST['dp_desc'];
         }
+		
+		$info_bit=0;
+		if ($tva_npr) $info_bit |= 0x01;
 
 		// Insere ligne
 		$result = $fac->addline(
@@ -850,7 +855,7 @@ if (($_POST['action'] == 'addligne' || $_POST['action'] == 'addligne_predef') &&
 				$date_start,
 				$date_end,
 				0,
-				'',
+				$info_bit,
 				'',
 				$price_base_type,
 				$pu_ttc
@@ -888,6 +893,14 @@ if ($_POST['action'] == 'updateligne' && $user->rights->facture->creer && $_POST
 		$date_end=$_POST['date_endyear'].'-'.$_POST['date_endmonth'].'-'.$_POST['date_endday'];
 	}
 
+	// Define info_bits
+	$info_bits=0;
+	if (eregi('\*',$_POST['tva_tx'])) $info_bits |= 0x01;
+
+	// Define vat_rate
+	$vat_rate=$_POST['tva_tx'];
+	$vat_rate=eregi_replace('\*','',$vat_rate);
+
 	$result = $fac->updateline($_POST['rowid'],
 		$_POST['desc'],
 		$_POST['price'],
@@ -895,7 +908,9 @@ if ($_POST['action'] == 'updateligne' && $user->rights->facture->creer && $_POST
 		$_POST['remise_percent'],
 		$date_start,
 		$date_end,
-		$_POST['tva_tx']
+		$vat_rate,
+		'HT',
+		$info_bits
 		);
 
 	if ($_REQUEST['lang_id'])
@@ -2405,7 +2420,7 @@ else
 							}
 							print "</td>\n";
 						}
-						print '<td align="right">'.vatrate($objp->tva_taux).'%</td>';
+						print '<td align="right">'.vatrate($objp->tva_taux).'%'.($objp->info_bits & 1?' *':'').'</td>';
 						print '<td align="right">'.price($objp->subprice)."</td>\n";
 						print '<td align="right">';
 						if (($objp->info_bits & 2) != 2)
@@ -2507,10 +2522,7 @@ else
 						}
 						print '</td>';
 						print '<td align="right">';
-						if(! $soc->tva_assuj)
-							print '<input type="hidden" name="tva_tx" value="0">0%';
-						else
-							print $html->select_tva('tva_tx',$objp->tva_taux,$mysoc,$soc);
+						print $html->select_tva('tva_tx',$objp->tva_taux,$mysoc,$soc,'',$objp->info_bits);
 						print '</td>';
 						print '<td align="right"><input size="6" type="text" class="flat" name="price" value="'.price($objp->subprice,0,'',0).'"></td>';
 						print '<td align="right">';
@@ -2591,10 +2603,8 @@ else
 				}
 				print '</td>';
 				print '<td align="right">';
-				if (! $soc->tva_assuj)
-					print '<input type="hidden" name="tva_tx" value="0">0%';
-				else
-					$html->select_tva('tva_tx',$conf->defaulttx,$mysoc,$soc);
+
+				$html->select_tva('tva_tx',$conf->defaulttx,$mysoc,$soc);
 				print '</td>';
 				print '<td align="right"><input type="text" name="pu" size="6"></td>';
 				print '<td align="right"><input type="text" name="qty" value="'.($fac->type==2?'-1':'1').'" size="2"></td>';
diff --git a/htdocs/compta/facture/facture-rec.class.php b/htdocs/compta/facture/facture-rec.class.php
index d5475e8a383df058ed9cb914fae56c9069edd873..f52e52d66a271fb43ece7156d79f8bdfff7d627c 100644
--- a/htdocs/compta/facture/facture-rec.class.php
+++ b/htdocs/compta/facture/facture-rec.class.php
@@ -358,7 +358,7 @@ class FactureRec extends Facture
 	/**
 	 *		\brief		Ajoute une ligne de facture
 	 */
-	function addline($facid, $desc, $pu, $qty, $txtva, $fk_product='NULL', $remise_percent=0, $price_base_type='HT')
+	function addline($facid, $desc, $pu, $qty, $txtva, $fk_product='NULL', $remise_percent=0, $price_base_type='HT', $info_bits=0)
 	{
 		include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
 		
@@ -376,7 +376,7 @@ class FactureRec extends Facture
 			// qty, pu, remise_percent et txtva
 			// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
 			// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
-			$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type);
+			$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
 			$total_ht  = $tabprice[0];
 			$total_tva = $tabprice[1];
 			$total_ttc = $tabprice[2];
diff --git a/htdocs/contrat/contrat.class.php b/htdocs/contrat/contrat.class.php
index 1421e193c933bb16d49f504231dcd31b70ca4dfa..fccab983c9c763d0d580cfc4491329739997c02e 100644
--- a/htdocs/contrat/contrat.class.php
+++ b/htdocs/contrat/contrat.class.php
@@ -670,7 +670,7 @@ class Contrat extends CommonObject
 		$pu = price2num($pu,'MU');
 		$txtva = price2num($txtva,'MU');
 		
-        dolibarr_syslog("Contrat::addline $desc, $pu, $qty, $txtva, $fk_product, $remise_percent, $date_start, $date_end, $price_base_type");
+        dolibarr_syslog("Contrat::addline $desc, $pu, $qty, $txtva, $fk_product, $remise_percent, $date_start, $date_end, $price_base_type, $info_bits");
 
         if ($this->statut == 0)
         {
@@ -693,7 +693,7 @@ class Contrat extends CommonObject
 			// qty, pu, remise_percent et txtva
 			// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker 
 			// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
-			$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type);
+			$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
 			$total_ht  = $tabprice[0];
 			$total_tva = $tabprice[1];
 			$total_ttc = $tabprice[2];
diff --git a/htdocs/facture.class.php b/htdocs/facture.class.php
index 7734f4c92d1ca691f081b39e93c2ca24a7303943..12a8a1a11d6bf85d99a402081089fcd200b8bbbb 100644
--- a/htdocs/facture.class.php
+++ b/htdocs/facture.class.php
@@ -46,57 +46,58 @@ class Facture extends CommonObject
 	var $element='facture';
     var $table_element='facture';
 
-  var $table;
-  var $tabledetail;	
-  var $id;
-  //! Id client
-  var $socid;
-  //! Objet societe client (� charger par fetch_client)
-  var $client;	
-  var $number;
-  var $author;
-  var $date;
-  var $ref;
-  var $ref_client;
-  //! 0=Facture normale, 1=Facture remplacement, 2=Facture avoir, 3=Facture r�currente
-  var $type;
-  var $amount;
-  var $remise;
-  var $tva;
-  var $total;
-  var $note;
-  var $note_public;
-  //! 0=brouillon,
-  //! 1=valid�e,
-  //! 2=class�e pay�e partiellement (close_code='discount_vat','badcustomer') ou compl�tement (close_code=null),
-  //! 3=class�e abandonn�e et aucun paiement n'a eu lieu (close_code='badcustomer','abandon' ou 'replaced')
-  var $statut;
-  //! 1 si facture pay�e COMPLETEMENT, 0 sinon (ce champ ne devrait plus servir car insuffisant)
-  var $paye;
-  //! id facture source si facture de remplacement ou avoir
-  var $fk_facture_source;
-  //! Fermeture apres paiement partiel: discount_vat, bad_customer, abandon
-  //! Fermeture alors que aucun paiement: replaced (si remplac�), abandon
-  var $close_code;	
-  //! Commentaire si mis a paye sans paiement complet
-  var $close_note;
-  var $propalid;
-  var $projetid;
-  var $date_lim_reglement;
-  var $cond_reglement_id;
-  var $cond_reglement_code;
-  var $mode_reglement_id;
-  var $mode_reglement_code;
-  var $modelpdf;
-  var $products=array();
-  var $lignes=array();	
-  //! Pour board
-  var $nbtodo;
-  var $nbtodolate;
-  var $specimen;
-  //! Numero d'erreur de 512 � 1023
-  var $errno = 0;
-  /**
+	var $table;
+	var $tabledetail;	
+	var $id;
+	//! Id client
+	var $socid;
+	//! Objet societe client (� charger par fetch_client)
+	var $client;	
+	var $number;
+	var $author;
+	var $date;
+	var $ref;
+	var $ref_client;
+	//! 0=Facture normale, 1=Facture remplacement, 2=Facture avoir, 3=Facture r�currente
+	var $type;
+	var $amount;
+	var $remise;
+	var $tva;
+	var $total;
+	var $note;
+	var $note_public;
+	//! 0=brouillon,
+	//! 1=valid�e,
+	//! 2=class�e pay�e partiellement (close_code='discount_vat','badcustomer') ou compl�tement (close_code=null),
+	//! 3=class�e abandonn�e et aucun paiement n'a eu lieu (close_code='badcustomer','abandon' ou 'replaced')
+	var $statut;
+	//! 1 si facture pay�e COMPLETEMENT, 0 sinon (ce champ ne devrait plus servir car insuffisant)
+	var $paye;
+	//! id facture source si facture de remplacement ou avoir
+	var $fk_facture_source;
+	//! Fermeture apres paiement partiel: discount_vat, bad_customer, abandon
+	//! Fermeture alors que aucun paiement: replaced (si remplac�), abandon
+	var $close_code;	
+	//! Commentaire si mis a paye sans paiement complet
+	var $close_note;
+	var $propalid;
+	var $projetid;
+	var $date_lim_reglement;
+	var $cond_reglement_id;
+	var $cond_reglement_code;
+	var $mode_reglement_id;
+	var $mode_reglement_code;
+	var $modelpdf;
+	var $products=array();
+	var $lignes=array();	
+	//! Pour board
+	var $nbtodo;
+	var $nbtodolate;
+	var $specimen;
+	//! Numero d'erreur de 512 � 1023
+	var $errno = 0;
+	
+	/**
      \brief  Constructeur de la classe
      \param  DB         handler acc�s base de donn�es
      \param  socid		id societe ('' par defaut)
@@ -1337,7 +1338,7 @@ class Facture extends CommonObject
    *					par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,taux_produit)
    *					et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue)
    */
-	function addline($facid, $desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits='', $fk_remise_except='', $price_base_type='HT', $pu_ttc=0)
+	function addline($facid, $desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits=0, $fk_remise_except='', $price_base_type='HT', $pu_ttc=0)
 	{
 		dolibarr_syslog("Facture::Addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,fk_product=$fk_product,remise_percent=$remise_percent,date_start=$date_start,date_end=$date_end,ventil=$ventil,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc", LOG_DEBUG);
 		include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
@@ -1369,7 +1370,7 @@ class Facture extends CommonObject
 			// qty, pu, remise_percent et txtva
 			// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
 			// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
-			$tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type);
+			$tabprice = calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
 			$total_ht  = $tabprice[0];
 			$total_tva = $tabprice[1];
 			$total_ttc = $tabprice[2];
@@ -1443,97 +1444,100 @@ class Facture extends CommonObject
 		}
 	}
 
-  /**
-   *      \brief     Mets � jour une ligne de facture
-   *      \param     rowid            Id de la ligne de facture
-   *      \param     desc             Description de la ligne
-   *      \param     pu               Prix unitaire (HT ou TTC selon price_base_type)
-   *      \param     qty              Quantit�
-   *      \param     remise_percent   Pourcentage de remise de la ligne
-   *      \param     date_start       Date de debut de validit� du service
-   *      \param     date_end         Date de fin de validit� du service
-   *      \param     tva_tx           Taux TVA
-   * 	  \param	 price_base_type  HT ou TTC
-   *      \return    int              < 0 si erreur, > 0 si ok
-   */
-  function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $date_start, $date_end, $txtva, $price_base_type='HT')
-  {
-    dolibarr_syslog("Facture::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $txtva", LOG_DEBUG);
-    include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
+	/**
+	*      \brief     Mets � jour une ligne de facture
+	*      \param     rowid            Id de la ligne de facture
+	*      \param     desc             Description de la ligne
+	*      \param     pu               Prix unitaire (HT ou TTC selon price_base_type)
+	*      \param     qty              Quantit�
+	*      \param     remise_percent   Pourcentage de remise de la ligne
+	*      \param     date_start       Date de debut de validit� du service
+	*      \param     date_end         Date de fin de validit� du service
+	*      \param     tva_tx           Taux TVA
+	* 	   \param     price_base_type  HT ou TTC
+	* 	   \param     info_bits        Miscellanous informations
+	*      \return    int              < 0 si erreur, > 0 si ok
+	*/
+	function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $date_start, $date_end, $txtva, $price_base_type='HT', $info_bits=0)
+	{
+		include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
 
-    if ($this->brouillon)
-      {
-	$this->db->begin();
+		dolibarr_syslog("Facture::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $txtva, $price_base_type, $info_bits", LOG_DEBUG);
 
-	// Nettoyage param�tres
-	$remise_percent=price2num($remise_percent);
-	$qty=price2num($qty);
-	if (! $qty) $qty=1;
-	$pu = price2num($pu);
-	$txtva=price2num($txtva);
-
-	// Calcul du total TTC et de la TVA pour la ligne a partir de
-	// qty, pu, remise_percent et txtva
-	// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
-	// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
-	$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type);
-		$total_ht  = $tabprice[0];
-		$total_tva = $tabprice[1];
-		$total_ttc = $tabprice[2];
-		$pu_ht  = $tabprice[3];
-		$pu_tva = $tabprice[4];
-		$pu_ttc = $tabprice[5];
-
-	// Anciens indicateurs: $price, $remise (a ne plus utiliser)
-	$price = $pu;
-	$remise = 0;
-	if ($remise_percent > 0)
-	  {
-	    $remise = round(($pu * $remise_percent / 100),2);
-	    $price = ($pu - $remise);
-	  }
-	$price    = price2num($price);
+		if ($this->brouillon)
+		{
+			$this->db->begin();
 
-	// Mise a jour ligne en base
-	$ligne=new FactureLigne($this->db);
-	$ligne->rowid=$rowid;
-	$ligne->fetch($rowid);
-
-	$ligne->desc=$desc;
-	$ligne->qty=$qty;
-	$ligne->tva_tx=$txtva;
-	$ligne->remise_percent=$remise_percent;
-	$ligne->subprice=$pu;
-	$ligne->date_start=$date_start;
-	$ligne->date_end=$date_end;
-	$ligne->total_ht=$total_ht;
-	$ligne->total_tva=$total_tva;
-	$ligne->total_ttc=$total_ttc;
-
-	// A ne plus utiliser
-	$ligne->price=$price;
-	$ligne->remise=$remise;
-
-	$result=$ligne->update();
-	if ($result > 0)
-	  {
-	    // Mise a jour info denormalisees au niveau facture
-	    $this->update_price($this->id);
-	    $this->db->commit();
-	    return $result;
-	  }
-	else
-	  {
-	    $this->db->rollback();
-	    return -1;
-	  }
-      }
-    else
-      {
-	$this->error="Facture::UpdateLine Invoice statut makes operation forbidden";
-	return -2;
-      }
-  }
+			// Nettoyage param�tres
+			$remise_percent=price2num($remise_percent);
+			$qty=price2num($qty);
+			if (! $qty) $qty=1;
+			$pu = price2num($pu);
+			$txtva=price2num($txtva);
+
+			// Calcul du total TTC et de la TVA pour la ligne a partir de
+			// qty, pu, remise_percent et txtva
+			// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
+			// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
+			$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
+			$total_ht  = $tabprice[0];
+			$total_tva = $tabprice[1];
+			$total_ttc = $tabprice[2];
+			$pu_ht  = $tabprice[3];
+			$pu_tva = $tabprice[4];
+			$pu_ttc = $tabprice[5];
+
+			// Anciens indicateurs: $price, $remise (a ne plus utiliser)
+			$price = $pu;
+			$remise = 0;
+			if ($remise_percent > 0)
+			{
+				$remise = round(($pu * $remise_percent / 100),2);
+				$price = ($pu - $remise);
+			}
+			$price    = price2num($price);
+
+			// Mise a jour ligne en base
+			$ligne=new FactureLigne($this->db);
+			$ligne->rowid=$rowid;
+			$ligne->fetch($rowid);
+
+			$ligne->desc=$desc;
+			$ligne->qty=$qty;
+			$ligne->tva_tx=$txtva;
+			$ligne->remise_percent=$remise_percent;
+			$ligne->subprice=$pu;
+			$ligne->date_start=$date_start;
+			$ligne->date_end=$date_end;
+			$ligne->total_ht=$total_ht;
+			$ligne->total_tva=$total_tva;
+			$ligne->total_ttc=$total_ttc;
+			$ligne->info_bits=$info_bits;
+			
+			// A ne plus utiliser
+			$ligne->price=$price;
+			$ligne->remise=$remise;
+
+			$result=$ligne->update();
+			if ($result > 0)
+			{
+				// Mise a jour info denormalisees au niveau facture
+				$this->update_price($this->id);
+				$this->db->commit();
+				return $result;
+			}
+			else
+			{
+				$this->db->rollback();
+				return -1;
+			}
+		}
+		else
+		{
+			$this->error="Facture::UpdateLine Invoice statut makes operation forbidden";
+			return -2;
+		}
+	}
 
 	/**
 	*	\brief		Supprime une ligne facture de la base
@@ -3108,7 +3112,7 @@ class FactureLigne
     $sql.= ",total_ttc=".price2num($this->total_ttc)."";
     $sql.= " WHERE rowid = ".$this->rowid;
 
-    dolibarr_syslog("FactureLigne::update sql=$sql");
+    dolibarr_syslog("FactureLigne::update sql=".$sql);
 
     $resql=$this->db->query($sql);
     if ($resql)
@@ -3119,7 +3123,7 @@ class FactureLigne
     else
       {
 	$this->error=$this->db->error();
-	dolibarr_syslog("FactureLigne::update Error ".$this->error);
+	dolibarr_syslog("FactureLigne::update Error ".$this->error, LOG_ERR);
 	$this->db->rollback();
 	return -2;
       }
diff --git a/htdocs/fourn/fournisseur.commande.class.php b/htdocs/fourn/fournisseur.commande.class.php
index 8a8f61a4e67f343e44040f4a3fac40c1fc5117f1..969873dd93b6a8ac17d48f7f65801baea99d1f68 100644
--- a/htdocs/fourn/fournisseur.commande.class.php
+++ b/htdocs/fourn/fournisseur.commande.class.php
@@ -1244,9 +1244,10 @@ class CommandeFournisseur extends Commande
    *      \param     qty              Quantit�
    *      \param     remise_percent   Pourcentage de remise de la ligne
    *      \param     tva_tx           Taux TVA
+   *	  \param	 info_bits		  Miscellanous informations
    *      \return    int              < 0 si erreur, > 0 si ok
    */
-  function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $txtva, $price_base_type='HT')
+  function updateline($rowid, $desc, $pu, $qty, $remise_percent=0, $txtva, $price_base_type='HT', $info_bits=0)
   {
     dolibarr_syslog("CommandeFournisseur::UpdateLine $rowid, $desc, $pu, $qty, $remise_percent, $txtva");
     include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
@@ -1266,7 +1267,7 @@ class CommandeFournisseur extends Commande
 	// qty, pu, remise_percent et txtva
 	// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker 
 	// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
-	$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $price_base_type);
+	$tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $price_base_type, $info_bits);
 	$total_ht  = $tabprice[0];
 	$total_tva = $tabprice[1];
 	$total_ttc = $tabprice[2];
diff --git a/htdocs/fourn/fournisseur.facture.class.php b/htdocs/fourn/fournisseur.facture.class.php
index 177185ec432f73533f33d9efacad0406aab99e84..c412dfff8c85b1ba8c97d160e4c76ade59a12cbc 100644
--- a/htdocs/fourn/fournisseur.facture.class.php
+++ b/htdocs/fourn/fournisseur.facture.class.php
@@ -458,9 +458,10 @@ class FactureFournisseur extends Facture
 	 * \param     qty           	Quantit�
 	 * \param     idproduct			Id produit
 	 * \param	  price_base_type	HT ou TTC
+	 * \param	  info_bits			Miscellanous informations of line
 	 * \return    int           	<0 si ko, >0 si ok
 	 */
-	function updateline($id, $label, $pu, $tauxtva, $qty=1, $idproduct=0, $price_base_type='HT')
+	function updateline($id, $label, $pu, $tauxtva, $qty=1, $idproduct=0, $price_base_type='HT', $info_bits=0)
 	{
 		include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
 
@@ -474,7 +475,7 @@ class FactureFournisseur extends Facture
 		// qty, pu, remise_percent et txtva
 		// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
 		// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
-		$tabprice = calcul_price_total($qty, $pu, 0, $tauxtva, 0, $price_base_type);
+		$tabprice = calcul_price_total($qty, $pu, 0, $tauxtva, 0, $price_base_type, $info_bits);
 		$total_ht  = $tabprice[0];
 		$total_tva = $tabprice[1];
 		$total_ttc = $tabprice[2];
diff --git a/htdocs/html.form.class.php b/htdocs/html.form.class.php
index cc0cb509e44328b9e87c33dcbba3205285ea9040..ed23314eac2157883eed6e0b3cc1e70aadc235a6 100644
--- a/htdocs/html.form.class.php
+++ b/htdocs/html.form.class.php
@@ -2176,22 +2176,29 @@ class Form
     /**
      *      \brief      Selection du taux de tva � appliquer
      *      \param      name                Nom champ html
-     *      \param      defaulttx           For�age du taux tva pr�-s�lectionn�. Mettre '' pour aucun forcage.
+     *      \param      selectedrate        For�age du taux tva pr�-s�lectionn�. Mettre '' pour aucun forcage.
      *      \param      societe_vendeuse    Objet soci�t� vendeuse
      *      \param      societe_acheteuse   Objet soci�t� acheteuse
      *      \param      taux_produit        Taux par defaut du produit vendu
+     *      \param      info_bits           Miscellanous information on line
      *      \remarks    Si vendeur non assujeti � TVA, TVA par d�faut=0. Fin de r�gle.
      *                  Si le (pays vendeur = pays acheteur) alors la TVA par d�faut=TVA du produit vendu. Fin de r�gle.
      *                  Si (vendeur et acheteur dans Communaut� europ�enne) et bien vendu = moyen de transports neuf (auto, bateau, avion), TVA par d�faut=0 (La TVA doit �tre pay� par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de r�gle.
      *                  Si (vendeur et acheteur dans Communaut� europ�enne) et bien vendu autre que transport neuf alors la TVA par d�faut=TVA du produit vendu. Fin de r�gle.
      *                  Sinon la TVA propos�e par d�faut=0. Fin de r�gle.
      */
-    function select_tva($name='tauxtva', $defaulttx='', $societe_vendeuse='', $societe_acheteuse='', $taux_produit='')
+    function select_tva($name='tauxtva', $selectedrate='', $societe_vendeuse='', $societe_acheteuse='', $taux_produit='', $info_bits=0)
 	{
 		global $langs,$conf,$mysoc;
 
 		$txtva=array();
 		$libtva=array();
+		$nprtva=array();
+
+		// Define defaultnpr and defaultttx
+		$defaultnpr=($info_bits & 0x01);
+		$defaultnpr=(eregi('\*',$selectedrate) ? 1 : $defaultnpr);
+		$defaulttx=eregi_replace('\*','',$selectedrate);
 
 		//print $societe_vendeuse."-".$societe_acheteuse;
 		if (is_object($societe_vendeuse) && ! $societe_vendeuse->pays_code)
@@ -2232,8 +2239,9 @@ class Form
 				for ($i = 0; $i < $num; $i++)
 				{
 					$obj = $this->db->fetch_object($resql);
-					$txtva[$i] = $obj->taux;
-					$libtva[$i] = $obj->taux.'%'.($obj->recuperableonly ? ' *':'');
+					$txtva[$i]  = $obj->taux;
+					$libtva[$i] = $obj->taux.'%';
+					$nprtva[$i] = $obj->recuperableonly;
 				}
 			}
 			else
@@ -2250,6 +2258,7 @@ class Form
 		if ($defaulttx < 0 || strlen($defaulttx) == 0)
 		{
 			$defaulttx=get_default_tva($societe_vendeuse,$societe_acheteuse,$taux_produit);
+			$defaultnpr=get_default_npr($societe_vendeuse,$societe_acheteuse,$taux_produit);
 		}
 		// Si taux par defaut n'a pu etre d�termin�, on prend dernier de la liste.
 		// Comme ils sont tri�s par ordre croissant, dernier = plus �lev� = taux courant
@@ -2267,16 +2276,21 @@ class Form
 			
 			for ($i = 0 ; $i < $nbdetaux ; $i++)
 			{
-				print '<option value="'.$txtva[$i].'"';
-				if ($txtva[$i] == $defaulttx)
+				//print "xxxxx".$txtva[$i]."-".$nprtva[$i];
+				print '<option value="'.$txtva[$i];
+				print $nprtva[$i] ? '*': '';
+				print '"';
+				if ($txtva[$i] == $defaulttx && $nprtva[$i] == $defaultnpr)
 				{
 					print ' selected="true"';
 				}
-				print '>'.vatrate($libtva[$i]).'</option>';
+				print '>'.vatrate($libtva[$i]);
+				print $nprtva[$i] ? ' *': '';
+				print '</option>';
 				
 				$this->tva_taux_value[$i] = $txtva[$i];
 				$this->tva_taux_libelle[$i] = $libtva[$i];
-				
+				$this->tva_taux_npr[$i] = $nprtva[$i];
 			}
 			print '</select>';
 		}
diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php
index 9c57ace04aae9cde9c95051ebd00b9522524cfde..3d75564b8a031c91fedb37ab8906a6de90f84695 100644
--- a/htdocs/install/upgrade2.php
+++ b/htdocs/install/upgrade2.php
@@ -988,7 +988,7 @@ function migrate_price_facture($db,$langs,$conf)
 				$facligne= new FactureLigne($db);
 				$facligne->fetch($rowid);
 
-				$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT');
+				$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT',$info_bits);
 				$total_ht  = $result[0];
 				$total_tva = $result[1];
 				$total_ttc = $result[2];
@@ -1094,7 +1094,7 @@ function migrate_price_propal($db,$langs,$conf)
 				$propalligne= new PropaleLigne($db);
 				$propalligne->fetch($rowid);
 
-				$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT');
+				$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT',$info_bits);
 				$total_ht  = $result[0];
 				$total_tva = $result[1];
 				$total_ttc = $result[2];
@@ -1199,7 +1199,7 @@ function migrate_price_contrat($db,$langs,$conf)
 				//$contratligne->fetch($rowid); Non requis car le update_total ne met a jour que chp redefinis
 				$contratligne->rowid=$rowid;
 				
-				$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT');
+				$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT',$info_bits);
 				$total_ht  = $result[0];
 				$total_tva = $result[1];
 				$total_ttc = $result[2];
@@ -1302,7 +1302,7 @@ function migrate_price_commande($db,$langs,$conf)
 				$commandeligne= new CommandeLigne($db);
 				$commandeligne->fetch($rowid);
 
-				$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT');
+				$result=calcul_price_total($qty,$pu,$remise_percent,$txtva,$remise_percent_global,'HT',$info_bits);
 				$total_ht  = $result[0];
 				$total_tva = $result[1];
 				$total_ttc = $result[2];
diff --git a/htdocs/lib/functions.inc.php b/htdocs/lib/functions.inc.php
index 347d4d45cd73b37d2ca7c634255beb75d011276d..313bc383bac733398545aece100ad71da1ab1dbb 100644
--- a/htdocs/lib/functions.inc.php
+++ b/htdocs/lib/functions.inc.php
@@ -1893,6 +1893,26 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit)
 }
 
 
+/**
+   \brief      	Fonction qui renvoie si tva doit etre tva percue r�cup�rable
+   \remarks    	Si vendeur non assujeti a TVA, TVA par d�faut=0. Fin de r�gle.
+				Si le (pays vendeur = pays acheteur) alors TVA par d�faut=TVA du produit vendu. Fin de r�gle.
+				Si (vendeur et acheteur dans Communaut� europ�enne) et (bien vendu = moyen de transports neuf comme auto, bateau, avion) alors TVA par d�faut=0 (La TVA doit �tre pay� par acheteur au centre d'impots de son pays et non au vendeur). Fin de r�gle.
+				Si (vendeur et acheteur dans Communaut� europ�enne) et (acheteur = particulier ou entreprise sans num TVA intra) alors TVA par d�faut=TVA du produit vendu. Fin de r�gle.
+				Si (vendeur et acheteur dans Communaut� europ�enne) et (acheteur = entreprise avec num TVA) intra alors TVA par d�faut=0. Fin de r�gle.
+				Sinon TVA propos�e par d�faut=0. Fin de r�gle.
+   \param      	societe_vendeuse    	Objet soci�t� vendeuse
+   \param      	societe_acheteuse   	Objet soci�t� acheteuse
+   \param      	taux_produit        	Taux par defaut du produit vendu
+   \return     	float               	0 or 1
+ */
+function get_default_npr($societe_vendeuse, $societe_acheteuse, $taux_produit)
+{
+
+	return 0;
+}
+
+
 /**
 		\brief  Renvoie oui ou non dans la langue choisie
 		\param	yesno			Variable pour test si oui ou non
diff --git a/htdocs/lib/price.lib.php b/htdocs/lib/price.lib.php
index 4ae0c6757474a8285f9ea7a0a68d4514ee9527a4..28d7b3e1a987a5722849010c319b56be1509ce51 100644
--- a/htdocs/lib/price.lib.php
+++ b/htdocs/lib/price.lib.php
@@ -35,15 +35,16 @@
 		\param 	txtva						Taux tva
 		\param 	remise_percent_global		0
 		\param	price_base_type 			HT=on calcule sur le HT, TTC=on calcule sur le TTC
+		\param	info_bits					Miscellanous informations on line
 		\return result[0,1,2,3,4,5]			(total_ht, total_tva, total_ttc, pu_ht, pu_tva, pu_ttc)
 */
-function calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $remise_percent_global=0, $price_base_type='HT')
+function calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $remise_percent_global=0, $price_base_type='HT', $info_bits=0)
 {
 	global $conf;
 	
 	$result=array();
 
-	//dolibarr_syslog("price.lib::calcul_price_total $qty, $pu, $remise_percent_ligne, $txtva, $price_base_type");
+	//dolibarr_syslog("price.lib::calcul_price_total $qty, $pu, $remise_percent_ligne, $txtva, $price_base_type $info_bits");
 	if ($price_base_type == 'HT')
 	{
 		// On travaille par defaut en partant du prix HT
diff --git a/htdocs/propal.class.php b/htdocs/propal.class.php
index e0747c0d874d119d93ffc3bf1b1d56b8747da17b..d1dfa0190efa644784cc8805886e6806cddc5941 100644
--- a/htdocs/propal.class.php
+++ b/htdocs/propal.class.php
@@ -296,7 +296,7 @@ class Propal extends CommonObject
 			  // qty, pu, remise_percent et txtva
 			  // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker 
 			  // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
-			  $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type);
+			  $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
 			  $total_ht  = $tabprice[0];
 			  $total_tva = $tabprice[1];
 			  $total_ttc = $tabprice[2];
@@ -375,11 +375,11 @@ class Propal extends CommonObject
    *	\param		price_base_type		HT ou TTC
    *    \return     int             	0 en cas de succ�s
    */
-    function updateline($rowid, $pu, $qty, $remise_percent=0, $txtva, $desc='', $price_base_type='HT')
+    function updateline($rowid, $pu, $qty, $remise_percent=0, $txtva, $desc='', $price_base_type='HT', $info_bits=0)
     {
     	global $conf;
     	
-    	dolibarr_syslog("Propal::UpdateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type");
+    	dolibarr_syslog("Propal::UpdateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type, $info_bits");
     	include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
     	
     	if ($this->statut == 0)
@@ -405,7 +405,7 @@ class Propal extends CommonObject
         // qty, pu, remise_percent et txtva
         // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker 
         // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
-        $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type);
+        $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, $price_base_type, $info_bits);
         $total_ht  = $tabprice[0];
         $total_tva = $tabprice[1];
         $total_ttc = $tabprice[2];