diff --git a/htdocs/install/inc.php b/htdocs/install/inc.php
index e5ad6f019a14ed78b21ed82f440b085fffd200f7..82e9a3dfeaa264ab33fee3ad4bad3520dc650682 100644
--- a/htdocs/install/inc.php
+++ b/htdocs/install/inc.php
@@ -86,7 +86,7 @@ if (! defined('DONOTLOADCONF') && file_exists($conffile))
 		if (empty($dolibarr_main_db_port) && ($dolibarr_main_db_type=='mysqli' || $dolibarr_main_db_type=='mysql')) $dolibarr_main_db_port='3306'; // For backward compatibility
 
 		// Clean parameters
-    	$dolibarr_main_data_root        =isset($dolibarr_main_data_root)?trim($dolibarr_main_data_root):'';
+		$dolibarr_main_data_root        =isset($dolibarr_main_data_root)?trim($dolibarr_main_data_root):DOL_DOCUMENT_ROOT . '/../documents';
     	$dolibarr_main_url_root         =isset($dolibarr_main_url_root)?trim($dolibarr_main_url_root):'';
     	$dolibarr_main_url_root_alt     =isset($dolibarr_main_url_root_alt)?trim($dolibarr_main_url_root_alt):'';
     	$dolibarr_main_document_root    =isset($dolibarr_main_document_root)?trim($dolibarr_main_document_root):'';
@@ -133,7 +133,7 @@ if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_m
 define('MAIN_DB_PREFIX',(isset($dolibarr_main_db_prefix)?$dolibarr_main_db_prefix:''));
 
 define('DOL_CLASS_PATH', 'class/');                             // Filsystem path to class dir
-define('DOL_DATA_ROOT',(isset($dolibarr_main_data_root)?$dolibarr_main_data_root:''));
+define('DOL_DATA_ROOT',(isset($dolibarr_main_data_root)?$dolibarr_main_data_root:DOL_DOCUMENT_ROOT . '/../documents'));
 define('DOL_MAIN_URL_ROOT', (isset($dolibarr_main_url_root)?$dolibarr_main_url_root:''));           // URL relative root
 $uri=preg_replace('/^http(s?):\/\//i','',constant('DOL_MAIN_URL_ROOT'));  // $uri contains url without http*
 $suburi = strstr($uri, '/');       // $suburi contains url without domain
diff --git a/htdocs/user/agenda_extsites.php b/htdocs/user/agenda_extsites.php
index ea8c197867722a2c40e7d48a5efdd5eec26c3add..dc5ec528a2189d2858e794f789a0542beec67828 100644
--- a/htdocs/user/agenda_extsites.php
+++ b/htdocs/user/agenda_extsites.php
@@ -66,45 +66,43 @@ $result = restrictedArea($user, 'user', $id, 'user&user', $feature2);
 if (($object->id != $user->id) && (! $user->rights->user->user->lire))
   accessforbidden();
 
-
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$hookmanager->initHooks(array('usercard','globalcard'));
 
 /*
  * Actions
  */
-if ($actionsave)
-{
-    $db->begin();
-
-	$i=1; $errorsaved=0;
-	$error=0;
-	$tabparam=array();
-
-	// Save agendas
-	while ($i <= $MAXAGENDA)
-	{
-		$name=trim(GETPOST('AGENDA_EXT_NAME_'.$id.'_'.$i,'alpha'));
-		$src=trim(GETPOST('AGENDA_EXT_SRC_'.$id.'_'.$i,'alpha'));
-		$offsettz=trim(GETPOST('AGENDA_EXT_OFFSETTZ_'.$id.'_'.$i,'alpha'));
-		$color=trim(GETPOST('AGENDA_EXT_COLOR_'.$id.'_'.$i,'alpha'));
-		if ($color=='-1') $color='';
-		$enabled=trim(GETPOST('AGENDA_EXT_ENABLED_'.$id.'_'.$i,'alpha'));
-
-		if (! empty($src) && ! dol_is_url($src))
-		{
-			setEventMessage($langs->trans("ErrorParamMustBeAnUrl"),'errors');
-			$error++;
-			$errorsaved++;
-			break;
-		}
-
-		$tabparam['AGENDA_EXT_NAME_'.$id.'_'.$i]=$name;
-		$tabparam['AGENDA_EXT_SRC_'.$id.'_'.$i]=$src;
-		$tabparam['AGENDA_EXT_OFFSETTZ_'.$id.'_'.$i]=$offsettz;
-		$tabparam['AGENDA_EXT_COLOR_'.$id.'_'.$i]=$color;
-		$tabparam['AGENDA_EXT_ENABLED_'.$id.'_'.$i]=$enabled;
 
-		$i++;
-	}
+$parameters=array('id'=>$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)) {
+	if ($actionsave) {
+		$db->begin();
+
+		$i = 1;
+		$errorsaved = 0;
+		$error = 0;
+		$tabparam = array();
+
+		// Save agendas
+		while ($i <= $MAXAGENDA) {
+			$name = trim(GETPOST('AGENDA_EXT_NAME_'.$id.'_'.$i, 'alpha'));
+			$src = trim(GETPOST('AGENDA_EXT_SRC_'.$id.'_'.$i, 'alpha'));
+			$offsettz = trim(GETPOST('AGENDA_EXT_OFFSETTZ_'.$id.'_'.$i, 'alpha'));
+			$color = trim(GETPOST('AGENDA_EXT_COLOR_'.$id.'_'.$i, 'alpha'));
+			if ($color == '-1') {
+				$color = '';
+			}
+			$enabled = trim(GETPOST('AGENDA_EXT_ENABLED_'.$id.'_'.$i, 'alpha'));
+
+			if (!empty($src) && !dol_is_url($src)) {
+				setEventMessage($langs->trans("ErrorParamMustBeAnUrl"), 'errors');
+				$error ++;
+				$errorsaved ++;
+				break;
+			}
 
 	if (! $error)
 	{
@@ -112,16 +110,26 @@ if ($actionsave)
 		if (! $result > 0) $error++;
 	}
 
-    if (! $error)
-    {
-        $db->commit();
-        setEventMessage($langs->trans("SetupSaved"));
-    }
-    else
-    {
-        $db->rollback();
-        if (empty($errorsaved))	setEventMessage($langs->trans("Error"),'errors');
-    }
+			$i ++;
+		}
+
+		if (!$error) {
+			$result = dol_set_user_param($db, $conf, $fuser, $tabparam);
+			if (!$result > 0) {
+				$error ++;
+			}
+		}
+
+		if (!$error) {
+			$db->commit();
+			setEventMessage($langs->trans("SetupSaved"));
+		} else {
+			$db->rollback();
+			if (empty($errorsaved)) {
+				setEventMessage($langs->trans("Error"), 'errors');
+			}
+		}
+	}
 }
 
 /*
diff --git a/htdocs/user/card.php b/htdocs/user/card.php
index 25167d1fd94875bd4b3f07f99fe81fb09dcd56aa..aa27914e1d5629600dfc66067928cf6be080500a 100644
--- a/htdocs/user/card.php
+++ b/htdocs/user/card.php
@@ -101,175 +101,159 @@ $hookmanager->initHooks(array('usercard','globalcard'));
  * Actions
  */
 
