diff --git a/dev/skeletons/modMyModule.class.php b/dev/skeletons/modMyModule.class.php
index 86d9636809ad3b393796372e5e6fb8005fb35f39..a54aac470e5eb70210c986cd0b85d04146ce8d13 100644
--- a/dev/skeletons/modMyModule.class.php
+++ b/dev/skeletons/modMyModule.class.php
@@ -1,6 +1,6 @@
 <?php
 /* Copyright (C) 2003      Rodolphe Quiedeville <rodolphe@quiedeville.org>
- * Copyright (C) 2004-2012 Laurent Destailleur  <eldy@users.sourceforge.net>
+ * Copyright (C) 2004-2015 Laurent Destailleur  <eldy@users.sourceforge.net>
  * Copyright (C) 2005-2012 Regis Houssin        <regis.houssin@capnetworks.com>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -46,7 +46,7 @@ class modMyModule extends DolibarrModules
 
 		// Id for module (must be unique).
 		// Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id).
-		$this->numero = 100000;
+		$this->numero = 500000;		// TODO Go on page http://wiki.dolibarr.org/index.php/List_of_modules_id to reserve id number for your module
 		// Key text used to identify module (for permissions, menus, etc...)
 		$this->rights_class = 'mymodule';
 
diff --git a/htdocs/admin/salaries.php b/htdocs/admin/salaries.php
index 58e85dbf8d3594012c1ad394532b9f95ef43d4e5..2d32db71af78080589f94ae87f89a74975facb09 100644
--- a/htdocs/admin/salaries.php
+++ b/htdocs/admin/salaries.php
@@ -113,11 +113,11 @@ print '</tr>';
 
 print "</table>\n";
 
-print '</form>';
-
 dol_fiche_end();
 
 print '<div style="text-align:center"><input type="submit" class="button" value="'.$langs->trans('Modify').'" name="button"></div>';
 
+print '</form>';
+
 llxFooter();
 $db->close();
diff --git a/htdocs/admin/system/about.php b/htdocs/admin/system/about.php
index e9d3f96ad555aee620f1d04aa5e1ee5c30d61ea1..3b2492fad65ca9ac239f9779bfae75caef63be22 100644
--- a/htdocs/admin/system/about.php
+++ b/htdocs/admin/system/about.php
@@ -59,39 +59,39 @@ $result = getURLContent('http://sourceforge.net/projects/dolibarr/rss');
 $sfurl = simplexml_load_string($result['content']);
 if ($sfurl)
 {
-    $title=$sfurl->channel[0]->item[0]->title;
-
-	function word_limiter($text, $limit = 30, $chars = '0123456789.')
-	{
-	    if (strlen( $text ) > $limit)
-	    {
-	        $words = str_word_count($text, 2, $chars);
-	        $words = array_reverse($words, TRUE);
-	        foreach($words as $length => $word) {
-	            if ($length + strlen( $word ) >= $limit)
-	            {
-	                array_shift($words);
-	            } else {
-	                break;
-	            }
-	        }
-	        $words = array_reverse($words);
-	        $text = implode(" ", $words) . '';
-	    }
-	    return $text;
-	}
-
-	$str = word_limiter($title);
-	$str = preg_replace('/[^0-9\.]/', '', $str);
-	print ' ('.$langs->trans("LastStableVersion").': <b>'.$str.'</b>';
-	if (DOL_VERSION == $str)
-	{
-	    $youuselaststable=1;
-        print $langs->trans("YouUseLastStableVersion");  
-	}
-	print ')';
+    $i=0;
+    $version='0.0';
+    while (! empty($sfurl->channel[0]->item[$i]->title) && $i < 10000)
+    {
+        $title=$sfurl->channel[0]->item[$i]->title;
+        if (preg_match('/([0-9]+\.([0-9\.]+))/', $title, $reg))
+        {
+            $newversion=$reg[1];
+            $newversionarray=explode('.',$newversion);
+            $versionarray=explode('.',$version);
+            //var_dump($newversionarray);var_dump($versionarray);
+            if (versioncompare($newversionarray, $versionarray) > 0) $version=$newversion;
+        }
+        $i++;
+    }
+
+    // Show version
+    if ($version != '0.0') 
+    {
+        print ' ('.$langs->trans("LastStableVersion").': <b>'.$version.'</b>';
+    	if (DOL_VERSION == $version)
+    	{
+    	    $youuselaststable=1;
+            print $langs->trans("YouUseLastStableVersion");  
+    	}
+    	print ')';
+    }
 	print ' / <a href="http://www.gnu.org/copyleft/gpl.html">GNU-GPL v3+</a></li>';
 }
+else
+{
+    print $langs->trans("LastStableVersion").' : <b>' .$langs->trans("UpdateServerOffline").'</b><br>';
+}
 
 
 print '</ul>';
diff --git a/htdocs/admin/tools/update.php b/htdocs/admin/tools/update.php
index e1166e96c3de4edc162d244deadda333d7628f74..cb4890f77f182903a0fa9a94be65f3bd0ec70b0d 100644
--- a/htdocs/admin/tools/update.php
+++ b/htdocs/admin/tools/update.php
@@ -23,6 +23,7 @@
  */
 
 require '../../main.inc.php';
+include_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php';
 include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
 include_once DOL_DOCUMENT_ROOT . '/core/lib/geturl.lib.php';
 
@@ -172,30 +173,24 @@ $result = getURLContent('http://sourceforge.net/projects/dolibarr/rss');
 $sfurl = simplexml_load_string($result['content']);
 if ($sfurl)
 {
-    $title=$sfurl->channel[0]->item[0]->title;
-
-	function word_limiter($text, $limit = 30, $chars = '0123456789.')
-	{
-	    if (strlen( $text ) > $limit)
-	    {
-	        $words = str_word_count($text, 2, $chars);
-	        $words = array_reverse($words, TRUE);
-	        foreach($words as $length => $word) {
-	            if ($length + strlen( $word ) >= $limit)
-	            {
-	                array_shift($words);
-	            } else {
-	                break;
-	            }
-	        }
-	        $words = array_reverse($words);
-	        $text = implode(" ", $words) . '';
-	    }
-	    return $text;
-	}
-
-	$str = $title;
-	print $langs->trans("LastStableVersion").' : <b>'. word_limiter( $str ).'</b><br>';
+    $i=0;
+    $version='0.0';
+    while (! empty($sfurl->channel[0]->item[$i]->title) && $i < 10000)
+    {
+        $title=$sfurl->channel[0]->item[$i]->title;
+        if (preg_match('/([0-9]+\.([0-9\.]+))/', $title, $reg))
+        {
+            $newversion=$reg[1];
+            $newversionarray=explode('.',$newversion);
+            $versionarray=explode('.',$version);
+            //var_dump($newversionarray);var_dump($versionarray);
+            if (versioncompare($newversionarray, $versionarray) > 0) $version=$newversion;
+        }
+        $i++;
+    }
+    
+    // Show version
+	print $langs->trans("LastStableVersion").' : <b>'. (($version != '0.0')?$version:$langs->trans("Unknown")) .'</b><br>';
 }
 else
 {
diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php
index 86a49f9f232c1ca4124978182b6e5256f9c78c42..d5e99af0df634c712f05e74bfd7bd4b89a7069b8 100644
--- a/htdocs/compta/facture.php
+++ b/htdocs/compta/facture.php
@@ -3886,9 +3886,9 @@ else if ($id > 0 || ! empty($ref))
 		$formmail->withtocc = $liste; // List suggested for CC
 		$formmail->withtoccc = $conf->global->MAIN_EMAIL_USECCC;
 		if (empty($object->ref_client)) {
-			$formmail->withtopic = $outputlangs->transnoentities($topicmail, '__FACREF__');
+			$formmail->withtopic = $outputlangs->transnoentities($topicmail, '__REF__');
 		} else if (! empty($object->ref_client)) {
-			$formmail->withtopic = $outputlangs->transnoentities($topicmail, '__FACREF__ (__REFCLIENT__)');
+			$formmail->withtopic = $outputlangs->transnoentities($topicmail, '__REF__ (__REFCLIENT__)');
 		}
 
 		$formmail->withfile = 2;
@@ -3896,7 +3896,7 @@ else if ($id > 0 || ! empty($ref))
 		$formmail->withdeliveryreceipt = 1;
 		$formmail->withcancel = 1;
 		// Tableau des substitutions
-		$formmail->substit['__FACREF__'] = $object->ref;
+		$formmail->substit['__REF__'] = $object->ref;
 		$formmail->substit['__SIGNATURE__'] = $user->signature;
 		$formmail->substit['__REFCLIENT__'] = $object->ref_client;
 		$formmail->substit['__THIRDPARTY_NAME__'] = $object->thirdparty->name;
diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php
index b27bc9d2294c19cd70940b5cb578e5fda485b36c..b58d2052b990a8692d0a95125f78bd8169918b54 100644
--- a/htdocs/compta/facture/class/facture.class.php
+++ b/htdocs/compta/facture/class/facture.class.php
@@ -3687,11 +3687,9 @@ class Facture extends CommonInvoice
 
 		$now = dol_now();
 
-		//Paid invoices have status STATUS_CLOSED
-		if (!$this->statut != Facture::STATUS_VALIDATED) {
-			return false;
-		}
-
+		// Paid invoices have status STATUS_CLOSED
+		if ($this->statut != Facture::STATUS_VALIDATED) return false;
+		
 		return $this->date_lim_reglement < ($now - $conf->facture->client->warning_delay);
 	}
 }
diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php
index 9372f50f4aaf446912237aa3ec1669f1b8ca7a5d..cce908dc368dbdc1e28f91937952ec106d351bf2 100644
--- a/htdocs/compta/facture/list.php
+++ b/htdocs/compta/facture/list.php
@@ -60,6 +60,7 @@ $id=(GETPOST('id','int')?GETPOST('id','int'):GETPOST('facid','int'));  // For ba
 $ref=GETPOST('ref','alpha');
 $socid=GETPOST('socid','int');
 $action=GETPOST('action','alpha');
+$massaction=GETPOST('massaction','alpha');
 $confirm=GETPOST('confirm','alpha');
 $lineid=GETPOST('lineid','int');
 $userid=GETPOST('userid','int');
@@ -70,6 +71,9 @@ $search_societe=GETPOST('search_societe','alpha');
 $search_montant_ht=GETPOST('search_montant_ht','alpha');
 $search_montant_ttc=GETPOST('search_montant_ttc','alpha');
 $search_status=GETPOST('search_status','int');
+$search_paymentmode=GETPOST('search_paymentmode','int');
+$option = GETPOST('option');
+if ($option == 'late') $filter = 'paye:0';
 
 $sortfield = GETPOST("sortfield",'alpha');
 $sortorder = GETPOST("sortorder",'alpha');
@@ -94,6 +98,7 @@ $day_lim	= GETPOST('day_lim','int');
 $month_lim	= GETPOST('month_lim','int');
 $year_lim	= GETPOST('year_lim','int');
 $filtre	= GETPOST('filtre');
+$toselect = GETPOST('toselect', 'array');
 
 // Security check
 $fieldid = (! empty($ref)?'facnumber':'rowid');
@@ -122,9 +127,290 @@ if (empty($user->socid)) $fieldstosearchall["f.note_private"]="NotePrivate";
  * Actions
  */
 
+if (GETPOST('cancel')) { $action='list'; $massaction=''; }
+
 $parameters=array('socid'=>$socid);
 $reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action);    // Note that $action and $object may have been modified by some hooks
 if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+if (empty($reshook))
