diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php
index 73b6dc59b81b90587ce7629e66f9b5f32b09c53f..2794bffcbb36b437857f19368ee6c700cac9b7df 100644
--- a/htdocs/comm/propal.php
+++ b/htdocs/comm/propal.php
@@ -634,7 +634,7 @@ else if ($action == "setabsolutediscount" && $user->rights->propale->creer)
 else if ($action == "addline" && $user->rights->propale->creer)
 {
 	$idprod=GETPOST('idprod', 'int');
-	//var_dump($_POST);
+
 	if (empty($idprod) && GETPOST('type') < 0)
 	{
 		setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Type")), 'errors');
@@ -667,8 +667,6 @@ else if ($action == "addline" && $user->rights->propale->creer)
 			$prod->fetch($idprod);
 
 			$tva_tx = get_default_tva($mysoc,$object->client,$prod->id);
-			$localtax1_tx= get_localtax($tva_tx, 1, $object->client);  //get_default_localtax($mysoc,$object->client,1,$prod->id);
-			$localtax2_tx= get_localtax($tva_tx, 2, $object->client); //get_default_localtax($mysoc,$object->client,2,$prod->id);
 			$tva_npr = get_default_npr($mysoc,$object->client,$prod->id);
 
 			// On defini prix unitaire
@@ -752,8 +750,6 @@ else if ($action == "addline" && $user->rights->propale->creer)
 			$label = ((GETPOST('update_label') && GETPOST('product_label')) ? GETPOST('product_label'):'');
 
 			$type = $prod->type;
-			$fournprice=(GETPOST('fournprice')?GETPOST('fournprice'):'');
-			$buyingprice=(GETPOST('buying_price')?GETPOST('buying_price'):'');
 		}
 		else
 		{
@@ -763,12 +759,16 @@ else if ($action == "addline" && $user->rights->propale->creer)
 			$label=(GETPOST('product_label')?GETPOST('product_label'):'');
 			$desc=GETPOST('product_desc');
 			$type=GETPOST('type');
-			$localtax1_tx=get_localtax($tva_tx,1,$object->client);
-			$localtax2_tx=get_localtax($tva_tx,2,$object->client);
-			$fournprice=(GETPOST('fournprice')?GETPOST('fournprice'):'');
-			$buyingprice=(GETPOST('buying_price')?GETPOST('buying_price'):'');
 		}
 
+		// Margin
+		$fournprice=(GETPOST('fournprice')?GETPOST('fournprice'):'');
+		$buyingprice=(GETPOST('buying_price')?GETPOST('buying_price'):'');
+
+		// Local Taxes
+		$localtax1_tx= get_localtax($tva_tx, 1, $object->client);
+		$localtax2_tx= get_localtax($tva_tx, 2, $object->client);
+
 		$info_bits=0;
 		if ($tva_npr) $info_bits |= 0x01;
 
@@ -822,6 +822,8 @@ else if ($action == "addline" && $user->rights->propale->creer)
 
 				unset($_POST['qty']);
 				unset($_POST['type']);
+				unset($_POST['idprod']);
+				unset($_POST['remise_percent']);
 				unset($_POST['price_ht']);
 				unset($_POST['price_ttc']);
 				unset($_POST['tva_tx']);
diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php
index 857de5cab90fa5fdbf501fffe802c4df019cbc59..b60b0bcb86bc1a790596092200bd050d8d963f9d 100644
--- a/htdocs/comm/propal/class/propal.class.php
+++ b/htdocs/comm/propal/class/propal.class.php
@@ -741,7 +741,6 @@ class Propal extends CommonObject
 
 						$result = $this->addline(
 								$this->id,
-                        		$this->lines[$i]->label,
 								$this->lines[$i]->desc,
 								$this->lines[$i]->subprice,
 								$this->lines[$i]->qty,
@@ -758,7 +757,8 @@ class Propal extends CommonObject
 								$this->lines[$i]->special_code,
 								$fk_parent_line,
 								$this->lines[$i]->fk_fournprice,
-								$this->lines[$i]->pa_ht
+								$this->lines[$i]->pa_ht,
+								$this->lines[$i]->label
 						);
 
                         if ($result < 0)
diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php
index 11ce0f53b4bef6649d2ec8d14e962c2d68a13e4e..15194b7738affe7a0c7fc2b42559574a8d6a3c77 100644
--- a/htdocs/commande/class/commande.class.php
+++ b/htdocs/commande/class/commande.class.php
@@ -697,7 +697,8 @@ class Commande extends CommonOrder
                         $this->lines[$i]->special_code,
                         $fk_parent_line,
                         $this->lines[$i]->fk_fournprice,
-                        $this->lines[$i]->pa_ht
+                        $this->lines[$i]->pa_ht,
+                    	$this->lines[$i]->label
                     );
                     if ($result < 0)
                     {
@@ -896,6 +897,7 @@ class Commande extends CommonOrder
                 $line = new OrderLine($this->db);
 
                 $line->libelle           = $object->lines[$i]->libelle;
+                $line->label             = $object->lines[$i]->label;
                 $line->desc              = $object->lines[$i]->desc;
                 $line->price             = $object->lines[$i]->price;
                 $line->subprice          = $object->lines[$i]->subprice;
@@ -1006,7 +1008,7 @@ class Commande extends CommonOrder
      *	par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,produit)
      *	et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue)
      */
