diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php
index e0d08dbc1fa7c1fe8e0c486d73ab8d808ddcdd63..e40176f784d1fe3f6bf3e66a332389cbccba2f81 100644
--- a/htdocs/contrat/card.php
+++ b/htdocs/contrat/card.php
@@ -706,6 +706,11 @@ if (empty($reshook))
 	    $result = $object->validate($user);
 	}
 	
+	else if ($action == 'reopen' && $user->rights->contrat->creer)
+	{
+	    $result = $object->reopen($user);
+	}
+	
 	// Close all lines
 	else if ($action == 'confirm_close' && $confirm == 'yes' && $user->rights->contrat->creer)
 	{
@@ -1915,7 +1920,12 @@ else
                 if ($user->rights->contrat->creer) print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=valid">'.$langs->trans("Validate").'</a></div>';
                 else print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans("Validate").'</a></div>';
             }
-
+            if ($object->statut == 1 && $nbofservices)
+            {
+                if ($user->rights->contrat->creer) print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=reopen">'.$langs->trans("Modify").'</a></div>';
+                else print '<div class="inline-block divButAction"><a class="butActionRefused" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans("Modify").'</a></div>';
+            }
+            
             if (! empty($conf->facture->enabled) && $object->statut > 0 && $object->nbofservicesclosed < $nbofservices)
             {
                 $langs->load("bills");
@@ -1975,6 +1985,12 @@ else
 
         print '</div><div class="fichehalfright"><div class="ficheaddleft">';
 
+		// List of actions on element
+		include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php';
+		$formactions = new FormActions($db);
+		$somethingshown = $formactions->showactions($object, 'contract', $socid);
+        
+        
         print '</div></div></div>';
     }
 }
diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php
index 91f96aabf5deec471d8a9836bbde10b659b85003..37eaa1db04d6938e93c1ef27174528c3a4f2ebfb 100644
--- a/htdocs/contrat/class/contrat.class.php
+++ b/htdocs/contrat/class/contrat.class.php
@@ -472,7 +472,71 @@ class Contrat extends CommonObject
 
 	}
 