+{
+	// Mass actions
+	if (! empty($massaction) && count($toselect) < 1)
+	{
+		$error++;
+		setEventMessage("NoLineChecked","warnings");
+	}
+
+	if (! $error && $massaction == 'confirm_presend')
+	{
+		$resaction = '';
+		$nbsent = 0;
+		$nbignored = 0;
+		$langs->load("mails");
+		include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+		
+		if (!isset($user->email))
+		{
+			$error++;
+			setEventMessages($langs->trans("NoSenderEmailDefined"), null, 'warnings');
+		}
+
+		if (! $error)
+		{
+			$thirdparty=new Societe($db);
+			$objecttmp=new Facture($db);
+			$listofobjectid=array();
+			$listofobjectthirdparties=array();
+			$listofobjectref=array();
+			foreach($toselect as $toselectid)
+			{
+				$objecttmp=new Facture($db);	// must create new instance because instance is saved into $listofobjectref array for future use
+				$result=$objecttmp->fetch($toselectid);
+				if ($result > 0) 
+				{
+					$listoinvoicesid[$toselectid]=$toselectid;
+					$thirdpartyid=$objecttmp->fk_soc?$objecttmp->fk_soc:$objecttmp->socid;
+					$listofobjectthirdparties[$thirdpartyid]=$thirdpartyid;
+					$listofobjectref[$thirdpartyid][$toselectid]=$objecttmp;
+				}
+			}
+			//var_dump($listofobjectthirdparties);exit;
+			
+			foreach ($listofobjectthirdparties as $thirdpartyid)
+			{
+				$result = $thirdparty->fetch($thirdpartyid);
+				if ($result < 0) 
+				{
+					dol_print_error($db);
+					exit;
+				}
+				
+				// Define recipient $sendto and $sendtocc
+				if (trim($_POST['sendto']))
+				{
+					// Recipient is provided into free text
+					$sendto = trim($_POST['sendto']);
+					$sendtoid = 0;
+				}
+				elseif ($_POST['receiver'] != '-1')
+				{
+					// Recipient was provided from combo list
+					if ($_POST['receiver'] == 'thirdparty') // Id of third party
+					{
+						$sendto = $thirdparty->email;
+						$sendtoid = 0;
+					}
+					else	// Id du contact
+					{
+						$sendto = $thirdparty->contact_get_property((int) $_POST['receiver'],'email');
+						$sendtoid = $_POST['receiver'];
+					}
+				}
+				if (trim($_POST['sendtocc']))
+				{
+					$sendtocc = trim($_POST['sendtocc']);
+				}
+				elseif ($_POST['receivercc'] != '-1')
+				{
+					// Recipient was provided from combo list
+					if ($_POST['receivercc'] == 'thirdparty')	// Id of third party
+					{
+						$sendtocc = $thirdparty->email;
+					}
+					else	// Id du contact
+					{
+						$sendtocc = $thirdparty->contact_get_property((int) $_POST['receivercc'],'email');
+					}
+				}
+				
+				//var_dump($listofobjectref[$thirdpartyid]);	// Array of invoice for this thirdparty
+				
+				$attachedfiles=array('paths'=>array(), 'names'=>array(), 'mimes'=>array());
+				$listofqualifiedinvoice=array();
+				$listofqualifiedref=array();
+				foreach($listofobjectref[$thirdpartyid] as $objectid => $object)
+				{
+					//var_dump($object);
+					//var_dump($thirdpartyid.' - '.$objectid.' - '.$object->statut);
+					
+					if ($object->statut != Facture::STATUS_VALIDATED)
+					{
+						$nbignored++;
+						continue; // Payment done or started or canceled
+					}
+	
+					// Read document
+					// TODO Use future field $object->fullpathdoc to know where is stored default file
+					// TODO If not defined, use $object->modelpdf (or defaut invoice config) to know what is template to use to regenerate doc.
+					$filename=dol_sanitizeFileName($object->ref).'.pdf';
+					$filedir=$conf->facture->dir_output . '/' . dol_sanitizeFileName($object->ref);
+					$file = $filedir . '/' . $filename;
+					$mime = dol_mimetype($file);
+
+					if (dol_is_file($file))
+					{
+						if (empty($sendto)) 	// For the case, no recipient were set (multi thirdparties send)
+						{
+							$object->fetch_thirdparty();
+							$sendto = $object->thirdparty->email;
+						}
+	
+						if (empty($sendto)) 
+						{
+							//print "No recipient for thirdparty ".$object->thirdparty->name;
+							$nbignored++;
+							continue;
+						}
+	
+						if (dol_strlen($sendto))
+						{
+							// Create form object
+							$attachedfiles=array(
+									'paths'=>array_merge($attachedfiles['paths'],array($file)), 
+									'names'=>array_merge($attachedfiles['names'],array($filename)), 
+									'mimes'=>array_merge($attachedfiles['mimes'],array($mime))
+							);
+						}
+	
+						$listofqualifiedinvoice[$objectid]=$object;
+						$listofqualifiedref[$objectid]=$object->ref;
+					}
+					else
+					{  
+						$nbignored++;
+						$langs->load("other");
+						$resaction.='<div class="error">'.$langs->trans('ErrorCantReadFile',$file).'</div>';
+						dol_syslog('Failed to read file: '.$file, LOG_WARNING);
+						continue;
+					}
+					
+					//var_dump($listofqualifiedref);
+				}
+	
+				if (count($listofqualifiedinvoice) > 0)
+				{
+					$langs->load("commercial");
+					$from = $user->getFullName($langs) . ' <' . $user->email .'>';
+					$replyto = $from;
+					$subject = GETPOST('subject');
+					$message = GETPOST('message');
+					$sendtocc = GETPOST('sentocc');
+					$sendtobcc = (empty($conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO)?'':$conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO);
+		
+					$substitutionarray=array(
+						'__ID__' => join(', ',array_keys($listofqualifiedinvoice)),
+						'__EMAIL__' => $thirdparty->email,
+						'__CHECK_READ__' => '<img src="'.DOL_MAIN_URL_ROOT.'/public/emailing/mailing-read.php?tag='.$thirdparty->tag.'&securitykey='.urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY).'" width="1" height="1" style="width:1px;height:1px" border="0"/>',
+						//'__LASTNAME__' => $obj2->lastname,
+						//'__FIRSTNAME__' => $obj2->firstname,
+						'__FACREF__' => join(', ',$listofqualifiedref),            // For backward compatibility
+					    '__REF__' => join(', ',$listofqualifiedref),
+						'__REFCLIENT__' => $thirdparty->name
+					);
+	
+					$subject=make_substitutions($subject, $substitutionarray);
+					$message=make_substitutions($message, $substitutionarray);
+	
+					$filepath = $attachedfiles['paths'];
+					$filename = $attachedfiles['names'];
+					$mimetype = $attachedfiles['mimes'];
+					
+					//var_dump($filepath);
+					
+					// Send mail
+					require_once(DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php');
+					$mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc,$sendtobcc,$deliveryreceipt,-1);
+					if ($mailfile->error)
+					{
+						$resaction.='<div class="error">'.$mailfile->error.'</div>';
+					}
+					else
+					{
+						$result=$mailfile->sendfile();
+						if ($result)
+						{
+							$resaction.=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($from,2),$mailfile->getValidAddress($sendto,2));		// Must not contain "
+	
+							$error=0;
+	
+							foreach($listofqualifiedinvoice as $invid => $object)
+							{
+								$actiontypecode='AC_FAC';
+								$actionmsg=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto;
+								if ($message)
+								{
+									if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc);
+									$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject);
+									$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":");
+									$actionmsg = dol_concatdesc($actionmsg, $message);
+								}
+								
+								// Initialisation donnees
+								$object->sendtoid		= 0;
+								$object->actiontypecode	= $actiontypecode;
+								$object->actionmsg		= $actionmsg;  // Long text
+								$object->actionmsg2		= $actionmsg2; // Short text
+								$object->fk_element		= $invid;
+								$object->elementtype	= $object->element;
+		
+								// Appel des triggers
+								include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
+								$interface=new Interfaces($db);
+								$result=$interface->run_triggers('BILL_SENTBYMAIL',$object,$user,$langs,$conf);
+								if ($result < 0) { $error++; $this->errors=$interface->errors; }
+								// Fin appel triggers
+		
+								if (! $error)
+								{
+									$resaction.=$langs->trans("MailSent").': '.$sendto."<br>\n";
+								}
+								else
+								{
+									dol_print_error($db);
+								}
+								$nbsent++;
+							}
+						}
+						else
+						{
+							$langs->load("other");
+							if ($mailfile->error)
+							{
+								$resaction.=$langs->trans('ErrorFailedToSendMail',$from,$sendto);
+								$resaction.='<br><div class="error">'.$mailfile->error.'</div>';
+							}
+							else
+							{
+								$resaction.='<div class="warning">No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS</div>';
+							}
+						}
+					}
+				}
+			}
+
+			$resaction.=($resaction?'<br>':$resaction);
+			$resaction.='<strong>'.$langs->trans("ResultOfMailSending").':</strong><br>'."\n";
+			$resaction.=$langs->trans("NbSelected").': '.count($toselect)."\n<br>";
+			$resaction.=$langs->trans("NbIgnored").': '.($nbignored?$nbignored:0)."\n<br>";
+			$resaction.=$langs->trans("NbSent").': '.($nbsent?$nbsent:0)."\n<br>";
+			
+			if ($nbsent)
+			{
+				$action='';	// Do not show form post if there was at least one successfull sent
+				setEventMessages($langs->trans("EMailSentToNRecipients", $nbsent.'/'.count($toselect)), null, 'mesgs');
+				setEventMessages($resaction, null, 'mesgs');
+			}
+			else
+			{
+				//setEventMessages($langs->trans("EMailSentToNRecipients", 0), null, 'warnings');  // May be object has no generated PDF file
+				setEventMessages($resaction, null, 'warnings');
+			}
+		}
+		
+		$action='list';
+		$massaction='';
+	}
+}
 
 // Do we click on purge search criteria ?
 if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers
@@ -139,9 +425,13 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both
     $search_montant_ht='';
     $search_montant_ttc='';
     $search_status='';
+    $search_paymentmode='';
     $day='';
     $year='';
     $month='';
+    $toselect='';
+    $option='';
+    $filter='';
 }
 
     
@@ -160,7 +450,7 @@ $facturestatic=new Facture($db);
 
 $sql = 'SELECT';
 if ($sall || $search_product_category > 0) $sql = 'SELECT DISTINCT';
-$sql.= ' f.rowid as facid, f.facnumber, f.ref_client, f.type, f.note_private, f.increment, f.total as total_ht, f.tva as total_tva, f.total_ttc,';
+$sql.= ' f.rowid as facid, f.facnumber, f.ref_client, f.type, f.note_private, f.increment, f.fk_mode_reglement, f.total as total_ht, f.tva as total_tva, f.total_ttc,';
 $sql.= ' f.datef as df, f.date_lim_reglement as datelimite,';
 $sql.= ' f.paye as paye, f.fk_statut,';
 $sql.= ' s.nom as name, s.rowid as socid, s.code_client, s.client ';
@@ -203,6 +493,7 @@ if ($search_societe) $sql .= natural_search('s.nom', $search_societe);
 if ($search_montant_ht != '') $sql.= natural_search('f.total', $search_montant_ht, 1);
 if ($search_montant_ttc != '') $sql.= natural_search('f.total_ttc', $search_montant_ttc, 1);
 if ($search_status != '' && $search_status >= 0) $sql.= " AND f.fk_statut = ".$db->escape($search_status);
+if ($search_paymentmode > 0) $sql .= " AND f.fk_mode_reglement = ".$search_paymentmode."";
 if ($month > 0)
 {
     if ($year > 0 && empty($day))
@@ -229,6 +520,8 @@ else if ($year_lim > 0)
 {
 	$sql.= " AND f.date_lim_reglement BETWEEN '".$db->idate(dol_get_first_day($year_lim,1,false))."' AND '".$db->idate(dol_get_last_day($year_lim,12,false))."'";
 }
+if ($option == 'late') $sql.=" AND f.date_lim_reglement < '".$db->idate(dol_now() - $conf->facture->client->warning_delay)."'";
+if ($filter == 'paye:0') $sql.= " AND f.fk_statut = 1";
 if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$search_sale;
 if ($search_user > 0)
 {
@@ -265,6 +558,8 @@ if ($resql)
 {
     $num = $db->num_rows($resql);
 
+	$arrayofselected=is_array($toselect)?$toselect:array();
+    
     if ($socid)
     {
         $soc = new Societe($db);
@@ -282,10 +577,113 @@ if ($resql)
     if ($search_montant_ht != '')  $param.='&search_montant_ht='.$search_montant_ht;
     if ($search_montant_ttc != '') $param.='&search_montant_ttc='.$search_montant_ttc;
 	if ($search_status != '') $param.='&search_status='.$search_status;
-    print_barre_liste($langs->trans('BillsCustomers').' '.($socid?' '.$soc->name:''),$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords,'title_accountancy.png');
-
+	if ($search_paymentmode > 0) $param.='search_paymentmode='.$search_paymentmode;
+	$param.=(! empty($option)?"&amp;option=".$option:"");
+	
+	$massactionbutton=$form->selectMassAction('', $massaction ? array() : array('presend'=>$langs->trans("SendByMail")));
+    
     $i = 0;
-    print '<form method="GET" action="'.$_SERVER["PHP_SELF"].'">'."\n";
+    print '<form method="POST" name="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
+    
+	print_barre_liste($langs->trans('BillsCustomers').' '.($socid?' '.$soc->name:''),$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,$massactionbutton,$num,$nbtotalofrecords,'title_accountancy.png');
+
+	if ($massaction == 'presend')
+	{
+		$langs->load("mails");
+		
+		if (! GETPOST('cancel')) 
+		{
+			$objecttmp=new Facture($db);
+			$listofselectedid=array();
+			$listofselectedthirdparties=array();
+			$listofselectedref=array();
+			foreach($arrayofselected as $toselectid)
+			{
+				$result=$objecttmp->fetch($toselectid);
+				if ($result > 0) 
+				{
+					$listofselectedid[$toselectid]=$toselectid;
+					$thirdpartyid=$objecttmp->fk_soc?$objecttmp->fk_soc:$objecttmp->socid;
+					$listofselectedthirdparties[$thirdpartyid]=$thirdpartyid;
+					$listofselectedref[$thirdpartyid][$toselectid]=$objecttmp->ref;
+				}
+			}
+		}
+
+		print '<input type="hidden" name="massaction" value="confirm_presend">';
+		
+		include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
+		$formmail = new FormMail($db);		
+		
+		dol_fiche_head(null, '', $langs->trans("SendByMail"));
+
+		$topicmail="SendBillRef";
+		$modelmail="facture_send";
+
+		// Cree l'objet formulaire mail
+		include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
+		$formmail = new FormMail($db);
+		$formmail->withform=-1;
+		$formmail->fromtype = 'user';
+		$formmail->fromid   = $user->id;
+		$formmail->fromname = $user->getFullName($langs);
+		$formmail->frommail = $user->email;
+		if (! empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 1))	// If bit 1 is set
+		{
+			$formmail->trackid='inv'.$object->id;
+		}
+		if (! empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 2))	// If bit 2 is set
+		{
+			include DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
+			$formmail->frommail=dolAddEmailTrackId($formmail->frommail, 'inv'.$object->id);
+		}
+		$formmail->withfrom=1;
+		$liste=$langs->trans("AllRecipientSelected");
+		if (count($listofselectedthirdparties) == 1)
+		{
+			$liste=array();
+			$thirdpartyid=array_shift($listofselectedthirdparties);
+   			$soc=new Societe($db);
+    		$soc->fetch($thirdpartyid);
+        	foreach ($soc->thirdparty_and_contact_email_array(1) as $key=>$value)
+        	{
+        		$liste[$key]=$value;
+        	}
+			$formmail->withtoreadonly=0;
+		}
+		else
+		{
+			$formmail->withtoreadonly=1;
+		}
+		$formmail->withto=$liste;
+		$formmail->withtofree=0;
+		$formmail->withtocc=1;
+		$formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC;
+		$formmail->withtopic=$langs->transnoentities($topicmail, '__REF__', '__REFCLIENT__');
+		$formmail->withfile=$langs->trans("EachInvoiceWillBeAttachedToEmail");
+		$formmail->withbody=1;
+		$formmail->withdeliveryreceipt=1;
+		$formmail->withcancel=1;
+		// Tableau des substitutions
+		$formmail->substit['__REF__']='__REF__';	// We want to keep the tag
+		$formmail->substit['__SIGNATURE__']=$user->signature;
+		$formmail->substit['__REFCLIENT__']='__REFCLIENT__';	// We want to keep the tag
+		$formmail->substit['__PERSONALIZED__']='';
+		$formmail->substit['__CONTACTCIVNAME__']='';
+
+		// Tableau des parametres complementaires du post
+		$formmail->param['action']=$action;
+		$formmail->param['models']=$modelmail;
+		$formmail->param['models_id']=GETPOST('modelmailselected','int');
+		$formmail->param['facid']=join(',',$arrayofselected);
+		//$formmail->param['returnurl']=$_SERVER["PHP_SELF"].'?id='.$object->id;
+
+		print $formmail->get_form();
+        
+        dol_fiche_end();
+	}
+	
+	
     if ($optioncss != '') print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
 	print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
 	print '<input type="hidden" name="action" value="list">';
@@ -347,8 +745,9 @@ if ($resql)
     print_liste_field_titre($langs->trans('Date'),$_SERVER['PHP_SELF'],'f.datef','',$param,'align="center"',$sortfield,$sortorder);
     print_liste_field_titre($langs->trans("DateDue"),$_SERVER['PHP_SELF'],"f.date_lim_reglement",'',$param,'align="center"',$sortfield,$sortorder);
     print_liste_field_titre($langs->trans('ThirdParty'),$_SERVER['PHP_SELF'],'s.nom','',$param,'',$sortfield,$sortorder);
+	print_liste_field_titre($langs->trans("PaymentModeShort"),$_SERVER["PHP_SELF"],"f.fk_reglement_mode","",$param,"",$sortfield,$sortorder);
     print_liste_field_titre($langs->trans('AmountHT'),$_SERVER['PHP_SELF'],'f.total','',$param,'align="right"',$sortfield,$sortorder);
-    print_liste_field_titre($langs->trans('AmountVAT'),$_SERVER['PHP_SELF'],'f.tva','',$param,'align="right"',$sortfield,$sortorder);
+    print_liste_field_titre($langs->trans('Taxes'),$_SERVER['PHP_SELF'],'f.tva','',$param,'align="right"',$sortfield,$sortorder);
     print_liste_field_titre($langs->trans('AmountTTC'),$_SERVER['PHP_SELF'],'f.total_ttc','',$param,'align="right"',$sortfield,$sortorder);
     print_liste_field_titre($langs->trans('Received'),$_SERVER['PHP_SELF'],'am','',$param,'align="right"',$sortfield,$sortorder);
     print_liste_field_titre($langs->trans('Status'),$_SERVER['PHP_SELF'],'fk_statut,paye,am','',$param,'align="right"',$sortfield,$sortorder);
@@ -372,8 +771,12 @@ if ($resql)
     if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print '<input class="flat" type="text" size="1" maxlength="2" name="day_lim" value="'.$day_lim.'">';
     print '<input class="flat" type="text" size="1" maxlength="2" name="month_lim" value="'.$month_lim.'">';
     $formother->select_year($year_lim?$year_lim:-1,'year_lim',1, 20, 5);
+	print '<br><input type="checkbox" name="option" value="late"'.($option == 'late'?' checked':'').'> '.$langs->trans("Late");
     print '</td>';
     print '<td class="liste_titre" align="left"><input class="flat" type="text" size="8" name="search_societe" value="'.$search_societe.'"></td>';
+	print '<td class="liste_titre" align="left">';
+	$form->select_types_paiements($search_paymentmode, 'search_paymentmode', '', 0, 0, 1, 10);
+	print '</td>';
     print '<td class="liste_titre" align="right"><input class="flat" type="text" size="6" name="search_montant_ht" value="'.$search_montant_ht.'"></td>';
     print '<td class="liste_titre"></td>';
     print '<td class="liste_titre" align="right"><input class="flat" type="text" size="6" name="search_montant_ttc" value="'.$search_montant_ttc.'"></td>';
@@ -407,8 +810,8 @@ if ($resql)
             $facturestatic->id=$objp->facid;
             $facturestatic->ref=$objp->facnumber;
             $facturestatic->type=$objp->type;
-            $facturestatic->statut = $objp->fk_statut;
-            $facturestatic->date_lim_reglement = $db->jdate($objp->datelimite);
+            $facturestatic->statut=$objp->fk_statut;
+            $facturestatic->date_lim_reglement=$db->jdate($objp->datelimite);
             $notetoshow=dol_string_nohtmltag(($user->societe_id>0?$objp->note_public:$objp->note),1);
             $paiement = $facturestatic->getSommePaiement();
 
@@ -463,6 +866,11 @@ if ($resql)
             print $thirdparty->getNomUrl(1,'customer');
             print '</td>';
 
+            // Payment mode
+            print '<td>';
+            $form->form_modes_reglement($_SERVER['PHP_SELF'], $objp->fk_mode_reglement, 'none');
+            print '</td>';
+            
             print '<td align="right">'.price($objp->total_ht,0,$langs).'</td>';
 
             print '<td align="right">'.price($objp->total_tva,0,$langs).'</td>';
@@ -471,12 +879,17 @@ if ($resql)
 
             print '<td align="right">'.(! empty($paiement)?price($paiement,0,$langs):'&nbsp;').'</td>';
 
-            // Affiche statut de la facture
+            // Status
             print '<td align="right" class="nowrap">';
             print $facturestatic->LibStatut($objp->paye,$objp->fk_statut,5,$paiement,$objp->type);
             print "</td>";
 
-            print "<td></td>";
+			// Checkbox
+            print '<td class="nowrap" align="center">';
+            $selected=0;
+			if (in_array($objp->facid, $arrayofselected)) $selected=1;
+			print '<input id="cb'.$objp->facid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$objp->facid.'"'.($selected?' checked="checked"':'').'>';
+			print '</td>' ;
 
             print "</tr>\n";
             $total_ht+=$objp->total_ht;
@@ -490,7 +903,7 @@ if ($resql)
         {
             // Print total
             print '<tr class="liste_total">';
-            print '<td class="liste_total" colspan="5" align="left">'.$langs->trans('Total').'</td>';
+            print '<td class="liste_total" colspan="6" align="left">'.$langs->trans('Total').'</td>';
             print '<td class="liste_total" align="right">'.price($total_ht,0,$langs).'</td>';
             print '<td class="liste_total" align="right">'.price($total_tva,0,$langs).'</td>';
             print '<td class="liste_total" align="right">'.price($total_ttc,0,$langs).'</td>';
diff --git a/htdocs/compta/facture/mergepdftool.php b/htdocs/compta/facture/mergepdftool.php
index 968ab8543c2ea3a2cb683851f3d58ecf9e49bcdf..f79621a4d87077b10f27ad468c88c95daa70ca86 100644
--- a/htdocs/compta/facture/mergepdftool.php
+++ b/htdocs/compta/facture/mergepdftool.php
@@ -590,13 +590,13 @@ if ($resql)
 		$formmail->withtoreadonly=1;
 		$formmail->withtocc=1;
 		$formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC;
-		$formmail->withtopic=$langs->transnoentities($topicmail, '__FACREF__', '__REFCLIENT__');
+		$formmail->withtopic=$langs->transnoentities($topicmail, '__REF__', '__REFCLIENT__');
 		$formmail->withfile=$langs->trans("EachInvoiceWillBeAttachedToEmail");
 		$formmail->withbody=1;
 		$formmail->withdeliveryreceipt=1;
 		$formmail->withcancel=1;
 		// Tableau des substitutions
-		//$formmail->substit['__FACREF__']='';
+		//$formmail->substit['__REF__']='';
 		$formmail->substit['__SIGNATURE__']=$user->signature;
 		//$formmail->substit['__REFCLIENT__']='';
 		$formmail->substit['__PERSONALIZED__']='';
diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php
index 5ddb0b343fa4fecb646c0c91c73d1a6a75b90861..e0d08dbc1fa7c1fe8e0c486d73ab8d808ddcdd63 100644
--- a/htdocs/contrat/card.php
+++ b/htdocs/contrat/card.php
@@ -830,7 +830,7 @@ if (empty($reshook))
 	            setEventMessages($object->error, $object->errors, 'errors');
 	        }
 	
-	        $result = $object->setValueFrom('ref',GETPOST('ref','alpha'));;
+	        $result = $object->setValueFrom('ref',GETPOST('ref','alpha'));
 	        if ($result < 0) {
 	            setEventMessages($object->error, $object->errors, 'errors');
 	            $action = 'editref';
@@ -843,6 +843,30 @@ if (empty($reshook))
 	        header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $id);
 	        exit;
 	    }
+	} 
+	elseif ($action=='setdate_contrat') 
+	{
+	    $cancelbutton = GETPOST('cancel');
+	
+	    if (!$cancelbutton) {
+	        $result = $object->fetch($id);
+	        if ($result < 0) {
+	            setEventMessages($object->error, $object->errors, 'errors');
+	        }
+			$datacontrat=dol_mktime(GETPOST('date_contrathour'), GETPOST('date_contratmin'), 0, GETPOST('date_contratmonth'), GETPOST('date_contratday'), GETPOST('date_contratyear'));
+	        $result = $object->setValueFrom('date_contrat',$datacontrat,'',null,'date');
+	        if ($result < 0) {
+	            setEventMessages($object->error, $object->errors, 'errors');
+	            $action = 'editdate_contrat';
+	        } else {
+	            header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id);
+	            exit;
+	        }
+	    }
+	    else {
+	        header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $id);
+	        exit;
+	    }
 	}
 	
 	// Generation doc (depuis lien ou depuis cartouche doc)