-	function addline($commandeid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $info_bits=0, $fk_remise_except=0, $price_base_type='HT', $pu_ttc=0, $date_start='', $date_end='', $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0)
+	function addline($commandeid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $info_bits=0, $fk_remise_except=0, $price_base_type='HT', $pu_ttc=0, $date_start='', $date_end='', $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='')
     {
         dol_syslog(get_class($this)."::addline commandeid=$commandeid, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_percent=$remise_percent, info_bits=$info_bits, fk_remise_except=$fk_remise_except, price_base_type=$price_base_type, pu_ttc=$pu_ttc, date_start=$date_start, date_end=$date_end, type=$type", LOG_DEBUG);
 
@@ -1038,6 +1040,7 @@ class Commande extends CommonOrder
         {
             $pu=$pu_ttc;
         }
+        $label=trim($label);
         $desc=trim($desc);
 
         // Check parameters
@@ -1080,6 +1083,7 @@ class Commande extends CommonOrder
             $this->line=new OrderLine($this->db);
 
             $this->line->fk_commande=$commandeid;
+            $this->line->label=$label;
             $this->line->desc=$desc;
             $this->line->qty=$qty;
             $this->line->tva_tx=$txtva;
@@ -1425,7 +1429,7 @@ class Commande extends CommonOrder
     {
         $this->lines=array();
 
-        $sql = 'SELECT l.rowid, l.fk_product, l.fk_parent_line, l.product_type, l.fk_commande, l.description, l.price, l.qty, l.tva_tx,';
+        $sql = 'SELECT l.rowid, l.fk_product, l.fk_parent_line, l.product_type, l.fk_commande, l.label as custom_label, l.description, l.price, l.qty, l.tva_tx,';
         $sql.= ' l.localtax1_tx, l.localtax2_tx, l.fk_remise_except, l.remise_percent, l.subprice, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.rang, l.info_bits, l.special_code,';
         $sql.= ' l.total_ht, l.total_ttc, l.total_tva, l.total_localtax1, l.total_localtax2, l.date_start, l.date_end,';
         $sql.= ' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label';
@@ -1452,6 +1456,7 @@ class Commande extends CommonOrder
                 $line->id               = $objp->rowid;
                 $line->fk_commande      = $objp->fk_commande;
                 $line->commande_id      = $objp->fk_commande;			// \deprecated
+                $line->label            = $objp->custom_label;
                 $line->desc             = $objp->description;  		// Description ligne
                 $line->product_type     = $objp->product_type;
                 $line->qty              = $objp->qty;
@@ -1468,11 +1473,11 @@ class Commande extends CommonOrder
                 $line->remise_percent   = $objp->remise_percent;
                 $line->price            = $objp->price;
                 $line->fk_product       = $objp->fk_product;
-								$line->fk_fournprice 		= $objp->fk_fournprice;
-		      			$marginInfos = getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
-		   			    $line->pa_ht 						= $marginInfos[0];
-		    				$line->marge_tx					= $marginInfos[1];
-		     				$line->marque_tx				= $marginInfos[2];
+				$line->fk_fournprice 	= $objp->fk_fournprice;
+		      	$marginInfos			= getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
+		   		$line->pa_ht 			= $marginInfos[0];
+		    	$line->marge_tx			= $marginInfos[1];
+		     	$line->marque_tx		= $marginInfos[2];
                 $line->rang             = $objp->rang;
                 $line->info_bits        = $objp->info_bits;
                 $line->special_code		= $objp->special_code;
@@ -2156,14 +2161,14 @@ class Commande extends CommonOrder
      *  @param		int				$pa_ht				Buying price (without tax)
      *  @return   	int              					< 0 if KO, > 0 if OK
      */
-	function updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0,$txlocaltax2=0, $price_base_type='HT', $info_bits=0, $date_start='', $date_end='', $type=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0)
+	function updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0,$txlocaltax2=0, $price_base_type='HT', $info_bits=0, $date_start='', $date_end='', $type=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0, $label='')
     {
         global $conf;
 
         dol_syslog(get_class($this)."::updateline $rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, $price_base_type, $info_bits, $date_start, $date_end, $type");
         include_once(DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php');
 
-        if ($this->brouillon)
+        if (! empty($this->brouillon))
         {
             $this->db->begin();
 
@@ -2178,7 +2183,7 @@ class Commande extends CommonOrder
             $remise_percent=price2num($remise_percent);
             $qty=price2num($qty);
             $pu = price2num($pu);
-      			$pa_ht=price2num($pa_ht);
+      		$pa_ht=price2num($pa_ht);
             $txtva=price2num($txtva);
             $txlocaltax1=price2num($txlocaltax1);
             $txlocaltax2=price2num($txlocaltax2);
@@ -2220,6 +2225,7 @@ class Commande extends CommonOrder
             }
 
             $this->line->rowid=$rowid;
+            $this->line->label=$label;
             $this->line->desc=$desc;
             $this->line->qty=$qty;
             $this->line->tva_tx=$txtva;
@@ -2239,9 +2245,9 @@ class Commande extends CommonOrder
             $this->line->fk_parent_line=$fk_parent_line;
             $this->line->skip_update_total=$skip_update_total;
 
-						// infos marge
-			      $this->line->fk_fournprice = $fk_fournprice;
-						$this->line->pa_ht = $pa_ht;
+			// infos marge
+			$this->line->fk_fournprice = $fk_fournprice;
+			$this->line->pa_ht = $pa_ht;
 
             // TODO deprecated
             $this->line->price=$price;
@@ -2741,7 +2747,7 @@ class Commande extends CommonOrder
     {
         $lines = array();
 
-        $sql = 'SELECT l.rowid, l.fk_product, l.product_type, l.description, l.price, l.qty, l.tva_tx, ';
+        $sql = 'SELECT l.rowid, l.fk_product, l.product_type, l.label as custom_label, l.description, l.price, l.qty, l.tva_tx, ';
         $sql.= ' l.fk_remise_except, l.remise_percent, l.subprice, l.info_bits, l.rang, l.special_code, l.fk_parent_line,';
         $sql.= ' l.total_ht, l.total_tva, l.total_ttc, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.localtax1_tx, l.localtax2_tx,';
         $sql.= ' l.date_start, l.date_end,';
@@ -2763,6 +2769,7 @@ class Commande extends CommonOrder
                 $obj = $this->db->fetch_object($resql);
 
                 $this->lines[$i]->id				= $obj->rowid;
+                $this->lines[$i]->label 			= $obj->custom_label;
                 $this->lines[$i]->description 		= $obj->description;
                 $this->lines[$i]->fk_product		= $obj->fk_product;
                 $this->lines[$i]->ref				= $obj->ref;
@@ -2788,7 +2795,7 @@ class Commande extends CommonOrder
 				$marginInfos						= getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
 				$this->lines[$i]->pa_ht				= $marginInfos[0];
 				$this->lines[$i]->marge_tx			= $marginInfos[1];
-				 $this->lines[$i]->marque_tx		= $marginInfos[2];
+				$this->lines[$i]->marque_tx			= $marginInfos[2];
 
                 $i++;
             }
@@ -2823,6 +2830,7 @@ class OrderLine
     var $rowid;
     var $fk_parent_line;
     var $fk_facture;
+    var $label;
     var $desc;          	// Description ligne
     var $fk_product;		// Id produit predefini
     var $product_type = 0;	// Type 0 = product, 1 = Service
@@ -2851,8 +2859,10 @@ class OrderLine
     var $price;
 
     // From llx_product
-    var $ref;				// Reference produit
-    var $product_libelle; 	// Label produit
+    var $ref;				// deprecated
+    var $libelle;			// deprecated
+    var $product_ref;
+    var $product_label; 	// Label produit
     var $product_desc;  	// Description produit
 
     // Added by Matelli (See http://matelli.fr/showcases/patchs-dolibarr/add-dates-in-order-lines.html)
@@ -2881,7 +2891,7 @@ class OrderLine
      */
     function fetch($rowid)
     {
-        $sql = 'SELECT cd.rowid, cd.fk_commande, cd.fk_parent_line, cd.fk_product, cd.product_type, cd.description, cd.price, cd.qty, cd.tva_tx, cd.localtax1_tx, cd.localtax2_tx,';
+        $sql = 'SELECT cd.rowid, cd.fk_commande, cd.fk_parent_line, cd.fk_product, cd.product_type, cd.label as custom_label, cd.description, cd.price, cd.qty, cd.tva_tx, cd.localtax1_tx, cd.localtax2_tx,';
         $sql.= ' cd.remise, cd.remise_percent, cd.fk_remise_except, cd.subprice,';
         $sql.= ' cd.info_bits, cd.total_ht, cd.total_tva, cd.total_localtax1, cd.total_localtax2, cd.total_ttc, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht, cd.rang, cd.special_code,';
         $sql.= ' p.ref as product_ref, p.label as product_libelle, p.description as product_desc,';
@@ -2896,6 +2906,7 @@ class OrderLine
             $this->rowid            = $objp->rowid;
             $this->fk_commande      = $objp->fk_commande;
             $this->fk_parent_line   = $objp->fk_parent_line;
+            $this->label            = $objp->custom_label;
             $this->desc             = $objp->description;
             $this->qty              = $objp->qty;
             $this->price            = $objp->price;
@@ -2914,11 +2925,11 @@ class OrderLine
             $this->total_localtax1  = $objp->total_localtax1;
             $this->total_localtax2  = $objp->total_localtax2;
             $this->total_ttc        = $objp->total_ttc;
-						$this->fk_fournprice = $objp->fk_fournprice;
-						$marginInfos = getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
-				    $this->pa_ht = $marginInfos[0];
-						$this->marge_tx			= $marginInfos[1];
-						$this->marque_tx			= $marginInfos[2];
+			$this->fk_fournprice	= $objp->fk_fournprice;
+			$marginInfos			= getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
+			$this->pa_ht			= $marginInfos[0];
+			$this->marge_tx			= $marginInfos[1];
+			$this->marque_tx		= $marginInfos[2];
             $this->special_code		= $objp->special_code;
             $this->rang             = $objp->rang;
 
@@ -3015,12 +3026,13 @@ class OrderLine
 
         // Insertion dans base de la ligne
         $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'commandedet';
-        $sql.= ' (fk_commande, fk_parent_line, description, qty, tva_tx, localtax1_tx, localtax2_tx,';
+        $sql.= ' (fk_commande, fk_parent_line, label, description, qty, tva_tx, localtax1_tx, localtax2_tx,';
         $sql.= ' fk_product, product_type, remise_percent, subprice, price, remise, fk_remise_except,';
         $sql.= ' special_code, rang, fk_product_fournisseur_price, buy_price_ht,';
         $sql.= ' info_bits, total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, date_start, date_end)';
         $sql.= " VALUES (".$this->fk_commande.",";
         $sql.= " ".($this->fk_parent_line>0?"'".$this->fk_parent_line."'":"null").",";
+        $sql.= " ".(! empty($this->label)?"'".$this->db->escape($this->label)."'":"null").",";
         $sql.= " '".$this->db->escape($this->desc)."',";
         $sql.= " '".price2num($this->qty)."',";
         $sql.= " '".price2num($this->tva_tx)."',";
@@ -3114,6 +3126,9 @@ class OrderLine
 		// Mise a jour ligne en base
 		$sql = "UPDATE ".MAIN_DB_PREFIX."commandedet SET";
 		$sql.= " description='".$this->db->escape($this->desc)."'";
+		if (empty($this->label)) {
+			$sql.= " , label='".$this->db->escape($this->label)."'";
+		}
 		$sql.= " , tva_tx=".price2num($this->tva_tx);
 		$sql.= " , localtax1_tx=".price2num($this->localtax1_tx);
 		$sql.= " , localtax2_tx=".price2num($this->localtax2_tx);
diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php
index b76be6a5d796535c0e9abb8ea4b26bfa6bfce72a..a5ed509a7e60c53b537bd1984d2834c25fa9951c 100644
--- a/htdocs/commande/fiche.php
+++ b/htdocs/commande/fiche.php
@@ -520,20 +520,22 @@ else if ($action == 'addline' && $user->rights->commande->creer)
 {
 	$langs->load('errors');
 	$error = false;
-var_dump($_POST); exit;
-	if ((GETPOST('np_price') < 0) && (GETPOST('qty') < 0))
+
+	$idprod=GETPOST('idprod', 'int');
+
+	if ((empty($idprod) || GETPOST('update_price')) && (GETPOST('price_ht') < 0) && (GETPOST('qty') < 0))
     {
-        setEventMessage($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPrice'), $langs->transnoentitiesnoconv('Qty')), 'errors');
+        setEventMessage($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPriceHT'), $langs->transnoentitiesnoconv('Qty')), 'errors');
         $error = true;
     }
-	if (! GETPOST('idprod') && GETPOST('type') < 0)
+	if (empty($idprod) && GETPOST('type') < 0)
 	{
 		setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), 'errors');
         $error = true;
 	}
-	if (! GETPOST('idprod') && GETPOST('np_price') == '') // Unit price can be 0 but not ''
+	if (empty($idprod) && (!(GETPOST('price_ht') >= 0) || GETPOST('price_ht') == '')) // Unit price can be 0 but not ''
 	{
-		setEventMessage($langs->trans($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('UnitPrice'))), 'errors');
+		setEventMessage($langs->trans($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('UnitPriceHT'))), 'errors');
         $error = true;
 	}
 	if (! GETPOST('qty') && GETPOST('qty') == '')
@@ -541,16 +543,16 @@ var_dump($_POST); exit;
         setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), 'errors');
         $error = true;
     }
