diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php
index 8ad8ecd2331e40ccdf03e99d51d2709fd726fc20..02ccd13b97ca5e787cbcc05ee49d159a2271ab89 100644
--- a/htdocs/core/class/commonobject.class.php
+++ b/htdocs/core/class/commonobject.class.php
@@ -2141,7 +2141,8 @@ abstract class CommonObject
         $fieldstatus="fk_statut";
         if ($elementTable == 'user') $fieldstatus="statut";
         if ($elementTable == 'expensereport') $fieldstatus="fk_c_expensereport_statuts";
-
+		if ($elementTable == 'commande_fournisseur_dispatch') $fieldstatus="status";
+        
         $sql = "UPDATE ".MAIN_DB_PREFIX.$elementTable;
         $sql.= " SET ".$fieldstatus." = ".$status;
         // If status = 1 = validated, update also fk_user_valid
diff --git a/htdocs/core/class/html.formorder.class.php b/htdocs/core/class/html.formorder.class.php
index 5ea5b33c1f463aa8cede30c2bd5550a293e95ece..2abc0c3848504220be5bae21168b8102902333db 100644
--- a/htdocs/core/class/html.formorder.class.php
+++ b/htdocs/core/class/html.formorder.class.php
@@ -57,11 +57,11 @@ class FormOrder
     {
         print '<select class="flat" name="'.$hmlname.'">';
         print '<option value="-1">&nbsp;</option>';
-        $statustohow=array(0,1,2,3,4,5,6,9);	// 7 is same label than 6. 8 does not exist.
+        $statustohow=array('0'=>'0','1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6,7','9'=>'9');	// 7 is same label than 6. 8 does not exist.
 
-        foreach($statustohow as $key)
+        foreach($statustohow as $key => $value)
         {
-			print '<option value="'.$key.'"'.($selected == $key?' selected="selected"':'').'>';
+			print '<option value="'.$value.'"'.(($selected == $key || $selected == $value)?' selected="selected"':'').'>';
 			print CommandeFournisseur::LibStatut($key,$short);
 	        print '</option>';
         }
diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php
index a75d97ec25201757319ba0cf4021470ae5209d7d..b9477d0adc858e774cdb3f3e66003c26d345a618 100644
--- a/htdocs/fourn/class/fournisseur.commande.class.php
+++ b/htdocs/fourn/class/fournisseur.commande.class.php
@@ -106,6 +106,8 @@ class CommandeFournisseur extends CommonOrder
      */
     function __construct($db)
     {
+    	global $conf;
+    	
         $this->db = $db;
         $this->products = array();
         $this->lines = array();
@@ -114,7 +116,8 @@ class CommandeFournisseur extends CommonOrder
         $this->statuts[0] = 'StatusOrderDraft';
         $this->statuts[1] = 'StatusOrderValidated';
         $this->statuts[2] = 'StatusOrderApproved';
-        $this->statuts[3] = 'StatusOrderOnProcess';
+        if (empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) $this->statuts[3] = 'StatusOrderOnProcess';
+        else $this->statuts[3] = 'StatusOrderOnProcessWithValidation';
         $this->statuts[4] = 'StatusOrderReceivedPartially';
         $this->statuts[5] = 'StatusOrderReceivedAll';
         $this->statuts[6] = 'StatusOrderCanceled';	// Approved->Canceled
@@ -1618,19 +1621,65 @@ class CommandeFournisseur extends CommonOrder
         }
     }
 