@@ -1278,8 +1302,15 @@ else
         print "</td></tr>";
 
         // Date
-        print '<tr><td>'.$langs->trans("Date").'</td>';
-        print '<td colspan="3">'.dol_print_date($object->date_contrat,"dayhour")."</td></tr>\n";
+        print '<tr>';
+		print '<td  width="20%">';
+		print $form->editfieldkey("Date",'date_contrat',$object->date_contrat,$object,$user->rights->contrat->creer);
+		print '</td><td>';
+		print $form->editfieldval("Date",'date_contrat',$object->date_contrat,$object,$user->rights->contrat->creer,'datehourpicker');
+		print '</td>';
+		print '</tr>';
+       /* print '<tr><td>'.$langs->trans("Date").'</td>';
+        print '<td colspan="3">'.dol_print_date($object->date_contrat,"dayhour")."</td></tr>\n";*/
 
         // Projet
         if (! empty($conf->projet->enabled))
diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php
index 6a397c1245ffaeeae6b99771eaf1ca40db204d21..399d148220c05286af2ccbdc98523bb5a7f787c9 100644
--- a/htdocs/core/class/extrafields.class.php
+++ b/htdocs/core/class/extrafields.class.php
@@ -1552,7 +1552,7 @@ class ExtraFields
 				{
 					$value_arr=GETPOST($keysuffix."options_".$key.$keyprefix);
 					// Make sure we get an array even if there's only one checkbox
-					$value_arr=(array)$value_arr
+					$value_arr=(array) $value_arr;
 					$value_key=implode(',', $value_arr);
 				}
 				else if (in_array($key_type,array('price','double')))
diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index 6b1eaa69aa3d233af9ea0789737d8aad00076fb7..18580c4b6cc3eff3b0a2f5f5cd5d34a975663411 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -77,7 +77,7 @@ class Form
      * @param   string	$preselected	Name of Value to show/edit (not used in this function)
      * @param	object	$object			Object
      * @param	boolean	$perm			Permission to allow button to edit parameter. Set it to 0 to have a not edited field.
-     * @param	string	$typeofdata		Type of data ('string' by default, 'email', 'numeric:99', 'text' or 'textarea:rows:cols', 'day' or 'datepicker', 'ckeditor:dolibarr_zzz:width:height:savemethod:1:rows:cols', 'select;xxx[:class]'...)
+     * @param	string	$typeofdata		Type of data ('string' by default, 'email', 'amount:99', 'numeric:99', 'text' or 'textarea:rows:cols', 'day' or 'datepicker', 'ckeditor:dolibarr_zzz:width:height:savemethod:1:rows:cols', 'select;xxx[:class]'...)
      * @param	string	$moreparam		More param to add on a href URL
      * @return	string					HTML edit field
      */
@@ -122,7 +122,7 @@ class Form
      * @param	string	$value			Value to show/edit
      * @param	object	$object			Object
      * @param	boolean	$perm			Permission to allow button to edit parameter
-     * @param	string	$typeofdata		Type of data ('string' by default, 'amount', 'email', 'numeric:99', 'text' or 'textarea:rows:cols', 'day' or 'datepicker', 'ckeditor:dolibarr_zzz:width:height:savemethod:toolbarstartexpanded:rows:cols', 'select:xxx'...)
+     * @param	string	$typeofdata		Type of data ('string' by default, 'email', 'amount:99', 'numeric:99', 'text' or 'textarea:rows:cols', 'day' or 'datepicker', 'ckeditor:dolibarr_zzz:width:height:savemethod:toolbarstartexpanded:rows:cols', 'select:xxx'...)
      * @param	string	$editvalue		When in edit mode, use this value as $value instead of value (for example, you can provide here a formated price instead of value). Use '' to use same than $value
      * @param	object	$extObject		External object
      * @param	mixed	$custommsg		String or Array of custom messages : eg array('success' => 'MyMessage', 'error' => 'MyMessage')
@@ -154,11 +154,16 @@ class Form
                 $ret.='<input type="hidden" name="id" value="'.$object->id.'">';
                 $ret.='<table class="nobordernopadding" cellpadding="0" cellspacing="0">';
                 $ret.='<tr><td>';
-                if (preg_match('/^(string|email|numeric|amount)/',$typeofdata))
+                if (preg_match('/^(string|email)/',$typeofdata))
                 {
                     $tmp=explode(':',$typeofdata);
                     $ret.='<input type="text" id="'.$htmlname.'" name="'.$htmlname.'" value="'.($editvalue?$editvalue:$value).'"'.($tmp[1]?' size="'.$tmp[1].'"':'').'>';
                 }
+                else if (preg_match('/^(numeric|amount)/',$typeofdata))
+                {
+                    $tmp=explode(':',$typeofdata);
+                    $ret.='<input type="text" id="'.$htmlname.'" name="'.$htmlname.'" value="'.price(price2num($editvalue?$editvalue:$value)).'"'.($tmp[1]?' size="'.$tmp[1].'"':'').'>';
+                }
                 else if (preg_match('/^text/',$typeofdata) || preg_match('/^note/',$typeofdata))
                 {
                     $tmp=explode(':',$typeofdata);
@@ -203,8 +208,8 @@ class Form
             }
             else
 			{
-				if ($typeofdata == 'email')   $ret.=dol_print_email($value,0,0,0,0,1);
-                elseif ($typeofdata == 'amount')   $ret.=($value != '' ? price($value,'',$langs,0,-1,-1,$conf->currency) : '');
+				if (preg_match('/^(email)/',$typeofdata))              $ret.=dol_print_email($value,0,0,0,0,1);
+                elseif (preg_match('/^(amount|numeric)/',$typeofdata)) $ret.=($value != '' ? price($value,'',$langs,0,-1,-1,$conf->currency) : '');
                 elseif (preg_match('/^text/',$typeofdata) || preg_match('/^note/',$typeofdata))  $ret.=dol_htmlentitiesbr($value);
                 elseif ($typeofdata == 'day' || $typeofdata == 'datepicker') $ret.=dol_print_date($value,'day');
                 elseif ($typeofdata == 'dayhour' || $typeofdata == 'datehourpicker') $ret.=dol_print_date($value,'dayhour');
@@ -477,6 +482,72 @@ class Form
         return $this->textwithtooltip($text, $htmltext, 2, $direction, $img, $extracss, $notabs, '', $noencodehtmltext);
     }
 