-    if (! GETPOST('idprod') && (GETPOST('np_desc') == '') && (GETPOST('dp_desc') == ''))
+    if (empty($idprod) && ! GETPOST('product_desc'))
     {
         setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Description')), 'errors');
         $error = true;
     }
 
-	if (!$error && GETPOST('qty') && ((GETPOST('np_price') != '' && (GETPOST('np_desc') || GETPOST('dp_desc'))) || GETPOST('idprod')))
+	if (! $error && (GETPOST('qty') >= 0) && (GETPOST('product_desc') || ! empty($idprod)))
 	{
 		// Clean parameters
-		$suffixe = GETPOST('idprod') ? '_predef' : '';
+		$suffixe = (! empty($idprod) ? '_predef' : '');
 		$date_start=dol_mktime(0, 0, 0, GETPOST('date_start'.$suffixe.'month'), GETPOST('date_start'.$suffixe.'day'), GETPOST('date_start'.$suffixe.'year'));
 		$date_end=dol_mktime(0, 0, 0, GETPOST('date_end'.$suffixe.'month'), GETPOST('date_end'.$suffixe.'day'), GETPOST('date_end'.$suffixe.'year'));
 		$price_base_type = 'HT';
@@ -559,15 +561,16 @@ var_dump($_POST); exit;
 		// Ecrase $desc par celui du produit
 		// Ecrase $txtva par celui du produit
 		// Ecrase $base_price_type par celui du produit
-		if (GETPOST('idprod'))
+		if (! empty($idprod))
 		{
 			$prod = new Product($db);
-			$prod->fetch(GETPOST('idprod'));
+			$prod->fetch($idprod);
 
 			$tva_tx = get_default_tva($mysoc,$object->client,$prod->id);
+			$tva_npr = get_default_npr($mysoc,$object->client,$prod->id);
 
 			// multiprix
-			if ($conf->global->PRODUIT_MULTIPRICES && $object->client->price_level)
+			if (! empty($conf->global->PRODUIT_MULTIPRICES) && ! empty($object->client->price_level))
 			{
 				$pu_ht = $prod->multiprices[$object->client->price_level];
 				$pu_ttc = $prod->multiprices_ttc[$object->client->price_level];
@@ -582,6 +585,24 @@ var_dump($_POST); exit;
 				$price_base_type = $prod->price_base_type;
 			}
 
+			// Update if prices fields are defined
+			if (GETPOST('update_price') && (GETPOST('price_ht') || GETPOST('price_ttc')))
+			{
+				$price_ht=price2num(GETPOST('price_ht'), 'MU');
+				$price_ttc=price2num(GETPOST('price_ttc'), 'MU');
+
+				if ($price_base_type == 'TTC' && $price_ttc != $pu_ttc)
+				{
+					$pu_ttc = $price_ttc;
+					$pu_ht = price2num($price_ttc / (1 + ($prod->tva_tx / 100)),'MU');
+				}
+				else if ($price_base_type != 'TTC' && $price_ht != $pu_ht)
+				{
+					$pu_ht = $price_ht;
+					$pu_ttc = price2num($price_ht * (1 + ($prod->tva_tx / 100)),'MU');
+				}
+			}
+
 			// On reevalue prix selon taux tva car taux tva transaction peut etre different
 			// de ceux du produit par defaut (par exemple si pays different entre vendeur et acheteur).
 			if ($tva_tx != $prod->tva_tx)
@@ -596,39 +617,54 @@ var_dump($_POST); exit;
 				}
 			}
 
-			// Define output language
-			if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE))
-			{
-				$outputlangs = $langs;
-				$newlang='';
-				if (empty($newlang) && GETPOST('lang_id')) $newlang=GETPOST('lang_id');
-				if (empty($newlang)) $newlang=$object->client->default_lang;
-				if (! empty($newlang))
-				{
-					$outputlangs = new Translate("",$conf);
-					$outputlangs->setDefaultLang($newlang);
-				}
+			if (GETPOST('update_desc')) {
+
+				$desc = (GETPOST('product_desc')?GETPOST('product_desc'):'');
+
+			} else {
+
+				// Define output language
+				if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE))
+				{
+					$outputlangs = $langs;
+					$newlang='';
+					if (empty($newlang) && GETPOST('lang_id')) $newlang=GETPOST('lang_id');
+					if (empty($newlang)) $newlang=$object->client->default_lang;
+					if (! empty($newlang))
+					{
+						$outputlangs = new Translate("",$conf);
+						$outputlangs->setDefaultLang($newlang);
+					}
+
+					$desc = (! empty($prod->multilangs[$outputlangs->defaultlang]["description"])) ? $prod->multilangs[$outputlangs->defaultlang]["description"] : $prod->description;
+				}
+				else
+				{
+					$desc = $prod->description;
+				}
+
+				$desc.= ($desc && GETPOST('product_desc')) ? ((dol_textishtml($desc) || dol_textishtml(GETPOST('product_desc')))?"<br />\n":"\n") : "";
+				$desc.= GETPOST('product_desc');
+			}
+
+			$label = ((GETPOST('update_label') && GETPOST('product_label')) ? GETPOST('product_label'):'');
 
-				$desc = (! empty($prod->multilangs[$outputlangs->defaultlang]["description"])) ? $prod->multilangs[$outputlangs->defaultlang]["description"] : $prod->description;
-			}
-			else
-			{
-				$desc = $prod->description;
-			}
-
-			$desc.= ($desc && GETPOST('np_desc')) ? ((dol_textishtml($desc) || dol_textishtml(GETPOST('np_desc')))?"<br />\n":"\n") : "";
-			$desc.= GETPOST('np_desc');
 			$type = $prod->type;
 		}
 		else
 		{
-			$pu_ht=GETPOST('np_price');
-			$tva_tx=str_replace('*','',GETPOST('np_tva_tx'));
-			$tva_npr=preg_match('/\*/',GETPOST('np_tva_tx'))?1:0;
-			$desc=GETPOST('dp_desc');
+			$pu_ht=GETPOST('price_ht');
+			$tva_tx=str_replace('*','',GETPOST('tva_tx'));
+			$tva_npr=preg_match('/\*/',GETPOST('tva_tx'))?1:0;
+			$label=(GETPOST('product_label')?GETPOST('product_label'):'');
+			$desc=GETPOST('product_desc');
 			$type=GETPOST('type');
 		}
 
+		// Margin
+		$fournprice=(GETPOST('fournprice')?GETPOST('fournprice'):'');
+		$buyingprice=(GETPOST('buying_price')?GETPOST('buying_price'):'');
+
 		// Local Taxes
 		$localtax1_tx= get_localtax($tva_tx, 1, $object->client);
 		$localtax2_tx= get_localtax($tva_tx, 2, $object->client);
@@ -638,73 +674,74 @@ var_dump($_POST); exit;
 		$info_bits=0;
 		if ($tva_npr) $info_bits |= 0x01;
 
