diff --git a/htdocs/core/tpl/contacts.tpl.php b/htdocs/core/tpl/contacts.tpl.php
index dc97d84e9b647ebf966e450fd2896f7edcfb559a..33b98d56f48a7f98e727cc3987770f80b3be554e 100644
--- a/htdocs/core/tpl/contacts.tpl.php
+++ b/htdocs/core/tpl/contacts.tpl.php
@@ -14,6 +14,9 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * 
+ * This template needs:
+ * $object
  */
 
 if (! class_exists('Contact')) {
@@ -30,6 +33,7 @@ if ($module == 'propal')				{ $permission=$user->rights->propale->creer; }
 elseif ($module == 'fichinter')			{ $permission=$user->rights->ficheinter->creer; }
 elseif ($module == 'invoice_supplier')	{ $permission=$user->rights->fournisseur->facture->creer; }
 elseif ($module == 'order_supplier')	{ $permission=$user->rights->fournisseur->commande->creer; }
+elseif ($module == 'project')			{ $permission=$user->rights->projet->creer; }
 elseif (! isset($permission))			{ $permission=$user->rights->$module->creer; } // If already defined by caller page
 
 $formcompany= new FormCompany($db);
diff --git a/htdocs/projet/contact.php b/htdocs/projet/contact.php
index 2f253112cdff81ab3a31c495597cd62b79b045c2..0674bcaf24b45687c7d4634185174d5138db0a83 100644
--- a/htdocs/projet/contact.php
+++ b/htdocs/projet/contact.php
@@ -31,17 +31,20 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
 $langs->load("projects");
 $langs->load("companies");
 
-$id = GETPOST('id','int');
-$ref= GETPOST('ref','alpha');
+$id     = GETPOST('id','int');
+$ref    = GETPOST('ref','alpha');
+$lineid = GETPOST('lineid','int');
+$socid  = GETPOST('socid','int');
+$action = GETPOST('action','alpha');
 
-$mine = $_REQUEST['mode']=='mine' ? 1 : 0;
+$mine   = GETPOST('mode')=='mine' ? 1 : 0;
 //if (! $user->rights->projet->all->lire) $mine=1;	// Special for projects
 
-$project = new Project($db);
+$object = new Project($db);
 if ($ref)
 {
-    $project->fetch(0,$ref);
-    $id=$project->id;
+    $object->fetch(0,$ref);
+    $id=$object->id;
 }
 
 // Security check
@@ -55,41 +58,42 @@ $result = restrictedArea($user, 'projet', $id);
  */
 
 // Add new contact
-if ($_POST["action"] == 'addcontact' && $user->rights->projet->creer)
+if ($action == 'addcontact' && $user->rights->projet->creer)
 {
 	$result = 0;
-	$result = $project->fetch($id);
+	$result = $object->fetch($id);
 
     if ($result > 0 && $id > 0)
     {
-  		$result = $project->add_contact($_POST["contactid"], $_POST["type"], $_POST["source"]);
+  		$contactid = (GETPOST('userid') ? GETPOST('userid','int') : GETPOST('contactid','int'));
+  		$result = $object->add_contact($contactid, $_POST["type"], $_POST["source"]);
     }
 
 	if ($result >= 0)
 	{
-		header("Location: contact.php?id=".$project->id);
+		header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
 		exit;
 	}
 	else
 	{
-		if ($project->error == 'DB_ERROR_RECORD_ALREADY_EXISTS')
+		if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS')
 		{
 			$langs->load("errors");
 			$mesg = '<div class="error">'.$langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType").'</div>';
 		}
 		else
 		{
-			$mesg = '<div class="error">'.$project->error.'</div>';
+			$mesg = '<div class="error">'.$object->error.'</div>';
 		}
 	}
 }
 
 // bascule du statut d'un contact
-if ($_GET["action"] == 'swapstatut' && $user->rights->projet->creer)
+if ($action == 'swapstatut' && $user->rights->projet->creer)
 {
-	if ($project->fetch($id))
+	if ($object->fetch($id))
 	{
-	    $result=$project->swapContactStatus(GETPOST('ligne'));
+	    $result=$object->swapContactStatus(GETPOST('ligne'));
 	}
 	else
 	{
@@ -98,14 +102,14 @@ if ($_GET["action"] == 'swapstatut' && $user->rights->projet->creer)
 }
 
 // Efface un contact
-if ($_GET["action"] == 'deleteline' && $user->rights->projet->creer)
+if (($action == 'deleteline' || $action == 'deletecontact') && $user->rights->projet->creer)
 {
-	$project->fetch($id);
-	$result = $project->delete_contact($_GET["lineid"]);
+	$object->fetch($id);
+	$result = $object->delete_contact($_GET["lineid"]);
 
 	if ($result >= 0)
 	{
-		header("Location: contact.php?id=".$project->id);
+		header("Location: contact.php?id=".$object->id);
 		exit;
 	}
 	else
@@ -137,18 +141,18 @@ dol_htmloutput_mesg($mesg);
 
 if ($id > 0 || ! empty($ref))
 {
-	if ( $project->fetch($id,$ref) > 0)
+	if ( $object->fetch($id,$ref) > 0)
 	{
-		if ($project->societe->id > 0)  $result=$project->societe->fetch($project->societe->id);
+		if ($object->societe->id > 0)  $result=$object->societe->fetch($object->societe->id);
 
 		// To verify role of users
-		//$userAccess = $project->restrictedProjectArea($user,'read');
-		$userWrite  = $project->restrictedProjectArea($user,'write');
-		//$userDelete = $project->restrictedProjectArea($user,'delete');
+		//$userAccess = $object->restrictedProjectArea($user,'read');
+		$userWrite  = $object->restrictedProjectArea($user,'write');
+		//$userDelete = $object->restrictedProjectArea($user,'delete');
 		//print "userAccess=".$userAccess." userWrite=".$userWrite." userDelete=".$userDelete;
 
-		$head = project_prepare_head($project);
-		dol_fiche_head($head, 'contact', $langs->trans("Project"), 0, ($project->public?'projectpub':'project'));
+		$head = project_prepare_head($object);
+		dol_fiche_head($head, 'contact', $langs->trans("Project"), 0, ($object->public?'projectpub':'project'));
 
 
 		/*
@@ -163,231 +167,42 @@ if ($id > 0 || ! empty($ref))
 		// Define a complementary filter for search of next/prev ref.
         if (! $user->rights->projet->all->lire)
         {
-            $projectsListId = $project->getProjectsAuthorizedForUser($user,$mine,0);
-            $project->next_prev_filter=" rowid in (".(count($projectsListId)?join(',',array_keys($projectsListId)):'0').")";
+            $objectsListId = $object->getProjectsAuthorizedForUser($user,$mine,0);
+            $object->next_prev_filter=" rowid in (".(count($objectsListId)?join(',',array_keys($objectsListId)):'0').")";
         }
-		print $form->showrefnav($project, 'ref', $linkback, 1, 'ref', 'ref', '');
+		print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', '');
 		print '</td></tr>';
 
 		// Label
-		print '<tr><td>'.$langs->trans("Label").'</td><td>'.$project->title.'</td></tr>';
+		print '<tr><td>'.$langs->trans("Label").'</td><td>'.$object->title.'</td></tr>';
 
 		// Customer
 		print "<tr><td>".$langs->trans("Company")."</td>";
 		print '<td colspan="3">';
-		if ($project->societe->id > 0) print $project->societe->getNomUrl(1);
+		if ($object->societe->id > 0) print $object->societe->getNomUrl(1);
 		else print '&nbsp;';
 		print '</td></tr>';
 
 		// Visibility
 		print '<tr><td>'.$langs->trans("Visibility").'</td><td>';
-		if ($project->public) print $langs->trans('SharedProject');
+		if ($object->public) print $langs->trans('SharedProject');
 		else print $langs->trans('PrivateProject');
 		print '</td></tr>';
 
 		// Statut
-		print '<tr><td>'.$langs->trans("Status").'</td><td>'.$project->getLibStatut(4).'</td></tr>';
+		print '<tr><td>'.$langs->trans("Status").'</td><td>'.$object->getLibStatut(4).'</td></tr>';
 
 		print "</table>";
 
 		print '</div>';
 
-		/*
-		 * Lignes de contacts
-		 */
-		print '<br><table class="noborder" width="100%">';
-
-		/*
-		 * Ajouter une ligne de contact
-		 * Non affiche en mode modification de ligne
-		 */
-		if ($_GET["action"] != 'editline')
-		{
-			print '<tr class="liste_titre">';
-			print '<td>'.$langs->trans("Source").'</td>';
-			print '<td>'.$langs->trans("Company").'</td>';
-			print '<td>'.$langs->trans("Contacts").'</td>';
-			print '<td>'.$langs->trans("ContactType").'</td>';
-			print '<td colspan="3">&nbsp;</td>';
-			print "</tr>\n";
-
-			$var = false;
-
-			print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$project->id.'" method="POST">';
-			print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
-			print '<input type="hidden" name="action" value="addcontact">';
-			print '<input type="hidden" name="source" value="internal">';
-			print '<input type="hidden" name="id" value="'.$project->id.'">';
-
-			// Ligne ajout pour contact interne
-			print "<tr ".$bc[$var].">";
-
-			print '<td class="nowrap">';
-			print img_object('','user').' '.$langs->trans("Users");
-			print '</td>';
-
-			print '<td colspan="1">';
-			print $conf->global->MAIN_INFO_SOCIETE_NOM;
-			print '</td>';
-
-			print '<td colspan="1">';
-			// On recupere les id des users deja selectionnes
-			$form->select_users($user->id,'contactid',0);
-			print '</td>';
-			print '<td>';
-			$formcompany->selectTypeContact($project, '', 'type','internal','rowid');
-			print '</td>';
-			print '<td align="right" colspan="3" >';
-			if ($userWrite > 0 || $user->admin)
-			{
-			    print '<input type="submit" class="button" value="'.$langs->trans("Add").'"';
-				if (! ($userWrite > 0 || $user->admin)) print ' disabled="disabled"';
-			    print '>';
-			}
-			print '</td>';
-			print '</tr>';
-
-			print '</form>';
-
-			// Line to add external contact. Only if project is linked to a third party.
-			//if ($project->societe->id)
-			//{
-				print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$id.'" method="POST">';
-				print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
-				print '<input type="hidden" name="action" value="addcontact">';
-				print '<input type="hidden" name="source" value="external">';
-				print '<input type="hidden" name="id" value="'.$id.'">';
-
-				$var=!$var;
-				print "<tr ".$bc[$var].">";
-
-				print '<td class="nowrap">';
-				print img_object('','contact').' '.$langs->trans("ThirdPartyContacts");
-				print '</td>';
-
-				print '<td colspan="1">';
-				$selectedCompany = isset($_GET["newcompany"])?$_GET["newcompany"]:$project->societe->id;
-				$selectedCompany = $formcompany->selectCompaniesForNewContact($project, 'id', $selectedCompany, 'newcompany', (empty($project->societe->id)?array():array($project->societe->id)));
-				print '</td>';
-
-				print '<td colspan="1">';
-				$nbofcontacts=$form->select_contacts($selectedCompany, '', 'contactid');
-				//if ($nbofcontacts == 0) print $langs->trans("NoContactDefined");
-				print '</td>';
-				print '<td>';
-				$formcompany->selectTypeContact($project, '', 'type','external','rowid');
-				print '</td>';
-
-				print '<td align="right" colspan="3" >';
-				if ($userWrite > 0 || $user->admin)
-				{
-				    print '<input type="submit" class="button" value="'.$langs->trans("Add").'"';
-				    if (! $nbofcontacts || ! ($userWrite > 0 || $user->admin)) print ' disabled="disabled"';
-				    print '>';
-				}
-				print '</td>';
-				print '</tr>';
-
-				print "</form>";
-			//}
-
-			print '<tr><td colspan="6">&nbsp;</td></tr>';
-		}
-
-		// Liste des contacts lies
-		print '<tr class="liste_titre">';
-		print '<td>'.$langs->trans("Source").'</td>';
-		print '<td>'.$langs->trans("Company").'</td>';
-		print '<td>'.$langs->trans("Contacts").'</td>';
-		print '<td>'.$langs->trans("ContactType").'</td>';
-		print '<td align="center">'.$langs->trans("Status").'</td>';
-		print '<td colspan="2">&nbsp;</td>';
-		print "</tr>\n";
-
-		$companystatic = new Societe($db);
-		$var = true;
-
-		foreach(array('internal','external') as $source)
+		// Contacts lines (modules that overwrite templates must declare this into descriptor)
+		$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
+		foreach($dirtpls as $reldir)
 		{
-			$tab = $project->liste_contact(-1,$source);
-			$num=count($tab);
-
-			$i = 0;
-			while ($i < $num)
-			{
-				$var = !$var;
-
-				print '<tr '.$bc[$var].' valign="top">';
-
-				// Source
-				print '<td align="left">';
-				if ($tab[$i]['source']=='internal') print $langs->trans("User");
-				if ($tab[$i]['source']=='external') print $langs->trans("ThirdPartyContact");
-				print '</td>';
-
-				// Societe
-				print '<td align="left">';
-				if ($tab[$i]['socid'] > 0)
-				{
-					$companystatic->fetch($tab[$i]['socid']);
-					print $companystatic->getNomUrl(1);
-				}
-				if ($tab[$i]['socid'] < 0)
-				{
-					print $conf->global->MAIN_INFO_SOCIETE_NOM;
-				}
-				if (! $tab[$i]['socid'])
-				{
-					print '&nbsp;';
-				}
-				print '</td>';
-
-				// Contact
-				print '<td>';
-				if ($tab[$i]['source']=='internal')
-				{
-                    $userstatic->id=$tab[$i]['id'];
-                    $userstatic->lastname=$tab[$i]['nom'];
-                    $userstatic->firstname=$tab[$i]['firstname'];
-                    print $userstatic->getNomUrl(1);
-				}
-				if ($tab[$i]['source']=='external')
-				{
-                    $contactstatic->id=$tab[$i]['id'];
-                    $contactstatic->lastname=$tab[$i]['nom'];
-                    $contactstatic->firstname=$tab[$i]['firstname'];
-                    print $contactstatic->getNomUrl(1);
-				}
-				print '</td>';
-
-				// Type de contact
-				print '<td>'.$tab[$i]['libelle'].'</td>';
-
-				// Statut
-				print '<td align="center">';
-				// Activation desativation du contact
-				if ($project->statut >= 0 && $userWrite > 0) print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$project->id.'&amp;action=swapstatut&amp;ligne='.$tab[$i]['rowid'].'">';
-				print $contactstatic->LibStatut($tab[$i]['status'],3);
-				if ($project->statut >= 0 && $userWrite > 0) print '</a>';
-				print '</td>';
-
-				// Icon update et delete
-				print '<td align="center" nowrap>';
-				if ($user->rights->projet->creer && $userWrite > 0)
-				{
-					print '&nbsp;';
-					print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$project->id.'&amp;action=deleteline&amp;lineid='.$tab[$i]['rowid'].'">';
-					print img_delete();
-					print '</a>';
-				}
-				print '</td>';
-
-				print "</tr>\n";
-
-				$i ++;
-			}
-		}
-		print "</table>";
+			$res=@include dol_buildpath($reldir.'/contacts.tpl.php');
+			if ($res) break;
+		}		
 	}
 	else
 	{