+    /**
+     * Generate select HTML to choose massaction
+     * 
+     * @param	string	$selected		Selected value
+     * @param	int		$arrayofaction	array('code'=>'label', ...)
+     * @return	string					Select list
+     */
+    function selectMassAction($selected, $arrayofaction)
+    {
+    	global $conf,$langs,$hookmanager;
+    	
+    	if (count($arrayofaction) == 0) return;
+    	
+    	$disabled=0;
+    	$ret='<div class="centpercent center"><select class="flat hideobject massaction massactionselect" name="massaction"'.($disabled?' disabled="disabled"':'').'>';
+    	$ret.='<option value="0"'.($disabled?' disabled="disabled"':'').'>-- '.$langs->trans("SelectAction").' --</option>';
+    	foreach($arrayofaction as $code => $label)
+    	{
+    		$ret.='<option value="'.$code.'"'.($disabled?' disabled="disabled"':'').'>'.$label.'</option>';
+    	}
+    	$ret.='</select>';
+    	$ret.='<input type="submit" name="confirmmassaction" disabled="disabled" class="button hideobject massaction massactionconfirmed" value="'.dol_escape_htmltag($langs->trans("Confirm")).'">';
+    	$ret.='</div>';
+    	
+    	$ret.='<!-- JS CODE TO ENABLE mass action select -->
+		<script type="text/javascript">
+    	jQuery(document).ready(function () {
+    		function initCheckForSelect()
+    		{
+    			atleastoneselected=0;
+	    		jQuery(".checkforselect").each(function( index ) {
+	  				/* console.log( index + ": " + $( this ).text() ); */
+	  				if ($(this).is(\':checked\')) atleastoneselected++;
+	  			});
+	  			console.log(atleastoneselected);
+	  			if (atleastoneselected)
+	  			{
+	  				jQuery(".massaction").show();
+	  			}
+	  			else
+	  			{
+	  				jQuery(".massaction").hide();
+	  			}
+    		}
+    		initCheckForSelect();
+    		jQuery(".checkforselect").click(function() {
+    			initCheckForSelect();
+	  		});
+	  		jQuery(".massactionselect").change(function() {
+	  			console.log( $( this ).val() );
+	  			if ($(this).val() != \'0\')
+	  			{
+	  				jQuery(".massactionconfirmed").prop(\'disabled\', false);
+	  			}
+	  			else
+	  			{
+	  				jQuery(".massactionconfirmed").prop(\'disabled\', true);
+	  			}
+	  		});
+    	});
+		</script>
+    	';
+    	
+    	return $ret;
+    }
+    
     /**
      *  Return combo list of activated countries, into language of user
      *
@@ -1261,10 +1332,11 @@ class Form
      *  @param	string	$show_every		0=default list, 1=add also a value "Everybody" at beginning of list
      *  @param	string	$enableonlytext	If option $enableonly is set, we use this text to explain into label why record is disabled. Not used if enableonly is empty.
      *  @param	string	$morecss		More css
+     *  @param  int     $noactive       Show only active users (this will also happened whatever is this option if USER_HIDE_INACTIVE_IN_COMBOBOX is on). 
      * 	@return	string					HTML select string
      *  @see select_dolgroups
      */
-    function select_dolusers($selected='', $htmlname='userid', $show_empty=0, $exclude='', $disabled=0, $include='', $enableonly='', $force_entity=0, $maxlength=0, $showstatus=0, $morefilter='', $show_every=0, $enableonlytext='', $morecss='')
+    function select_dolusers($selected='', $htmlname='userid', $show_empty=0, $exclude='', $disabled=0, $include='', $enableonly='', $force_entity=0, $maxlength=0, $showstatus=0, $morefilter='', $show_every=0, $enableonlytext='', $morecss='', $noactive=0)
     {
         global $conf,$user,$langs;
 
@@ -1324,7 +1396,7 @@ class Form
         if (! empty($user->societe_id)) $sql.= " AND u.fk_soc = ".$user->societe_id;
         if (is_array($exclude) && $excludeUsers) $sql.= " AND u.rowid NOT IN ('".$excludeUsers."')";
         if (is_array($include) && $includeUsers) $sql.= " AND u.rowid IN ('".$includeUsers."')";
-        if (! empty($conf->global->USER_HIDE_INACTIVE_IN_COMBOBOX)) $sql.= " AND u.statut <> 0";
+        if (! empty($conf->global->USER_HIDE_INACTIVE_IN_COMBOBOX) || $noactive) $sql.= " AND u.statut <> 0";
         if (! empty($morefilter)) $sql.=" ".$morefilter;
         $sql.= " ORDER BY u.lastname ASC";
 
@@ -2643,7 +2715,7 @@ class Form
      *      @param  int		$maxlength      Max length of label
      * 		@return	void
      */
-    function select_types_paiements($selected='',$htmlname='paiementtype',$filtertype='',$format=0, $empty=0, $noadmininfo=0,$maxlength=0)
+    function select_types_paiements($selected='', $htmlname='paiementtype', $filtertype='', $format=0, $empty=0, $noadmininfo=0, $maxlength=0)
     {
         global $langs,$user;
 
diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php
index 1f0cb5c6e284e5d9a5eef2294c31c373afc8e03e..c9e8ab7899d8641755efd58aeaa4ddc895f977c9 100644
--- a/htdocs/core/class/html.formmail.class.php
+++ b/htdocs/core/class/html.formmail.class.php
@@ -648,7 +648,7 @@ class FormMail extends Form
         			}
         			if ($this->param["models"]=='facture_send')
         			{
-        				$url=getPaypalPaymentUrl(0,'invoice',$this->substit['__FACREF__']);
+        				$url=getPaypalPaymentUrl(0,'invoice',$this->substit['__REF__']);
         				$this->substit['__PERSONALIZED__']=str_replace('\n',"\n",$langs->transnoentitiesnoconv("PredefinedMailContentLink",$url));
         			}
         		}
@@ -692,7 +692,7 @@ class FormMail extends Form
 						else $this->withfckeditor=0;
         			}
 
-        			$doleditor=new DolEditor('message',$defaultmessage,'',280,$this->ckeditortoolbar,'In',true,true,$this->withfckeditor,8,72);
+        			$doleditor=new DolEditor('message',$defaultmessage,'',280,$this->ckeditortoolbar,'In',true,true,$this->withfckeditor,8,'95%');
         			$out.= $doleditor->Create(1);
         		}
         		$out.= "</td></tr>\n";
diff --git a/htdocs/core/class/html.formprojet.class.php b/htdocs/core/class/html.formprojet.class.php
index b44a30dcd05cc38855746e2a1e073a36cd656e22..2b7f76dedf91c9dba8b8206c0b0dfde0dfbb9960 100644
--- a/htdocs/core/class/html.formprojet.class.php
+++ b/htdocs/core/class/html.formprojet.class.php
@@ -148,7 +148,7 @@ class FormProjets
 			if (! empty($conf->use_javascript_ajax))
 			{
 				include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
-	           	$comboenhancement = ajax_combobox($htmlname, '', 0, $forcefocus);
+	           	$comboenhancement = ajax_combobox($htmlname, array(), 0, $forcefocus);
             	$out.=$comboenhancement;
             	$nodatarole=($comboenhancement?' data-role="none"':'');
             	$minmax='minwidth100 maxwidth300';
diff --git a/htdocs/core/db/DoliDB.class.php b/htdocs/core/db/DoliDB.class.php
index f1909a91ea0bece10af35c3d2ad180b4dc8b2810..4103b095330eed10c770db1b27db8de154bf6748 100644
--- a/htdocs/core/db/DoliDB.class.php
+++ b/htdocs/core/db/DoliDB.class.php
@@ -221,7 +221,7 @@ abstract class DoliDB implements Database
 	 * Define sort criteria of request
 	 *
 	 * @param	string	$sortfield  List of sort fields, separated by comma. Example: 't1.fielda, t2.fieldb'
-	 * @param	string	$sortorder  Sort order
+	 * @param	'ASC'|'DESC'	$sortorder  Sort order
 	 * @return	string      		String to provide syntax of a sort sql string
 	 */
 	function order($sortfield=null,$sortorder=null)
@@ -236,9 +236,11 @@ abstract class DoliDB implements Database
 				else $return.=',';
 
 				$return.=preg_replace('/[^0-9a-z_\.]/i','',$val);
-				if (! empty($sortorder))
-				{
-					$return.=' '.preg_replace('/[^0-9a-z]/i','',$sortorder);
+				// Only ASC and DESC values are valid SQL
+				if ($sortorder === 'ASC') {
+					$return .= ' ASC';
+				} elseif ($sortorder === 'DESC') {
+					$return .= ' DESC';
 				}
 			}
 			return $return;
diff --git a/htdocs/core/js/lib_head.js b/htdocs/core/js/lib_head.js
index eab995d062b00372522e7091f16d34af66d1002b..ad799e72bd08a51cd417e9c83588e875ba2deb1b 100644
--- a/htdocs/core/js/lib_head.js
+++ b/htdocs/core/js/lib_head.js
@@ -864,8 +864,8 @@ function confirmConstantAction(action, url, code, input, box, entity, yesButton,
                 .addClass( "ui-widget ui-widget-content ui-corner-left dolibarrcombobox" );
 
             input.data("ui-autocomplete")._renderItem = function( ul, item ) {
-                return $("<li></li>")
-                    .data( "item.autocomplete", item )
+                return $("<li>")
+                    .data( "ui-autocomplete-item", item ) // jQuery UI > 1.10.0
                     .append( "<a>" + item.label + "</a>" )
                     .appendTo( ul );
             };
diff --git a/htdocs/core/lib/ajax.lib.php b/htdocs/core/lib/ajax.lib.php
index 44de58ed4a8e64bbf675a9afc71023464d9e998a..fa150e6fbb735d2619d8c45c395b61a51e43758a 100644
--- a/htdocs/core/lib/ajax.lib.php
+++ b/htdocs/core/lib/ajax.lib.php
@@ -170,8 +170,8 @@ function ajax_autocompleter($selected, $htmlname, $url, $urloption='', $minLengt
     					}
     					,delay: 500
 					}).data("ui-autocomplete")._renderItem = function( ul, item ) {
-						return $("<li></li>")
-						.data( "item.autocomplete", item )
+						return $("<li>")
+						.data( "ui-autocomplete-item", item ) // jQuery UI > 1.10.0
 						.append( \'<a><span class="tag">\' + item.label + "</span></a>" )
 						.appendTo(ul);
 					};
diff --git a/htdocs/core/lib/product.lib.php b/htdocs/core/lib/product.lib.php
index 5ca0389455f31daab64e2d06771c6f8ec6b9bb73..73c74cfb97e5868b403f07c15cfc9776a1bf8de3 100644
--- a/htdocs/core/lib/product.lib.php
+++ b/htdocs/core/lib/product.lib.php
@@ -1,5 +1,5 @@
 <?php
-/* Copyright (C) 2006-2008  Laurent Destailleur     <eldy@users.sourceforge.net>
+/* Copyright (C) 2006-2015  Laurent Destailleur     <eldy@users.sourceforge.net>
  * Copyright (C) 2007       Rodolphe Quiedeville    <rodolphe@quiedeville.org>
  * Copyright (C) 2009-2010  Regis Houssin           <regis.houssin@capnetworks.com>
  * Copyright (C) 2015       Raphaël Doursenaud      <rdoursenaud@gpcsolutions.fr>
@@ -46,14 +46,16 @@ function product_prepare_head($object)
 	$h++;
 
 	$head[$h][0] = DOL_URL_ROOT."/product/price.php?id=".$object->id;
-	$head[$h][1] = $langs->trans("CustomerPrices");
+	$head[$h][1] = $langs->trans("SellingPrices");
 	$head[$h][2] = 'price';
 	$h++;
 
-	if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->lire)
+	if ((! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->lire)
+	|| (! empty($conf->margin->enabled) && $user->rights->margin->liretous)
+	)
 	{
 		$head[$h][0] = DOL_URL_ROOT."/product/fournisseurs.php?id=".$object->id;
-		$head[$h][1] = $langs->trans("SuppliersPrices");
+		$head[$h][1] = $langs->trans("BuyingPrices");
 		$head[$h][2] = 'suppliers';
 		$h++;
 	}
diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php
index 0569e90d903c537db4480b5e1277a610472e91fd..97bea63e43653ee3adc7fabf4c280736aa682bf5 100644
--- a/htdocs/core/lib/project.lib.php
+++ b/htdocs/core/lib/project.lib.php
@@ -874,11 +874,11 @@ function searchTaskInChild(&$inc, $parent, &$lines, &$taskrole)
  * @param	DoliDB	$db					Database handler
  * @param	Form	$form				Object form
  * @param   int		$socid				Id thirdparty
- * @param   int		$projectsListId     Id of project i have permission on
- * @param   int		$mytasks            Limited to task i am contact to
+ * @param   int		$projectsListId     Id of project I have permission on
+ * @param   int		$mytasks            Limited to task I am contact to
  * @param	int		$statut				-1=No filter on statut, 0 or 1 = Filter on status
  * @param	array	$listofoppstatus	List of opportunity status
- * @param   array   $hiddenfields       List of fields to not show
+ * @param   array   $hiddenfields       List of info to not show ('projectlabel', 'declaredprogress', '...', )
  * @return	void
  */
 function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks=0, $statut=-1, $listofoppstatus=array(),$hiddenfields=array())
@@ -993,7 +993,7 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks=
     	if (empty($conf->global->PROJECT_HIDE_TASKS)) 
     	{
             print_liste_field_titre($langs->trans("Tasks"),"","","","",'align="right"',$sortfield,$sortorder);
-            print_liste_field_titre($langs->trans("PlannedWorkload"),"","","","",'align="right"',$sortfield,$sortorder);
+            if (! in_array('plannedworkload', $hiddenfields))  print_liste_field_titre($langs->trans("PlannedWorkload"),"","","","",'align="right"',$sortfield,$sortorder);
             if (! in_array('declaredprogress', $hiddenfields)) print_liste_field_titre($langs->trans("ProgressDeclared"),"","","","",'align="right"',$sortfield,$sortorder);
     	}
     	print_liste_field_titre($langs->trans("Status"),"","","","",'align="right"',$sortfield,$sortorder);
@@ -1016,7 +1016,7 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks=
 				print '<td>';
 				$projectstatic->ref=$objp->ref;
 				print $projectstatic->getNomUrl(1);
-				print ' - '.dol_trunc($objp->title,24);
+				if (! in_array('projectlabel', $hiddenfields)) print ' - '.dol_trunc($objp->title,24);
 				print '</td>';
 				print '<td>';
 				if ($objp->fk_soc > 0)
@@ -1044,8 +1044,10 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks=
     	       
     				$plannedworkload=$objp->planned_workload;
     				$total_plannedworkload+=$plannedworkload;
-    				print '<td align="right">'.($plannedworkload?convertSecondToTime($plannedworkload):'').'</td>';
-    
+    				if (! in_array('plannedworkload', $hiddenfields))
+    				{
+    				    print '<td align="right">'.($plannedworkload?convertSecondToTime($plannedworkload):'').'</td>';
+    				}
     				if (! in_array('declaredprogress', $hiddenfields)) 
     				{
     				    $declaredprogressworkload=$objp->declared_progess_workload;
@@ -1073,12 +1075,12 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks=
 		if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES))
 		{
 			print '<td class="liste_total" align="right">'.price($total_opp_amount, 0, '', 1, -1, -1, $conf->currency).'</td>';
-			print '<td class="liste_total" align="right">'.$form->textwithpicto(price($ponderated_opp_amount, 0, '', 1, -1, -1, $conf->currency), $langs->trans("OpportunityPonderatedAmount"), 1).'</td>';
+			print '<td class="liste_total" align="right">'.$form->textwithpicto(price($ponderated_opp_amount, 0, '', 1, -1, -1, $conf->currency), $langs->trans("OpportunityPonderatedAmountDesc"), 1).'</td>';
 		}
 		if (empty($conf->global->PROJECT_HIDE_TASKS)) 
 		{
             print '<td class="liste_total" align="right">'.$total_task.'</td>';
-            print '<td class="liste_total" align="right">'.($total_plannedworkload?convertSecondToTime($total_plannedworkload):'').'</td>';
+            if (! in_array('plannedworkload', $hiddenfields))  print '<td class="liste_total" align="right">'.($total_plannedworkload?convertSecondToTime($total_plannedworkload):'').'</td>';
             if (! in_array('declaredprogress', $hiddenfields)) print '<td class="liste_total" align="right">'.($total_plannedworkload?round(100*$total_declaredprogressworkload/$total_plannedworkload,0).'%':'').'</td>';
 		}
 		print '<td class="liste_total"></td>';
diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql
index cfb5348c4c95499cb05e99de9de58c5c1d8d50d1..6e21ae19c0f76ca9d7a73e4ca604c807981b4e68 100644
--- a/htdocs/core/menus/init_menu_auguria.sql
+++ b/htdocs/core/menus/init_menu_auguria.sql
@@ -304,11 +304,13 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->hrm->enabled', __HANDLER__, 'left', 4601__+MAX_llx_menu__, 'hrm', '', 4600__+MAX_llx_menu__, '/user/card.php?&action=create', 'NewEmployee', 1, 'hrm', '$user->rights->hrm->employee->write', '', 0, 1, __ENTITY__);
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->hrm->enabled', __HANDLER__, 'left', 4602__+MAX_llx_menu__, 'hrm', '', 4600__+MAX_llx_menu__, '/user/index.php?$leftmenu=hrm&mode=employee', 'List', 1, 'hrm', '$user->rights->hrm->employee->read', '', 0, 2, __ENTITY__);
 -- HRM - Holiday
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5000__+MAX_llx_menu__, 'hrm', 'hrm', 15__+MAX_llx_menu__, '/holiday/list.php?&leftmenu=hrm', 'CPTitreMenu', 0, 'holiday', '$user->rights->holiday->write', '', 0, 1, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5000__+MAX_llx_menu__, 'hrm', 'hrm', 15__+MAX_llx_menu__, '/holiday/list.php?&leftmenu=hrm', 'CPTitreMenu', 0, 'holiday', '$user->rights->holiday->read', '', 0, 1, __ENTITY__);
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5001__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/card.php?&action=request', 'MenuAddCP', 1, 'holiday', '$user->rights->holiday->write', '', 0, 1, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5002__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/define_holiday.php?&action=request', 'MenuConfCP', 1, 'holiday', '$user->rights->holiday->define_holiday', '', 0, 2, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5003__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/view_log.php?&action=request', 'MenuLogCP', 1, 'holiday', '$user->rights->holiday->view_log', '', 0, 3, __ENTITY__);
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5004__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/month_report.php?&action=request', 'MenuReportMonth', 1, 'holiday', '$user->rights->holiday->month_report', '', 0, 4, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5002__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/list.php?&leftmenu=hrm', 'List', 1, 'holiday', '$user->rights->holiday->read', '', 0, 1, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5003__+MAX_llx_menu__, 'hrm', '', 5002__+MAX_llx_menu__, '/holiday/list.php?select_statut=2&leftmenu=hrm', 'ListToApprove', 2, 'trips', '$user->rights->holiday->read', '', 0, 1, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5004__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/define_holiday.php?&action=request', 'MenuConfCP', 1, 'holiday', '$user->rights->holiday->define_holiday', '', 0, 2, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5005__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/view_log.php?&action=request', 'MenuLogCP', 1, 'holiday', '$user->rights->holiday->define_holiday', '', 0, 3, __ENTITY__);
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5006__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/month_report.php?&action=request', 'MenuReportMonth', 1, 'holiday', '$user->rights->holiday->define_holiday', '', 0, 4, __ENTITY__);
 -- HRM - Expense reports
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->deplacement->enabled', __HANDLER__, 'left', 2100__+MAX_llx_menu__, 'accountancy', 'tripsandexpenses', 15__+MAX_llx_menu__, '/compta/deplacement/index.php?leftmenu=tripsandexpenses', 'TripsAndExpenses', 0, 'trips', '$user->rights->deplacement->lire', '', 0, 5, __ENTITY__);
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->deplacement->enabled', __HANDLER__, 'left', 2101__+MAX_llx_menu__, 'accountancy', '', 2100__+MAX_llx_menu__, '/compta/deplacement/card.php?action=create&amp;leftmenu=tripsandexpenses', 'New', 1, 'trips', '$user->rights->deplacement->creer', '', 0, 1, __ENTITY__);
diff --git a/htdocs/core/modules/mailings/fraise.modules.php b/htdocs/core/modules/mailings/fraise.modules.php
index 2716bdc1e4ca704c1854ae49cb78b74208682c40..ca9f2b11f0dc88ca0c343351c2d018b014b2ad76 100644
--- a/htdocs/core/modules/mailings/fraise.modules.php
+++ b/htdocs/core/modules/mailings/fraise.modules.php
@@ -28,16 +28,16 @@ include_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
 
 
 /**
- *	Class to generate target according to rule Fraise
+ *    Class to generate target according to rule Fraise
  */
 class mailing_fraise extends MailingTargets
 {
-	// CHANGE THIS: Put here a name not already used
-	var $name='FundationMembers';                    // Identifiant du module mailing
-	// CHANGE THIS: Put here a description of your selector module.
-	// This label is used if no translation found for key MailingModuleDescXXX where XXX=name is found
+    // CHANGE THIS: Put here a name not already used
+    var $name='FundationMembers';                    // Identifiant du module mailing
+    // CHANGE THIS: Put here a description of your selector module.
+    // This label is used if no translation found for key MailingModuleDescXXX where XXX=name is found
     var $desc='Foundation members with emails (by status)';
-	// CHANGE THIS: Set to 1 if selector is available for admin users only
+    // CHANGE THIS: Set to 1 if selector is available for admin users only
     var $require_admin=0;
 
     var $require_module=array('adherent');
@@ -46,11 +46,11 @@ class mailing_fraise extends MailingTargets
     var $db;
 
 
-	/**
-	 *	Constructor
-	 *
-	 *  @param		DoliDB		$db      Database handler
-	 */
+    /**
+     *    Constructor
+     *
+     *  @param        DoliDB        $db      Database handler
+     */
     function __construct($db)
     {
         $this->db=$db;
@@ -58,37 +58,37 @@ class mailing_fraise extends MailingTargets
 
 
     /**
-	 *	On the main mailing area, there is a box with statistics.
-	 *	If you want to add a line in this report you must provide an
-	 *	array of SQL request that returns two field:
-	 *	One called "label", One called "nb".
-	 *
-	 *	@return		string[]		Array with SQL requests
-	 */
+     *    On the main mailing area, there is a box with statistics.
+     *    If you want to add a line in this report you must provide an
+     *    array of SQL request that returns two field:
+     *    One called "label", One called "nb".
+     *
+     *    @return        array        Array with SQL requests
+     */
     function getSqlArrayForStats()
-	{
+    {
         global $langs;
 
         $langs->load("members");
 
-		// Array for requests for statistics board
-	    $statssql=array();
+        // Array for requests for statistics board
+        $statssql=array();
 
         $statssql[0] ="SELECT '".$this->db->escape($langs->trans("FundationMembers"))."' as label, count(*) as nb";
-		$statssql[0].=" FROM ".MAIN_DB_PREFIX."adherent where statut = 1";
+        $statssql[0].=" FROM ".MAIN_DB_PREFIX."adherent where statut = 1";
 
-		return $statssql;
-	}
+        return $statssql;
+    }
 
 
     /**
-	 *	Return here number of distinct emails returned by your selector.
-	 *	For example if this selector is used to extract 500 different
-	 *	emails from a text file, this function must return 500.
-	 *
-	 *  @param		string		$sql		Requete sql de comptage
-	 *	@return		int						Nb of recipients
-	 */
+     *    Return here number of distinct emails returned by your selector.
+     *    For example if this selector is used to extract 500 different
+     *    emails from a text file, this function must return 500.
+     *
+     *  @param    string    $sql        Requete sql de comptage
+     *    @return        int            Nb of recipients
+     */
     function getNbOfRecipients($sql='')
     {
         $sql  = "SELECT count(distinct(a.email)) as nb";
@@ -108,7 +108,7 @@ class mailing_fraise extends MailingTargets
      */
     function formFilter()
     {
-        global $langs;
+        global $conf, $langs;
         $langs->load("members");
 
         $form=new Form($this->db);
@@ -121,6 +121,36 @@ class mailing_fraise extends MailingTargets
         $s.='<option value="1a">'.$langs->trans("MemberStatusActiveShort").' ('.$langs->trans("MemberStatusPaidShort").')</option>';
         $s.='<option value="1b">'.$langs->trans("MemberStatusActiveShort").' ('.$langs->trans("MemberStatusActiveLateShort").')</option>';
         $s.='<option value="0">'.$langs->trans("MemberStatusResiliatedShort").'</option>';
+        $s.='</select> ';
+        $s.=$langs->trans("Type").': ';
+        $s.='<select name="filter" class="flat">';
+        $sql = "SELECT rowid, libelle, statut";
+        $sql.= " FROM ".MAIN_DB_PREFIX."adherent_type";
+        $sql.= " WHERE entity = ".$conf->entity;
+        $sql.= " ORDER BY rowid";
+        $resql = $this->db->query($sql);
+        if ($resql)
+        {
+            $num = $this->db->num_rows($resql);
+
+            $s.='<option value="0">&nbsp;</option>';
+            if (! $num) $s.='<option value="0" disabled="disabled">'.$langs->trans("NoCategoriesDefined").'</option>';
+
+            $i = 0;
+            while ($i < $num)
+            {
+                $obj = $this->db->fetch_object($resql);
+
+                $s.='<option value="'.$obj->rowid.'">'.dol_trunc($obj->libelle,38,'middle');
+                $s.='</option>';
+                $i++;
+            }
+        }
+        else
+        {
+            dol_print_error($this->db);
+        }
+
         $s.='</select>';
         $s.='<br>';
         $s.=$langs->trans("DateEndSubscription").': &nbsp;';
@@ -135,7 +165,7 @@ class mailing_fraise extends MailingTargets
     /**
      *  Renvoie url lien vers fiche de la source du destinataire du mailing
      *
-     *  @param	int		$id		ID
+     *  @param    int        $id        ID
      *  @return     string      Url lien
      */
     function url($id)
@@ -147,9 +177,9 @@ class mailing_fraise extends MailingTargets
     /**
      *  Ajoute destinataires dans table des cibles
      *
-     *  @param	int		$mailing_id    	Id of emailing
-     *  @param  array	$filtersarray   Param to filter sql request. Deprecated. Should use $_POST instead.
-     *  @return int           			< 0 si erreur, nb ajout si ok
+     *  @param    int        $mailing_id        Id of emailing
+     *  @param  array    $filtersarray   Param to filter sql request. Deprecated. Should use $_POST instead.
+     *  @return int                       < 0 si erreur, nb ajout si ok
      */
     function add_to_target($mailing_id,$filtersarray=array())
     {
@@ -162,7 +192,7 @@ class mailing_fraise extends MailingTargets
 		$langs->load("members");
         $langs->load("companies");
 
-    	$cibles = array();
+        $cibles = array();
         $now=dol_now();
 
         $dateendsubscriptionafter=dol_mktime($_POST['subscriptionafterhour'],$_POST['subscriptionaftermin'],$_POST['subscriptionaftersec'],$_POST['subscriptionaftermonth'],$_POST['subscriptionafterday'],$_POST['subscriptionafteryear']);
@@ -171,8 +201,8 @@ class mailing_fraise extends MailingTargets
         // La requete doit retourner: id, email, fk_contact, name, firstname
         $sql = "SELECT a.rowid as id, a.email as email, null as fk_contact, ";
         $sql.= " a.lastname, a.firstname,";
-        $sql.= " a.datefin, a.civility as civility_id, a.login, a.societe";	// Other fields
-        $sql.= " FROM ".MAIN_DB_PREFIX."adherent as a";
+        $sql.= " a.datefin, a.civility as civility_id, a.login, a.societe";    // Other fields
+        $sql.= " FROM ".MAIN_DB_PREFIX."adherent as a, ".MAIN_DB_PREFIX."adherent_type as ta";
         $sql.= " WHERE a.email <> ''";     // Note that null != '' is false
         $sql.= " AND a.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")";
         if (isset($_POST["filter"]) && $_POST["filter"] == '-1') $sql.= " AND a.statut=-1";
@@ -181,6 +211,8 @@ class mailing_fraise extends MailingTargets
         if (isset($_POST["filter"]) && $_POST["filter"] == '0')  $sql.= " AND a.statut=0";
         if ($dateendsubscriptionafter > 0)  $sql.=" AND datefin > '".$this->db->idate($dateendsubscriptionafter)."'";
         if ($dateendsubscriptionbefore > 0) $sql.=" AND datefin < '".$this->db->idate($dateendsubscriptionbefore)."'";
+        $sql.= " AND a.fk_adherent_type = ta.rowid";
+        if ($_POST['filter']) $sql.= " AND ta.rowid='".$_POST['filter']."'";
         $sql.= " ORDER BY a.email";
         //print $sql;
 
@@ -202,11 +234,11 @@ class mailing_fraise extends MailingTargets
                 if ($old <> $obj->email)
                 {
                     $cibles[$j] = array(
-                    			'email' => $obj->email,
-                    			'fk_contact' => $obj->fk_contact,
-                    			'lastname' => $obj->lastname,
-                    			'firstname' => $obj->firstname,
-                    			'other' =>
+                                'email' => $obj->email,
+                                'fk_contact' => $obj->fk_contact,
+                                'lastname' => $obj->lastname,
+                                'firstname' => $obj->firstname,
+                                'other' =>
                                 ($langs->transnoentities("Login").'='.$obj->login).';'.
                                 ($langs->transnoentities("UserTitle").'='.($obj->civility_id?$langs->transnoentities("Civility".$obj->civility_id):'')).';'.
                                 ($langs->transnoentities("DateEnd").'='.dol_print_date($this->db->jdate($obj->datefin),'day')).';'.
@@ -214,7 +246,7 @@ class mailing_fraise extends MailingTargets
                                 'source_url' => $this->url($obj->id),
                                 'source_id' => $obj->id,
                                 'source_type' => 'member'
-                    			);
+                                );
                     $old = $obj->email;
                     $j++;
                 }
@@ -230,7 +262,6 @@ class mailing_fraise extends MailingTargets
         }
 
         return parent::add_to_target($mailing_id, $cibles);
-	}
+    }
 
 }