-		if ($result >= 0)
-		{
-			if($price_min && (price2num($pu_ht)*(1-price2num(GETPOST('remise_percent'))/100) < price2num($price_min)))
-			{
-				//print "CantBeLessThanMinPrice ".$up_ht." - ".GETPOST('remise_percent')." - ".$product->price_min;
-				$mesg = '<div class="error">'.$langs->trans("CantBeLessThanMinPrice",price2num($price_min,'MU').' '.$langs->trans("Currency".$conf->currency)).'</div>' ;
-			}
-			else
-			{
-				// Insert line
-				$result = $object->addline(
-					$object->id,
-					$desc,
-					$pu_ht,
-					GETPOST('qty'),
-					$tva_tx,
-					$localtax1_tx,
-					$localtax2_tx,
-					GETPOST('idprod'),
-					GETPOST('remise_percent'),
-					$info_bits,
+		if (! empty($price_min) && (price2num($pu_ht)*(1-price2num(GETPOST('remise_percent'))/100) < price2num($price_min)))
+		{
+			$mesg = $langs->trans("CantBeLessThanMinPrice",price2num($price_min,'MU').getCurrencySymbol($conf->currency));
+			setEventMessage($mesg, 'errors');
+		}
+		else
+		{
+			// Insert line
+			$result = $object->addline(
+					$object->id,
+					$desc,
+					$pu_ht,
+					GETPOST('qty'),
+					$tva_tx,
+					$localtax1_tx,
+					$localtax2_tx,
+					$idprod,
+					GETPOST('remise_percent'),
+					$info_bits,
+					0,
+					$price_base_type,
+					$pu_ttc,
+					$date_start,
+					$date_end,
+					$type,
+					-1,
 					0,
-					$price_base_type,
-					$pu_ttc,
-					$date_start,
-					$date_end,
-					$type,
-					-1,
-					'',
-					GETPOST('fk_parent_line'),
-					GETPOST('np_fournprice'),
-					GETPOST('np_buying_price')
-				);
-
-				if ($result > 0)
-				{
-					if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
-					{
-						// Define output language
-						$outputlangs = $langs;
-						$newlang=GETPOST('lang_id','alpha');
-						if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang=$object->client->default_lang;
-						if (! empty($newlang))
-						{
-							$outputlangs = new Translate("",$conf);
-							$outputlangs->setDefaultLang($newlang);
-						}
-
-						$ret=$object->fetch($object->id);    // Reload to get new records
-						commande_pdf_create($db, $object, $object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref, $hookmanager);
-					}
-
-					unset($_POST['qty']);
-					unset($_POST['type']);
-					unset($_POST['idprod']);
-					unset($_POST['remise_percent']);
-					unset($_POST['dp_desc']);
-					unset($_POST['np_desc']);
-					unset($_POST['np_price']);
-					unset($_POST['np_tva_tx']);
-					unset($_POST['np_buying_price']);
-				}
-				else
-				{
-					setEventMessage($object->error, 'errors');
-				}
-			}
+					GETPOST('fk_parent_line'),
+					$fournprice,
+					$buyingprice,
+					$label
+			);
+
+			if ($result > 0)
+			{
+				if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
+				{
+					// Define output language
+					$outputlangs = $langs;
+					$newlang=GETPOST('lang_id','alpha');
+					if (! empty($conf->global->MAIN_MULTILANGS) && empty($newlang)) $newlang=$object->client->default_lang;
+					if (! empty($newlang))
+					{
+						$outputlangs = new Translate("",$conf);
+						$outputlangs->setDefaultLang($newlang);
+					}
+
+					$ret=$object->fetch($object->id);    // Reload to get new records
+					commande_pdf_create($db, $object, $object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref, $hookmanager);
+				}
+
+				unset($_POST['qty']);
+				unset($_POST['type']);
+				unset($_POST['idprod']);
+				unset($_POST['remise_percent']);
+				unset($_POST['price_ht']);
+				unset($_POST['price_ttc']);
+				unset($_POST['tva_tx']);
+				unset($_POST['product_ref']);
+				unset($_POST['product_label']);
+				unset($_POST['product_desc']);
+				unset($_POST['fournprice']);
+				unset($_POST['buying_price']);
+			}
+			else
+			{
+				setEventMessage($object->error, 'errors');
+			}
 		}
 	}
 }
diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php
index f1b2b081a64949529d9011b5222fd3d381a45bdb..44c1ee105d5c32161ac668eca183ed5e6fa4b48b 100644
--- a/htdocs/compta/facture.php
+++ b/htdocs/compta/facture.php
@@ -940,35 +940,38 @@ else if ($action == 'add' && $user->rights->facture->creer)
 // Add a new line
 else if (($action == 'addline' || $action == 'addline_predef') && $user->rights->facture->creer)
 {
-    $result=0;
+	$langs->load('errors');
+    $error = false;
 
-    if ($_POST['np_price'] < 0 && $_POST["qty"] < 0)
+    $idprod=GETPOST('idprod', 'int');
+
+    if ((empty($idprod) || GETPOST('update_price')) && (GETPOST('price_ht') < 0) && (GETPOST('qty') < 0))
     {
-    	$langs->load("errors");
-    	$mesgs[]='<div class="error">'.$langs->trans("ErrorBothFieldCantBeNegative",$langs->transnoentitiesnoconv("UnitPriceHT"),$langs->transnoentitiesnoconv("Qty")).'</div>';
-    	$result = -1 ;
+    	setEventMessage($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPriceHT'), $langs->transnoentitiesnoconv('Qty')), 'errors');
+        $error = true;
     }
-    if (empty($_POST['idprod']) && $_POST["type"] < 0)
+    if (empty($idprod) && GETPOST('type') < 0)
     {
-        $mesgs[]='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Type")).'</div>';
-        $result = -1 ;
+        setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), 'errors');
+        $error = true;
     }
-    if (empty($_POST['idprod']) && (! isset($_POST["np_price"]) || $_POST["np_price"]==''))	// Unit price can be 0 but not ''
+    if (empty($idprod) && (!(GETPOST('price_ht') >= 0) || GETPOST('price_ht') == ''))	// Unit price can be 0 but not ''
     {
-        $mesgs[]='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("UnitPriceHT")).'</div>';
-        $result = -1 ;
+        setEventMessage($langs->trans($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('UnitPriceHT'))), 'errors');
+        $error = true;
     }
-    if (empty($_POST['idprod']) && empty($_POST["np_desc"]) && empty($_POST["dp_desc"]))
+    if (! GETPOST('qty') && GETPOST('qty') == '')
     {
-        $mesgs[]='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Description")).'</div>';
-        $result = -1 ;
+        setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), 'errors');
+        $error = true;
     }
-    if (! isset($_POST['qty']) || $_POST['qty']=='')
+    if (empty($idprod) && ! GETPOST('product_desc'))
     {
-        $mesgs[]='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv('Qty')).'</div>';
-        $result = -1 ;
+        setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Description')), 'errors');
+        $error = true;
     }
-    if ($result >= 0 && ( ($_POST['np_price']!='' && ($_POST['np_desc'] || $_POST['dp_desc'])) || $_POST['idprod'] ) )
+
+    if (! $error && (GETPOST('qty') >= 0) && (GETPOST('product_desc') || ! empty($idprod)))
     {
         $ret=$object->fetch($id);
         if ($ret < 0)
@@ -978,26 +981,26 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights-
         }
         $ret=$object->fetch_thirdparty();
 
-        $suffixe = $_POST['idprod'] ? '_predef' : '';
-        $date_start=dol_mktime($_POST['date_start'.$suffixe.'hour'],$_POST['date_start'.$suffixe.'min'],$_POST['date_start'.$suffixe.'sec'],$_POST['date_start'.$suffixe.'month'],$_POST['date_start'.$suffixe.'day'],$_POST['date_start'.$suffixe.'year']);
-        $date_end=dol_mktime($_POST['date_end'.$suffixe.'hour'],$_POST['date_end'.$suffixe.'min'],$_POST['date_end'.$suffixe.'sec'],$_POST['date_end'.$suffixe.'month'],$_POST['date_end'.$suffixe.'day'],$_POST['date_end'.$suffixe.'year']);
-
+        // Clean parameters
+        $suffixe = (! empty($idprod) ? '_predef' : '');
+        $date_start=dol_mktime(GETPOST('date_start'.$suffixe.'hour'), GETPOST('date_start'.$suffixe.'min'), GETPOST('date_start'.$suffixe.'sec'), GETPOST('date_start'.$suffixe.'month'), GETPOST('date_start'.$suffixe.'day'), GETPOST('date_start'.$suffixe.'year'));
+        $date_end=dol_mktime(GETPOST('date_end'.$suffixe.'hour'), GETPOST('date_end'.$suffixe.'min'), GETPOST('date_end'.$suffixe.'sec'), GETPOST('date_end'.$suffixe.'month'), GETPOST('date_end'.$suffixe.'day'), GETPOST('date_end'.$suffixe.'year'));
         $price_base_type = 'HT';
 
         // Ecrase $pu par celui du produit
         // Ecrase $desc par celui du produit
         // Ecrase $txtva par celui du produit
         // Ecrase $base_price_type par celui du produit
-        if ($_POST['idprod'])
+        if (! empty($idprod))
         {
             $prod = new Product($db);
-            $prod->fetch($_POST['idprod']);
+            $prod->fetch($idprod);
 
             $tva_tx = get_default_tva($mysoc,$object->client,$prod->id);
             $tva_npr = get_default_npr($mysoc,$object->client,$prod->id);
 
             // We define price for product
-            if ($conf->global->PRODUIT_MULTIPRICES && $object->client->price_level)
+            if (! empty($conf->global->PRODUIT_MULTIPRICES) && ! empty($object->client->price_level))
             {
                 $pu_ht = $prod->multiprices[$object->client->price_level];
                 $pu_ttc = $prod->multiprices_ttc[$object->client->price_level];
@@ -1012,6 +1015,24 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights-
                 $price_base_type = $prod->price_base_type;
             }
 
+            // Update if prices fields are defined
+            if (GETPOST('update_price') && (GETPOST('price_ht') || GETPOST('price_ttc')))
+            {
+            	$price_ht=price2num(GETPOST('price_ht'), 'MU');
+            	$price_ttc=price2num(GETPOST('price_ttc'), 'MU');
+
+            	if ($price_base_type == 'TTC' && $price_ttc != $pu_ttc)
+            	{
+            		$pu_ttc = $price_ttc;
+            		$pu_ht = price2num($price_ttc / (1 + ($prod->tva_tx / 100)),'MU');
+            	}
+            	else if ($price_base_type != 'TTC' && $price_ht != $pu_ht)
+            	{
+            		$pu_ht = $price_ht;
+            		$pu_ttc = price2num($price_ht * (1 + ($prod->tva_tx / 100)),'MU');
+            	}
+            }
+
             // On reevalue prix selon taux tva car taux tva transaction peut etre different
             // de ceux du produit par defaut (par exemple si pays different entre vendeur et acheteur).
             if ($tva_tx != $prod->tva_tx)
@@ -1026,28 +1047,36 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights-
                 }
             }
 