+    
+    /**
+	 * Return array of dispathed lines waiting to be approved for this order
+	 * 
+	 * @param	int		$status		Filter on stats (-1 = no filter, 0 = lines draft to be approved, 1 = approved lines)
+	 * @return	array				Array of lines
+     */
+    function getDispachedLines($status=-1)
+    {
+    	$ret = array();
+    	
+    	// List of already dispatched lines
+		$sql = "SELECT p.ref, p.label,";
+		$sql.= " e.rowid as warehouse_id, e.label as entrepot,";
+		$sql.= " cfd.rowid as dispatchlineid, cfd.fk_product, cfd.qty, cfd.eatby, cfd.sellby, cfd.batch, cfd.comment, cfd.status";
+		$sql.= " FROM ".MAIN_DB_PREFIX."product as p,";
+		$sql.= " ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as cfd";
+		$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."entrepot as e ON cfd.fk_entrepot = e.rowid";
+		$sql.= " WHERE cfd.fk_commande = ".$this->id;
+		$sql.= " AND cfd.fk_product = p.rowid";
+		if ($status >= 0) $sql.=" AND cfd.status = ".$status;
+		$sql.= " ORDER BY cfd.rowid ASC";
+
+		$resql = $this->db->query($sql);
+		if ($resql)
+		{
+			$num = $this->db->num_rows($resql);
+			$i = 0;
+
+			while ($i < $num)
+			{
+				$objp = $this->db->fetch_object($resql);
+				if ($objp) $ret[]=array('id'=>$objp->dispatchedlineid, 'productid'=>$objp->fk_product, 'warehouseid'=>$objp->warehouse_id);
+				
+				$i++;
+			}
+		}
+		else dol_print_error($this->db, 'Failed to execute request to get dispatched lines');
+		
+		return $ret;
+    }
+    
+    
     /**
      * 	Set a delivery in database for this supplier order
      *
      *	@param	User	$user		User that input data
      *	@param	date	$date		Date of reception
-     *	@param	string	$type		Type of receipt
+     *	@param	string	$type		Type of receipt ('tot' = total/done, 'par' = partial, 'nev' = never, 'can' = cancel)
      *	@param	string	$comment	Comment
      *	@return	int					<0 if KO, >0 if OK
      */
     function Livraison($user, $date, $type, $comment)
     {
+    	global $conf;
+    	
         $result = 0;
-
+		$error = 0;
+		
         dol_syslog(get_class($this)."::Livraison");
 
         if ($user->rights->fournisseur->commande->receptionner)
@@ -1640,7 +1689,27 @@ class CommandeFournisseur extends CommonOrder
             if ($type == 'nev') $statut = 7;
             if ($type == 'can') $statut = 7;
 
-            if ($statut == 4 or $statut == 5 or $statut == 7)
+        	if (! $error && ! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS) && ($type == 'tot'))
+	    	{
+	    		// If option SUPPLIER_ORDER_USE_DISPATCH_STATUS is on, we check all reception are approved to allow status "total/done"
+	    		$dispatchedlinearray=$this->getDispachedLines(0);
+	    		if (count($dispatchedlinearray) > 0)
+	    		{
+	    			$result=-1;
+	    			$error++;
+	    			$this->errors[]='ErrorCantSetReceptionToTotalDoneWithReceptionToApprove';
+	    			dol_syslog('ErrorCantSetReceptionToTotalDoneWithReceptionToApprove', LOG_DEBUG);
+	    		}
+	    	}
+
+            if (! $error && ! ($statut == 4 or $statut == 5 or $statut == 7))
+            {
+            	$error++;
+                dol_syslog(get_class($this)."::Livraison Error -2", LOG_ERR);
+                $result = -2;
+            }
+	    	
+            if (! $error)
             {
                 $this->db->begin();
 
@@ -1665,11 +1734,6 @@ class CommandeFournisseur extends CommonOrder
                     $result = -1;
                 }
             }
