diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php
index e0c3c00adad36a423247876fc46677fc6ff7aff6..f5ea791a02d5bec7328ce00c9712cc89fc91f293 100644
--- a/htdocs/commande/class/commande.class.php
+++ b/htdocs/commande/class/commande.class.php
@@ -1863,9 +1863,9 @@ class Commande extends CommonOrder
 
     /**
      *	Load array this->expeditions of lines of shipments with nb of products sent for each order line
-     *  Note: For a dedicated shipment, the fetch_lines load the qty_asked and qty_shipped. This function return qty_shipped cuulated for order
+     *  Note: For a dedicated shipment, the fetch_lines can be used to load the qty_asked and qty_shipped. This function is use to return qty_shipped cumulated for the order
      *   
-     *	@param      int		$filtre_statut      Filter on status
+     *	@param      int		$filtre_statut      Filter on shipment status
      * 	@return     int                			<0 if KO, Nb of lines found if OK
      */
     function loadExpeditions($filtre_statut=-1)
@@ -1934,21 +1934,6 @@ class Commande extends CommonOrder
         else dol_print_error($this->db);
     }
 
-    /**
-     *	Return a array with sendings by line
-     *
-     *	@param      int		$filtre_statut      Filtre sur statut
-     *	@return     int                 		0 si OK, <0 si KO
-     *
-     *	TODO  deprecate, move to Shipping class
-     */
-    function livraison_array($filtre_statut=self::STATUS_CANCELED)
-    {
-        $delivery = new Livraison($this->db);
-        $deliveryArray = $delivery->livraison_array($filtre_statut);
-        return $deliveryArray;
-    }
-
     /**
      *	Return a array with the pending stock by product
      *
diff --git a/htdocs/compta/sociales/index.php b/htdocs/compta/sociales/index.php
index 584d4ecfc7d58eb3ae9888937f0fd74cb788dd84..b673a5064ed9ca1f6fee37c382043c7656f29251 100644
--- a/htdocs/compta/sociales/index.php
+++ b/htdocs/compta/sociales/index.php
@@ -69,7 +69,7 @@ else
 	$typeid=$_REQUEST['typeid'];
 }
 
-if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers
+if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // All test are required to be compatible with all browsers
 {
 	$search_ref="";
 	$search_label="";
@@ -211,6 +211,8 @@ if ($resql)
         print '</td>';
 		print "</tr>\n";
 
+		$i=0;
+		$totalarray=array();
 		while ($i < min($num,$limit))
 		{
 			$obj = $db->fetch_object($resql);
@@ -244,8 +246,12 @@ if ($resql)
 			}
 			print '</td>';
 
+			// Amount
 			print '<td align="right" width="100">'.price($obj->amount).'</td>';
-
+			if (! $i) $totalarray['nbfield']++;
+		    if (! $i) $totalarray['totalttcfield']=$totalarray['nbfield'];
+			$totalarray['totalttc'] += $obj->amount;
+			
 			// Due date
 			print '<td width="110" align="center">'.dol_print_date($db->jdate($obj->date_ech), 'day').'</td>';
 
@@ -257,6 +263,22 @@ if ($resql)
 			$i++;
 		}
 
+		// Show total line
+		if (isset($totalarray['totalttcfield']))
+		{
+		    print '<tr class="liste_total">';
+            if ($num < $limit) print '<td align="left">'.$langs->trans("Total").'</td>';
+            else print '<td align="left">'.$langs->trans("Totalforthispage").'</td>';
+            print '<td></td>';
+            print '<td></td>';
+            print '<td></td>';
+            print '<td align="right">'.price($totalarray['totalttc']).'</td>';
+	        print '<td></td>';
+	        print '<td></td>';
+	        print '<td></td>';
+	        print '</tr>';
+		}
+		
 		print '</table>';
 	}
 	print '</form>';
diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php
index 1e29a2a36f67642486bee3435b873b100ffe3ed8..ca6abb40e5c2055046271d4302742314b6d30774 100644
--- a/htdocs/expedition/class/expedition.class.php
+++ b/htdocs/expedition/class/expedition.class.php
@@ -93,6 +93,13 @@ class Expedition extends CommonObject
 	var $meths;
 	var $listmeths;			// List of carriers
 
+	
+	const STATUS_DRAFT = 0;
+	const STATUS_VALIDATED = 1;
+	const STATUS_CLOSED = 2;
+	
+	
+	
 	/**
 	 *	Constructor
 	 *
@@ -1794,9 +1801,9 @@ class Expedition extends CommonObject
 	}
 
 	/**
-	 *	Classify the shipping as closed
+	 *	Classify the shipping as closed.
 	 *
-	 *	@return     int     <0 if ko, >0 if ok
+	 *	@return     int     <0 if KO, >0 if OK
 	 */
 	function setClosed()
 	{
@@ -1806,15 +1813,43 @@ class Expedition extends CommonObject
 		
 		$this->db->begin();
 		
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.'expedition SET fk_statut=2';
+		$sql = 'UPDATE '.MAIN_DB_PREFIX.'expedition SET fk_statut='.self::STATUS_CLOSED;
 		$sql .= ' WHERE rowid = '.$this->id.' AND fk_statut > 0';
 
 		$resql=$this->db->query($sql);
 		if ($resql)
 		{
-			// TODO: Add option/checkbox to set order billed if 100% of order is shipped
-			$this->statut=2;
+			// Set order billed if 100% of order is shipped (qty in shipment lines match qty in order lines)
+			if ($this->origin == 'commande' && $this->origin_id > 0)
+			{
+				$order = new Commande($this->db);
+				$order->fetch($this->origin_id);
+				
+				$order->loadExpeditions(self::STATUS_CLOSED);		// Fill $order->expeditions = array(orderlineid => qty)
+				
+				$shipments_match_order = 1;
+				foreach($order->lines as $line)
+				{
+					$lineid = $line->id;
+					$qty = $line->qty;
+					if (($type == 0 || ! empty($conf->global->STOCK_SUPPORTS_SERVICES)) && $order->expeditions[$lineid] != $qty)
+					{
+						$shipments_match_order = 0;
+						$text='Qty for order line id '.$lineid.' is '.$qty.' but in shipments with status Expedition::STATUS_CLOSED='.self::STATUS_CLOSED.', we have '.$order->expeditions[$lineid].' so we can t close order';
+						dol_syslog($text);
+						break;
+					}
+				}
+				if ($shipments_match_order)
+				{
+					dol_syslog("Qty for the ".count($order->lines)." lines of order have same value for shipments with status Expedition::STATUS_CLOSED=".self::STATUS_CLOSED.', so we close order');	
+					$order->cloture($user);
+				}
+			}
+			
+			$this->statut=self::STATUS_CLOSED;
 
+			
 			// If stock increment is done on closing
 			if (! $error && ! empty($conf->stock->enabled) && ! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE))
 			{
@@ -1823,7 +1858,7 @@ class Expedition extends CommonObject
 				$langs->load("agenda");
 	
 				// Loop on each product line to add a stock movement
-				// TODO possibilite d'expedier a partir d'une propale ou autre origine
+				// TODO possibilite d'expedier a partir d'une propale ou autre origine ?
 				$sql = "SELECT cd.fk_product, cd.subprice,";
 				$sql.= " ed.rowid, ed.qty, ed.fk_entrepot,";
 				$sql.= " edb.rowid as edbrowid, edb.eatby, edb.sellby, edb.batch, edb.qty as edbqty, edb.fk_origin_stock";
diff --git a/htdocs/install/mysql/tables/llx_element_lock.sql b/htdocs/install/mysql/tables/llx_element_lock.sql
deleted file mode 100644
index 155deba91699d6f57ba05c82164a3f4e649a0147..0000000000000000000000000000000000000000
--- a/htdocs/install/mysql/tables/llx_element_lock.sql
+++ /dev/null
@@ -1,27 +0,0 @@
--- ============================================================================
--- Copyright (C) 2011 Regis Houssin <regis.houssin@capnetworks.com>
---
--- This program is free software; you can redistribute it and/or modify
--- it under the terms of the GNU General Public License as published by
--- the Free Software Foundation; either version 3 of the License, or
--- (at your option) any later version.
---
--- This program is distributed in the hope that it will be useful,
--- but WITHOUT ANY WARRANTY; without even the implied warranty of
--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--- GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License
--- along with this program. If not, see <http://www.gnu.org/licenses/>.
---
--- ============================================================================
-
-create table llx_element_lock
-(
-	rowid				integer	AUTO_INCREMENT	PRIMARY KEY,
-	fk_element			integer NOT NULL,
-	elementtype			varchar(32) NOT NULL,
-	datel    			datetime,				-- date of lock
-	datem    			datetime,				-- date of unlock/modif
-	sessionid			varchar(255)	
-)ENGINE=innodb;
diff --git a/htdocs/langs/en_US/sendings.lang b/htdocs/langs/en_US/sendings.lang
index 1ec229af6c55c2f206303ff73bafb857f1c43708..c35aa71c8a16ef170b72076fc827f96ab5d84b36 100644
--- a/htdocs/langs/en_US/sendings.lang
+++ b/htdocs/langs/en_US/sendings.lang
@@ -72,6 +72,7 @@ ProductQtyInSuppliersShipmentAlreadyRecevied=Product quantity from opened suppli
 NoProductToShipFoundIntoStock=No product to ship found into warehouse <b>%s</b>. Correct stock or go back to choose another warehouse. 
 WeightVolShort=Weight/Vol.
 ValidateOrderFirstBeforeShipment=You must first validate the order before being able to make shipments.
+CloseShippeOrdersAutomatically=Classify the order "Delivered" if entirely shipped.
 
 # Sending methods
 SendingMethodCATCH=Catch by customer
diff --git a/htdocs/livraison/card.php b/htdocs/livraison/card.php
index 9ae66ee685e05c65f9e552a596896ce3496b448d..7b47c17f5c7c3462b43662edf0a3b11f0d7863f8 100644
--- a/htdocs/livraison/card.php
+++ b/htdocs/livraison/card.php
@@ -300,213 +300,7 @@ $formfile = new FormFile($db);
 if ($action == 'create')    // Seems to no be used
 {
 
-	print load_fiche_titre($langs->trans("CreateADeliveryOrder"));
-
-	if ($mesg)
-	{
-		print $mesg.'<br>';
-	}
-
-	$commande = new Commande($db);
-	$commande->livraison_array();
-
-	if ($commande->fetch(GETPOST("commande_id")))
-	{
-		$soc = new Societe($db);
-		$soc->fetch($commande->socid);
-		$author = new User($db);
-		$author->fetch($commande->user_author_id);
-
-		if (!$conf->expedition_bon->enabled && ! empty($conf->stock->enabled))
-		{
-			$entrepot = new Entrepot($db);
-		}
-
-		/*
-		 *   Commande
-		 */
-		print '<form action="'.$_SERVER['PHP_SELF'].'" method="post">';
-		print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
-		print '<input type="hidden" name="action" value="add">';
-		print '<input type="hidden" name="commande_id" value="'.$commande->id.'">';
-		if (!$conf->expedition_bon->enabled && ! empty($conf->stock->enabled))
-		{
-			print '<input type="hidden" name="entrepot_id" value="'.$_GET["entrepot_id"].'">';
-		}
-		print '<table class="border" width="100%">';
-		print '<tr><td width="20%">'.$langs->trans("Customer").'</td>';
-		print '<td width="30%"><b><a href="'.DOL_URL_ROOT.'/comm/card.php?socid='.$soc->id.'">'.$soc->name.'</a></b></td>';
-
-		print '<td width="50%" colspan="2">';
-
-		print "</td></tr>";
-
-		print "<tr><td>".$langs->trans("Date")."</td>";
-		print "<td>".dol_print_date($commande->date,'dayhourtext')."</td>\n";
-
-		print '<td>'.$langs->trans("Order").'</td><td><a href="'.DOL_URL_ROOT.'/commande/card.php?id='.$commande->id.'">'.img_object($langs->trans("ShowOrder"),'order').' '.$commande->ref.'</a>';
-		print "</td></tr>\n";
-
-		print '<tr>';
-
-		if (!$conf->expedition_bon->enabled && ! empty($conf->stock->enabled))
-		{
-			print '<td>'.$langs->trans("Warehouse").'</td>';
-			print '<td>';
-			$ents = $entrepot->list_array();
-			print '<a href="'.DOL_URL_ROOT.'/product/stock/card.php?id='.$_GET["entrepot_id"].'">'.img_object($langs->trans("ShowWarehouse"),'stock').' '.$ents[$_GET["entrepot_id"]].'</a>';
-			print '</td>';
-		}
-
-		print "<td>".$langs->trans("Author")."</td><td>".$author->getFullName($langs)."</td>\n";
-
-		if ($commande->note)
-		{
-			print '<tr><td colspan="3">Note : '.nl2br($commande->note)."</td></tr>";
-		}
-		print "</table>";
-
-		/*
-		 * Lignes de commandes
-		 */
-		print '<br><table class="noborder" width="100%">';
-
-		$commande->fetch_lines(1);
-		$lines = $commande->lines;
-
-		// Lecture des livraisons deja effectuees
-		$commande->livraison_array();
-
-		$num = count($commande->lines);
-		$i = 0;
-
-		if ($num)
-		{
-			print '<tr class="liste_titre">';
-			print '<td width="54%">'.$langs->trans("Description").'</td>';
-			print '<td align="center">'.$langs->trans("QtyOrdered").'</td>';
-			print '<td align="center">'.$langs->trans("QtyReceived").'</td>';
-			print '<td align="center">'.$langs->trans("QtyToShip").'</td>';
-			if (! empty($conf->stock->enabled))
-			{
-				print '<td width="12%" align="center">'.$langs->trans("Stock").'</td>';
-			}
-			print "</tr>\n";
-		}
-		$var=true;
-		while ($i < $num)
-		{
-			$product = new Product($db);
-
-			$line = $commande->lines[$i];
-			$var=!$var;
-			print "<tr ".$bc[$var].">\n";
-			if ($line->fk_product > 0)
-			{
-				$product->fetch($line->fk_product);
-				$product->load_stock();
-
-				// Define output language
-				if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE))
-				{
-					$commande->fetch_thirdparty();
-					$outputlangs = $langs;
-					$newlang='';
-					if (empty($newlang) && ! empty($_REQUEST['lang_id'])) $newlang=$_REQUEST['lang_id'];
-					if (empty($newlang)) $newlang=$commande->thirdparty->default_lang;
-					if (! empty($newlang))
-					{
-						$outputlangs = new Translate("",$conf);
-						$outputlangs->setDefaultLang($newlang);
-					}
-
-					$label = (! empty($product->multilangs[$outputlangs->defaultlang]["label"])) ? $product->multilangs[$outputlangs->defaultlang]["label"] : $product->label;
-				}
-				else
-					$label = (! empty($line->label)?$line->label:$product->label);
-
-				print '<td>';
-				print '<a href="'.DOL_URL_ROOT.'/product/card.php?id='.$line->fk_product.'">'.img_object($langs->trans("ShowProduct"),"product").' '.$product->ref.'</a> - '.$label;
-				if ($line->description) print nl2br($line->description);
-				print '</td>';
-			}
-			else
-			{
-				print "<td>";
-				if ($line->fk_product_type==1) $text = img_object($langs->trans('Service'),'service');
-				else $text = img_object($langs->trans('Product'),'product');
-
-				if (! empty($line->label)) {
-					$text.= ' <strong>'.$line->label.'</strong>';
-					print $form->textwithtooltip($text,$line->description,3,'','',$i);
-				} else {
-					print $text.' '.nl2br($line->description);
-				}
-
-				print_date_range($lines[$i]->date_start,$lines[$i]->date_end);
-				print "</td>\n";
-			}
-
-			print '<td align="center">'.$line->qty.'</td>';
-			/*
-			 *
-			 */
-			print '<td align="center">';
-			$quantite_livree = $commande->livraisons[$line->id];
-			print $quantite_livree;
-			print '</td>';
-
-			$quantite_commandee = $line->qty;
-			$quantite_a_livrer = $quantite_commandee - $quantite_livree;
-
-			if (! empty($conf->stock->enabled))
-			{
-				$stock = $product->stock_warehouse[$_GET["entrepot_id"]]->real;
-				$stock+=0;  // Convertit en numerique
-
-				// Quantite a livrer
-				print '<td align="center">';
-				print '<input name="idl'.$i.'" type="hidden" value="'.$line->id.'">';
-				print '<input name="qtyl'.$i.'" type="text" size="6" value="'.min($quantite_a_livrer, $stock).'">';
-				print '</td>';
-
-				// Stock
-				if ($stock < $quantite_a_livrer)
-				{
-					print '<td align="center">'.$stock.' '.img_warning().'</td>';
-				}
-				else
-				{
-					print '<td align="center">'.$stock.'</td>';
-				}
-			}
-			else
-			{
-				// Quantite a livrer
-				print '<td align="center">';
-				print '<input name="idl'.$i.'" type="hidden" value="'.$line->id.'">';
-				print '<input name="qtyl'.$i.'" type="text" size="6" value="'.$quantite_a_livrer.'">';
-				print '</td>';
-			}
-
-			print "</tr>\n";
-
-			$i++;
-			$var=!$var;
-		}
-
-		/*
-		 *
-		 */
-
-		print '<tr><td align="center" colspan="4"><br><input type="submit" class="button" value="'.$langs->trans("Create").'"></td></tr>';
-		print "</table>";
-		print '</form>';
-	}
-	else
-	{
-		dol_print_error($db);
-	}
+	
 }
 else
 /* *************************************************************************** */