-if ($action == 'confirm_disable' && $confirm == "yes" && $candisableuser)
-{
-    if ($id <> $user->id)
-    {
-        $object->fetch($id);
-        $object->setstatus(0);
-        header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
-        exit;
-    }
-}
-if ($action == 'confirm_enable' && $confirm == "yes" && $candisableuser)
-{
-	$error = 0;
+$parameters=array('id'=>$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 ($id <> $user->id)
-    {
-        $object->fetch($id);
+if (empty($reshook)) {
 
-        if (!empty($conf->file->main_limit_users))
-        {
-            $nb = $object->getNbOfUsers("active");
-            if ($nb >= $conf->file->main_limit_users)
-            {
-	            $error++;
-                setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors');
-            }
-        }
-
-        if (! $error)
-        {
-            $object->setstatus(1);
+    if ($action == 'confirm_disable' && $confirm == "yes" && $candisableuser) {
+        if ($id <> $user->id) {
+            $object->fetch($id);
+            $object->setstatus(0);
             header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
             exit;
         }
     }
-}
+    if ($action == 'confirm_enable' && $confirm == "yes" && $candisableuser) {
+        $error = 0;
 
-if ($action == 'confirm_delete' && $confirm == "yes" && $candisableuser)
-{
-    if ($id <> $user->id)
-    {
-        $object = new User($db);
-        $object->id=$id;
-        $result = $object->delete();
-        if ($result < 0)
-        {
-            $langs->load("errors");
-            setEventMessage($langs->trans("ErrorUserCannotBeDelete"), 'errors');
+        if ($id <> $user->id) {
+            $object->fetch($id);
+
+            if (!empty($conf->file->main_limit_users)) {
+                $nb = $object->getNbOfUsers("active");
+                if ($nb >= $conf->file->main_limit_users) {
+                    $error ++;
+                    setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors');
+                }
+            }
+
+            if (!$error) {
+                $object->setstatus(1);
+                header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
+                exit;
+            }
         }
-        else
-        {
-            header("Location: index.php");
-            exit;
+    }
+
+    if ($action == 'confirm_delete' && $confirm == "yes" && $candisableuser) {
+        if ($id <> $user->id) {
+            $object = new User($db);
+            $object->id = $id;
+            $result = $object->delete();
+            if ($result < 0) {
+                $langs->load("errors");
+                setEventMessage($langs->trans("ErrorUserCannotBeDelete"), 'errors');
+            } else {
+                header("Location: index.php");
+                exit;
+            }
         }
     }
-}
 
 // Action Add user
-if ($action == 'add' && $canadduser)
-{
-	$error = 0;
-
-    if (! $_POST["lastname"])
-    {
-	    $error++;
-        setEventMessage($langs->trans("NameNotDefined"), 'errors');
-        $action="create";       // Go back to create page
-    }
-    if (! $_POST["login"])
-    {
-	    $error++;
-	    setEventMessage($langs->trans("LoginNotDefined"), 'errors');
-        $action="create";       // Go back to create page
-    }
+    if ($action == 'add' && $canadduser) {
+        $error = 0;
 
-    if (! empty($conf->file->main_limit_users)) // If option to limit users is set
-    {
-        $nb = $object->getNbOfUsers("active");
-        if ($nb >= $conf->file->main_limit_users)
-        {
-	        $error++;
-	        setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors');
-            $action="create";       // Go back to create page
+        if (!$_POST["lastname"]) {
+            $error ++;
+            setEventMessage($langs->trans("NameNotDefined"), 'errors');
+            $action = "create";       // Go back to create page
+        }
+        if (!$_POST["login"]) {
+            $error ++;
+            setEventMessage($langs->trans("LoginNotDefined"), 'errors');
+            $action = "create";       // Go back to create page
         }
-    }
 
-    if (!$error)
-    {
-        $object->lastname		= GETPOST("lastname",'alpha');
-        $object->firstname	    = GETPOST("firstname",'alpha');
-        $object->login		    = GETPOST("login",'alpha');
-        $object->api_key		= GETPOST("api_key",'alpha');
-        $object->gender		    = GETPOST("gender",'alpha');
-        $object->admin		    = GETPOST("admin",'alpha');
-        $object->office_phone	= GETPOST("office_phone",'alpha');
-        $object->office_fax	    = GETPOST("office_fax",'alpha');
-        $object->user_mobile	= GETPOST("user_mobile");
-        $object->skype          = GETPOST("skype");
-        $object->email		    = GETPOST("email",'alpha');
-        $object->job			= GETPOST("job",'alpha');
-        $object->signature	    = GETPOST("signature");
-        $object->accountancy_code = GETPOST("accountancy_code");
-        $object->note			= GETPOST("note");
-        $object->ldap_sid		= GETPOST("ldap_sid");
-        $object->fk_user        = GETPOST("fk_user")>0?GETPOST("fk_user"):0;
-
-        $object->thm            = GETPOST("thm")!=''?GETPOST("thm"):'';
-        $object->tjm            = GETPOST("tjm")!=''?GETPOST("tjm"):'';
-        $object->salary         = GETPOST("salary")!=''?GETPOST("salary"):'';
-        $object->salaryextra    = GETPOST("salaryextra")!=''?GETPOST("salaryextra"):'';
-        $object->weeklyhours    = GETPOST("weeklyhours")!=''?GETPOST("weeklyhours"):'';
-
-		$object->color			= GETPOST("color")!=''?GETPOST("color"):'';
-
-        // Fill array 'array_options' with data from add form
-        $ret = $extrafields->setOptionalsFromPost($extralabels,$object);
-		if ($ret < 0) $error++;
-
-        // Set entity property
-        $entity=GETPOST('entity','int');
-        if (! empty($conf->multicompany->enabled))
+        if (!empty($conf->file->main_limit_users)) // If option to limit users is set
         {
-        	if (! empty($_POST["superadmin"]))
-        	{
-        		$object->entity = 0;
-        	}
-        	else if ($conf->multicompany->transverse_mode)
-        	{
-        		$object->entity = 1; // all users are forced into master entity
-        	}
-        	else
-        	{
-        		$object->entity = ($entity == '' ? 1 : $entity);
-        	}
-        }
-        else
-		{
-        	$object->entity = ($entity == '' ? 1 : $entity);
-        	/*if ($user->admin && $user->entity == 0 && GETPOST("admin",'alpha'))
-        	{
-        	}*/
+            $nb = $object->getNbOfUsers("active");
+            if ($nb >= $conf->file->main_limit_users) {
+                $error ++;
+                setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors');
+                $action = "create";       // Go back to create page
+            }
         }
 
-        $db->begin();
+        if (!$error) {
+            $object->lastname = GETPOST("lastname", 'alpha');
+            $object->firstname = GETPOST("firstname", 'alpha');
+            $object->login = GETPOST("login", 'alpha');
+            $object->api_key = GETPOST("api_key", 'alpha');
+            $object->gender = GETPOST("gender", 'alpha');
+            $object->admin = GETPOST("admin", 'alpha');
+            $object->office_phone = GETPOST("office_phone", 'alpha');
+            $object->office_fax = GETPOST("office_fax", 'alpha');
+            $object->user_mobile = GETPOST("user_mobile");
+            $object->skype = GETPOST("skype");
+            $object->email = GETPOST("email", 'alpha');
+            $object->job = GETPOST("job", 'alpha');
+            $object->signature = GETPOST("signature");
+            $object->accountancy_code = GETPOST("accountancy_code");
+            $object->note = GETPOST("note");
+            $object->ldap_sid = GETPOST("ldap_sid");
+            $object->fk_user = GETPOST("fk_user") > 0 ? GETPOST("fk_user") : 0;
+
+            $object->thm = GETPOST("thm") != '' ? GETPOST("thm") : '';
+            $object->tjm = GETPOST("tjm") != '' ? GETPOST("tjm") : '';
+            $object->salary = GETPOST("salary") != '' ? GETPOST("salary") : '';
+            $object->salaryextra = GETPOST("salaryextra") != '' ? GETPOST("salaryextra") : '';
+            $object->weeklyhours = GETPOST("weeklyhours") != '' ? GETPOST("weeklyhours") : '';
+
+            $object->color = GETPOST("color") != '' ? GETPOST("color") : '';
 
-        $id = $object->create($user);
-        if ($id > 0)
-        {
-            if (isset($_POST['password']) && trim($_POST['password']))
-            {
-                $object->setPassword($user,trim($_POST['password']));
+            // Fill array 'array_options' with data from add form
+            $ret = $extrafields->setOptionalsFromPost($extralabels, $object);
+            if ($ret < 0) {
+                $error ++;
+            }
+
+            // Set entity property
+            $entity = GETPOST('entity', 'int');
+            if (!empty($conf->multicompany->enabled)) {
+                if (!empty($_POST["superadmin"])) {
+                    $object->entity = 0;
+                } else {
+                    if ($conf->multicompany->transverse_mode) {
+                        $object->entity = 1; // all users are forced into master entity
+                    } else {
+                        $object->entity = ($entity == '' ? 1 : $entity);
+                    }
+                }
+            } else {
+                $object->entity = ($entity == '' ? 1 : $entity);
+                /*if ($user->admin && $user->entity == 0 && GETPOST("admin",'alpha'))
+				{
+				}*/
             }
 
-            $db->commit();
+            $db->begin();
 
-            header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
-            exit;
-        }
-        else
-        {
-            $langs->load("errors");
-            $db->rollback();
-            if (is_array($object->errors) && count($object->errors)) setEventMessage($object->errors,'errors');
-            else setEventMessage($object->error, 'errors');
-            $action="create";       // Go back to create page
-        }
+            $id = $object->create($user);
+            if ($id > 0) {
+                if (isset($_POST['password']) && trim($_POST['password'])) {
+                    $object->setPassword($user, trim($_POST['password']));
+                }
+
+                $db->commit();
 
+                header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
+                exit;
+            } else {
+                $langs->load("errors");
+                $db->rollback();
+                if (is_array($object->errors) && count($object->errors)) {
+                    setEventMessage($object->errors, 'errors');
+                } else {
+                    setEventMessage($object->error, 'errors');
+                }
+                $action = "create";       // Go back to create page
+            }
+
+        }
     }
-}
 
 // Action add usergroup
 if (($action == 'addgroup' || $action == 'removegroup') && $caneditfield)
@@ -280,97 +264,74 @@ if (($action == 'addgroup' || $action == 'removegroup') && $caneditfield)
         $editgroup->fetch($group);
 		$editgroup->oldcopy=clone $editgroup;
 
-        $object->fetch($id);
-        if ($action == 'addgroup')    $object->SetInGroup($group,($conf->multicompany->transverse_mode?GETPOST("entity"):$editgroup->entity));
-        if ($action == 'removegroup') $object->RemoveFromGroup($group,($conf->multicompany->transverse_mode?GETPOST("entity"):$editgroup->entity));
+            $object->fetch($id);
+            if ($action == 'addgroup') {
+                $object->SetInGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity));
+            }
+            if ($action == 'removegroup') {
+                $object->RemoveFromGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity));
+            }
 
-        if ($result > 0)
-        {
-            header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
-            exit;
-        }
-        else
-        {
-            setEventMessage($object->error, 'errors');
+            if ($result > 0) {
+                header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
+                exit;
+            } else {
+                setEventMessage($object->error, 'errors');
+            }
         }
     }
-}
 
-if ($action == 'update' && ! $_POST["cancel"])
-{
-    require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
-
-    if ($caneditfield)	// Case we can edit all field
-    {
-        $error=0;
-
-    	if (! $_POST["lastname"])
-        {
-	        setEventMessage($langs->trans("NameNotDefined"), 'errors');
-            $action="edit";       // Go back to create page
-            $error++;
-        }
-        if (! $_POST["login"])
-        {
-	        setEventMessage($langs->trans("LoginNotDefined"), 'errors');
-            $action="edit";       // Go back to create page
-            $error++;
-        }
+    if ($action == 'update' && !$_POST["cancel"]) {
+        require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
 
-        if (! $error)
+        if ($caneditfield)    // Case we can edit all field
         {
-            $object->fetch($id);
+            $error = 0;
 
-            // Test if new login
-            if (GETPOST("login") && GETPOST("login") != $object->login)
-            {
-				dol_syslog("New login ".$object->login." is requested. We test it does not exists.");
-				$tmpuser=new User($db);
-				$result=$tmpuser->fetch(0, GETPOST("login"));
-				if ($result > 0)
-				{
-					setEventMessage($langs->trans("ErrorLoginAlreadyExists", GETPOST('login')), 'errors');
-					$action="edit";       // Go back to create page
-					$error++;
-				}
+            if (!$_POST["lastname"]) {
+                setEventMessage($langs->trans("NameNotDefined"), 'errors');
+                $action = "edit";       // Go back to create page
+                $error ++;
+            }
+            if (!$_POST["login"]) {
+                setEventMessage($langs->trans("LoginNotDefined"), 'errors');
+                $action = "edit";       // Go back to create page
+                $error ++;
             }
-       }
 
-       if (! $error)
-       {
-            $db->begin();
+            if (!$error) {
+                $object->fetch($id);
 
 			$object->oldcopy = clone $object;
 
-            $object->lastname	= GETPOST("lastname",'alpha');
-            $object->firstname	= GETPOST("firstname",'alpha');
-            $object->login		= GETPOST("login",'alpha');
-            $object->gender		= GETPOST("gender",'alpha');
-            $object->pass		= GETPOST("password");
-            $object->api_key    = (GETPOST("api_key", 'alpha'))?GETPOST("api_key", 'alpha'):$object->api_key;
-            $object->admin		= empty($user->admin)?0:GETPOST("admin"); // A user can only be set admin by an admin
-            $object->office_phone=GETPOST("office_phone",'alpha');
-            $object->office_fax	= GETPOST("office_fax",'alpha');
-            $object->user_mobile= GETPOST("user_mobile");
-            $object->skype    	= GETPOST("skype");
-            $object->email		= GETPOST("email",'alpha');
-            $object->job		= GETPOST("job",'alpha');
-            $object->signature	= GETPOST("signature");
-            $object->accountancy_code	= GETPOST("accountancy_code");
-            $object->openid		= GETPOST("openid");
-            $object->fk_user    = GETPOST("fk_user")>0?GETPOST("fk_user"):0;
-
-	        $object->thm            = GETPOST("thm")!=''?GETPOST("thm"):'';
-	        $object->tjm            = GETPOST("tjm")!=''?GETPOST("tjm"):'';
-	        $object->salary         = GETPOST("salary")!=''?GETPOST("salary"):'';
-	        $object->salaryextra    = GETPOST("salaryextra")!=''?GETPOST("salaryextra"):'';
-	        $object->weeklyhours    = GETPOST("weeklyhours")!=''?GETPOST("weeklyhours"):'';
-
-			$object->color    	= GETPOST("color")!=''?GETPOST("color"):'';
-
-            // Fill array 'array_options' with data from add form
-        	$ret = $extrafields->setOptionalsFromPost($extralabels,$object);
-			if ($ret < 0) $error++;
+            if (!$error) {
+                $db->begin();
+
+                $object->oldcopy = dol_clone($object);
+
+                $object->lastname = GETPOST("lastname", 'alpha');
+                $object->firstname = GETPOST("firstname", 'alpha');
+                $object->login = GETPOST("login", 'alpha');
+                $object->gender = GETPOST("gender", 'alpha');
+                $object->pass = GETPOST("password");
+                $object->api_key = (GETPOST("api_key", 'alpha')) ? GETPOST("api_key", 'alpha') : $object->api_key;
+                $object->admin = empty($user->admin) ? 0 : GETPOST("admin"); // A user can only be set admin by an admin
+                $object->office_phone = GETPOST("office_phone", 'alpha');
+                $object->office_fax = GETPOST("office_fax", 'alpha');
+                $object->user_mobile = GETPOST("user_mobile");
+                $object->skype = GETPOST("skype");
+                $object->email = GETPOST("email", 'alpha');
+                $object->job = GETPOST("job", 'alpha');
+                $object->signature = GETPOST("signature");
+                $object->accountancy_code = GETPOST("accountancy_code");
+                $object->openid = GETPOST("openid");
+                $object->fk_user = GETPOST("fk_user") > 0 ? GETPOST("fk_user") : 0;
+
+                $object->thm = GETPOST("thm") != '' ? GETPOST("thm") : '';
+                $object->tjm = GETPOST("tjm") != '' ? GETPOST("tjm") : '';
+                $object->salary = GETPOST("salary") != '' ? GETPOST("salary") : '';
+                $object->salaryextra = GETPOST("salaryextra") != '' ? GETPOST("salaryextra") : '';
+                $object->weeklyhours = GETPOST("weeklyhours") != '' ? GETPOST("weeklyhours") : '';
 
             if (! empty($conf->multicompany->enabled))
             {
@@ -392,121 +353,137 @@ if ($action == 'update' && ! $_POST["cancel"])
             	$object->entity = (! GETPOST('entity', 'int') ? 0 : GETPOST('entity', 'int'));
             }
 
-            if (GETPOST('deletephoto')) $object->photo='';
-            if (! empty($_FILES['photo']['name'])) $object->photo = dol_sanitizeFileName($_FILES['photo']['name']);
-
-            if (! $error)
-            {
-	            $ret=$object->update($user);
-	            if ($ret < 0)
-	            {
-	            	$error++;
-	                if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
-	                {
-	                    $langs->load("errors");
-		                setEventMessage($langs->trans("ErrorLoginAlreadyExists",$object->login), 'errors');
-	                }
-	                else
-	              {
-		            	setEventMessages($object->error, $object->errors, 'errors');
-	                }
-	            }
-            }
-
-            if (! $error && isset($_POST['contactid']))
-            {
-            	$contactid=GETPOST('contactid');
-
-            	if ($contactid > 0)
-            	{
-	            	$contact=new Contact($db);
-	            	$contact->fetch($contactid);
+                // Fill array 'array_options' with data from add form
+                $ret = $extrafields->setOptionalsFromPost($extralabels, $object);
+                if ($ret < 0) {
+                    $error ++;
+                }
 
-	            	$sql = "UPDATE ".MAIN_DB_PREFIX."user";
-	            	$sql.= " SET fk_socpeople=".$db->escape($contactid);
-	            	if ($contact->socid) $sql.=", fk_soc=".$db->escape($contact->socid);
-	            	$sql.= " WHERE rowid=".$object->id;
-            	}
-            	else
-            	{
-            		$sql = "UPDATE ".MAIN_DB_PREFIX."user";
-            		$sql.= " SET fk_socpeople=NULL, fk_soc=NULL";
-            		$sql.= " WHERE rowid=".$object->id;
-            	}
-	            dol_syslog("fiche::update", LOG_DEBUG);
-            	$resql=$db->query($sql);
-            	if (! $resql)
-            	{
-            		$error++;
-            		setEventMessage($db->lasterror(), 'errors');
-            	}
-            }
+                if (!empty($conf->multicompany->enabled)) {
+                    if (!empty($_POST["superadmin"])) {
+                        $object->entity = 0;
+                    } else {
+                        if ($conf->multicompany->transverse_mode) {
+                            $object->entity = 1; // all users in master entity
+                        } else {
+                            $object->entity = (empty($_POST["entity"]) ? 0 : $_POST["entity"]);
+                        }
+                    }
+                } else {
+                    $object->entity = (empty($_POST["entity"]) ? 0 : $_POST["entity"]);
+                }
 
-            if (! $error && ! count($object->errors))
-            {
-                if (GETPOST('deletephoto') && $object->photo)
-                {
-                    $fileimg=$conf->user->dir_output.'/'.get_exdir($object->id,2,0,1,$object,'user').'/logos/'.$object->photo;
-                    $dirthumbs=$conf->user->dir_output.'/'.get_exdir($object->id,2,0,1,$object,'user').'/logos/thumbs';
-                    dol_delete_file($fileimg);
-                    dol_delete_dir_recursive($dirthumbs);
+                if (GETPOST('deletephoto')) {
+                    $object->photo = '';
+                }
+                if (!empty($_FILES['photo']['name'])) {
+                    $object->photo = dol_sanitizeFileName($_FILES['photo']['name']);
                 }
 
-                if (isset($_FILES['photo']['tmp_name']) && trim($_FILES['photo']['tmp_name']))
-                {
-                    $dir= $conf->user->dir_output . '/' . get_exdir($object->id,2,0,1,$object,'user');
+                if (!$error) {
+                    $ret = $object->update($user);
+                    if ($ret < 0) {
+                        $error ++;
+                        if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
+                            $langs->load("errors");
+                            setEventMessage($langs->trans("ErrorLoginAlreadyExists", $object->login), 'errors');
+                        } else {
+                            setEventMessages($object->error, $object->errors, 'errors');
+                        }
+                    }
+                }
 
-                    dol_mkdir($dir);
+                if (!$error && isset($_POST['contactid'])) {
+                    $contactid = GETPOST('contactid');
 
-                    if (@is_dir($dir))
-                    {
-                        $newfile=$dir.'/'.dol_sanitizeFileName($_FILES['photo']['name']);
-                        $result=dol_move_uploaded_file($_FILES['photo']['tmp_name'],$newfile,1,0,$_FILES['photo']['error']);
+                    if ($contactid > 0) {
+                        $contact = new Contact($db);
+                        $contact->fetch($contactid);
 
-                        if (! $result > 0)
-                        {
-	                        setEventMessage($langs->trans("ErrorFailedToSaveFile"), 'errors');
+                        $sql = "UPDATE ".MAIN_DB_PREFIX."user";
+                        $sql .= " SET fk_socpeople=".$db->escape($contactid);
+                        if ($contact->socid) {
+                            $sql .= ", fk_soc=".$db->escape($contact->socid);
                         }
-                        else
-                        {
-                            // Create small thumbs for company (Ratio is near 16/9)
-                            // Used on logon for example
-                            $imgThumbSmall = vignette($newfile, $maxwidthsmall, $maxheightsmall, '_small', $quality);
+                        $sql .= " WHERE rowid=".$object->id;
+                    } else {
+                        $sql = "UPDATE ".MAIN_DB_PREFIX."user";
+                        $sql .= " SET fk_socpeople=NULL, fk_soc=NULL";
+                        $sql .= " WHERE rowid=".$object->id;
+                    }
+                    dol_syslog("fiche::update", LOG_DEBUG);
+                    $resql = $db->query($sql);
+                    if (!$resql) {
+                        $error ++;
+                        setEventMessage($db->lasterror(), 'errors');
+                    }
+                }
 
-                            // Create mini thumbs for company (Ratio is near 16/9)
-                            // Used on menu or for setup page for example
-                            $imgThumbMini = vignette($newfile, $maxwidthmini, $maxheightmini, '_mini', $quality);
+                if (!$error && !count($object->errors)) {
+                    if (GETPOST('deletephoto') && $object->photo) {
+                        $fileimg = $conf->user->dir_output.'/'.get_exdir($object->id, 2, 0, 1, $object, 'user').'/logos/'.$object->photo;
+                        $dirthumbs = $conf->user->dir_output.'/'.get_exdir($object->id, 2, 0, 1, $object, 'user').'/logos/thumbs';
+                        dol_delete_file($fileimg);
+                        dol_delete_dir_recursive($dirthumbs);
+                    }
+
+                    if (isset($_FILES['photo']['tmp_name']) && trim($_FILES['photo']['tmp_name'])) {
+                        $dir = $conf->user->dir_output.'/'.get_exdir($object->id, 2, 0, 1, $object, 'user');
+
+                        dol_mkdir($dir);
+
+                        if (@is_dir($dir)) {
+                            $newfile = $dir.'/'.dol_sanitizeFileName($_FILES['photo']['name']);
+                            $result = dol_move_uploaded_file($_FILES['photo']['tmp_name'], $newfile, 1, 0, $_FILES['photo']['error']);
+
+                            if (!$result > 0) {
+                                setEventMessage($langs->trans("ErrorFailedToSaveFile"), 'errors');
+                            } else {
+                                // Create small thumbs for company (Ratio is near 16/9)
+                                // Used on logon for example
+                                $imgThumbSmall = vignette($newfile, $maxwidthsmall, $maxheightsmall, '_small', $quality);
+
+                                // Create mini thumbs for company (Ratio is near 16/9)
+                                // Used on menu or for setup page for example
+                                $imgThumbMini = vignette($newfile, $maxwidthmini, $maxheightmini, '_mini', $quality);
+                            }
+                        } else {
+                            $error ++;
+                            $langs->load("errors");
+                            setEventMessages($langs->trans("ErrorFailedToCreateDir", $dir), $mesgs, 'errors');
                         }
                     }
-                    else
+                }
+
+                if (!$error && !count($object->errors)) {
+                    setEventMessage($langs->trans("UserModified"));
+                    $db->commit();
+
+                    $login = $_SESSION["dol_login"];
+                    if ($login && $login == $object->oldcopy->login && $object->oldcopy->login != $object->login)    // Current user has changed its login
                     {
                     	$error++;
                     	$langs->load("errors");
                     	setEventMessages($langs->transnoentitiesnoconv("ErrorFailedToCreateDir", $dir), $mesgs, 'errors');
                     }
+                } else {
+                    $db->rollback();
                 }
             }
-
-            if (! $error && ! count($object->errors))
+        } else {
+            if ($caneditpassword)    // Case we can edit only password
             {
-	            setEventMessage($langs->trans("UserModified"));
-                $db->commit();
+                $object->fetch($id);
 
-                $login=$_SESSION["dol_login"];
-                if ($login && $login == $object->oldcopy->login && $object->oldcopy->login != $object->login)	// Current user has changed its login
-                {
-                	$_SESSION["dol_login"]=$object->login;	// Set new login to avoid disconnect at next page
+                $object->oldcopy = dol_clone($object);
+
+                $ret = $object->setPassword($user, $_POST["password"]);
+                if ($ret < 0) {
+                    setEventMessage($object->error, 'errors');
                 }
             }
-            else
-            {
-                $db->rollback();
-            }
         }
     }
-    else if ($caneditpassword)	// Case we can edit only password
-    {
-        $object->fetch($id);
 
 		$object->oldcopy = clone $object;
 
@@ -519,97 +496,83 @@ if ($action == 'update' && ! $_POST["cancel"])
 }
 
 // Change password with a new generated one
-if ((($action == 'confirm_password' && $confirm == 'yes')
-|| ($action == 'confirm_passwordsend' && $confirm == 'yes')) && $caneditpassword)
-{
-    $object->fetch($id);
+    if ((($action == 'confirm_password' && $confirm == 'yes')
+            || ($action == 'confirm_passwordsend' && $confirm == 'yes')) && $caneditpassword
+    ) {
+        $object->fetch($id);
 
-    $newpassword=$object->setPassword($user,'');
-    if ($newpassword < 0)
-    {
-        // Echec
-        setEventMessage($langs->trans("ErrorFailedToSetNewPassword"), 'errors');
-    }
-    else
-    {
-        // Succes
-        if ($action == 'confirm_passwordsend' && $confirm == 'yes')
-        {
-            if ($object->send_password($user,$newpassword) > 0)
-            {
-                setEventMessage($langs->trans("PasswordChangedAndSentTo",$object->email));
-            }
-            else
-            {
-	            setEventMessage($object->error, 'errors');
+        $newpassword = $object->setPassword($user, '');
+        if ($newpassword < 0) {
+            // Echec
+            setEventMessage($langs->trans("ErrorFailedToSetNewPassword"), 'errors');
+        } else {
+            // Succes
+            if ($action == 'confirm_passwordsend' && $confirm == 'yes') {
+                if ($object->send_password($user, $newpassword) > 0) {
+                    setEventMessage($langs->trans("PasswordChangedAndSentTo", $object->email));
+                } else {
+                    setEventMessage($object->error, 'errors');
+                }
+            } else {
+                setEventMessage($langs->trans("PasswordChangedTo", $newpassword), 'errors');
             }
         }
-        else
-        {
-	        setEventMessage($langs->trans("PasswordChangedTo",$newpassword), 'errors');
-        }
     }
-}
 
 // Action initialisation donnees depuis record LDAP
-if ($action == 'adduserldap')
-{
-    $selecteduser = $_POST['users'];
-
-    $required_fields = array(
-	$conf->global->LDAP_KEY_USERS,
-    $conf->global->LDAP_FIELD_NAME,
-    $conf->global->LDAP_FIELD_FIRSTNAME,
-    $conf->global->LDAP_FIELD_LOGIN,
-    $conf->global->LDAP_FIELD_LOGIN_SAMBA,
-    $conf->global->LDAP_FIELD_PASSWORD,
-    $conf->global->LDAP_FIELD_PASSWORD_CRYPTED,
-    $conf->global->LDAP_FIELD_PHONE,
-    $conf->global->LDAP_FIELD_FAX,
-    $conf->global->LDAP_FIELD_MOBILE,
-    $conf->global->LDAP_FIELD_SKYPE,
-    $conf->global->LDAP_FIELD_MAIL,
-    $conf->global->LDAP_FIELD_TITLE,
-	$conf->global->LDAP_FIELD_DESCRIPTION,
-    $conf->global->LDAP_FIELD_SID);
-
-    $ldap = new Ldap();
-    $result = $ldap->connect_bind();
-    if ($result >= 0)
-    {
-        // Remove from required_fields all entries not configured in LDAP (empty) and duplicated
-        $required_fields=array_unique(array_values(array_filter($required_fields, "dol_validElement")));
+    if ($action == 'adduserldap') {
+        $selecteduser = $_POST['users'];
+
+        $required_fields = array(
+            $conf->global->LDAP_KEY_USERS,
+            $conf->global->LDAP_FIELD_NAME,
+            $conf->global->LDAP_FIELD_FIRSTNAME,
+            $conf->global->LDAP_FIELD_LOGIN,
+            $conf->global->LDAP_FIELD_LOGIN_SAMBA,
+            $conf->global->LDAP_FIELD_PASSWORD,
+            $conf->global->LDAP_FIELD_PASSWORD_CRYPTED,
+            $conf->global->LDAP_FIELD_PHONE,
+            $conf->global->LDAP_FIELD_FAX,
+            $conf->global->LDAP_FIELD_MOBILE,
+            $conf->global->LDAP_FIELD_SKYPE,
+            $conf->global->LDAP_FIELD_MAIL,
+            $conf->global->LDAP_FIELD_TITLE,
+            $conf->global->LDAP_FIELD_DESCRIPTION,
+            $conf->global->LDAP_FIELD_SID
+        );
 
-        $ldapusers = $ldap->getRecords($selecteduser, $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields);
-        //print_r($ldapusers);
-
-        if (is_array($ldapusers))
-        {
-            foreach ($ldapusers as $key => $attribute)
-            {
-                $ldap_lastname		= $attribute[$conf->global->LDAP_FIELD_NAME];
-                $ldap_firstname		= $attribute[$conf->global->LDAP_FIELD_FIRSTNAME];
-                $ldap_login			= $attribute[$conf->global->LDAP_FIELD_LOGIN];
-                $ldap_loginsmb		= $attribute[$conf->global->LDAP_FIELD_LOGIN_SAMBA];
-                $ldap_pass			= $attribute[$conf->global->LDAP_FIELD_PASSWORD];
-                $ldap_pass_crypted	= $attribute[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED];
-                $ldap_phone			= $attribute[$conf->global->LDAP_FIELD_PHONE];
-                $ldap_fax			= $attribute[$conf->global->LDAP_FIELD_FAX];
-                $ldap_mobile		= $attribute[$conf->global->LDAP_FIELD_MOBILE];
-                $ldap_skype			= $attribute[$conf->global->LDAP_FIELD_SKYPE];
-                $ldap_mail			= $attribute[$conf->global->LDAP_FIELD_MAIL];
-                $ldap_sid			= $attribute[$conf->global->LDAP_FIELD_SID];
+        $ldap = new Ldap();
+        $result = $ldap->connect_bind();
+        if ($result >= 0) {
+            // Remove from required_fields all entries not configured in LDAP (empty) and duplicated
+            $required_fields = array_unique(array_values(array_filter($required_fields, "dol_validElement")));
+
+            $ldapusers = $ldap->getRecords($selecteduser, $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields);
+            //print_r($ldapusers);
+
+            if (is_array($ldapusers)) {
+                foreach ($ldapusers as $key => $attribute) {
+                    $ldap_lastname = $attribute[$conf->global->LDAP_FIELD_NAME];
+                    $ldap_firstname = $attribute[$conf->global->LDAP_FIELD_FIRSTNAME];
+                    $ldap_login = $attribute[$conf->global->LDAP_FIELD_LOGIN];
+                    $ldap_loginsmb = $attribute[$conf->global->LDAP_FIELD_LOGIN_SAMBA];
+                    $ldap_pass = $attribute[$conf->global->LDAP_FIELD_PASSWORD];
+                    $ldap_pass_crypted = $attribute[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED];
+                    $ldap_phone = $attribute[$conf->global->LDAP_FIELD_PHONE];
+                    $ldap_fax = $attribute[$conf->global->LDAP_FIELD_FAX];
+                    $ldap_mobile = $attribute[$conf->global->LDAP_FIELD_MOBILE];
+                    $ldap_skype = $attribute[$conf->global->LDAP_FIELD_SKYPE];
+                    $ldap_mail = $attribute[$conf->global->LDAP_FIELD_MAIL];
+                    $ldap_sid = $attribute[$conf->global->LDAP_FIELD_SID];
+                }
             }
+        } else {
+            setEventMessage($ldap->error, 'errors');
         }
     }
-    else
-    {
-        setEventMessage($ldap->error, 'errors');
-    }
 }
 
 
-
 /*
  * View
  */
diff --git a/htdocs/user/clicktodial.php b/htdocs/user/clicktodial.php
index 10e61f2412987182932cbee31e9334a70c453b0b..13aaff9560ff0f317fb51545d5221d3ad2d0b414 100644
--- a/htdocs/user/clicktodial.php
+++ b/htdocs/user/clicktodial.php
@@ -41,25 +41,33 @@ if ($user->id == $id)	// A user can always read its own card
 }
 $result = restrictedArea($user, 'user', $id, 'user&user', $feature2);
 
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$hookmanager->initHooks(array('usercard','globalcard'));
 
 /*
  * Actions
  */
 
-if ($action == 'update' && ! GETPOST('cancel'))
-{
-	$edituser = new User($db);
-	$edituser->fetch($id);
+$parameters=array('id'=>$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');
 
-	$edituser->clicktodial_url      = GETPOST("url");
-	$edituser->clicktodial_login    = GETPOST("login");
-	$edituser->clicktodial_password = GETPOST("password");
-	$edituser->clicktodial_poste    = GETPOST("poste");
+if (empty($reshook)) {
+    if ($action == 'update' && !GETPOST('cancel')) {
+        $edituser = new User($db);
+        $edituser->fetch($id);
 
-	$result=$edituser->update_clicktodial();
-	if ($result < 0) setEventMessage($edituser->error,'errors');
-}
+        $edituser->clicktodial_url = GETPOST("url");
+        $edituser->clicktodial_login = GETPOST("login");
+        $edituser->clicktodial_password = GETPOST("password");
+        $edituser->clicktodial_poste = GETPOST("poste");
 
+        $result = $edituser->update_clicktodial();
+        if ($result < 0) {
+            setEventMessage($edituser->error, 'errors');
+        }
+    }
+}
 
 
 /*
diff --git a/htdocs/user/document.php b/htdocs/user/document.php
index 46ceb72330c6673da24f8bba10840767e3ce7638..ef4f6650818ea31e90c2f4514c7b50f46b99b1b7 100644
--- a/htdocs/user/document.php
+++ b/htdocs/user/document.php
@@ -93,12 +93,20 @@ if ($id > 0 || ! empty($ref))
 	$upload_dir = $conf->user->multidir_output[$entitytouseforuserdir] . "/" . $object->id ;
 }
 
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$hookmanager->initHooks(array('usercard','globalcard'));
+
 /*
  * Actions
  */
 
-include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_pre_headers.tpl.php';
+$parameters=array('id'=>$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)) {
+	include_once DOL_DOCUMENT_ROOT.'/core/tpl/document_actions_pre_headers.tpl.php';
+}
 
 /*
  * View
diff --git a/htdocs/user/ldap.php b/htdocs/user/ldap.php
index 3445ab4495947c902b9a88ab6d8086b351e25b6a..48e4f8fcbb60693d2df43b21d5c10d84355c7143 100644
--- a/htdocs/user/ldap.php
+++ b/htdocs/user/ldap.php
@@ -45,37 +45,41 @@ $object = new User($db);
 $object->fetch($id);
 $object->getrights();
 
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$hookmanager->initHooks(array('usercard','globalcard'));
 
 /*
  * Actions
  */
 
-if ($_GET["action"] == 'dolibarr2ldap')
-{
-    $db->begin();
 
-    $ldap=new Ldap();
-    $result=$ldap->connect_bind();
+$parameters=array('id'=>$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');
 
-    $info=$object->_load_ldap_info();
-    $dn=$object->_load_ldap_dn($info);
-    $olddn=$dn;	// We can say that old dn = dn as we force synchro
+if (empty($reshook)) {
+    if ($_GET["action"] == 'dolibarr2ldap') {
+        $db->begin();
 
-    $result=$ldap->update($dn,$info,$user,$olddn);
+        $ldap = new Ldap();
+        $result = $ldap->connect_bind();
 
-    if ($result >= 0)
-    {
-        setEventMessage($langs->trans("UserSynchronized"));
-        $db->commit();
-    }
-    else
-    {
-        setEventMessage($ldap->error, 'errors');
-        $db->rollback();
+        $info = $object->_load_ldap_info();
+        $dn = $object->_load_ldap_dn($info);
+        $olddn = $dn;    // We can say that old dn = dn as we force synchro
+
+        $result = $ldap->update($dn, $info, $user, $olddn);
+
+        if ($result >= 0) {
+            setEventMessage($langs->trans("UserSynchronized"));
+            $db->commit();
+        } else {
+            setEventMessage($ldap->error, 'errors');
+            $db->rollback();
+        }
     }
 }
 
-
 /*
  * View
  */
diff --git a/htdocs/user/note.php b/htdocs/user/note.php
index 3aec8502ac111ba22642506c3b5663fd1ae696c0..7780227fb008af3ed461d3bbd7132ea358f8e58e 100644
--- a/htdocs/user/note.php
+++ b/htdocs/user/note.php
@@ -48,30 +48,32 @@ $feature2 = (($socid && $user->rights->user->self->creer)?'':'user');
 if ($user->id == $id) $feature2=''; // A user can always read its own card
 $result = restrictedArea($user, 'user', $id, 'user&user', $feature2);
 
-
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$hookmanager->initHooks(array('usercard','globalcard'));
 
 /******************************************************************************/
 /*                     Actions                                                */
 /******************************************************************************/
 
-if ($action == 'update' && $user->rights->user->user->creer && ! $_POST["cancel"])
-{
-	$db->begin();
-
-	$res=$object->update_note(dol_html_entity_decode(GETPOST('note_private'), ENT_QUOTES));
-	if ($res < 0)
-	{
-		$mesg='<div class="error">'.$adh->error.'</div>';
-		$db->rollback();
-	}
-	else
-	{
-		$db->commit();
+$parameters=array('id'=>$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)) {
+	if ($action == 'update' && $user->rights->user->user->creer && !$_POST["cancel"]) {
+		$db->begin();
+
+		$res = $object->update_note(dol_html_entity_decode(GETPOST('note_private'), ENT_QUOTES));
+		if ($res < 0) {
+			$mesg = '<div class="error">'.$adh->error.'</div>';
+			$db->rollback();
+		} else {
+			$db->commit();
+		}
 	}
 }
 
 
-
 /******************************************************************************/
 /* Affichage fiche                                                            */
 /******************************************************************************/
diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php
index ef803992d00066c886cf13b85ea1d36679a8fda3..85b4ba04e84933992c5dbd0fdd90476332fa87d1 100644
--- a/htdocs/user/param_ihm.php
+++ b/htdocs/user/param_ihm.php
@@ -74,24 +74,32 @@ $searchformtitle=array($langs->trans("Companies"),$langs->trans("Contacts"),$lan
 $form = new Form($db);
 $formadmin=new FormAdmin($db);
 
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$hookmanager->initHooks(array('usercard','globalcard'));
 
 /*
  * Actions
  */
-if ($action == 'update' && ($caneditfield || ! empty($user->admin)))
-{
-    if (! $_POST["cancel"])
-    {
-        $tabparam=array();
-
-        if ($_POST["check_MAIN_LANG_DEFAULT"]=="on") $tabparam["MAIN_LANG_DEFAULT"]=$_POST["main_lang_default"];
-        else $tabparam["MAIN_LANG_DEFAULT"]='';
-
-        if ($_POST["check_SIZE_LISTE_LIMIT"]=="on") $tabparam["MAIN_SIZE_LISTE_LIMIT"]=$_POST["main_size_liste_limit"];
-        else $tabparam["MAIN_SIZE_LISTE_LIMIT"]='';
+$parameters=array('id'=>$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)) {
+    if ($action == 'update' && ($caneditfield || !empty($user->admin))) {
+        if (!$_POST["cancel"]) {
+            $tabparam = array();
+
+            if ($_POST["check_MAIN_LANG_DEFAULT"] == "on") {
+                $tabparam["MAIN_LANG_DEFAULT"] = $_POST["main_lang_default"];
+            } else {
+                $tabparam["MAIN_LANG_DEFAULT"] = '';
+            }
 
-        if ($_POST["check_MAIN_THEME"]=="on") $tabparam["MAIN_THEME"]=$_POST["main_theme"];
-        else $tabparam["MAIN_THEME"]='';
+            if ($_POST["check_SIZE_LISTE_LIMIT"] == "on") {
+                $tabparam["MAIN_SIZE_LISTE_LIMIT"] = $_POST["main_size_liste_limit"];
+            } else {
+                $tabparam["MAIN_SIZE_LISTE_LIMIT"] = '';
+            }
 
     	$val=(join(',',(colorStringToArray(GETPOST('THEME_ELDY_TOPMENU_BACK1'),array()))));
     	if ($val == '') $tabparam['THEME_ELDY_TOPMENU_BACK1']='';
@@ -108,15 +116,18 @@ if ($action == 'update' && ($caneditfield || ! empty($user->admin)))
         $tabparam["MAIN_SEARCHFORM_SOCIETE"]=$_POST["main_searchform_societe"];
         $tabparam["MAIN_SEARCHFORM_PRODUITSERVICE"]=$_POST["main_searchform_produitservice"];
 
-        $result=dol_set_user_param($db, $conf, $object, $tabparam);
+            $tabparam["MAIN_SEARCHFORM_CONTACT"] = $_POST["main_searchform_contact"];
+            $tabparam["MAIN_SEARCHFORM_SOCIETE"] = $_POST["main_searchform_societe"];
+            $tabparam["MAIN_SEARCHFORM_PRODUITSERVICE"] = $_POST["main_searchform_produitservice"];
+
+            $result = dol_set_user_param($db, $conf, $object, $tabparam);
 
-        header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id);
-        exit;
+            header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id);
+            exit;
+        }
     }
 }
 
-
-
 /*
  * View
  */
diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php
index c4906fe7aae2bc3afceb26c37927c4f5b13b3ed3..750035e2dda95b2be5c1e05362d310cc0564f528 100644
--- a/htdocs/user/perms.php
+++ b/htdocs/user/perms.php
@@ -67,45 +67,52 @@ if ($user->id == $id && (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user-
 $result = restrictedArea($user, 'user', $id, 'user&user', $feature2);
 if ($user->id <> $id && ! $canreaduser) accessforbidden();
 
+$object = new User($db);
+$object->fetch($id);
+$object->getrights();
+
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$hookmanager->initHooks(array('usercard','globalcard'));
 
 /**
  * Actions
  */
 
-if ($action == 'addrights' && $caneditperms)
-{
-	$edituser = new User($db);
-	$edituser->fetch($id);
-	//$edituser->addrights($rights, $module, '', $entity); // TODO unused for the moment
-	$edituser->addrights($rights, $module);
-
-	// Si on a touche a ses propres droits, on recharge
-	if ($id == $user->id)
-	{
-		$user->clearrights();
-		$user->getrights();
-		$menumanager->loadMenu();
+$parameters=array('id'=>$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)) {
+	if ($action == 'addrights' && $caneditperms) {
+		$edituser = new User($db);
+		$edituser->fetch($id);
+		//$edituser->addrights($rights, $module, '', $entity); // TODO unused for the moment
+		$edituser->addrights($rights, $module);
+
+		// Si on a touche a ses propres droits, on recharge
+		if ($id == $user->id) {
+			$user->clearrights();
+			$user->getrights();
+			$menumanager->loadMenu();
+		}
 	}
-}
 
-if ($action == 'delrights' && $caneditperms)
-{
-	$edituser = new User($db);
-	$edituser->fetch($id);
-	//$edituser->delrights($rights, $module, '', $entity); // TODO unused for the moment
-	$edituser->delrights($rights, $module);
-
-	// Si on a touche a ses propres droits, on recharge
-	if ($id == $user->id)
-	{
-		$user->clearrights();
-		$user->getrights();
-		$menumanager->loadMenu();
+	if ($action == 'delrights' && $caneditperms) {
+		$edituser = new User($db);
+		$edituser->fetch($id);
+		//$edituser->delrights($rights, $module, '', $entity); // TODO unused for the moment
+		$edituser->delrights($rights, $module);
+
+		// Si on a touche a ses propres droits, on recharge
+		if ($id == $user->id) {
+			$user->clearrights();
+			$user->getrights();
+			$menumanager->loadMenu();
+		}
 	}
 }
 
 
-
 /**
  *	View
  */
@@ -114,10 +121,6 @@ llxHeader('',$langs->trans("Permissions"));
 
 $form=new Form($db);
 
-$object = new User($db);
-$object->fetch($id);
-$object->getrights();
-
 $head = user_prepare_head($object);
 
 $title = $langs->trans("User");