+	/**
+	 * Unvalidate a contract
+	 *
+	 * @param	User	$user      		Objet User
+     * @param	int		$notrigger		1=Does not execute triggers, 0=execute triggers
+	 * @return	int						<0 if KO, >0 if OK
+	 */
+	function reopen($user, $notrigger=0)
+	{
+		require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
+		global $langs, $conf;
+
+		$now=dol_now();
+
+		$error=0;
+		dol_syslog(get_class($this).'::reopen user='.$user->id);
 
+		$this->db->begin();
+
+		$this->fetch_thirdparty();
+
+		$sql = "UPDATE ".MAIN_DB_PREFIX."contrat SET statut = 0";
+		//$sql.= ", fk_user_valid = null, date_valid = null";
+		$sql .= " WHERE rowid = ".$this->id . " AND statut = 1";
+
+		dol_syslog(get_class($this)."::validate", LOG_DEBUG);
+		$resql = $this->db->query($sql);
+		if (! $resql)
+		{
+			dol_print_error($this->db);
+			$error++;
+			$this->error=$this->db->lasterror();
+		}
+
+		// Trigger calls
+		if (! $error && ! $notrigger)
+		{
+			// Call trigger
+			$result=$this->call_trigger('CONTRACT_REOPEN',$user);
+			if ($result < 0) {
+				$error++;
+			}
+			// End call triggers
+		}
+
+		// Set new ref and define current statut
+		if (! $error)
+		{
+			$this->statut=0;
+			$this->brouillon=1;
+			$this->date_validation=$now;
+		}
+
+		if (! $error)
+		{
+			$this->db->commit();
+			return 1;
+		}
+		else
+		{
+			$this->db->rollback();
+			return -1;
+		}
+	}
+	
 	/**
 	 *    Load a contract from database
 	 *
diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang
index 4bb6a52af8bf5a72e6cab481c08c1acb7e6cc805..6dd3c6220bb15b992331134a07ef0d16bb102276 100644
--- a/htdocs/langs/en_US/projects.lang
+++ b/htdocs/langs/en_US/projects.lang
@@ -163,6 +163,7 @@ ProjectsWithThisUserAsContact=Projects with this user as contact
 TasksWithThisUserAsContact=Tasks assigned to this user
 ResourceNotAssignedToProject=Not assigned to project
 ResourceNotAssignedToTask=Not assigned to task
+ResourceNotAssignedToTheTask=Not assigned to the task
 AssignTaskToMe=Assign task to me
 AssignTask=Assign
 ProjectOverview=Overview
diff --git a/htdocs/projet/activity/perday.php b/htdocs/projet/activity/perday.php
index f41d585a6b8124873de34557afa2406ae58fe752..7ff01487beb04610596d494d24b0ed120ca23030 100644
--- a/htdocs/projet/activity/perday.php
+++ b/htdocs/projet/activity/perday.php
@@ -108,6 +108,35 @@ if ($action == 'assign')
     {
     	$idfortaskuser=$user->id;
 		$result = $object->add_contact($idfortaskuser, GETPOST("type"), 'internal');
+
+    	if ($result >= 0 || $result == -2)	// Contact add ok or already contact of task
+    	{
+			// Test if we are already contact of the project (should be rare but sometimes we can add as task contact without being contact of project, like when admin user has been removed from contact of project)
+    		$sql='SELECT ec.rowid FROM '.MAIN_DB_PREFIX.'element_contact as ec, '.MAIN_DB_PREFIX.'c_type_contact as tc WHERE tc.rowid = ec.fk_c_type_contact';
+    		$sql.=' AND ec.fk_socpeople = '.$idfortaskuser." AND ec.element_id = '.$object->fk_project.' AND tc.element = 'project' AND source = 'internal'";
+    		$resql=$db->query($sql);
+    		if ($resql)
+    		{
+    			$obj=$db->fetch_object($resql);
+    			if (! $obj)	// User is not already linked to project, so we will create link to first type
+    			{
+    				$project = new Project($db);
+    				$project->fetch($object->fk_project);
+    				// Get type
+    				$listofprojcontact=$project->liste_type_contact('internal');
+    				
+    				if (count($listofprojcontact))
+    				{
+    					$typeforprojectcontact=reset(array_keys($listofprojcontact));
+    					$result = $project->add_contact($idfortaskuser, $typeforprojectcontact, 'internal');
+    				}
+    			}
+    		}
+    		else 
+    		{
+    			dol_print_error($db);
+    		}
+    	}
     }
 
 	if ($result < 0)
diff --git a/htdocs/projet/activity/perweek.php b/htdocs/projet/activity/perweek.php
index cc31d1090f82b87295deb096fda4008fd5835f15..e1c684159b2a5399f8ab49efed48d11553bda3a8 100644
--- a/htdocs/projet/activity/perweek.php
+++ b/htdocs/projet/activity/perweek.php
@@ -120,7 +120,36 @@ if ($action == 'assign')
     if (! $error)
     {
     	$idfortaskuser=$user->id;
-		$result = $object->add_contact($idfortaskuser, GETPOST("type"), 'internal');
+    	$result = $object->add_contact($idfortaskuser, GETPOST("type"), 'internal');
+
+    	if (! $result || $result == -2)	// Contact add ok or already contact of task
+    	{
+    		// Test if we are already contact of the project (should be rare but sometimes we can add as task contact without being contact of project, like when admin user has been removed from contact of project)
+    		$sql='SELECT ec.rowid FROM '.MAIN_DB_PREFIX.'element_contact as ec, '.MAIN_DB_PREFIX.'c_type_contact as tc WHERE tc.rowid = ec.fk_c_type_contact';
+    		$sql.=' AND ec.fk_socpeople = '.$idfortaskuser." AND ec.element_id = '.$object->fk_project.' AND tc.element = 'project' AND source = 'internal'";
+    		$resql=$db->query($sql);
+    		if ($resql)
+    		{
+    			$obj=$db->fetch_object($resql);
+    			if (! $obj)	// User is not already linked to project, so we will create link to first type
+    			{
+    				$project = new Project($db);
+    				$project->fetch($object->fk_project);
+    				// Get type
+    				$listofprojcontact=$project->liste_type_contact('internal');
+    				
+    				if (count($listofprojcontact))
+    				{
+    					$typeforprojectcontact=reset(array_keys($listofprojcontact));
+    					$result = $project->add_contact($idfortaskuser, $typeforprojectcontact, 'internal');
+    				}
+    			}
+    		}
+    		else 
+    		{
+    			dol_print_error($db);
+    		}
+    	}
     }
 
 	if ($result < 0)
diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php
index ac0adf33c772cdf6838c94798f71a9f2368a28e9..5ed3655615e95796acf44ce1fd6fe110d90b2204 100644
--- a/htdocs/projet/tasks/time.php
+++ b/htdocs/projet/tasks/time.php
@@ -395,7 +395,7 @@ if ($id > 0 || ! empty($ref))
 			if (count($contactsoftask)>0)
 			{
 				$userid=$contactsoftask[0];
-				print $form->select_dolusers((GETPOST('userid')?GETPOST('userid'):$userid), 'userid', 0, '', 0, '', $contactsoftask, 0, 0, 0, '', 0, $langs->trans("ResourceNotAssignedToTask"));
+				print $form->select_dolusers((GETPOST('userid')?GETPOST('userid'):$userid), 'userid', 0, '', 0, '', $contactsoftask, 0, 0, 0, '', 0, $langs->trans("ResourceNotAssignedToTheTask"));
 			}
 			else
 			{
@@ -405,7 +405,7 @@ if ($id > 0 || ! empty($ref))
 
 			// Note
 			print '<td class="nowrap">';
-			print '<textarea name="timespent_note" cols="80" rows="'.ROWS_2.'">'.($_POST['timespent_note']?$_POST['timespent_note']:'').'</textarea>';
+			print '<textarea name="timespent_note" width="95%" rows="'.ROWS_2.'">'.($_POST['timespent_note']?$_POST['timespent_note']:'').'</textarea>';
 			print '</td>';
 
 			// Progress declared
@@ -528,7 +528,7 @@ if ($id > 0 || ! empty($ref))
 			print '<td align="left">';
 			if ($_GET['action'] == 'editline' && $_GET['lineid'] == $task_time->rowid)
 			{
-				print '<textarea name="timespent_note_line" cols="80" rows="'.ROWS_2.'">'.$task_time->note.'</textarea>';
+				print '<textarea name="timespent_note_line" width="95%" rows="'.ROWS_2.'">'.$task_time->note.'</textarea>';
 			}
 			else
 			{
diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php
index 4252dcf71f4e646b6fdc2186ba91ffcc74dec7ee..2c5ac022529b35d41be553664679552e79a3b7e2 100644
--- a/htdocs/theme/eldy/style.css.php
+++ b/htdocs/theme/eldy/style.css.php
@@ -2221,6 +2221,10 @@ div.pagination li.litext a:hover {
 	background-color: transparent;
 	background-image: none;
 }
+div.pagination li.litext a:hover {
+	background-color: transparent;
+	background-image: none;
+}
 <?php if (! empty($conf->dol_use_jmobile)) { ?>
 div.pagination li.litext {
   padding-top: 13px;