-            // Define output language
-			if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE))
-			{
-				$outputlangs = $langs;
-				$newlang='';
-				if (empty($newlang) && GETPOST('lang_id')) $newlang=GETPOST('lang_id');
-				if (empty($newlang)) $newlang=$object->client->default_lang;
-				if (! empty($newlang))
-				{
-					$outputlangs = new Translate("",$conf);
-					$outputlangs->setDefaultLang($newlang);
-				}
-
-				$desc = (! empty($prod->multilangs[$outputlangs->defaultlang]["description"])) ? $prod->multilangs[$outputlangs->defaultlang]["description"] : $prod->description;
-			}
-			else
-			{
-				$desc = $prod->description;
-			}
+            if (GETPOST('update_desc')) {
+
+            	$desc = (GETPOST('product_desc')?GETPOST('product_desc'):'');
+
+            } else {
+
+            	// Define output language
+            	if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE))
+            	{
+            		$outputlangs = $langs;
+            		$newlang='';
+            		if (empty($newlang) && GETPOST('lang_id')) $newlang=GETPOST('lang_id');
+            		if (empty($newlang)) $newlang=$object->client->default_lang;
+            		if (! empty($newlang))
+            		{
+            			$outputlangs = new Translate("",$conf);
+            			$outputlangs->setDefaultLang($newlang);
+            		}
+
+            		$desc = (! empty($prod->multilangs[$outputlangs->defaultlang]["description"])) ? $prod->multilangs[$outputlangs->defaultlang]["description"] : $prod->description;
+            	}
+            	else
+            	{
+            		$desc = $prod->description;
+            	}
+
+            	$desc.= ($desc && GETPOST('product_desc')) ? ((dol_textishtml($desc) || dol_textishtml(GETPOST('product_desc')))?"<br />\n":"\n") : "";
+            	$desc.= GETPOST('product_desc');
+            }
 
-            $desc.= ($desc && $_POST['np_desc']) ? ((dol_textishtml($desc) || dol_textishtml($_POST['np_desc']))?"<br>\n":"\n") : "";
-            $desc.= $_POST['np_desc'];
             if (! empty($prod->customcode) || ! empty($prod->country_code))
             {
                 $tmptxt='(';
@@ -1057,103 +1086,107 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights-
                 $tmptxt.=')';
                 $desc.= (dol_textishtml($desc)?"<br>\n":"\n").$tmptxt;
             }
+
+            $label = ((GETPOST('update_label') && GETPOST('product_label')) ? GETPOST('product_label'):'');
+
             $type = $prod->type;
         }
         else
         {
-            $pu_ht=$_POST['np_price'];
-            $tva_tx=str_replace('*','',$_POST['np_tva_tx']);
-            $tva_npr=preg_match('/\*/',$_POST['np_tva_tx'])?1:0;
-            $desc=$_POST['dp_desc'];
-            $type=$_POST["type"];
+            $pu_ht=GETPOST('price_ht');
+			$tva_tx=str_replace('*','',GETPOST('tva_tx'));
+			$tva_npr=preg_match('/\*/',GETPOST('tva_tx'))?1:0;
+			$label=(GETPOST('product_label')?GETPOST('product_label'):'');
+			$desc=GETPOST('product_desc');
+			$type=GETPOST('type');
         }
 
-        $localtax1_tx=get_localtax($tva_tx,1,$object->client);
-        $localtax2_tx=get_localtax($tva_tx,2,$object->client);
-
-    		// ajout prix achat
-    		$fk_fournprice = $_POST['np_fournprice'];
-    		if ( ! empty($_POST['np_buying_price']) )
-    		  $pa_ht = $_POST['np_buying_price'];
-    		else
-    		  $pa_ht = null;
+        // Margin
+        $fournprice=(GETPOST('fournprice')?GETPOST('fournprice'):'');
+        $buyingprice=(GETPOST('buying_price')?GETPOST('buying_price'):'');
+
+        // Local Taxes
+        $localtax1_tx= get_localtax($tva_tx, 1, $object->client);
+        $localtax2_tx= get_localtax($tva_tx, 2, $object->client);
 
         $info_bits=0;
         if ($tva_npr) $info_bits |= 0x01;
 
-        if ($result >= 0)
-        {
-            if($price_min && (price2num($pu_ht)*(1-price2num($_POST['remise_percent'])/100) < price2num($price_min)))
-            {
-                $object->error = $langs->trans("CantBeLessThanMinPrice",price2num($price_min,'MU').' '.$langs->trans("Currency".$conf->currency));
-                $result = -1 ;
-            }
-            else
-            {
-            	// Insert line
-                $result = $object->addline(
-                    $id,
-                    $desc,
-                    $pu_ht,
-                    $_POST['qty'],
-                    $tva_tx,
-                    $localtax1_tx,
-                    $localtax2_tx,
-                    $_POST['idprod'],
-                    $_POST['remise_percent'],
-                    $date_start,
-                    $date_end,
-                    0,
-                    $info_bits,
-                    '',
-                    $price_base_type,
-                    $pu_ttc,
-                    $type,
-                    -1,
-                    0,
-                    '',
-                    0,
-                    GETPOST('fk_parent_line'),
-                    $fk_fournprice,
-                    $pa_ht
-                );
-            }
-        }
-    }
-
-    if ($result > 0)
-    {
-        // Define output language
-        $outputlangs = $langs;
-        $newlang='';
-        if ($conf->global->MAIN_MULTILANGS && empty($newlang) && ! empty($_REQUEST['lang_id'])) $newlang=$_REQUEST['lang_id'];
-        if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang=$object->client->default_lang;
-        if (! empty($newlang))
-        {
-            $outputlangs = new Translate("",$conf);
-            $outputlangs->setDefaultLang($newlang);
+        if (! empty($price_min) && (price2num($pu_ht)*(1-price2num($_POST['remise_percent'])/100) < price2num($price_min)))
+        {
+        	$mesg = $langs->trans("CantBeLessThanMinPrice",price2num($price_min,'MU').getCurrencySymbol($conf->currency));
+			setEventMessage($mesg, 'errors');
+        }
+        else
+        {
+        	// Insert line
+        	$result = $object->addline(
+        			$id,
+        			$desc,
+        			$pu_ht,
+        			GETPOST('qty'),
+        			$tva_tx,
+        			$localtax1_tx,
+        			$localtax2_tx,
+        			$idprod,
+        			GETPOST('remise_percent'),
+        			$date_start,
+        			$date_end,
+        			0,
+        			$info_bits,
+        			'',
+        			$price_base_type,
+        			$pu_ttc,
+        			$type,
+        			-1,
+        			0,
+        			'',
+        			0,
+        			GETPOST('fk_parent_line'),
+        			$fournprice,
+        			$buyingprice,
+        			$label
+        	);
+
+        	if ($result > 0)
+        	{
+        		if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
+        		{
+        			// Define output language
+        			$outputlangs = $langs;
+        			$newlang=GETPOST('lang_id','alpha');
+        			if (! empty($conf->global->MAIN_MULTILANGS) && empty($newlang)) $newlang=$object->client->default_lang;
+        			if (! empty($newlang))
+        			{
+        				$outputlangs = new Translate("",$conf);
+        				$outputlangs->setDefaultLang($newlang);
+        			}
+
+        			$ret=$object->fetch($id);    // Reload to get new records
+        			facture_pdf_create($db, $object, $object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref, $hookmanager);
+        		}
+
+        		unset($_POST['qty']);
+        		unset($_POST['type']);
+        		unset($_POST['idprod']);
+        		unset($_POST['remise_percent']);
+        		unset($_POST['price_ht']);
+				unset($_POST['price_ttc']);
+				unset($_POST['tva_tx']);
+				unset($_POST['product_ref']);
+				unset($_POST['product_label']);
+				unset($_POST['product_desc']);
+				unset($_POST['fournprice']);
+				unset($_POST['buying_price']);
+        	}
+        	else
+        	{
+        		setEventMessage($object->error, 'errors');
+        	}
+
+        	$action='';
         }
-        if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
-        {
-            $ret=$object->fetch($id);    // Reload to get new records
-            facture_pdf_create($db, $object, $object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref, $hookmanager);
-        }
-        unset($_POST['qty']);
-        unset($_POST['type']);
-        unset($_POST['idprod']);
-        unset($_POST['remise_percent']);
-        unset($_POST['dp_desc']);
-        unset($_POST['np_desc']);
-        unset($_POST['np_price']);
-        unset($_POST['np_tva_tx']);
-				unset($_POST['np_buying_price']);
-    }
-    else
-    {
-        $mesgs[]='<div class="error">'.$object->error.'</div>';
     }
-
-    $action='';
 }
 
 else if ($action == 'updateligne' && $user->rights->facture->creer && $_POST['save'] == $langs->trans('Save'))
@@ -2956,13 +2989,6 @@ else if ($id > 0 || ! empty($ref))
 
             $object->formAddFreeProduct(1,$mysoc,$soc,$hookmanager);
 