-            else
-            {
-                dol_syslog(get_class($this)."::Livraison Error -2", LOG_ERR);
-                $result = -2;
-            }
         }
         else
         {
diff --git a/htdocs/fourn/class/fournisseur.commande.dispatch.class.php b/htdocs/fourn/class/fournisseur.commande.dispatch.class.php
index 370b61de8819aac2444881df70c4c2c97829f7b3..e7aea53945ee139d86763c8e12ef3563d7bece00 100644
--- a/htdocs/fourn/class/fournisseur.commande.dispatch.class.php
+++ b/htdocs/fourn/class/fournisseur.commande.dispatch.class.php
@@ -17,7 +17,7 @@
  */
 
 /**
- *  \file       dev/skeletons/commandefournisseurdispatch.class.php
+ *  \file       fourn/class/fournisseur.commande.dispatch.class.php
  *  \ingroup    fournisseur stock
  *  \brief      This file is an example for a CRUD class file (Create/Read/Update/Delete)
  *				Initialy built by build_class_from_table on 2015-02-24 10:38
@@ -70,10 +70,10 @@ class CommandeFournisseurDispatch extends CommonObject
 
         // List of language codes for status
         $this->statuts[0] = 'Received';
-        $this->statuts[1] = 'Approved';
+        $this->statuts[1] = 'Verified';
         $this->statuts[2] = 'Denied';
         $this->statutshort[0] = 'Received';
-        $this->statutshort[1] = 'Approved';
+        $this->statutshort[1] = 'Verified';
         $this->statutshort[2] = 'Denied';
 
         return 1;
@@ -494,23 +494,17 @@ class CommandeFournisseurDispatch extends CommonObject
         if ($mode == 3)
         {
             if ($statut==0) return img_picto($langs->trans($this->statuts[$statut]),'statut0');
-            if ($statut==1) return img_picto($langs->trans($this->statuts[$statut]),'statut1');
-            if ($statut==2) return img_picto($langs->trans($this->statuts[$statut]),'statut3');
-            if ($statut==3) return img_picto($langs->trans($this->statuts[$statut]),'statut5');
+            if ($statut==1) return img_picto($langs->trans($this->statuts[$statut]),'statut4');
         }
         if ($mode == 4)
         {
             if ($statut==0) return img_picto($langs->trans($this->statuts[$statut]),'statut0').' '.$langs->trans($this->statuts[$statut]);
-            if ($statut==1) return img_picto($langs->trans($this->statuts[$statut]),'statut1').' '.$langs->trans($this->statuts[$statut]);
-            if ($statut==2) return img_picto($langs->trans($this->statuts[$statut]),'statut3').' '.$langs->trans($this->statuts[$statut]);
-            if ($statut==3) return img_picto($langs->trans($this->statuts[$statut]),'statut5').' '.$langs->trans($this->statuts[$statut]);
+            if ($statut==1) return img_picto($langs->trans($this->statuts[$statut]),'statut4').' '.$langs->trans($this->statuts[$statut]);
         }
         if ($mode == 5)
         {
             if ($statut==0) return '<span class="hideonsmartphone">'.$langs->trans($this->statutshort[$statut]).' </span>'.img_picto($langs->trans($this->statuts[$statut]),'statut0');
-            if ($statut==1) return '<span class="hideonsmartphone">'.$langs->trans($this->statutshort[$statut]).' </span>'.img_picto($langs->trans($this->statuts[$statut]),'statut1');
-            if ($statut==2) return '<span class="hideonsmartphone">'.$langs->trans($this->statutshort[$statut]).' </span>'.img_picto($langs->trans($this->statuts[$statut]),'statut3');
-            if ($statut==3) return '<span class="hideonsmartphone">'.$langs->trans($this->statutshort[$statut]).' </span>'.img_picto($langs->trans($this->statuts[$statut]),'statut5');
+            if ($statut==1) return '<span class="hideonsmartphone">'.$langs->trans($this->statutshort[$statut]).' </span>'.img_picto($langs->trans($this->statuts[$statut]),'statut4');
         }
     }
 
diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php
index c9a95872c17ee05d5de0ebc177ed713aef76579b..6101aa7e17dd8ff761caaf9ff4b183b03a1ca9b6 100644
--- a/htdocs/fourn/commande/card.php
+++ b/htdocs/fourn/commande/card.php
@@ -143,7 +143,7 @@ if (empty($reshook))
 	}
 
 	// Set incoterm
-	if ($action == 'set_incoterms' && !empty($conf->incoterm->enabled))
+	if ($action == 'set_incoterms' && $user->rights->fournisseur->commande->creer)
 	{
 		$result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha'));
 		if ($result < 0) setEventMessages($object->error, $object->errors, 'errors');
@@ -734,15 +734,14 @@ if (empty($reshook))
 		}
 	}
 
-	// Receive
+	// Set status of reception (complete, partial, ...)
 	if ($action == 'livraison' && $user->rights->fournisseur->commande->receptionner)
 	{
-
-	    if ($_POST["type"])
+	    if (GETPOST("type") != '')
 	    {
-	        $date_liv = dol_mktime(0,0,0,$_POST["remonth"],$_POST["reday"],$_POST["reyear"]);
+	        $date_liv = dol_mktime(GETPOST('rehour'),GETPOST('remin'),GETPOST('resec'),GETPOST("remonth"),GETPOST("reday"),GETPOST("reyear"));
 
-	        $result	= $object->Livraison($user, $date_liv, $_POST["type"], $_POST["comment"]);
+	        $result	= $object->Livraison($user, $date_liv, GETPOST("type"), GETPOST("comment"));
 	        if ($result > 0)
 	        {
 	            header("Location: ".$_SERVER["PHP_SELF"]."?id=".$object->id);
@@ -754,8 +753,7 @@ if (empty($reshook))
 	        }
 	        else
 	        {
-	            dol_print_error($db,$object->error);
-	            exit;
+	            setEventMessages($object->error, $object->errors, 'errors');
 	        }
 	    }
 	    else
@@ -2598,14 +2596,21 @@ elseif (! empty($object->id))
 				}
 
 				// Reopen
-				if (in_array($object->statut, array(2, 5, 6, 7, 9)))
+				if (in_array($object->statut, array(2)))
+				{
+					if ($user->rights->fournisseur->commande->commander)
+					{
+						print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=reopen">'.$langs->trans("Disapprove").'</a>';
+					}
+				}
+				if (in_array($object->statut, array(5, 6, 7, 9)))
 				{
 					if ($user->rights->fournisseur->commande->commander)
 					{
 						print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=reopen">'.$langs->trans("ReOpen").'</a>';
 					}
 				}
-
+				
 				// Create bill
 				if (! empty($conf->fournisseur->enabled) && $object->statut >= 2)  // 2 means accepted
 				{
diff --git a/htdocs/fourn/commande/dispatch.php b/htdocs/fourn/commande/dispatch.php
index 81c9e410c28e27db298ad7f6e560d9f70cc534c4..2610111023aab8fbf9edc44815efd11aa5c2586b 100644
--- a/htdocs/fourn/commande/dispatch.php
+++ b/htdocs/fourn/commande/dispatch.php
@@ -46,6 +46,8 @@ if (! empty($conf->productbatch->enabled)) $langs->load('productbatch');
 
 // Security check
 $id = GETPOST("id",'int');
+$lineid = GETPOST('lineid', 'int');
+$action = GETPOST('action');
 if ($user->societe_id) $socid=$user->societe_id;
 $result = restrictedArea($user, 'fournisseur', $id, '', 'commande');
 
@@ -65,7 +67,35 @@ $mesg='';
  * Actions
  */
 
-if ($_POST["action"] ==	'dispatch' && $user->rights->fournisseur->commande->receptionner)
+if ($action == 'checkdispatchline')
+{
+	$supplierorderdispatch = new CommandeFournisseurDispatch($db);
+	$result=$supplierorderdispatch->fetch($lineid);
+	if (! $result) dol_print_error($db);
+	$result=$supplierorderdispatch->setStatut(1);
+	if ($result < 0)
+	{
+		setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors, 'errors');
+		$error++;
+		$action='';
+	}
+}
+
+if ($action == 'uncheckdispatchline')
+{
+	$supplierorderdispatch = new CommandeFournisseurDispatch($db);
+	$result=$supplierorderdispatch->fetch($lineid);
+	if (! $result) dol_print_error($db);
+	$result=$supplierorderdispatch->setStatut(0);
+	if ($result < 0)
+	{
+		setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors, 'errors');
+		$error++;
+		$action='';
+	}
+}
+
+if ($action == 'dispatch' && $user->rights->fournisseur->commande->receptionner)
 {
 	$commande = new CommandeFournisseur($db);
 	$commande->fetch($id);
@@ -76,33 +106,40 @@ if ($_POST["action"] ==	'dispatch' && $user->rights->fournisseur->commande->rece
 
 	foreach($_POST as $key => $value)
 	{
-		if (preg_match('/^product_([0-9]+)$/i', $key, $reg))
+		if (preg_match('/^product_([0-9]+)$/i', $key, $reg))	// without batch module enabled
 		{
+			$numline=$reg[1] + 1;	// line of product
 			$prod = "product_".$reg[1];
 			$qty = "qty_".$reg[1];
 			$ent = "entrepot_".$reg[1];
 			$pu = "pu_".$reg[1];	// This is unit price including discount
 			$fk_commandefourndet = "fk_commandefourndet_".$reg[1];
-			if (GETPOST($ent,'int') > 0)
+
+			if (GETPOST($qty) > 0)	// We ask to move a qty
 			{
-				$result = $commande->DispatchProduct($user, GETPOST($prod,'int'),GETPOST($qty), GETPOST($ent,'int'), GETPOST($pu), GETPOST("comment"), '', '', '', GETPOST($fk_commandefourndet, 'int'));
-				if ($result < 0)
+				if (! GETPOST($ent,'int') > 0)
 				{
-					setEventMessages($commande->error, $commande->errors, 'errors');
+					dol_syslog('No dispatch for line '.$key.' as no warehouse choosed');
+					$text = $langs->transnoentities('Warehouse').', '.$langs->transnoentities('Line').' ' .($numline);
+					setEventMessage($langs->trans('ErrorFieldRequired',$text), 'errors');
 					$error++;
 				}
-			}
-			else
-			{
-				dol_syslog('No dispatch for line '.$key.' as no warehouse choosed');
-				$text = $langs->transnoentities('Warehouse').', '.$langs->transnoentities('Line').'' .($reg[1]-1);
-				setEventMessage($langs->trans('ErrorFieldRequired',$text), 'errors');
-				$error++;
+				
+				if (! $error)
+				{
+					$result = $commande->DispatchProduct($user, GETPOST($prod,'int'),GETPOST($qty), GETPOST($ent,'int'), GETPOST($pu), GETPOST("comment"), '', '', '', GETPOST($fk_commandefourndet, 'int'));
+					if ($result < 0)
+					{
+						setEventMessages($commande->error, $commande->errors, 'errors');
+						$error++;
+					}
+				}
 			}
 		}
-		else if (preg_match('/^product_([0-9]+)_([0-9]+)$/i', $key, $reg))
+		if (preg_match('/^product_([0-9]+)_([0-9]+)$/i', $key, $reg))	// with batch module enabled
 		{
 			//eat-by date dispatch
+			$numline=$reg[2] + 1;	// line of product
 			$prod = "product_".$reg[1]."_".$reg[2];
 			$qty = "qty_".$reg[1]."_".$reg[2];
 			$ent = "entrepot_".$reg[1]."_".$reg[2];
@@ -112,24 +149,25 @@ if ($_POST["action"] ==	'dispatch' && $user->rights->fournisseur->commande->rece
 			$dDLUO = dol_mktime(12, 0, 0, $_POST['dluo_'.$reg[1]."_".$reg[2].'month'], $_POST['dluo_'.$reg[1]."_".$reg[2].'day'], $_POST['dluo_'.$reg[1]."_".$reg[2].'year']);
 			$dDLC = dol_mktime(12, 0, 0, $_POST['dlc_'.$reg[1]."_".$reg[2].'month'], $_POST['dlc_'.$reg[1]."_".$reg[2].'day'], $_POST['dlc_'.$reg[1]."_".$reg[2].'year']);
 
-			if (! (GETPOST($ent,'int') > 0))
+			if (GETPOST($qty) > 0)	// We ask to move a qty
 			{
-				dol_syslog('No dispatch for line '.$key.' as no warehouse choosed');
-				$text = $langs->transnoentities('Warehouse').', '.$langs->transnoentities('Line').'' .($reg[1]-1);
-				setEventMessage($langs->trans('ErrorFieldRequired',$text), 'errors');
-				$error++;
-			}
+				if (! (GETPOST($ent,'int') > 0))
+				{
+					dol_syslog('No dispatch for line '.$key.' as no warehouse choosed');
+					$text = $langs->transnoentities('Warehouse').', '.$langs->transnoentities('Line').' ' .($numline).'-'.($reg[1]+1);
+					setEventMessage($langs->trans('ErrorFieldRequired',$text), 'errors');
+					$error++;
+				}
 
-			if (! $error)
-			{
-				if (! ((GETPOST($qty) > 0) && ($_POST[$lot] || $dDLUO || $dDLC)))
+				if (! ($_POST[$lot] || $dDLUO || $dDLC))
 				{
-					dol_syslog('No dispatch for line '.$key.' as qty is not set or eat-by date are not set');
-					$text = $langs->transnoentities('atleast1batchfield').', '.$langs->transnoentities('Line').'' .($reg[1]-1);
+					dol_syslog('No dispatch for line '.$key.' as serial/eat-by/sellby date are not set');
+					$text = $langs->transnoentities('atleast1batchfield').', '.$langs->transnoentities('Line').' ' .($numline).'-'.($reg[1]+1);
 					setEventMessage($langs->trans('ErrorFieldRequired',$text), 'errors');
 					$error++;
 				}
-				else
+				
+				if (! $error)
 				{
 					$result = $commande->dispatchProduct($user, GETPOST($prod,'int'), GETPOST($qty), GETPOST($ent,'int'), GETPOST($pu), GETPOST("comment"), $dDLC, $dDLUO, GETPOST($lot, 'alpha'), GETPOST($fk_commandefourndet, 'int'));
 					if ($result < 0)
@@ -511,7 +549,7 @@ if ($id > 0 || ! empty($ref))
 		// List of already dispatching
 		$sql = "SELECT p.ref, p.label,";
 		$sql.= " e.rowid as warehouse_id, e.label as entrepot,";
-		$sql.= " cfd.rowid, cfd.fk_product, cfd.qty, cfd.eatby, cfd.sellby, cfd.batch, cfd.comment, cfd.status";
+		$sql.= " cfd.rowid as dispatchlineid, cfd.fk_product, cfd.qty, cfd.eatby, cfd.sellby, cfd.batch, cfd.comment, cfd.status";
 		$sql.= " FROM ".MAIN_DB_PREFIX."product as p,";
 		$sql.= " ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as cfd";
 		$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."entrepot as e ON cfd.fk_entrepot = e.rowid";
@@ -545,7 +583,7 @@ if ($id > 0 || ! empty($ref))
 				print '<td></td>';
 				print '<td>'.$langs->trans("Warehouse").'</td>';
 				print '<td>'.$langs->trans("Comment").'</td>';
-				if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) print '<td align="right">'.$langs->trans("Status").'</td>';
+				if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) print '<td align="center" colspan="2">'.$langs->trans("Status").'</td>';
 				print "</tr>\n";
 
 				$var=false;
@@ -553,6 +591,7 @@ if ($id > 0 || ! empty($ref))
 				while ($i < $num)
 				{
 					$objp = $db->fetch_object($resql);
+					
 					print "<tr ".$bc[$var].">";
 					print '<td>';
 					print '<a href="'.DOL_URL_ROOT.'/product/fournisseurs.php?id='.$objp->fk_product.'">'.img_object($langs->trans("ShowProduct"),'product').' '.$objp->ref.'</a>';
@@ -588,8 +627,22 @@ if ($id > 0 || ! empty($ref))
 						//print $supplierorderdispatch->status;
 						print $supplierorderdispatch->getLibStatut(5);
 						print '</td>';
-					}
 
+						// Add button to check/uncheck disaptching
+						print '<td align="center">';
+						$disabled='';
+						if ($commande->statut == 5) $disabled=1;
+						if (empty($objp->status)) 
+						{
+							print '<a class="button'.($disabled?' buttonRefused':'').'" href="'.$_SERVER["PHP_SELF"]."?id=".$id."&action=checkdispatchline&lineid=".$objp->dispatchlineid.'">'.$langs->trans("Check").'</a>';
+						}
+						else 
+						{
+							print '<a class="button'.($disabled?' buttonRefused':'').'" href="'.$_SERVER["PHP_SELF"]."?id=".$id."&action=uncheckdispatchline&lineid=".$objp->dispatchlineid.'">'.$langs->trans("Uncheck").'</a>';
+						}
+						print '</td>';	
+					}
+					
 					print "</tr>\n";
 
 					$i++;
diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php
index 6926997f0f11c2a49f66d9c3b325615fd872596c..7e525a9d0805bf9bd0282f5e500e18a7065328ec 100644
--- a/htdocs/fourn/commande/list.php
+++ b/htdocs/fourn/commande/list.php
@@ -45,7 +45,7 @@ $search_user=GETPOST('search_user');
 $search_ht=GETPOST('search_ht');
 $search_ttc=GETPOST('search_ttc');
 $sall=GETPOST('search_all');
-$search_status=(GETPOST('search_status','int')!=''?GETPOST('search_status','int'):GETPOST('statut','int'));
+$search_status=(GETPOST('search_status','alpha')!=''?GETPOST('search_status','alpha'):GETPOST('statut','alpha'));	// alpha and not intbecause it can be '6,7'
 
 $page  = GETPOST('page','int');
 $socid = GETPOST('socid','int');
@@ -153,9 +153,9 @@ if ($search_refsupp)
 {
 	$sql.= " AND (cf.ref_supplier LIKE '%".$db->escape($search_refsupp)."%')";
 }
-if ($search_status >= 0)
+if ($search_status != '' && $search_status >= 0)
 {
-	if ($search_status == 6 || $search_status == 7) $sql.=" AND cf.fk_statut IN (6,7)";
+	if (strstr($search_status, ',')) $sql.=" AND cf.fk_statut IN (".$db->escape($search_status).")";
 	else $sql.=" AND cf.fk_statut = ".$search_status;
 }
 
@@ -205,9 +205,9 @@ if ($resql)
 
 	print '<tr class="liste_titre">';
 
-	print '<td class="liste_titre"><input type="text" class="flat" name="search_ref" value="'.$search_ref.'"></td>';
+	print '<td class="liste_titre"><input size="8" type="text" class="flat" name="search_ref" value="'.$search_ref.'"></td>';
 	if (empty($conf->global->SUPPLIER_ORDER_HIDE_REF_SUPPLIER)) print '<td class="liste_titre"><input type="text" class="flat" size="8" name="search_refsupp" value="'.$search_refsupp.'"></td>';
-	print '<td class="liste_titre"><input type="text" class="flat" name="search_company" value="'.$search_company.'"></td>';
+	print '<td class="liste_titre"><input type="text" class="flat" size="8" name="search_company" value="'.$search_company.'"></td>';
 	if (! empty($conf->global->PROJECT_SHOW_REF_INTO_LISTS))
 	{
 		print '<td class="liste_titre">';
diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang
index be75e3a96a35f8722a30af314a85357959a7cf75..3d83901194b9f234911e4e3df2f64f4fb3077966 100755
--- a/htdocs/langs/en_US/errors.lang
+++ b/htdocs/langs/en_US/errors.lang
@@ -160,6 +160,7 @@ ErrorPriceExpressionInternal=Internal error '%s'
 ErrorPriceExpressionUnknown=Unknown error '%s'
 ErrorSrcAndTargetWarehouseMustDiffers=Source and target warehouses must differs
 ErrorTryToMakeMoveOnProductRequiringBatchData=Error, trying to make a stock movement without batch/serial information, on a product requiring batch/serial information
+ErrorCantSetReceptionToTotalDoneWithReceptionToApprove=All recorded receptions must first be verified before being allowed to do this action
 
 # Warnings
 WarningMandatorySetupNotComplete=Mandatory setup parameters are not yet defined
diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang
index be893d5256947cf78215bbc183a01578d90a79ac..551807aad5946410a4ab58e87d328bc3d642736b 100644
--- a/htdocs/langs/en_US/main.lang
+++ b/htdocs/langs/en_US/main.lang
@@ -159,6 +159,7 @@ Search=Search
 SearchOf=Search
 Valid=Valid
 Approve=Approve
+Disapprove=Disapprove
 ReOpen=Re-Open
 Upload=Send file
 ToLink=Link
@@ -524,6 +525,7 @@ DateFromTo=From %s to %s
 DateFrom=From %s
 DateUntil=Until %s
 Check=Check
+Uncheck=Uncheck
 Internal=Internal
 External=External
 Internals=Internal
diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang
index 4f6e0b0dfb2edff006927eff69c2460e3277a4f7..ea3659b90de7eed5be1aaaa29190f9a5073b5029 100644
--- a/htdocs/langs/en_US/orders.lang
+++ b/htdocs/langs/en_US/orders.lang
@@ -42,6 +42,7 @@ StatusOrderCanceled=Canceled
 StatusOrderDraft=Draft (needs to be validated)
 StatusOrderValidated=Validated
 StatusOrderOnProcess=Ordered - Standby reception
+StatusOrderOnProcessWithValidation=Ordered - Standby reception or validation
 StatusOrderProcessed=Processed
 StatusOrderToBill=Delivered
 StatusOrderToBill2=To bill
diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php
index ccf54a6f9b502bf2406e5c33d1af7310f32fbdb0..206b1df019e79a4c8dddd66c9f482da597c6d6cc 100644
--- a/htdocs/theme/eldy/style.css.php
+++ b/htdocs/theme/eldy/style.css.php
@@ -361,6 +361,15 @@ fieldset { border: 1px solid #AAAAAA !important; box-shadow: 2px 2px 3px #DDD; }
     -moz-box-shadow: none;
     cursor: auto;
 }
+.buttonRefused {
+	pointer-events: none;
+   	cursor: default;	
+	opacity: 0.4;
+    filter: alpha(opacity=40); /* For IE8 and earlier */
+    box-shadow: none;
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+}
 form {
     padding:0px;
     margin:0px;