-
diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php
index 9dd3577b91d84418d19e5fcd2efefda9383d2b17..403f1411dc84f30183583e64df231aa9e49ecc03 100644
--- a/htdocs/fichinter/card.php
+++ b/htdocs/fichinter/card.php
@@ -6,6 +6,7 @@
  * Copyright (C) 2013       Florian Henry           <florian.henry@open-concept.pro>
  * Copyright (C) 2014-2015  Ferran Marcet           <fmarcet@2byte.es>
  * Copyright (C) 201		Charlie Benke           <charlies@patas-monkey.com>
+ * Copyright (C) 2015       Abbes Bahfir            <bafbes@gmail.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
@@ -466,8 +467,8 @@ if (empty($reshook))
 	// Add line
 	else if ($action == "addline" && $user->rights->ficheinter->creer)
 	{
-		if (!GETPOST('np_desc'))
-		{
+		if (!GETPOST('np_desc') && empty($conf->global->FICHINTER_EMPTY_LINE_DESC) )
+ 		{
 			$mesg='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Description")).'</div>';
 			$error++;
 		}
@@ -1566,16 +1567,18 @@ else if ($id > 0 || ! empty($ref))
 
 				$var=true;
 
-				print '<tr '.$bcnd[$var].">\n";
-				print '<td>';
-				// editeur wysiwyg
-				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
-				$doleditor=new DolEditor('np_desc',GETPOST('np_desc','alpha'),'',100,'dolibarr_details','',false,true,$conf->global->FCKEDITOR_ENABLE_DETAILS,ROWS_2,70);
-				$doleditor->Create();
-				print '</td>';
-
-				// Date intervention
-				print '<td align="center" class="nowrap">';
+				print '<tr '.$bcnd[$var] . ">\n";
+                print '<td>';
+                // editeur wysiwyg
+                if (empty($conf->global->FICHINTER_EMPTY_LINE_DESC)) {
+                    require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php';
+                    $doleditor = new DolEditor('np_desc', GETPOST('np_desc', 'alpha'), '', 100, 'dolibarr_details', '', false, true, $conf->global->FCKEDITOR_ENABLE_DETAILS, ROWS_2, 70);
+                    $doleditor->Create();
+                }
+                print '</td>';
+
+                // Date intervention
+                print '<td align="center" class="nowrap">';
 				$now=dol_now();
 				$timearray=dol_getdate($now);
 				if (! GETPOST('diday','int')) $timewithnohour=dol_mktime(0,0,0,$timearray['mon'],$timearray['mday'],$timearray['year']);
diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php
index d73447876234bffa8ffb2a7e4ccd748ee662fb2c..424f9ad65d4e7bc68bc73e2d843a9196dabff5c7 100644
--- a/htdocs/fourn/class/fournisseur.product.class.php
+++ b/htdocs/fourn/class/fournisseur.product.class.php
@@ -353,7 +353,7 @@ class ProductFournisseur extends Product
     function fetch_product_fournisseur_price($rowid, $ignore_expression = 0)
     {
         $sql = "SELECT pfp.rowid, pfp.price, pfp.quantity, pfp.unitprice, pfp.remise_percent, pfp.remise, pfp.tva_tx, pfp.fk_availability,";
-        $sql.= " pfp.fk_soc, pfp.ref_fourn, pfp.fk_product, pfp.charges, pfp.unitcharges, pfp.fk_supplier_price_expression, pfp.delivery_time_days"; // , pfp.recuperableonly as fourn_tva_npr";  FIXME this field not exist in llx_product_fournisseur_price
+        $sql.= " pfp.fk_soc, pfp.ref_fourn, pfp.fk_product, pfp.charges, pfp.cost_price, pfp.unitcharges, pfp.fk_supplier_price_expression, pfp.delivery_time_days"; // , pfp.recuperableonly as fourn_tva_npr";  FIXME this field not exist in llx_product_fournisseur_price
         $sql.= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price as pfp";
         $sql.= " WHERE pfp.rowid = ".$rowid;
 
@@ -368,12 +368,12 @@ class ProductFournisseur extends Product
             	$this->fourn_ref				= $obj->ref_fourn; // deprecated
 	            $this->ref_supplier             = $obj->ref_fourn;
             	$this->fourn_price				= $obj->price;
-            	$this->fourn_charges            = $obj->charges;
+            	$this->fourn_charges            = $obj->charges;	// deprecated
             	$this->fourn_qty                = $obj->quantity;
             	$this->fourn_remise_percent     = $obj->remise_percent;
             	$this->fourn_remise             = $obj->remise;
             	$this->fourn_unitprice          = $obj->unitprice;
-            	$this->fourn_unitcharges        = $obj->unitcharges;
+            	$this->fourn_unitcharges        = $obj->unitcharges;	// deprecated
             	$this->fourn_tva_tx					= $obj->tva_tx;
             	$this->product_id				= $obj->fk_product;	// deprecated
             	$this->fk_product				= $obj->fk_product;
@@ -456,9 +456,9 @@ class ProductFournisseur extends Product
                 $prodfourn->fourn_qty				= $record["quantity"];
 				$prodfourn->fourn_remise_percent	= $record["remise_percent"];
 				$prodfourn->fourn_remise			= $record["remise"];
-                $prodfourn->fourn_unitprice			= $record["unitprice"];
-				$prodfourn->fourn_charges           = $record["charges"];
-				$prodfourn->fourn_unitcharges       = $record["unitcharges"];
+				$prodfourn->fourn_unitprice			= $record["unitprice"];
+				$prodfourn->fourn_charges           = $record["charges"];		// deprecated
+				$prodfourn->fourn_unitcharges       = $record["unitcharges"];	// deprecated
                 $prodfourn->fourn_tva_tx			= $record["tva_tx"];
                 $prodfourn->fourn_id				= $record["fourn_id"];
                 $prodfourn->fourn_name				= $record["supplier_name"];
@@ -591,8 +591,8 @@ class ProductFournisseur extends Product
                         $this->fourn_remise_percent     = $record["remise_percent"];
                         $this->fourn_remise             = $record["remise"];
                         $this->fourn_unitprice          = $fourn_unitprice;
-                        $this->fourn_charges            = $record["charges"];
-                        $this->fourn_unitcharges        = $record["unitcharges"];
+                        $this->fourn_charges            = $record["charges"];		// deprecated
+                        $this->fourn_unitcharges        = $record["unitcharges"];	// deprecated
                         $this->fourn_tva_tx             = $record["tva_tx"];
                         $this->fourn_id                 = $record["fourn_id"];
                         $this->fourn_name               = $record["supplier_name"];
diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php
index fe6582fd35573e41f54f772b66c84663c97cd1df..82cdbe03b643f0a16252841ffa7f5654fbf04233 100644
--- a/htdocs/fourn/facture/card.php
+++ b/htdocs/fourn/facture/card.php
@@ -2338,13 +2338,13 @@ else
 			$formmail->withto=GETPOST("sendto")?GETPOST("sendto"):$liste;
 			$formmail->withtocc=$liste;
             $formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC;
-            $formmail->withtopic=$outputlangs->trans('SendBillRef','__FACREF__');
+            $formmail->withtopic=$outputlangs->trans('SendBillRef','__REF__');
             $formmail->withfile=2;
             $formmail->withbody=1;
             $formmail->withdeliveryreceipt=1;
             $formmail->withcancel=1;
             // Tableau des substitutions
-            $formmail->substit['__FACREF__']=$object->ref;
+            $formmail->substit['__REF__']=$object->ref;
             $formmail->substit['__SIGNATURE__']=$user->signature;
             $formmail->substit['__PERSONALIZED__']='';
             $formmail->substit['__CONTACTCIVNAME__']='';
diff --git a/htdocs/holiday/card.php b/htdocs/holiday/card.php
index d9200363f6dae1b72a9b47f38195d085c2848cbe..8a576250e79a7bbde4c1dd8e5c82f77b2c0376ab 100644
--- a/htdocs/holiday/card.php
+++ b/htdocs/holiday/card.php
@@ -130,12 +130,18 @@ if ($action == 'create')
 	    // If no validator designated
 	    if ($valideur < 1)
 	    {
-	        header('Location: card.php?action=request&error=Valideur');
-	        exit;
+	        setEventMessage($langs->transnoentitiesnoconv('InvalidValidatorCP'), 'errors');
+	        $error++;
 	    }
 
 	    $result = 0;
-	    
+
+        if ($type < 1)
+	    {
+	        setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Type")), 'errors');
+	        $error++;
+	    }
+
 	    if (! $error)
 	    {
     	    $cp->fk_user = $userid;
@@ -150,7 +156,7 @@ if ($action == 'create')
 	    }
 	    
 	    // If no SQL error we redirect to the request card
-	    if ($result > 0)
+	    if (! $error && $result > 0)
 	    {
 			$db->commit();
 
@@ -160,10 +166,6 @@ if ($action == 'create')
 	    else
 		{
 	    	$db->rollback();
-
-	        // Otherwise we display the request form with the SQL error message
-	        header('Location: card.php?action=request');
-	        exit;
 	    }
     }
 }
@@ -813,6 +815,7 @@ if (empty($id) || $action == 'add' || $action == 'request' || $action == 'create
 			$arraytypeleaves[$val['rowid']]=$labeltoshow;
         }
         print $form->selectarray('type', $arraytypeleaves, (GETPOST('type')?GETPOST('type'):''), 1);
+        if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1);
         print '</td>';
         print '</tr>';
 
@@ -821,10 +824,10 @@ if (empty($id) || $action == 'add' || $action == 'request' || $action == 'create
         print '<td class="fieldrequired">'.$langs->trans("DateDebCP").' ('.$langs->trans("FirstDayOfHoliday").')</td>';
         print '<td>';
         // Si la demande ne vient pas de l'agenda
-        if(!isset($_GET['datep'])) {
+        if (! GETPOST('date_debut_')) {
             $form->select_date(-1,'date_debut_');
         } else {
-            $tmpdate = dol_mktime(0, 0, 0, GETPOST('datepmonth'), GETPOST('datepday'), GETPOST('datepyear'));
+            $tmpdate = dol_mktime(0, 0, 0, GETPOST('date_debut_month'), GETPOST('date_debut_day'), GETPOST('date_debut_year'));
             $form->select_date($tmpdate,'date_debut_');
         }
         print ' &nbsp; &nbsp; ';
@@ -837,10 +840,10 @@ if (empty($id) || $action == 'add' || $action == 'request' || $action == 'create
         print '<td class="fieldrequired">'.$langs->trans("DateFinCP").' ('.$langs->trans("LastDayOfHoliday").')</td>';
         print '<td>';
         // Si la demande ne vient pas de l'agenda
-        if(!isset($_GET['datep'])) {
+        if (! GETPOST('date_fin_')) {
             $form->select_date(-1,'date_fin_');
         } else {
-            $tmpdate = dol_mktime(0, 0, 0, GETPOST('datefmonth'), GETPOST('datefday'), GETPOST('datefyear'));
+            $tmpdate = dol_mktime(0, 0, 0, GETPOST('date_fin_month'), GETPOST('date_fin_day'), GETPOST('date_fin_year'));
             $form->select_date($tmpdate,'date_fin_');
         }
         print ' &nbsp; &nbsp; ';
@@ -857,7 +860,7 @@ if (empty($id) || $action == 'add' || $action == 'request' || $action == 'create
         $valideurarray = array();
         foreach($valideurobjects as $val) $valideurarray[$val->id]=$val->id;
         print '<td>';
-        print $form->select_dolusers($user->fk_user, "valideur", 1, "", 0, $valideurarray);	// By default, hierarchical parent
+        print $form->select_dolusers((GETPOST('valideur')>0?GETPOST('valideur'):$user->fk_user), "valideur", 1, "", 0, $valideurarray, 0, 0, 0, 0, '', 0, '', '', 1);	// By default, hierarchical parent
         print '</td>';
         print '</tr>';
 
@@ -984,7 +987,6 @@ else
 
                 $head=holiday_prepare_head($cp);
 
-                dol_fiche_head($head,'card',$langs->trans("CPTitreMenu"),0,'holiday');
 
                 if ($action == 'edit' && $cp->statut == 1)
                 {
@@ -994,6 +996,8 @@ else
                     print '<input type="hidden" name="holiday_id" value="'.$id.'" />'."\n";
                 }
 
+                dol_fiche_head($head,'card',$langs->trans("CPTitreMenu"),0,'holiday');
+                
                 print '<table class="border" width="100%">';
                 print '<tbody>';
 
@@ -1168,19 +1172,20 @@ else
                 print '</tbody>';
                 print '</table>';
 
+                dol_fiche_end();
+                
                 if ($action == 'edit' && $cp->statut == 1)
                 {
-                    print '<br><div align="center">';
+                    print '<div align="center">';
                     if ($canedit && $cp->statut == 1)
                     {
-                        print '<input type="submit" value="'.$langs->trans("UpdateButtonCP").'" class="button">';
+                        print '<input type="submit" value="'.$langs->trans("Save").'" class="button">';
                     }
                     print '</div>';
 
                     print '</form>';
                 }
 
-                dol_fiche_end();
 
                 if (! $edit)
                 {
diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php
index 5c6829734afef727f4c6fd35e63621d90a28b40d..1c82288973e5bbbc3ea87bdb248d93feb3bfd3b7 100644
--- a/htdocs/holiday/list.php
+++ b/htdocs/holiday/list.php
@@ -419,7 +419,7 @@ if (! empty($holiday->holiday))
 if($holiday_payes == '2')
 {
     print '<tr>';
-    print '<td colspan="9" '.$bc[false].'">'.$langs->trans('None').'</td>';
+    print '<td colspan="10" '.$bc[false].'">'.$langs->trans('None').'</td>';
     print '</tr>';
 }
 
diff --git a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql
index cf3aa3fdf98aec87e890e465be4e2b39b941aea9..767a7dd0e7a3e166dce57ae67e799ec872181a66 100755
--- a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql
+++ b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql
@@ -101,6 +101,8 @@ ALTER TABLE llx_commande ADD COLUMN fk_warehouse integer DEFAULT NULL AFTER fk_s
 ALTER TABLE llx_commande_fournisseur ADD COLUMN billed smallint DEFAULT 0 AFTER fk_statut;
 ALTER TABLE llx_commande_fournisseur ADD INDEX billed (billed);
 
+ALTER TABLE llx_product ADD COLUMN cost_price	double(24,8) DEFAULT NULL;
+
 ALTER TABLE llx_ecm_directories MODIFY COLUMN fullpath varchar(750);
 ALTER TABLE llx_ecm_directories DROP INDEX idx_ecm_directories;
 ALTER TABLE llx_ecm_directories ADD UNIQUE INDEX uk_ecm_directories (label, fk_parent, entity);
diff --git a/htdocs/install/mysql/tables/llx_product.sql b/htdocs/install/mysql/tables/llx_product.sql
index e34ae887ffc7b986ad7d464dc3ebeb47f3d5f461..f42f18b8e46844601fa61bdec6af05481bddcedc 100755
--- a/htdocs/install/mysql/tables/llx_product.sql
+++ b/htdocs/install/mysql/tables/llx_product.sql
@@ -31,7 +31,6 @@ create table llx_product
 
   datec						datetime,
   tms						timestamp,
-  virtual					tinyint	  DEFAULT 0 NOT NULL,	-- Not used. Used by external modules. Value 0 for physical product, 1 for virtual product
   fk_parent					integer	  DEFAULT 0,			-- Not used. Used by external modules. Virtual product id
 
   label						varchar(255) NOT NULL,
@@ -44,8 +43,9 @@ create table llx_product
   price_min					double(24,8) DEFAULT 0,
   price_min_ttc				double(24,8) DEFAULT 0,
   price_base_type			varchar(3)   DEFAULT 'HT',
-  tva_tx					double(6,3),					  -- Default VAT rate of product
-  recuperableonly           integer NOT NULL DEFAULT '0',  -- French NPR VAT
+  cost_price			    double(24,8) DEFAULT NULL,      -- Cost price without tax. Can be used for margin calculation.
+  tva_tx					double(6,3),					-- Default VAT rate of product
+  recuperableonly           integer NOT NULL DEFAULT '0',   -- French NPR VAT
   localtax1_tx				double(6,3)  DEFAULT 0,         -- Spanish local VAT 1
   localtax2_tx				double(6,3)  DEFAULT 0,         -- Spanish local VAT 2
   fk_user_author			integer DEFAULT NULL,			  -- user making creation
@@ -76,7 +76,7 @@ create table llx_product
   fifo						double(24,8),							-- To store valuation of stock calculated using fifo method, for this product
   lifo						double(24,8),							-- To store valuation of stock calculated using lifo method, for this product
   canvas					varchar(32)  DEFAULT NULL,
-  finished					tinyint      DEFAULT NULL,
+  finished					tinyint      DEFAULT NULL,		-- 1=manufactured product, 0=matiere premiere
   hidden					tinyint      DEFAULT 0,			-- Not used. Deprecated.
   import_key				varchar(14),					-- Import key
   fk_price_expression integer,                     -- Link to the rule for dynamic price calculation
diff --git a/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql b/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql
index fb5184715d1ab99f07fbb30d705085290d7705d8..e7cf555d24e64f469f7603209c7b92ab769ba144 100755
--- a/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql
+++ b/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql
@@ -34,12 +34,12 @@ create table llx_product_fournisseur_price
   remise_percent		double NOT NULL DEFAULT 0,
   remise				double NOT NULL DEFAULT 0,
   unitprice				double(24,8) DEFAULT 0,
-  charges				double(24,8) DEFAULT 0,
-  unitcharges			double(24,8) DEFAULT 0,
+  charges				double(24,8) DEFAULT 0,		-- to store transport cost. Constant PRODUCT_CHARGES must be set to see it.
+  unitcharges			double(24,8) DEFAULT 0,		-- deprecated
   tva_tx				double(6,3) NOT NULL,
   info_bits				integer NOT NULL DEFAULT 0,
   fk_user				integer,
-  fk_supplier_price_expression	integer,                     -- Link to the rule for dynamic price calculation
-  import_key			varchar(14),                  -- Import key
+  fk_supplier_price_expression	integer,            -- Link to the rule for dynamic price calculation
+  import_key			varchar(14),                -- Import key
   delivery_time_days    integer
 )ENGINE=innodb;
diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang
index c347c7a0336dbc544b8a83252f4512ffaa300108..a567fd4f062d7191ac84993bc5caf9f595c3dd8b 100644
--- a/htdocs/langs/en_US/bills.lang
+++ b/htdocs/langs/en_US/bills.lang
@@ -74,6 +74,7 @@ PaymentsAlreadyDone=Payments already done
 PaymentsBackAlreadyDone=Payments back already done
 PaymentRule=Payment rule
 PaymentMode=Payment type
+PaymentModeShort=Payment type
 PaymentTerm=Payment term
 PaymentConditions=Payment terms
 PaymentConditionsShort=Payment terms
diff --git a/htdocs/langs/en_US/mails.lang b/htdocs/langs/en_US/mails.lang
index db8b013240f47c9f64bccfc346525fecafabb4a4..bda203ce05fd6c6719861f97a10cfc7962aed6e2 100644
--- a/htdocs/langs/en_US/mails.lang
+++ b/htdocs/langs/en_US/mails.lang
@@ -84,9 +84,12 @@ EachInvoiceWillBeAttachedToEmail=A document using default invoice document templ
 MailTopicSendRemindUnpaidInvoices=Reminder of invoice %s (%s)
 SendRemind=Send reminder by EMails
 RemindSent=%s reminder(s) sent
-AllRecipientSelectedForRemind=All thirdparties selected and if an email is set (note that one mail per invoice will be sent)
+AllRecipientSelected=All thirdparties selected and if an email is set.
 NoRemindSent=No EMail reminder sent
-ResultOfMassSending=Result of mass EMail reminders sending
+ResultOfMailSending=Result of mass EMail sending
+NbSelected=Nb selected
+NbIgnored=Nb ignored
+NbSent=Nb sent
 
 # Libelle des modules de liste de destinataires mailing
 MailingModuleDescContactCompanies=Contacts/addresses of all third parties (customer, prospect, supplier, ...)
diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang
index 070bc5c3d568c90c0def2fa9c3e26cfbe3d90341..db1cebac45d4cbf2bf67c7206869be4d192425a7 100644
--- a/htdocs/langs/en_US/main.lang
+++ b/htdocs/langs/en_US/main.lang
@@ -698,6 +698,7 @@ Deductible=Deductible
 from=from
 toward=toward
 Access=Access
+SelectAction=Select action
 HelpCopyToClipboard=Use Ctrl+C to copy to clipboard
 SaveUploadedFileWithMask=Save file on server with name "<strong>%s</strong>" (otherwise "%s")
 OriginFileName=Original filename
diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang
index 1ff53d367972a1f01c4757cc36fcf39daa3be846..d2faa9baae5bab6aea900b9a736c42c3af57ceb5 100644
--- a/htdocs/langs/en_US/other.lang
+++ b/htdocs/langs/en_US/other.lang
@@ -58,13 +58,13 @@ Miscellaneous=Miscellaneous
 NbOfActiveNotifications=Number of notifications (nb of recipient emails)
 PredefinedMailTest=This is a test mail.\nThe two lines are separated by a carriage return.\n\n__SIGNATURE__
 PredefinedMailTestHtml=This is a <b>test</b> mail (the word test must be in bold).<br>The two lines are separated by a carriage return.<br><br>__SIGNATURE__
-PredefinedMailContentSendInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __FACREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
-PredefinedMailContentSendInvoiceReminder=__CONTACTCIVNAME__\n\nWe would like to warn you that the invoice  __FACREF__ seems to not being payed. So this is the invoice in attachment again, as a reminder.\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
+PredefinedMailContentSendInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __REF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
+PredefinedMailContentSendInvoiceReminder=__CONTACTCIVNAME__\n\nWe would like to warn you that the invoice  __REF__ seems to not being payed. So this is the invoice in attachment again, as a reminder.\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
 PredefinedMailContentSendProposal=__CONTACTCIVNAME__\n\nYou will find here the commercial proposal __PROPREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
 PredefinedMailContentSendSupplierProposal=__CONTACTCIVNAME__\n\nYou will find here the price request __ASKREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
 PredefinedMailContentSendOrder=__CONTACTCIVNAME__\n\nYou will find here the order __ORDERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
 PredefinedMailContentSendSupplierOrder=__CONTACTCIVNAME__\n\nYou will find here our order __ORDERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
-PredefinedMailContentSendSupplierInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __FACREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
+PredefinedMailContentSendSupplierInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __REF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
 PredefinedMailContentSendShipping=__CONTACTCIVNAME__\n\nYou will find here the shipping __SHIPPINGREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
 PredefinedMailContentSendFichInter=__CONTACTCIVNAME__\n\nYou will find here the intervention __FICHINTERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
 PredefinedMailContentThirdparty=__CONTACTCIVNAME__\n\n__PERSONALIZED__\n\n__SIGNATURE__
diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang
index ddda015224569dcd5712810fd27a57c8c7be55ad..0d3f83d49a99c44a88f5a77159ae02d676fce066 100644
--- a/htdocs/langs/en_US/products.lang
+++ b/htdocs/langs/en_US/products.lang
@@ -76,6 +76,8 @@ SellingPriceHT=Selling price (net of tax)
 SellingPriceTTC=Selling price (inc. tax)
 PublicPrice=Public price
 CurrentPrice=Current price
+CostPriceDescription=This price (net of tax) can be used to store the average amount this product cost to your company. It may be any price you calculate yourself, for example from the average buying price plus average production and distribution cost.
+CostPriceUsage=In a future version, this value could be used for margin calculation.
 NewPrice=New price
 MinPrice=Min. selling price
 MinPriceHT=Min. selling price (net of tax)
@@ -190,6 +192,8 @@ ClonePricesProduct=Clone main informations and prices
 CloneCompositionProduct=Clone packaged product/service
 ProductIsUsed=This product is used
 NewRefForClone=Ref. of new product/service
+SellingPrices=Selling prices
+BuyingPrices=Buying prices
 CustomerPrices=Customer prices
 SuppliersPrices=Supplier prices
 SuppliersPricesOfProductsOrServices=Supplier prices (of products or services)
@@ -309,3 +313,4 @@ PropalMergePdfProductChooseFile=Select PDF files
 IncludingProductWithTag=Including product/service with tag
 DefaultPriceRealPriceMayDependOnCustomer=Default price, real price may depend on customer
 WarningSelectOneDocument=Please select at least one document
+DefaultUnitToShow=Units
diff --git a/htdocs/langs/fr_FR/products.lang b/htdocs/langs/fr_FR/products.lang
index 455cb20998696337017f4f3345c6cddf506b42da..b9f5a664fe5ee7276bb1601aef791e6f1dca4243 100644
--- a/htdocs/langs/fr_FR/products.lang
+++ b/htdocs/langs/fr_FR/products.lang
@@ -297,3 +297,4 @@ PropalMergePdfProductChooseFile=Sélectionnez les fichiers PDF
 IncludingProductWithTag=Incluant un produit ayant le tag/catégorie
 DefaultPriceRealPriceMayDependOnCustomer=Prix ​​par défaut, le prix réel peut dépendre du client
 WarningSelectOneDocument=Sélectionnez au moins un document
+DefaultUnitToShow=Unités
diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang
index 97f363812579036f6e2706756584b01c1dd81590..256e1bc41295b9e38dd375b4d58dfa35aab88d40 100644
--- a/htdocs/langs/fr_FR/projects.lang
+++ b/htdocs/langs/fr_FR/projects.lang
@@ -178,6 +178,7 @@ TaskAssignedToEnterTime=Tâche assignée. La saisie de temps sur cette tâche de
 OpenedProjectsByThirdparties=Projets ouverts par tiers
 OpportunityTotalAmount=Montant total des opportunités
 OpportunityPonderatedAmount=Montant pondéré des opportunités
+OpportunityPonderatedAmountDesc=Montant pondéré par la probabilité (dépendante du statut) des opportunités
 OppStatusPROSP=Prospection
 OppStatusQUAL=Qualification
 OppStatusPROPO=Proposition
diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php
index d173282fdb9e3071de5259d507e68744a68cc669..d27df85f4ac9cbfc73839c1de8d2935770e7aa61 100644
--- a/htdocs/main.inc.php
+++ b/htdocs/main.inc.php
@@ -1749,9 +1749,9 @@ function left_menu($menu_array_before, $helppagename='', $notused='', $menu_arra
 			$bugbaseurl.= urlencode("- **URL**: " . $_SERVER["REQUEST_URI"] . "\n");
 			$bugbaseurl.= urlencode("\n");
 			$bugbaseurl.= urlencode("# Report\n");
-			print '<p id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
+			print '<div id="blockvmenuhelpbugreport" class="blockvmenuhelp">';
 			print '<a class="help" target="_blank" href="'.$bugbaseurl.'">'.$langs->trans("FindBug").'</a>';
-			print '</p>';
+			print '</div>';
 		}
 
         print "</div>\n";
diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php
index aaf5aaf1baa3788e8c086b49a55b9b5183957593..dcd889a0a77868282e926b312101daab9f6f14ac 100644
--- a/htdocs/product/class/product.class.php
+++ b/htdocs/product/class/product.class.php
@@ -1563,7 +1563,7 @@ class Product extends CommonObject
 		}
 
 		$sql = "SELECT rowid, ref, ref_ext, label, description, url, note, customcode, fk_country, price, price_ttc,";
-		$sql.= " price_min, price_min_ttc, price_base_type, tva_tx, recuperableonly as tva_npr, localtax1_tx, localtax2_tx, tosell,";
+		$sql.= " price_min, price_min_ttc, price_base_type, cost_price, tva_tx, recuperableonly as tva_npr, localtax1_tx, localtax2_tx, tosell,";
 		$sql.= " tobuy, fk_product_type, duration, seuil_stock_alerte, canvas,";
 		$sql.= " weight, weight_units, length, length_units, surface, surface_units, volume, volume_units, barcode, fk_barcode_type, finished,";
 		$sql.= " accountancy_code_buy, accountancy_code_sell, stock, pmp,";
@@ -1606,6 +1606,7 @@ class Product extends CommonObject
 				$this->price_min				= $obj->price_min;
 				$this->price_min_ttc			= $obj->price_min_ttc;
 				$this->price_base_type			= $obj->price_base_type;
+				$this->cost_price    			= $obj->cost_price;
 				$this->tva_tx					= $obj->tva_tx;
 				//! French VAT NPR
 				$this->tva_npr					= $obj->tva_npr;
diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php
index 96aa9aa6311fb90ab3354a6a149403bc69cdec7a..dab8d8dcf5d3dfedaf4ba3ab1d070d5f995bb254 100644
--- a/htdocs/product/fournisseurs.php
+++ b/htdocs/product/fournisseurs.php
@@ -46,6 +46,7 @@ $rowid=GETPOST('rowid','int');
 $action=GETPOST('action', 'alpha');
 $cancel=GETPOST('cancel', 'alpha');
 $socid=GETPOST('socid', 'int');
+$cost_price=GETPOST('cost_price', 'int');
 $backtopage=GETPOST('backtopage','alpha');
 $error=0;
 
@@ -91,17 +92,37 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e
 
 if (empty($reshook))
 {
+	if ($action == 'setcost_price')
+	{
+		if ($id)
+		{
+			$result=$object->fetch($id);
+			$result=$object->setValueFrom('cost_price', price2num($cost_price));
+			if ($result > 0)
+			{
+				$object->cost_price = price2num($cost_price);
+				setEventMessage($langs->trans("RecordSaved"));
+			}
+			else
+			{
+				$error++;
+				setEventMessages($object->error, $object->errors, 'errors');
+			}
+		}
+		$action='';
+	}
+	
 	if ($action == 'remove_pf')
 	{
-		if ($rowid)
+		if ($rowid)	// id of product supplier price to remove
 		{
 			$action = '';
-			$result=$product->remove_product_fournisseur_price($rowid);
+			$result=$object->remove_product_fournisseur_price($rowid);
 			if($result > 0){
 				setEventMessage($langs->trans("PriceRemoved"));
 			}else{
 				$error++;
-				setEventMessages($product->error, $product->errors, 'errors');
+				setEventMessages($object->error, $object->errors, 'errors');
 			}
 		}
 	}
@@ -282,6 +303,17 @@ if ($id > 0 || $ref)
 			}
             print '</td></tr>';
 
+			// Cost price. Can be used for margin module for option "calculate margin on explicit cost price
+            // Accountancy sell code
+            print '<tr><td>';
+			$textdesc =$langs->trans("CostPriceDescription");
+			$textdesc.="<br>".$langs->trans("CostPriceUsage");
+			$text=$form->textwithpicto($langs->trans("CostPrice"), $textdesc, 1, 'help', '');
+            print $form->editfieldkey($text,'cost_price',$object->cost_price,$object,$user->rights->produit->creer||$user->rights->service->creer,'amount:6');
+            print '</td><td colspan="2">';
+            print $form->editfieldval($text,'cost_price',$object->cost_price,$object,$user->rights->produit->creer||$user->rights->service->creer,'amount:6');
+            print '</td></tr>';
+            
 			print '</table>';
 
             print '</div>';
@@ -463,7 +495,7 @@ if ($id > 0 || $ref)
 				print '<td><input class="flat" name="delivery_time_days" size="4" value="'.($rowid ? $object->delivery_time_days : '').'">&nbsp;'.$langs->trans('days').'</td>';
 				print '</tr>';
 
-				// Charges ????
+				// Option to define a transport cost on supplier price
 				if ($conf->global->PRODUCT_CHARGES)
 				{
 					if (! empty($conf->margin->enabled))
diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php
index b91b8763611959e0f3943540b752dff5e7bb1a38..8b3d2b76c25b100d5e4f5479601ab55008edd12f 100644
--- a/htdocs/projet/index.php
+++ b/htdocs/projet/index.php
@@ -132,7 +132,7 @@ include DOL_DOCUMENT_ROOT.'/projet/graph_opportunities.inc.php';
 
 
 // List of draft projects
-print_projecttasks_array($db,$form,$socid,$projectsListId,0,0,$listofoppstatus,array('declaredprogress'));
+print_projecttasks_array($db, $form, $socid, $projectsListId, 0, 0, $listofoppstatus, array('projectlabel', 'plannedworkload', 'declaredprogress'));
 
 
 print '</div><div class="fichetwothirdright"><div class="ficheaddleft">';
diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php
index c4e8b8f5783b12a9acbcfdc503e5d4504dad6eba..a50595db6096ab1eb5d03548619649bf2da849a1 100644
--- a/htdocs/projet/list.php
+++ b/htdocs/projet/list.php
@@ -84,8 +84,58 @@ $syear	= GETPOST('syear','int');
 
 if ($search_status == '') $search_status=-1;	// -1 or 1
 
-// Purge criteria
-if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$contextpage='projectlist';
+
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$hookmanager->initHooks(array($contextpage));
+$extrafields = new ExtraFields($db);
+
+// fetch optionals attributes and labels
+$extralabels = $extrafields->fetch_name_optionals_label('project');
+$search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_');
+
+// List of fields to search into when doing a "search in all"
+$fieldstosearchall = array(
+	'p.ref'=>"Ref",
+	'p.title'=>"Label",
+	's.nom'=>"ThirdPartyName",
+    "p.note_public"=>"NotePublic"
+);
+if (empty($user->socid)) $fieldstosearchall["p.note_private"]="NotePrivate";
+
+$arrayfields=array(
+    'p.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1),
+    'p.label'=>array('label'=>$langs->trans("Label"), 'checked'=>1),
+    's.nom'=>array('label'=>$langs->trans("ThirdParty"), 'checked'=>1),
+    'commerical'=>array('label'=>$langs->trans("SaleRepresentative"), 'checked'=>1),
+	'p.date_start'=>array('label'=>$langs->trans("DateStart"), 'checked'=>1, 'position'=>100),
+    'p.date_end'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1, 'position'=>101),
+    'p.visibility'=>array('label'=>$langs->trans("Visibility"), 'checked'=>1, 'position'=>102),
+    'p.opportunity_amount'=>array('label'=>$langs->trans("OpportunityAmount"), 'checked'=>1, 'enabled'=>$conf->global->PROJECT_USE_OPPORTUNITIES, 'position'=>103),
+	'p.opportunity_status'=>array('label'=>$langs->trans("OpportunityStatus"), 'checked'=>1, 'enabled'=>$conf->global->PROJECT_USE_OPPORTUNITIES, 'position'=>104),
+	'p.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500),
+    'p.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500),
+    'p.status'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000),
+);
+// Extra fields
+if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label))
+{
+   foreach($extrafields->attribute_label as $key => $val) 
+   {
+       $arrayfields["ef.".$key]=array('label'=>$extrafields->attribute_label[$key], 'checked'=>$extrafields->attribute_list[$key], 'position'=>$extrafields->attribute_pos[$key], 'enabled'=>$extrafields->attribute_perms[$key]);
+   }
+}
+
+
+/*
+ * Actions
+ */
+
+include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
+
+// Do we click on purge search criteria ?
+if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers
 {
 	$search_all='';
 	$search_ref="";
@@ -103,20 +153,9 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both
 	$sday="";
 	$smonth="";
 	$syear="";
+	$search_array_options=array();
 }
 
-// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
-$hookmanager->initHooks(array('projectlist'));
-$extrafields = new ExtraFields($db);
-
-// List of fields to search into when doing a "search in all"
-$fieldstosearchall = array(
-	'p.ref'=>"Ref",
-	'p.title'=>"Label",
-	's.nom'=>"ThirdPartyName",
-    "p.note_public"=>"NotePublic"
-);
-if (empty($user->socid)) $fieldstosearchall["p.note_private"]="NotePrivate";
 
 
 /*
diff --git a/htdocs/resource/class/resource.class.php b/htdocs/resource/class/resource.class.php
index 3cb96dc53a3dccf44d192d2a8963935adf0b0f29..e6c01eb09f40a0854ac9fcfaf7f3acd7caf95031 100644
--- a/htdocs/resource/class/resource.class.php
+++ b/htdocs/resource/class/resource.class.php
@@ -22,7 +22,6 @@
 
  */
 
-// Put here all includes required by your class file
 require_once DOL_DOCUMENT_ROOT."/core/class/commonobject.class.php";
 require_once DOL_DOCUMENT_ROOT."/core/lib/functions2.lib.php";
 
@@ -396,7 +395,13 @@ class Resource extends CommonObject
     	}
     	$sql.= " GROUP BY t.rowid";
     	$sql.= $this->db->order($sortfield,$sortorder);
-    	if ($limit) $sql.= $this->db->plimit($limit+1,$offset);
+        $this->num_all = 0;
+        if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
+        {
+            $result = $this->db->query($sql);
+            $this->num_all = $this->db->num_rows($result);
+        }
+    	if ($limit) $sql.= $this->db->plimit($limit, $offset);
     	dol_syslog(get_class($this)."::fetch_all", LOG_DEBUG);
 
     	$resql=$this->db->query($sql);
diff --git a/htdocs/resource/list.php b/htdocs/resource/list.php
index a1d5e0e209c7930ffbc92c334e799bdc110c717c..24e871de03a983749a230d2d8c2373a09a297675 100644
--- a/htdocs/resource/list.php
+++ b/htdocs/resource/list.php
@@ -22,15 +22,10 @@
  */
 
 
-// Change this following line to use the correct relative path (../, ../../, etc)
-$res=0;
-$res=@include("../main.inc.php");				// For root directory
-if (! $res) $res=@include("../../main.inc.php");	// For "custom" directory
-if (! $res) die("Include of main fails");
+require '../main.inc.php';
+require_once DOL_DOCUMENT_ROOT.'/resource/class/resource.class.php';
 
-require 'class/resource.class.php';
-
-// Load traductions files requiredby by page
+// Load translations files requiredby by page
 $langs->load("resource");
 $langs->load("companies");
 $langs->load("other");
@@ -52,7 +47,7 @@ $object = new Resource($db);
 
 $hookmanager->initHooks(array('resource_list'));
 
-if (empty($sortorder)) $sortorder="DESC";
+if (empty($sortorder)) $sortorder="ASC";
 if (empty($sortfield)) $sortfield="t.rowid";
 if (empty($arch)) $arch = 0;
 
@@ -82,13 +77,12 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e
 /*
  * View
  */
-$pagetitle=$langs->trans('ResourcePageIndex');
-llxHeader('',$pagetitle,'');
-
-
 
 $form=new Form($db);
 
+$pagetitle=$langs->trans('ResourcePageIndex');
+llxHeader('',$pagetitle,'');
+
 print load_fiche_titre($pagetitle,'','title_generic');
 
 // Confirmation suppression resource line
@@ -102,6 +96,8 @@ $ret = $object->fetch_all($sortorder, $sortfield, $limit, $offset);
 if($ret == -1) {
 	dol_print_error($db,$object->error);
 	exit;
+} else {
+    print_barre_liste($pagetitle, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $ret+1, $object->num_all,'title_generic.png');
 }
 if(!$ret) {
 	print '<div class="warning">'.$langs->trans('NoResourceInDatabase').'</div>';
diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php
index 8477eb97788dd268e3d3cd6a4ddb942ec3c00760..ef64761ab6fe01636a7f79153b122222f0a5fc07 100644
--- a/htdocs/societe/list.php
+++ b/htdocs/societe/list.php
@@ -634,14 +634,14 @@ if ($resql)
     if (! empty($arrayfields['s.town']['checked']))
     {
         print '<td class="liste_titre">';
-    	print '<input class="flat" size="8" type="text" name="search_town" value="'.dol_escape_htmltag($search_town).'">';
+    	print '<input class="flat" size="6" type="text" name="search_town" value="'.dol_escape_htmltag($search_town).'">';
     	print '</td>';
     }
 	// Zip
     if (! empty($arrayfields['s.zip']['checked']))
     {
         print '<td class="liste_titre">';
-    	print '<input class="flat" size="8" type="text" name="search_zip" value="'.dol_escape_htmltag($search_zip).'">';
+    	print '<input class="flat" size="4" type="text" name="search_zip" value="'.dol_escape_htmltag($search_zip).'">';
     	print '</td>';
     }
     // Country
@@ -966,21 +966,21 @@ if ($resql)
         // Date creation
         if (! empty($arrayfields['s.datec']['checked']))
         {
-            print '<td align="center">';
+            print '<td align="center" class="nowrap">';
             print dol_print_date($db->jdate($obj->date_creation), 'dayhour');
             print '</td>';
         }
         // Date modification
         if (! empty($arrayfields['s.tms']['checked']))
         {
-            print '<td align="center">';
+            print '<td align="center" class="nowrap">';
             print dol_print_date($db->jdate($obj->date_update), 'dayhour');
             print '</td>';
         }
 	    // Status
         if (! empty($arrayfields['s.status']['checked']))
         {
-            print '<td align="center">'.$companystatic->getLibStatut(3).'</td>';
+            print '<td align="center" class="nowrap">'.$companystatic->getLibStatut(3).'</td>';
         }
         // Action column
         print '<td></td>';
diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php
index 88d2ae2d5a997302154381fb37683be60bab97a5..f0f031114e5b7ad224a7e2d262884641f1d8127d 100644
--- a/htdocs/theme/eldy/style.css.php
+++ b/htdocs/theme/eldy/style.css.php
@@ -190,6 +190,10 @@ $colortexttitle=join(',',colorStringToArray($colortexttitle));
 $colortext=join(',',colorStringToArray($colortext));
 $colortextlink=join(',',colorStringToArray($colortextlink));
 
+if (! empty($conf->dol_optimize_smallscreen)) $fontsize=11;
+
+$nbtopmenuentries=$menumanager->showmenu('topnb');
+
 print '/*'."\n";
 print 'colorbackbody='.$colorbackbody."\n";
 print 'colorbackvmenu1='.$colorbackvmenu1."\n";
@@ -211,14 +215,9 @@ print 'dol_use_jmobile='.$dol_use_jmobile."\n";
 print 'dol_screenwidth='.$_SESSION['dol_screenwidth']."\n";
 print 'dol_screenheight='.$_SESSION['dol_screenheight']."\n";
 print 'fontsize='.$fontsize."\n";
+print 'nbtopmenuentries='.$nbtopmenuentries."\n";
 print '*/'."\n";
 
-if (! empty($conf->dol_optimize_smallscreen)) $fontsize=11;
-
-
-$nbtopmenuentries=$menumanager->showmenu('topnb');
-//print $nb;
-
 ?>
 
 /* ============================================================================== */
@@ -2455,7 +2454,7 @@ input.liste_titre {
 }
 
 .noborder tr.liste_total, .noborder tr.liste_total td, tr.liste_total, form.liste_total {
-	background: #F0F0F0;
+	/* background: #F0F0F0; */
 }
 .noborder tr.liste_total td, tr.liste_total td, form.liste_total div {
     color: #552266;
@@ -3044,7 +3043,7 @@ li.cal_event       { border: none; list-style-type: none; }
 /* CSS for treeview */
 .treeview ul { background-color: transparent !important; margin-top: 0; }
 .treeview li { background-color: transparent !important; padding: 0 0 0 16px !important; min-height: 20px; }
-.treeview .hover { color: black !important; }
+.treeview .hover { color: rgb(<?php print $colortextlink; ?>) !important; text-decoration: underline !important; }
 
 
 
diff --git a/htdocs/theme/md/graph-color.php b/htdocs/theme/md/graph-color.php
index 0c091a1ede307f45c38014d7e64e135761d3f223..4346d00715807cd04805421f56ff9227caa97742 100644
--- a/htdocs/theme/md/graph-color.php
+++ b/htdocs/theme/md/graph-color.php
@@ -28,7 +28,7 @@
 
 global $theme_bordercolor, $theme_datacolor, $theme_bgcolor, $theme_bgcoloronglet;
 $theme_bordercolor = array(235,235,224);
-$theme_datacolor = array(array(190,190,220), array(200,160,180), array(125,135,150), array(170,140,190), array(190,190,170), array(190,170,190), array(170,190,190), array(150,135,125), array(85,135,150), array(150,135,80), array(150,80,150));
+$theme_datacolor = array(array(140,140,220), array(190,120,120), array(0,160,140), array(190,190,100), array(115,125,150), array(100,170,20), array(250,190,30), array(150,135,125), array(85,135,150), array(150,135,80), array(150,80,150));
 $theme_bgcolor = array(hexdec('F4'),hexdec('F4'),hexdec('F4'));
 $theme_bgcoloronglet = array(hexdec('DE'),hexdec('E7'),hexdec('EC'));
 
diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php
index e316f078b2474a7ed2a51687d8258e4322f697dc..261a288ddc3c5ab8a7081bbcf1c8d2260753d5b5 100644
--- a/htdocs/theme/md/style.css.php
+++ b/htdocs/theme/md/style.css.php
@@ -185,6 +185,10 @@ $colortexttitle=join(',',colorStringToArray($colortexttitle));
 $colortext=join(',',colorStringToArray($colortext));
 $colortextlink=join(',',colorStringToArray($colortextlink));
 
+if (! empty($conf->dol_optimize_smallscreen)) $fontsize=11;
+
+$nbtopmenuentries=$menumanager->showmenu('topnb');
+
 print '/*'."\n";
 print 'colorbackbody='.$colorbackbody."\n";
 print 'colorbackvmenu1='.$colorbackvmenu1."\n";
@@ -205,12 +209,9 @@ print 'dol_no_mouse_hover='.$dol_no_mouse_hover."\n";
 print 'dol_use_jmobile='.$dol_use_jmobile."\n";
 print 'dol_screenwidth='.$_SESSION['dol_screenwidth']."\n";
 print 'dol_screenheight='.$_SESSION['dol_screenheight']."\n";
+print 'nbtopmenuentries='.$nbtopmenuentries."\n";
 print '*/'."\n";
 
-if (! empty($conf->dol_optimize_smallscreen)) $fontsize=11;
-
-$nbtopmenuentries=$menumanager->showmenu('topnb');
-
 ?>
 
 /* ============================================================================== */
@@ -1933,11 +1934,11 @@ table.liste, table.noborder, table.formdoc, div.noborder {
 	border-style: solid;
 
 	margin: 0px 0px 2px 0px;
-
+    /*
 	-moz-box-shadow: 2px 2px 4px #CCC;
 	-webkit-box-shadow: 2px 2px 4px #CCC;
 	box-shadow: 2px 2px 4px #CCC;
-
+    */
 	-moz-border-radius: 0.1em;
 	-webkit-border-radius: 0.1em;
 	border-radius: 0.1em;
@@ -1953,14 +1954,14 @@ table.noborder tr, div.noborder form {
 	border-left-width: 1px;
 	border-left-color: #BBBBBB;
 	border-left-style: solid;
-	height: 26px;
+	min-height: 26px;
 }
 
 table.liste th, table.noborder th {
 	padding: 5px 2px 5px 3px;			/* t r b l */
 }
 table.noborder th, table.noborder td, div.noborder form, div.noborder form div {
-	padding: 1px 2px 1px 3px;			/* t r b l */
+	padding: 4px 2px 4px 3px;			/* t r b l */
 }
 
 table.nobordernopadding {
@@ -2211,7 +2212,10 @@ table.dataTable td {
 }
 tr.even td, tr.pair td, tr.odd td, tr.impair td, form.odd div.tagtd, form.impair div.tagtd, form.pair div.tagtd, div.impair div.tagtd, div.pair div.tagtd, div.liste_titre div.tagtd {
     padding: 5px 2px 5px 3px;
-    border-bottom: 1px solid #f4f4f4;
+    border-bottom: 1px solid #eee;
+}
+tr.even:last-child td, tr.pair:last-child td, tr.odd:last-child td, tr.impair:last-child td {
+    border-bottom: 0px !important;
 }
 tr.even td .nobordernopadding tr td, tr.pair td .nobordernopadding tr td, tr.impair td .nobordernopadding tr td, tr.odd td .nobordernopadding tr td {
     border-bottom: 0px !important;
@@ -2309,14 +2313,15 @@ input.liste_titre {
 }
 
 .noborder tr.liste_total, .noborder tr.liste_total td, tr.liste_total, form.liste_total {
-	background: #F0F0F0;
+	/* background: #F0F0F0; */
 }
 .noborder tr.liste_total td, tr.liste_total td, form.liste_total div {
-    border-top: 1px solid #f4f4f4;
+    /* border-top: 1px solid #f4f4f4; */
     color: #332266;
     font-weight: normal;
     white-space: nowrap;
     padding: 4px;
+    height: 20px;
 }
 
 
@@ -2908,7 +2913,7 @@ li.cal_event       { border: none; list-style-type: none; }
 /* CSS for treeview */
 .treeview ul { background-color: transparent !important; margin-top: 0; }
 .treeview li { background-color: transparent !important; padding: 0 0 0 16px !important; min-height: 20px; }
-.treeview .hover { color: black !important; }
+.treeview .hover { color: rgb(<?php print $colortextlink; ?>) !important; text-decoration: underline !important; }
 
 
 
@@ -3734,7 +3739,23 @@ border-top-right-radius: 6px;
 
 
 
-/* CSS style used for small screen */
+::-webkit-scrollbar {
+    width: 10px;
+}
+::-webkit-scrollbar-button {
+    background: #aaa
+}
+::-webkit-scrollbar-track-piece {
+    background: #fff
+}
+::-webkit-scrollbar-thumb {
+    background: #ddd
+}​
+
+
+
+
+/***** CSS style used for small screen *****/
 
 .imgopensurveywizard
 {
@@ -3750,7 +3771,7 @@ border-top-right-radius: 6px;
 	}
 }
 
-@media only screen and (max-width:  <?php echo ($nbtopmenuentries * 85) + 200; ?>px)
+@media only screen and (max-width:  <?php echo round($nbtopmenuentries * $fontsize * 7, 0) + 200; ?>px)
 {
 	.mainmenuaspan {
     	display: none;
diff --git a/htdocs/user/card.php b/htdocs/user/card.php
index 9cd92248b879a333ae48bd2b78d466f965fbee03..c7d745a2c94c9f6e2a93da247f71132a3db4ef2a 100644
--- a/htdocs/user/card.php
+++ b/htdocs/user/card.php
@@ -1016,14 +1016,20 @@ if (($action == 'create') || ($action == 'adduserldap'))
 		$langs->load("salaries");
 
 	    // THM
-	    print '<tr><td>'.$langs->trans("THM").'</td>';
+	    print '<tr><td>';
+		$text=$langs->trans("THM");
+		print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm');
+	    print '</td>';
 	    print '<td>';
 	    print '<input size="8" type="text" name="thm" value="'.GETPOST('thm').'">';
 	    print '</td>';
 	    print "</tr>\n";
 
 	    // TJM
-	    print '<tr><td>'.$langs->trans("TJM").'</td>';
+	    print '<tr><td>';
+		$text=$langs->trans("TJM");
+		print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classtjm');
+	    print '</td>';
 	    print '<td>';
 	    print '<input size="8" type="text" name="tjm" value="'.GETPOST('tjm').'">';
 	    print '</td>';