-            // Add predefined products/services
-            if ($conf->product->enabled || $conf->service->enabled)
-            {
-                $var=!$var;
-                $object->formAddPredefinedProduct(1,$mysoc,$soc,$hookmanager);
-            }
-
             $parameters=array();
             $reshook=$hookmanager->executeHooks('formAddObject',$parameters,$object,$action);    // Note that $action and $object may have been modified by hook
         }
diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php
index 462ba7d6289bacc49e90cd15c5176ae2872cd4e9..2e2760151bf328f02b3244ff23e59d5c36fa9804 100644
--- a/htdocs/compta/facture/class/facture.class.php
+++ b/htdocs/compta/facture/class/facture.class.php
@@ -363,7 +363,8 @@ class Facture extends CommonInvoice
                             0,
                             $fk_parent_line,
                             $this->lines[$i]->fk_fournprice,
-                            $this->lines[$i]->pa_ht
+                            $this->lines[$i]->pa_ht,
+                        	$this->lines[$i]->label
                         );
                         if ($result < 0)
                         {
@@ -504,7 +505,6 @@ class Facture extends CommonInvoice
             if ($invertdetail)
             {
                 $facture->lines[$i]->subprice  = -$facture->lines[$i]->subprice;
-                //$facture->lines[$i]->price     = -$facture->lines[$i]->price;
                 $facture->lines[$i]->total_ht  = -$facture->lines[$i]->total_ht;
                 $facture->lines[$i]->total_tva = -$facture->lines[$i]->total_tva;
                 $facture->lines[$i]->total_localtax1 = -$facture->lines[$i]->total_localtax1;
@@ -643,8 +643,8 @@ class Facture extends CommonInvoice
             $line = new FactureLigne($this->db);
 
             $line->libelle			= $object->lines[$i]->libelle;
+            $line->label			= $object->lines[$i]->label;
             $line->desc				= $object->lines[$i]->desc;
-            //$line->price			= $object->lines[$i]->price;
             $line->subprice			= $object->lines[$i]->subprice;
             $line->total_ht			= $object->lines[$i]->total_ht;
             $line->total_tva		= $object->lines[$i]->total_tva;
@@ -881,7 +881,7 @@ class Facture extends CommonInvoice
     {
         $this->lines=array();
 
-        $sql = 'SELECT l.rowid, l.fk_product, l.fk_parent_line, l.description, l.product_type, l.price, l.qty, l.tva_tx, ';
+        $sql = 'SELECT l.rowid, l.fk_product, l.fk_parent_line, l.label as custom_label, l.description, l.product_type, l.price, l.qty, l.tva_tx, ';
         $sql.= ' l.localtax1_tx, l.localtax2_tx, l.remise, l.remise_percent, l.fk_remise_except, l.subprice,';
         $sql.= ' l.rang, l.special_code,';
         $sql.= ' l.date_start as date_start, l.date_end as date_end,';
@@ -904,6 +904,7 @@ class Facture extends CommonInvoice
                 $line = new FactureLigne($this->db);
 
                 $line->rowid	        = $objp->rowid;
+                $line->label            = $objp->custom_label;
                 $line->desc             = $objp->description;		// Description line
                 $line->product_type     = $objp->product_type;		// Type of line
                 $line->product_ref      = $objp->product_ref;		// Ref product
@@ -931,11 +932,11 @@ class Facture extends CommonInvoice
                 $line->total_ttc        = $objp->total_ttc;
                 $line->export_compta    = $objp->fk_export_compta;
                 $line->code_ventilation = $objp->fk_code_ventilation;
-								$line->fk_fournprice 		= $objp->fk_fournprice;
-		      			$marginInfos = getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
-		   			    $line->pa_ht 						= $marginInfos[0];
-		    				$line->marge_tx					= $marginInfos[1];
-		     				$line->marque_tx				= $marginInfos[2];
+				$line->fk_fournprice 	= $objp->fk_fournprice;
+		      	$marginInfos			= getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
+		   		$line->pa_ht 			= $marginInfos[0];
+		    	$line->marge_tx			= $marginInfos[1];
+		     	$line->marque_tx		= $marginInfos[2];
                 $line->rang				= $objp->rang;
                 $line->special_code		= $objp->special_code;
                 $line->fk_parent_line	= $objp->fk_parent_line;
@@ -1871,7 +1872,7 @@ class Facture extends CommonInvoice
      * 		@param		int			$pa_ht				Buying price of line
      *    	@return    	int             				<0 if KO, Id of line if OK
      */
-    function addline($facid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $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, $type=0, $rang=-1, $special_code=0, $origin='', $origin_id=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0)
+    function addline($facid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $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, $type=0, $rang=-1, $special_code=0, $origin='', $origin_id=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='')
     {
         dol_syslog(get_class($this)."::Addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva, txlocaltax1=$txlocaltax1, txlocaltax2=$txlocaltax2, 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,type=$type", LOG_DEBUG);
         include_once(DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php');
@@ -1908,7 +1909,7 @@ class Facture extends CommonInvoice
         // Check parameters
         if ($type < 0) return -1;
 
-        if ($this->brouillon)
+        if (! empty($this->brouillon))
         {
             $this->db->begin();
 
@@ -1943,6 +1944,7 @@ class Facture extends CommonInvoice
             // Insert line
             $this->line=new FactureLigne($this->db);
             $this->line->fk_facture=$facid;
+            $this->line->label=$label;
             $this->line->desc=$desc;
             $this->line->qty=            ($this->type==2?abs($qty):$qty);	// For credit note, quantity is always positive and unit price negative
             $this->line->tva_tx=$txtva;
@@ -2025,7 +2027,7 @@ class Facture extends CommonInvoice
      * 		@param		int			$pa_ht				Buying price of line
      *      @return    	int             				< 0 if KO, > 0 if OK
      */
-    function updateline($rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $txtva, $txlocaltax1=0, $txlocaltax2=0, $price_base_type='HT', $info_bits=0, $type=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0)
+    function updateline($rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $txtva, $txlocaltax1=0, $txlocaltax2=0, $price_base_type='HT', $info_bits=0, $type=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0, $label='')
     {
         include_once(DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php');
 
@@ -2089,6 +2091,7 @@ class Facture extends CommonInvoice
 			}
 
             $this->line->rowid				= $rowid;
+            $this->line->label				= $label;
             $this->line->desc				= $desc;
             $this->line->qty=            ($this->type==2?abs($qty):$qty);	// For credit note, quantity is always positive and unit price negative
             $this->line->tva_tx				= $txtva;
@@ -2996,7 +2999,7 @@ class Facture extends CommonInvoice
      */
     function getLinesArray()
     {
-        $sql = 'SELECT l.rowid, l.description, l.fk_product, l.product_type, l.qty, l.tva_tx,';
+        $sql = 'SELECT l.rowid, l.label as custom_label, l.description, l.fk_product, l.product_type, l.qty, l.tva_tx,';
         $sql.= ' l.fk_remise_except, l.localtax1_tx, l.localtax2_tx,';
         $sql.= ' l.remise_percent, l.subprice, l.info_bits, l.rang, l.special_code, l.fk_parent_line,';
         $sql.= ' l.total_ht, l.total_tva, l.total_ttc, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht,';
@@ -3019,6 +3022,7 @@ class Facture extends CommonInvoice
                 $obj = $this->db->fetch_object($resql);
 
                 $this->lines[$i]->id				= $obj->rowid;
+                $this->lines[$i]->label 			= $obj->custom_label;
                 $this->lines[$i]->description 		= $obj->description;
                 $this->lines[$i]->fk_product		= $obj->fk_product;
                 $this->lines[$i]->ref				= $obj->product_ref;
@@ -3044,7 +3048,7 @@ class Facture extends CommonInvoice
 				$marginInfos						= getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
 				$this->lines[$i]->pa_ht				= $marginInfos[0];
 				$this->lines[$i]->marge_tx			= $marginInfos[1];
-				 $this->lines[$i]->marque_tx		= $marginInfos[2];
+				$this->lines[$i]->marque_tx			= $marginInfos[2];
 
                 $i++;
             }
@@ -3082,6 +3086,7 @@ class FactureLigne
     var $fk_facture;
     //! Id parent line
     var $fk_parent_line;
+    var $label;
     //! Description ligne
     var $desc;
     var $fk_product;		// Id of predefined product
@@ -3160,7 +3165,7 @@ class FactureLigne
      */
     function fetch($rowid)
     {
-        $sql = 'SELECT fd.rowid, fd.fk_facture, fd.fk_parent_line, fd.fk_product, fd.product_type, fd.description, fd.price, fd.qty, fd.tva_tx,';
+        $sql = 'SELECT fd.rowid, fd.fk_facture, fd.fk_parent_line, fd.fk_product, fd.product_type, fd.label as custom_label, fd.description, fd.price, fd.qty, fd.tva_tx,';
         $sql.= ' fd.localtax1_tx, fd. localtax2_tx, fd.remise, fd.remise_percent, fd.fk_remise_except, fd.subprice,';
         $sql.= ' fd.date_start as date_start, fd.date_end as date_end, fd.fk_product_fournisseur_price as fk_fournprice, fd.buy_price_ht as pa_ht,';
         $sql.= ' fd.info_bits, fd.total_ht, fd.total_tva, fd.total_ttc, fd.total_localtax1, fd.total_localtax2, fd.rang,';
@@ -3178,6 +3183,7 @@ class FactureLigne
             $this->rowid				= $objp->rowid;
             $this->fk_facture			= $objp->fk_facture;
             $this->fk_parent_line		= $objp->fk_parent_line;
+            $this->label				= $objp->label;
             $this->desc					= $objp->description;
             $this->qty					= $objp->qty;
             $this->subprice				= $objp->subprice;
@@ -3199,15 +3205,11 @@ class FactureLigne
             $this->fk_code_ventilation	= $objp->fk_code_ventilation;
             $this->fk_export_compta		= $objp->fk_export_compta;
             $this->rang					= $objp->rang;
-						$this->fk_fournprice = $objp->fk_fournprice;
-						$marginInfos = getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
-				    $this->pa_ht = $marginInfos[0];
-						$this->marge_tx			= $marginInfos[1];
-						$this->marque_tx			= $marginInfos[2];
-
-            // Ne plus utiliser
-            //$this->price				= $objp->price;
-            //$this->remise				= $objp->remise;
+			$this->fk_fournprice		= $objp->fk_fournprice;
+			$marginInfos				= getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
+			$this->pa_ht				= $marginInfos[0];
+			$this->marge_tx				= $marginInfos[1];
+			$this->marque_tx			= $marginInfos[2];
 
             $this->ref					= $objp->product_ref;      // deprecated
             $this->product_ref			= $objp->product_ref;
@@ -3245,11 +3247,9 @@ class FactureLigne
         if (empty($this->total_localtax1)) $this->total_localtax1=0;
         if (empty($this->total_localtax2)) $this->total_localtax2=0;
         if (empty($this->rang)) $this->rang=0;
-        //if (empty($this->remise)) $this->remise=0;
         if (empty($this->remise_percent)) $this->remise_percent=0;
         if (empty($this->info_bits)) $this->info_bits=0;
         if (empty($this->subprice)) $this->subprice=0;
-        //if (empty($this->price))    $this->price=0;
         if (empty($this->special_code)) $this->special_code=0;
         if (empty($this->fk_parent_line)) $this->fk_parent_line=0;
 
@@ -3268,13 +3268,14 @@ class FactureLigne
 
         // Insertion dans base de la ligne
         $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facturedet';
-        $sql.= ' (fk_facture, fk_parent_line, description, qty, tva_tx, localtax1_tx, localtax2_tx,';
+        $sql.= ' (fk_facture, fk_parent_line, label, description, qty, tva_tx, localtax1_tx, localtax2_tx,';
         $sql.= ' fk_product, product_type, remise_percent, subprice, fk_remise_except,';
         $sql.= ' date_start, date_end, fk_code_ventilation, fk_export_compta, ';
         $sql.= ' rang, special_code, fk_product_fournisseur_price, buy_price_ht,';
         $sql.= ' info_bits, total_ht, total_tva, total_ttc, total_localtax1, total_localtax2)';
         $sql.= " VALUES (".$this->fk_facture.",";
         $sql.= " ".($this->fk_parent_line>0?"'".$this->fk_parent_line."'":"null").",";
+        $sql.= " ".(! empty($this->label)?"'".$this->db->escape($this->label)."'":"null").",";
         $sql.= " '".$this->db->escape($this->desc)."',";
         $sql.= " ".price2num($this->qty).",";
         $sql.= " ".price2num($this->tva_tx).",";
@@ -3398,7 +3399,6 @@ class FactureLigne
 		if (empty($this->localtax2_tx)) $this->localtax2_tx=0;
 		if (empty($this->total_localtax1)) $this->total_localtax1=0;
 		if (empty($this->total_localtax2)) $this->total_localtax2=0;
-		//if (empty($this->remise)) $this->remise=0;
 		if (empty($this->remise_percent)) $this->remise_percent=0;
 		if (empty($this->info_bits)) $this->info_bits=0;
 		if (empty($this->product_type)) $this->product_type=0;
@@ -3420,9 +3420,10 @@ class FactureLigne
         // Mise a jour ligne en base
         $sql = "UPDATE ".MAIN_DB_PREFIX."facturedet SET";
         $sql.= " description='".$this->db->escape($this->desc)."'";
+        if (! empty($this->label)) {
+        	$sql.= " , label='".$this->db->escape($this->label)."'";
+        }
         $sql.= ",subprice=".price2num($this->subprice)."";
-        //$sql.= ",price=".price2num($this->price)."";
-        //$sql.= ",remise=".price2num($this->remise)."";
         $sql.= ",remise_percent=".price2num($this->remise_percent)."";
         if ($this->fk_remise_except) $sql.= ",fk_remise_except=".$this->fk_remise_except;
         else $sql.= ",fk_remise_except=null";
diff --git a/htdocs/core/tpl/freeproductline_create.tpl.php b/htdocs/core/tpl/freeproductline_create.tpl.php
index 7688f9698288b2a20e04c0ffc24183e0299d8167..23077b3e5b54e7dfc309df59684d8d4b6a2b3d5e 100644
--- a/htdocs/core/tpl/freeproductline_create.tpl.php
+++ b/htdocs/core/tpl/freeproductline_create.tpl.php
@@ -214,6 +214,9 @@ $(document).ready(function() {
 			} else {
 				$('#product_desc').focus();
 			}
+
+	    } else {
+	    	$('#update_desc_checkbox').removeAttr('checked').trigger('change');
 	    }
 	});
 
diff --git a/htdocs/install/mysql/migration/3.2.0-3.3.0.sql b/htdocs/install/mysql/migration/3.2.0-3.3.0.sql
index 3685e5a56e370d2795b2318727fd5f7c773ab77a..404e036f866bb8a3d157737cf23ad3fc4d19ab88 100755
--- a/htdocs/install/mysql/migration/3.2.0-3.3.0.sql
+++ b/htdocs/install/mysql/migration/3.2.0-3.3.0.sql
@@ -73,4 +73,5 @@ INSERT INTO llx_const (name, value, type, note, visible) values ('PRODUCT_CODEPR
 ALTER TABLE llx_c_barcode_type ADD UNIQUE INDEX uk_c_barcode_type(code, entity);
 
 ALTER TABLE llx_propaldet ADD COLUMN label varchar(255) DEFAULT NULL AFTER fk_product;
-
+ALTER TABLE llx_commandedet ADD COLUMN label varchar(255) DEFAULT NULL AFTER fk_product;
+ALTER TABLE llx_facturedet ADD COLUMN label varchar(255) DEFAULT NULL AFTER fk_product;
diff --git a/htdocs/install/mysql/tables/llx_commandedet.sql b/htdocs/install/mysql/tables/llx_commandedet.sql
index 36318a566e72dd0dd801c747587d80dbeda611e0..42a9bb1845d64d0839d9f97f58c7b6d1b2d59121 100644
--- a/htdocs/install/mysql/tables/llx_commandedet.sql
+++ b/htdocs/install/mysql/tables/llx_commandedet.sql
@@ -1,7 +1,8 @@
 -- ===================================================================
--- Copyright (C) 2003      Rodolphe Quiedeville <rodolphe@quiedeville.org>
--- Copyright (C) 2006-2009 Laurent Destailleur  <eldy@users.sourceforge.net>
--- Copyright (C) 2010      Juanjo Menent        <jmenent@2byte.es>
+-- Copyright (C) 2003		Rodolphe Quiedeville	<rodolphe@quiedeville.org>
+-- Copyright (C) 2005-2012	Regis Houssin			<regis@dolibarr.fr>
+-- Copyright (C) 2006-2009	Laurent Destailleur		<eldy@users.sourceforge.net>
+-- Copyright (C) 2010		Juanjo Menent			<jmenent@2byte.es>
 --
 -- 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
@@ -20,34 +21,36 @@
 
 create table llx_commandedet
 (
-  rowid              integer AUTO_INCREMENT PRIMARY KEY,
-  fk_commande        integer	NOT NULL,
-  fk_parent_line	 integer	NULL,
-  fk_product         integer	NULL,
-  description        text,
-  tva_tx             double(6,3),	                  -- vat rate
-  localtax1_tx       double(6,3),                     -- localtax1 rate
-  localtax2_tx       double(6,3),                     -- localtax2 rate
-  qty                real,                            -- quantity
-  remise_percent     real         DEFAULT 0,          -- pourcentage de remise
-  remise             real         DEFAULT 0,          -- montant de la remise
-  fk_remise_except   integer      NULL,               -- Lien vers table des remises fixes
-  price              real,                            -- prix final
-  subprice           double(24,8) DEFAULT 0,          -- prix unitaire
-  total_ht           double(24,8) DEFAULT 0,          -- Total HT de la ligne toute quantite et incluant remise ligne et globale
-  total_tva          double(24,8) DEFAULT 0,          -- Total TVA de la ligne toute quantite et incluant remise ligne et globale
-  total_localtax1    double(24,8) DEFAULT 0,          -- Total LocalTax1 
-  total_localtax2    double(24,8) DEFAULT 0,          -- Total LocalTax2
-  total_ttc          double(24,8) DEFAULT 0,          -- Total TTC de la ligne toute quantite et incluant remise ligne et globale
-  product_type		 integer      DEFAULT 0,
-  date_start         datetime     DEFAULT NULL,       -- date debut si service
-  date_end           datetime     DEFAULT NULL,       -- date fin si service
-  info_bits          integer      DEFAULT 0,          -- TVA NPR ou non
-  buy_price_ht      double(24,8) DEFAULT 0,          -- prix d'achat HT
-	fk_product_fournisseur_price     int(11)      DEFAULT NULL,       -- r�f�rence prix fournisseur
-  special_code       integer UNSIGNED DEFAULT 0,      -- code pour les lignes speciales
-  rang               integer      DEFAULT 0,
-  import_key         varchar(14)
+  rowid							integer AUTO_INCREMENT PRIMARY KEY,
+  fk_commande					integer	NOT NULL,
+  fk_parent_line				integer	NULL,
+  fk_product					integer	NULL,
+  label							varchar(255) DEFAULT NULL,
+  description					text,
+  tva_tx						double(6,3),	                 -- vat rate
+  localtax1_tx					double(6,3),                     -- localtax1 rate
+  localtax2_tx					double(6,3),                     -- localtax2 rate
+  qty							real,                            -- quantity
+  remise_percent				real         DEFAULT 0,          -- pourcentage de remise
+  remise						real         DEFAULT 0,          -- montant de la remise
+  fk_remise_except				integer      NULL,               -- Lien vers table des remises fixes
+  price							real,                            -- prix final
+  subprice						double(24,8) DEFAULT 0,          -- prix unitaire
+  total_ht						double(24,8) DEFAULT 0,          -- Total HT de la ligne toute quantite et incluant remise ligne et globale
+  total_tva						double(24,8) DEFAULT 0,          -- Total TVA de la ligne toute quantite et incluant remise ligne et globale
+  total_localtax1				double(24,8) DEFAULT 0,          -- Total LocalTax1 
+  total_localtax2				double(24,8) DEFAULT 0,          -- Total LocalTax2
+  total_ttc						double(24,8) DEFAULT 0,          -- Total TTC de la ligne toute quantite et incluant remise ligne et globale
+  product_type					integer      DEFAULT 0,
+  date_start					datetime     DEFAULT NULL,       -- date debut si service
+  date_end						datetime     DEFAULT NULL,       -- date fin si service
+  info_bits						integer      DEFAULT 0,          -- TVA NPR ou non
+  buy_price_ht					double(24,8) DEFAULT 0,          -- prix d'achat HT
+  fk_product_fournisseur_price	int(11)      DEFAULT NULL,       -- reference prix fournisseur
+  special_code					integer UNSIGNED DEFAULT 0,      -- code pour les lignes speciales
+  rang							integer      DEFAULT 0,
+  import_key					varchar(14)
+  
 )ENGINE=innodb;
 
 -- 
diff --git a/htdocs/install/mysql/tables/llx_facturedet.sql b/htdocs/install/mysql/tables/llx_facturedet.sql
index f2dba3e600e10d6864ebee52e5084fc86eb9a759..8ccfeb35fb710cb17509458e4e824ffc6aee63d0 100644
--- a/htdocs/install/mysql/tables/llx_facturedet.sql
+++ b/htdocs/install/mysql/tables/llx_facturedet.sql
@@ -1,8 +1,8 @@
 -- ===================================================================
--- Copyright (C) 2001-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
--- Copyright (C) 2004-2005 Laurent Destailleur  <eldy@users.sourceforge.net>
--- Copyright (C) 2005-2010 Regis Houssin        <regis@dolibarr.fr>
--- Copyright (C) 2010      Juanjo Menent        <jmenent@2byte.es>
+-- Copyright (C) 2001-2005	Rodolphe Quiedeville	<rodolphe@quiedeville.org>
+-- Copyright (C) 2004-2005	Laurent Destailleur		<eldy@users.sourceforge.net>
+-- Copyright (C) 2005-2012	Regis Houssin			<regis@dolibarr.fr>
+-- Copyright (C) 2010		Juanjo Menent			<jmenent@2byte.es>
 --
 -- 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
@@ -22,36 +22,38 @@
 
 create table llx_facturedet
 (
-  rowid               integer    AUTO_INCREMENT PRIMARY KEY,
-  fk_facture          integer    NOT NULL,
-  fk_parent_line	  integer	 NULL,
-  fk_product          integer    NULL,					-- Doit pouvoir etre nul pour ligne detail sans produits
-  description         text,
-  tva_tx              double(6,3),								-- Taux tva produit/service (exemple 19.6)
-  localtax1_tx        double(6,3) 		 DEFAULT 0,    			-- tax local tax 1
-  localtax2_tx	      double(6,3) 		 DEFAULT 0,    			-- tax local tax 2
-  qty                 real,								-- Quantity (exemple 2)
-  remise_percent      real       DEFAULT 0,				-- % de la remise ligne (exemple 20%)
-  remise              real       DEFAULT 0,				-- Montant calcule de la remise % sur PU HT (exemple 20)
-  fk_remise_except    integer    NULL,					-- Lien vers table des remises fixes
-  subprice            double(24,8),								-- P.U. HT (exemple 100)
-  price               double(24,8),								-- P.U. HT apres remise % de ligne
-  total_ht            double(24,8),								-- Total HT de la ligne toute quantite et incluant remise ligne et globale
-  total_tva           double(24,8),								-- Total TVA de la ligne toute quantite et incluant remise ligne et globale
-  total_localtax1     double(24,8)  	 DEFAULT 0,				-- Total LocalTax1 for total quantity of line
-  total_localtax2     double(24,8)		 DEFAULT 0,				-- total LocalTax2 for total quantity of line
-  total_ttc           double(24,8),								-- Total TTC de la ligne toute quantite et incluant remise ligne et globale
-  product_type		  integer    DEFAULT 0,
-  date_start          datetime   DEFAULT NULL,			-- date debut si service
-  date_end            datetime   DEFAULT NULL,			-- date fin si service
-  info_bits		      integer    DEFAULT 0,				-- TVA NPR ou non
-  buy_price_ht      double(24,8) DEFAULT 0,          -- prix d'achat HT
-	fk_product_fournisseur_price     int(11)      DEFAULT NULL,       -- r�f�rence prix fournisseur
-  fk_code_ventilation integer    DEFAULT 0 NOT NULL,
-  fk_export_compta    integer    DEFAULT 0 NOT NULL,
-  special_code        integer UNSIGNED DEFAULT 0,		-- code pour les lignes speciales
-  rang                integer    DEFAULT 0,				-- ordre d'affichage
-  import_key          varchar(14)
+  rowid							integer    AUTO_INCREMENT PRIMARY KEY,
+  fk_facture					integer    NOT NULL,
+  fk_parent_line				integer	 NULL,
+  fk_product					integer    NULL,					-- Doit pouvoir etre nul pour ligne detail sans produits
+  label							varchar(255) DEFAULT NULL,
+  description					text,
+  tva_tx						double(6,3),						-- Taux tva produit/service (exemple 19.6)
+  localtax1_tx					double(6,3) 		 DEFAULT 0,		-- tax local tax 1
+  localtax2_tx					double(6,3) 		 DEFAULT 0,		-- tax local tax 2
+  qty							real,								-- Quantity (exemple 2)
+  remise_percent				real       DEFAULT 0,				-- % de la remise ligne (exemple 20%)
+  remise						real       DEFAULT 0,				-- Montant calcule de la remise % sur PU HT (exemple 20)
+  fk_remise_except				integer    NULL,					-- Lien vers table des remises fixes
+  subprice						double(24,8),						-- P.U. HT (exemple 100)
+  price							double(24,8),						-- P.U. HT apres remise % de ligne
+  total_ht						double(24,8),						-- Total HT de la ligne toute quantite et incluant remise ligne et globale
+  total_tva						double(24,8),						-- Total TVA de la ligne toute quantite et incluant remise ligne et globale
+  total_localtax1				double(24,8)  	 DEFAULT 0,			-- Total LocalTax1 for total quantity of line
+  total_localtax2				double(24,8)		 DEFAULT 0,		-- total LocalTax2 for total quantity of line
+  total_ttc						double(24,8),						-- Total TTC de la ligne toute quantite et incluant remise ligne et globale
+  product_type					integer    DEFAULT 0,
+  date_start					datetime   DEFAULT NULL,			-- date debut si service
+  date_end						datetime   DEFAULT NULL,			-- date fin si service
+  info_bits						integer    DEFAULT 0,				-- TVA NPR ou non
+  buy_price_ht					double(24,8) DEFAULT 0,				-- prix d'achat HT
+  fk_product_fournisseur_price	int(11)      DEFAULT NULL,			-- reference prix fournisseur
+  fk_code_ventilation			integer    DEFAULT 0 NOT NULL,
+  fk_export_compta				integer    DEFAULT 0 NOT NULL,
+  special_code					integer UNSIGNED DEFAULT 0,			-- code pour les lignes speciales
+  rang							integer    DEFAULT 0,				-- ordre d'affichage
+  import_key					varchar(14)
+  
 )ENGINE=innodb;
 
 --