diff --git a/htdocs/product/composition/card.php b/htdocs/product/composition/card.php
index 913fc40e40b999ebda6ff88b0984b448d619c6a5..15e44f8602dc2c89caec5499605d265e82319aa7 100644
--- a/htdocs/product/composition/card.php
+++ b/htdocs/product/composition/card.php
@@ -116,13 +116,14 @@ if ($action == 'add_prod' && ($user->rights->produit->creer || $user->rights->se
 else if($action==='save_composed_product')
 {
 	$TProduct = GETPOST('TProduct', 'array');
-	if(!empty($TProduct))
+	if (!empty($TProduct))
 	{
 		foreach ($TProduct as $id_product => $row)
 		{
 			if ($row['qty'] > 0) $object->update_sousproduit($id, $id_product, $row['qty'], isset($row['incdec']) ? 1 : 0 );
 			else $object->del_sousproduit($id, $id_product);
 		}
+		setEventMessages('RecordSaved', null);
 	}
 	$action='';
 }
diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php
index 4584c8b8a2f190ea2354102156a67a8f2b1df0c1..ce2ff9740130287d730b233b31da797d6d8a994d 100644
--- a/htdocs/projet/list.php
+++ b/htdocs/projet/list.php
@@ -664,10 +664,11 @@ if ($resql)
         		else print $langs->trans('PrivateProject');
         		print '</td>';
         	}
+        	// Amount
         	if (! empty($arrayfields['p.opp_amount']['checked']))
         	{
     			print '<td align="right">';
-    			if ($obj->opp_status_code) print price($obj->opp_amount, 1, '', 1, -1, -1, $conf->currency);
+    			if ($obj->opp_status_code) print price($obj->opp_amount, 1, '', 1, -1, -1, '');
     			print '</td>';
         	}
         	if (! empty($arrayfields['p.fk_opp_status']['checked']))