diff --git a/htdocs/admin/agenda_xcal.php b/htdocs/admin/agenda_xcal.php
index 671c24880bcb93d7bce2c31183da30cbfbd52d47..ecf49c012018aaa94aa0b75dec00105739db8d01 100644
--- a/htdocs/admin/agenda_xcal.php
+++ b/htdocs/admin/agenda_xcal.php
@@ -171,7 +171,7 @@ $message.='<br>';
 print $message;
 
 $message=$langs->trans("AgendaUrlOptions1",$user->login,$user->login).'<br>';
-$message.=$langs->trans("AgendaUrlOptions2",$user->login,$user->login).'<br>';
+//$message.=$langs->trans("AgendaUrlOptions2",$user->login,$user->login).'<br>';
 $message.=$langs->trans("AgendaUrlOptions3",$user->login,$user->login).'<br>';
 $message.=$langs->trans("AgendaUrlOptions4",$user->login,$user->login).'<br>';
 $message.=$langs->trans("AgendaUrlOptionsProject",$user->login,$user->login);
diff --git a/htdocs/categories/categorie.php b/htdocs/categories/categorie.php
index e9e11b656b9f97e1db7fb8974a60cd44178db556..a77751fcb29c37811c29d9fb32703c8df9409ce5 100644
--- a/htdocs/categories/categorie.php
+++ b/htdocs/categories/categorie.php
@@ -278,7 +278,7 @@ if ($socid)
 
 	// Address
 	print '<tr><td valign="top">'.$langs->trans('Address').'</td><td colspan="3">';
-    print dol_print_address($soc->address,'gmap','thirdparty',$object->id);
+    print dol_print_address($soc->address,'gmap','thirdparty',$soc->id);
     print '</td></tr>';
 
 	// Zip / Town
diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php
index 5f1cb8f7c287a5ea7ad8be5086706d5a0295b643..fb7195fdd6842c1e7656332e27aa7f2ccff3fdbe 100644
--- a/htdocs/comm/action/class/actioncomm.class.php
+++ b/htdocs/comm/action/class/actioncomm.class.php
@@ -141,6 +141,9 @@ class ActionComm extends CommonObject
         $userownerid=$this->userownerid;
         $userdoneid=$this->userdoneid;
 
+        // Be sure assigned user array is not empty.
+        if (count($this->userassigned) == 0) $this->userassigned = array('id'=>$userownerid);
+
         if (! $this->type_id || ! $this->type_code)
         {
         	$key=empty($this->type_id)?$this->type_code:$this->type_id;
@@ -973,7 +976,7 @@ class ActionComm extends CommonObject
             $sql.= " a.label, a.code, a.note, a.fk_action as type_id,";
             $sql.= " a.fk_soc,";
             $sql.= " a.fk_user_author, a.fk_user_mod,";
-            $sql.= " a.fk_user_action, a.fk_user_done,";
+            $sql.= " a.fk_user_action,";
             $sql.= " a.fk_contact, a.percent as percentage,";
             $sql.= " a.fk_element, a.elementtype,";
             $sql.= " a.priority, a.fulldayevent, a.location, a.punctual, a.transparency,";
@@ -981,9 +984,11 @@ class ActionComm extends CommonObject
             $sql.= " s.nom as socname,";
             $sql.= " c.id as type_id, c.code as type_code, c.libelle";
             $sql.= " FROM (".MAIN_DB_PREFIX."c_actioncomm as c, ".MAIN_DB_PREFIX."actioncomm as a)";
-            $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_author";
+            $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_author";	// Link to get author of event for export
             $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on s.rowid = a.fk_soc";
-            $sql.= " WHERE a.fk_action=c.id";
+			// We must filter on assignement table
+			if ($filters['logint'] || $filters['login']) $sql.=", ".MAIN_DB_PREFIX."actioncomm_resources as ar";
+			$sql.= " WHERE a.fk_action=c.id";
             $sql.= " AND a.entity = ".$conf->entity;
             foreach ($filters as $key => $value)
             {
@@ -993,17 +998,8 @@ class ActionComm extends CommonObject
                 if ($key == 'idfrom')       $sql.=" AND a.id >= ".(is_numeric($value)?$value:0);
                 if ($key == 'idto')         $sql.=" AND a.id <= ".(is_numeric($value)?$value:0);
                 if ($key == 'project')      $sql.=" AND a.fk_project=".(is_numeric($value)?$value:0);
-                if ($key == 'login')
-                {
-                    $login=$value;
-                    $userforfilter=new User($this->db);
-                    $result=$userforfilter->fetch('',$value);
-                    $sql.= " AND (";
-                    $sql.= " a.fk_user_author = ".$userforfilter->id;
-                    $sql.= " OR a.fk_user_action = ".$userforfilter->id;
-                    $sql.= " OR a.fk_user_done = ".$userforfilter->id;
-                    $sql.= ")";
-                }
+    	        // We must filter on assignement table
+				if ($key == 'logint' || $key == 'login') $sql.= " AND ar.fk_actioncomm = a.id AND ar.element_type='user'";
                 if ($key == 'logina')
                 {
                     $logina=$value;
@@ -1011,19 +1007,12 @@ class ActionComm extends CommonObject
                     $result=$userforfilter->fetch('',$value);
                     $sql.= " AND a.fk_user_author = ".$userforfilter->id;
                 }
-                if ($key == 'logint')
+                if ($key == 'logint' || $key == 'login')
                 {
                     $logint=$value;
                     $userforfilter=new User($this->db);
                     $result=$userforfilter->fetch('',$value);
-                    $sql.= " AND a.fk_user_action = ".$userforfilter->id;
-                }
-                if ($key == 'logind')
-                {
-                    $logind=$value;
-                    $userforfilter=new User($this->db);
-                    $result=$userforfilter->fetch('',$value);
-                    $sql.= " AND a.fk_user_done = ".$userforfilter->id;
+                    $sql.= " AND ar.fk_element = ".$userforfilter->id;
                 }
             }
             $sql.= " AND a.datep IS NOT NULL";		// To exclude corrupted events and avoid errors in lightning/sunbird import
diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php
index 4630d486ebf3f87b407041f471e14f04bdb4e0d7..7820de113b72f5b982dc3305f848508ac5ebf6ba 100644
--- a/htdocs/comm/action/index.php
+++ b/htdocs/comm/action/index.php
@@ -40,9 +40,7 @@ if (! empty($conf->projet->enabled)) {
 if (! isset($conf->global->AGENDA_MAX_EVENTS_DAY_VIEW)) $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW=3;
 
 $filter=GETPOST("filter",'',3);
-$filtera = GETPOST("userasked","int",3)?GETPOST("userasked","int",3):GETPOST("filtera","int",3);
 $filtert = GETPOST("usertodo","int",3)?GETPOST("usertodo","int",3):GETPOST("filtert","int",3);
-$filterd = GETPOST("userdone","int",3)?GETPOST("userdone","int",3):GETPOST("filterd","int",3);
 $usergroup = GETPOST("usergroup","int",3);
 $showbirthday = empty($conf->use_javascript_ajax)?GETPOST("showbirthday","int"):1;
 
@@ -72,9 +70,7 @@ if (! $user->rights->agenda->myactions->read) accessforbidden();
 if (! $user->rights->agenda->allactions->read) $canedit=0;
 if (! $user->rights->agenda->allactions->read || $filter =='mine')  // If no permission to see all, we show only affected to me
 {
-    $filtera=$user->id;
     $filtert=$user->id;
-    $filterd=$user->id;
 }
 
 $action=GETPOST('action','alpha');
@@ -283,9 +279,7 @@ $param='';
 if ($actioncode || isset($_GET['actioncode']) || isset($_POST['actioncode'])) $param.="&actioncode=".$actioncode;
 if ($status || isset($_GET['status']) || isset($_POST['status'])) $param.="&status=".$status;
 if ($filter)  $param.="&filter=".$filter;
-if ($filtera) $param.="&filtera=".$filtera;
 if ($filtert) $param.="&filtert=".$filtert;
-if ($filterd) $param.="&filterd=".$filterd;
 if ($socid)   $param.="&socid=".$socid;
 if ($showbirthday) $param.="&showbirthday=1";
 if ($pid)     $param.="&projectid=".$pid;
@@ -340,7 +334,7 @@ $paramnoaction=preg_replace('/action=[a-z_]+/','',$param);
 $head = calendars_prepare_head($paramnoaction);
 
 dol_fiche_head($head, $tabactive, $langs->trans('Agenda'), 0, 'action');
-print_actions_filter($form,$canedit,$status,$year,$month,$day,$showbirthday,$filtera,$filtert,$filterd,$pid,$socid,$action,$listofextcals,$actioncode,$usergroup);
+print_actions_filter($form,$canedit,$status,$year,$month,$day,$showbirthday,0,$filtert,0,$pid,$socid,$action,$listofextcals,$actioncode,$usergroup);
 dol_fiche_end();
 
 $showextcals=$listofextcals;
@@ -405,27 +399,29 @@ print_fiche_titre($s,$link.' &nbsp; &nbsp; '.$nav, '');
 // Get event in an array
 $eventarray=array();
 
-$sql = 'SELECT a.id,a.label,';
+$sql = 'SELECT ';
+if ($usergroup > 0) $sql.=" DISTINCT";
+$sql.= ' a.id, a.label,';
 $sql.= ' a.datep,';
 $sql.= ' a.datep2,';
-$sql.= ' a.datea,';
-$sql.= ' a.datea2,';
 $sql.= ' a.percent,';
-$sql.= ' a.fk_user_author,a.fk_user_action,a.fk_user_done,';
+$sql.= ' a.fk_user_author,a.fk_user_action,';
 $sql.= ' a.transparency, a.priority, a.fulldayevent, a.location,';
 $sql.= ' a.fk_soc, a.fk_contact,';
 $sql.= ' ca.code as type_code, ca.libelle as type_label';
 $sql.= ' FROM '.MAIN_DB_PREFIX.'c_actioncomm as ca, '.MAIN_DB_PREFIX."actioncomm as a";
 if (! $user->rights->societe->client->voir && ! $socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON a.fk_soc = sc.fk_soc";
-if ($usergroup > 0) $sql.= ", ".MAIN_DB_PREFIX."usergroup_user as ugu";
+// We must filter on assignement table
+if ($filtert > 0 || $usergroup > 0) $sql.=", ".MAIN_DB_PREFIX."actioncomm_resources as ar";
+if ($usergroup > 0) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."usergroup_user as ugu ON ugu.fk_user = ar.fk_element";
 $sql.= ' WHERE a.fk_action = ca.id';
 $sql.= ' AND a.entity IN ('.getEntity('agenda', 1).')';
 if ($actioncode) $sql.=" AND ca.code='".$db->escape($actioncode)."'";
 if ($pid) $sql.=" AND a.fk_project=".$db->escape($pid);
 if (! $user->rights->societe->client->voir && ! $socid) $sql.= " AND (a.fk_soc IS NULL OR sc.fk_user = " .$user->id . ")";
 if ($socid > 0) $sql.= ' AND a.fk_soc = '.$socid;
-// FIXME: We must filter on assignement table
-if ($usergroup > 0) $sql.= " AND ugu.fk_user = a.fk_user_action";
+// We must filter on assignement table
+if ($filtert > 0 || $usergroup > 0) $sql.= " AND ar.fk_actioncomm = a.id AND ar.element_type='user'";
 if ($action == 'show_day')
 {
     $sql.= " AND (";
@@ -459,14 +455,12 @@ if ($status == '-1') { $sql.= " AND a.percent = -1"; }	// Not applicable
 if ($status == '50') { $sql.= " AND (a.percent > 0 AND a.percent < 100)"; }	// Running already started
 if ($status == 'done' || $status == '100') { $sql.= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep2 <= '".$db->idate($now)."'))"; }
 if ($status == 'todo') { $sql.= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep2 > '".$db->idate($now)."'))"; }
-// FIXME: We must filter on assignement table
-if ($filtera > 0 || $filtert > 0 || $filterd > 0 || $usergroup > 0)
+// We must filter on assignement table
+if ($filtert > 0 || $usergroup > 0)
 {
     $sql.= " AND (";
-    if ($filtera > 0) $sql.= " a.fk_user_author = ".$filtera;
-    if ($filtert > 0) $sql.= ($filtera>0?" OR ":"")." a.fk_user_action = ".$filtert;
-    if ($filterd > 0) $sql.= ($filtera>0||$filtert>0?" OR ":"")." a.fk_user_done = ".$filterd;
-	if ($usergroup > 0) $sql.= ($filtera>0||$filtert>0||$filterd>0?" OR ":"")." ugu.fk_usergroup = ".$usergroup;
+    if ($filtert > 0) $sql.= "ar.fk_element = ".$filtert;
+    if ($usergroup > 0) $sql.= ($filtert>0?" OR ":"")." ugu.fk_usergroup = ".$usergroup;
     $sql.= ")";
 }
 // Sort on date
@@ -1094,7 +1088,7 @@ $db->close();
 function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventarray, $maxprint=0, $maxnbofchar=16, $newparam='', $showinfo=0, $minheight=60)
 {
     global $user, $conf, $langs;
-    global $action, $filter, $filtera, $filtert, $filterd, $status, $actioncode;	// Filters used into search form
+    global $action, $filter, $filtert, $status, $actioncode;	// Filters used into search form
     global $theme_datacolor;
     global $cachethirdparties, $cachecontacts, $cacheusers, $colorindexused;
 
@@ -1383,7 +1377,7 @@ function show_day_events($db, $day, $month, $year, $monthshown, $style, &$eventa
                 {
                 	print '<a href="'.DOL_URL_ROOT.'/comm/action/index.php?action='.$action.'&maxprint=0&month='.$monthshown.'&year='.$year;
                     print ($status?'&status='.$status:'').($filter?'&filter='.$filter:'');
-                    print ($filtera?'&filtera='.$filtera:'').($filtert?'&filtert='.$filtert:'').($filterd?'&filterd='.$filterd:'');
+                    print ($filtert?'&filtert='.$filtert:'');
                     print ($actioncode!=''?'&actioncode='.$actioncode:'');
                     print '">'.img_picto("all","1downarrow_selected.png").' ...';
                     print ' +'.(count($eventarray[$daykey])-$maxprint);
diff --git a/htdocs/comm/action/listactions.php b/htdocs/comm/action/listactions.php
index a53628e3d312a45f5a8dc622a0502afb2264786f..b8c913df271f1f436bbc7e4689f881aee690cef1 100644
--- a/htdocs/comm/action/listactions.php
+++ b/htdocs/comm/action/listactions.php
@@ -30,6 +30,7 @@ require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
 require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php';
 
+$langs->load("users");
 $langs->load("companies");
 $langs->load("agenda");
 $langs->load("commercial");
@@ -52,9 +53,7 @@ if ($status == ''   && ! isset($_GET['status']) && ! isset($_POST['status'])) $s
 if (empty($action) && ! isset($_GET['action']) && ! isset($_POST['action'])) $action=(empty($conf->global->AGENDA_DEFAULT_VIEW)?'show_month':$conf->global->AGENDA_DEFAULT_VIEW);
 
 $filter=GETPOST("filter",'',3);
-$filtera = GETPOST("userasked","int",3)?GETPOST("userasked","int",3):GETPOST("filtera","int",3);
 $filtert = GETPOST("usertodo","int",3)?GETPOST("usertodo","int",3):GETPOST("filtert","int",3);
-$filterd = GETPOST("userdone","int",3)?GETPOST("userdone","int",3):GETPOST("filterd","int",3);
 $usergroup = GETPOST("usergroup","int",3);
 $showbirthday = empty($conf->use_javascript_ajax)?GETPOST("showbirthday","int"):1;
 
@@ -94,9 +93,7 @@ if (! $user->rights->agenda->myactions->read) accessforbidden();
 if (! $user->rights->agenda->allactions->read) $canedit=0;
 if (! $user->rights->agenda->allactions->read || $filter=='mine')	// If no permission to see all, we show only affected to me
 {
-	$filtera=$user->id;
 	$filtert=$user->id;
-	$filterd=$user->id;
 }
 
 // Purge search criteria
@@ -133,15 +130,14 @@ if (GETPOST("viewcal") || GETPOST("viewweek") || GETPOST("viewday"))
  */
 
 $form=new Form($db);
+$userstatic=new User($db);
 
 $nav='';
 $nav.=' &nbsp; <form name="dateselect" action="'.$_SERVER["PHP_SELF"].'?action=show_peruser'.$param.'">';
 if ($actioncode || isset($_GET['actioncode']) || isset($_POST['actioncode'])) $nav.='<input type="hidden" name="actioncode" value="'.$actioncode.'">';
 if ($status || isset($_GET['status']) || isset($_POST['status']))  $nav.='<input type="hidden" name="status" value="'.$status.'">';
 if ($filter)  $nav.='<input type="hidden" name="filter" value="'.$filter.'">';
-if ($filtera) $nav.='<input type="hidden" name="filtera" value="'.$filtera.'">';
 if ($filtert) $nav.='<input type="hidden" name="filtert" value="'.$filtert.'">';
-if ($filterd) $nav.='<input type="hidden" name="filterd" value="'.$filterd.'">';
 if ($socid)   $nav.='<input type="hidden" name="socid" value="'.$socid.'">';
 if ($showbirthday)  $nav.='<input type="hidden" name="showbirthday" value="1">';
 if ($pid)    $nav.='<input type="hidden" name="projectid" value="'.$pid.'">';
@@ -163,65 +159,57 @@ $param='';
 if ($actioncode || isset($_GET['actioncode']) || isset($_POST['actioncode'])) $param.="&actioncode=".$actioncode;
 if ($status || isset($_GET['status']) || isset($_POST['status'])) $param.="&status=".$status;
 if ($filter) $param.="&filter=".$filter;
-if ($filtera) $param.="&filtera=".$filtera;
 if ($filtert) $param.="&filtert=".$filtert;
-if ($filterd) $param.="&filterd=".$filterd;
 if ($socid) $param.="&socid=".$socid;
 if ($showbirthday) $param.="&showbirthday=1";
 if ($pid) $param.="&projectid=".$pid;
 if ($type) $param.="&type=".$type;
 if ($usergroup) $param.="&usergroup=".$usergroup;
 
-$sql = "SELECT s.nom as societe, s.rowid as socid, s.client,";
-$sql.= " a.id, a.datep as dp, a.datep2 as dp2,";
-$sql.= " a.fk_contact, a.note, a.label, a.percent as percent,";
+$sql = "SELECT";
+if ($usergroup > 0) $sql.=" DISTINCT";
+$sql.= " s.nom as societe, s.rowid as socid, s.client,";
+$sql.= " a.id, a.label, a.datep as dp, a.datep2 as dp2,";
+$sql.= ' a.fk_user_author,a.fk_user_action,';
+$sql.= " a.fk_contact, a.note, a.percent as percent,";
 $sql.= " c.code as type_code, c.libelle as type_label,";
-$sql.= " ua.login as loginauthor, ua.rowid as useridauthor,";
-$sql.= " ut.login as logintodo, ut.rowid as useridtodo,";
-//$sql.= " ud.login as logindone, ud.rowid as useriddone,";
 $sql.= " sp.lastname, sp.firstname";
-$sql.= " FROM ".MAIN_DB_PREFIX."c_actioncomm as c,";
-$sql.= " ".MAIN_DB_PREFIX.'user as u,';
-$sql.= " ".MAIN_DB_PREFIX."actioncomm as a";
+$sql.= " FROM ".MAIN_DB_PREFIX."c_actioncomm as c, ".MAIN_DB_PREFIX."actioncomm as a";
 if (! $user->rights->societe->client->voir && ! $socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON a.fk_soc = sc.fk_soc";
 $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON a.fk_soc = s.rowid";
 $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sp ON a.fk_contact = sp.rowid";
-$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as ua ON a.fk_user_author = ua.rowid";
-$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as ut ON a.fk_user_action = ut.rowid";
-//$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as ud ON a.fk_user_done = ud.rowid";
-if ($usergroup > 0) $sql.= ", ".MAIN_DB_PREFIX."usergroup_user as ugu";
+// We must filter on assignement table
+if ($filtert > 0 || $usergroup > 0) $sql.=", ".MAIN_DB_PREFIX."actioncomm_resources as ar";
+if ($usergroup > 0) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."usergroup_user as ugu ON ugu.fk_user = ar.fk_element";
 $sql.= " WHERE c.id = a.fk_action";
-$sql.= ' AND a.fk_user_author = u.rowid';
 $sql.= ' AND a.entity IN ('.getEntity('agenda', 1).')';
 if ($actioncode) $sql.=" AND c.code='".$db->escape($actioncode)."'";
 if ($pid) $sql.=" AND a.fk_project=".$db->escape($pid);
 if (! $user->rights->societe->client->voir && ! $socid) $sql.= " AND (a.fk_soc IS NULL OR sc.fk_user = " .$user->id . ")";
 if ($socid > 0) $sql.= " AND s.rowid = ".$socid;
-// FIXME: We must filter on assignement table
-if ($usergroup > 0) $sql.= " AND ugu.fk_user = a.fk_user_action";
+// We must filter on assignement table
+if ($filtert > 0 || $usergroup > 0) $sql.= " AND ar.fk_actioncomm = a.id AND ar.element_type='user'";
 if ($type) $sql.= " AND c.id = ".$type;
 if ($status == '0') { $sql.= " AND a.percent = 0"; }
 if ($status == '-1') { $sql.= " AND a.percent = -1"; }	// Not applicable
 if ($status == '50') { $sql.= " AND (a.percent > 0 AND a.percent < 100)"; }	// Running already started
 if ($status == 'done' || $status == '100') { $sql.= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep2 <= '".$db->idate($now)."'))"; }
 if ($status == 'todo') { $sql.= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep2 > '".$db->idate($now)."'))"; }
-// FIXME: We must filter on assignement table
-if ($filtera > 0 || $filtert > 0 || $filterd > 0 || $usergroup > 0)
+// We must filter on assignement table
+if ($filtert > 0 || $usergroup > 0)
 {
     $sql.= " AND (";
-    if ($filtera > 0) $sql.= " a.fk_user_author = ".$filtera;
-    if ($filtert > 0) $sql.= ($filtera>0?" OR ":"")." a.fk_user_action = ".$filtert;
-    if ($filterd > 0) $sql.= ($filtera>0||$filtert>0?" OR ":"")." a.fk_user_done = ".$filterd;
-	if ($usergroup > 0) $sql.= ($filtera>0||$filtert>0||$filterd>0?" OR ":"")." ugu.fk_usergroup = ".$usergroup;
+    if ($filtert > 0) $sql.= "ar.fk_element = ".$filtert;
+    if ($usergroup > 0) $sql.= ($filtert>0?" OR ":"")." ugu.fk_usergroup = ".$usergroup;
     $sql.= ")";
 }
+
 // The second or of next test is to take event with no end date (we suppose duration is 1 hour in such case)
 if ($dateselect > 0) $sql.= " AND ((a.datep2 >= '".$db->idate($dateselect)."' AND a.datep <= '".$db->idate($dateselect+3600*24-1)."') OR (a.datep2 IS NULL AND a.datep > '".$db->idate($dateselect-3600)."' AND a.datep <= '".$db->idate($dateselect+3600*24-1)."'))";
 if ($datestart > 0) $sql.= " AND a.datep BETWEEN '".$db->idate($datestart)."' AND '".$db->idate($datestart+3600*24-1)."'";
 if ($dateend > 0) $sql.= " AND a.datep2 BETWEEN '".$db->idate($dateend)."' AND '".$db->idate($dateend+3600*24-1)."'";
 $sql.= $db->order($sortfield,$sortorder);
 $sql.= $db->plimit($limit + 1, $offset);
-
 //print $sql;
 
 dol_syslog("comm/action/listactions.php", LOG_DEBUG);
@@ -246,7 +234,7 @@ if ($resql)
 	$head = calendars_prepare_head($param);
 
     dol_fiche_head($head, $tabactive, $langs->trans('Agenda'), 0, 'action');
-    print_actions_filter($form,$canedit,$status,$year,$month,$day,$showbirthday,$filtera,$filtert,$filterd,$pid,$socid,$action,-1,$actioncode,$usergroup);
+    print_actions_filter($form,$canedit,$status,$year,$month,$day,$showbirthday,0,$filtert,0,$pid,$socid,$action,-1,$actioncode,$usergroup);
     dol_fiche_end();
 
     // Add link to show birthdays
@@ -275,14 +263,11 @@ if ($resql)
 	print '<table class="liste" width="100%">';
 	print '<tr class="liste_titre">';
 	print_liste_field_titre($langs->trans("Action"),$_SERVER["PHP_SELF"],"a.label",$param,"","",$sortfield,$sortorder);
-	//print_liste_field_titre($langs->trans("Title"),$_SERVER["PHP_SELF"],"a.label",$param,"","",$sortfield,$sortorder);
 	print_liste_field_titre($langs->trans("DateStart"),$_SERVER["PHP_SELF"],"a.datep",$param,'','align="center"',$sortfield,$sortorder);
 	print_liste_field_titre($langs->trans("DateEnd"),$_SERVER["PHP_SELF"],"a.datep2",$param,'','align="center"',$sortfield,$sortorder);
 	print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom",$param,"","",$sortfield,$sortorder);
 	print_liste_field_titre($langs->trans("Contact"),$_SERVER["PHP_SELF"],"a.fk_contact",$param,"","",$sortfield,$sortorder);
-	//print_liste_field_titre($langs->trans("ActionUserAsk"),$_SERVER["PHP_SELF"],"ua.login",$param,"","",$sortfield,$sortorder);
-	print_liste_field_titre($langs->trans("ActionsOwnedBy"),$_SERVER["PHP_SELF"],"ut.login",$param,"","",$sortfield,$sortorder);
-	//print_liste_field_titre($langs->trans("DoneBy"),$_SERVER["PHP_SELF"],"ud.login",$param,"","",$sortfield,$sortorder);
+	print_liste_field_titre($langs->trans("ActionsOwnedBy"),$_SERVER["PHP_SELF"],"",$param,"","",$sortfield,$sortorder);
 	print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"a.percent",$param,"",'align="right"',$sortfield,$sortorder);
 	print "</tr>\n";
 
@@ -375,45 +360,15 @@ if ($resql)
 		}
 		print '</td>';
 
-		// User author
-		/*
-		print '<td align="left">';
-		if ($obj->useridauthor)
-		{
-			$userstatic=new User($db);
-			$userstatic->id=$obj->useridauthor;
-			$userstatic->login=$obj->loginauthor;
-			print $userstatic->getLoginUrl(1);
-		}
-		else print '&nbsp;';
-		print '</td>';
-		*/
-
 		// User to do
 		print '<td align="left">';
-		if ($obj->useridtodo)
-		{
-			$userstatic=new User($db);
-			$userstatic->id=$obj->useridtodo;
-			$userstatic->login=$obj->logintodo;
-			print $userstatic->getLoginUrl(1);
-		}
-		else print '&nbsp;';
-		print '</td>';
-
-		// User did
-		/*
-		print '<td align="left">';
-		if ($obj->useriddone)
+		if ($obj->fk_user_action > 0)
 		{
-			$userstatic=new User($db);
-			$userstatic->id=$obj->useriddone;
-			$userstatic->login=$obj->logindone;
+			$userstatic->fetch($obj->fk_user_action);
 			print $userstatic->getLoginUrl(1);
 		}
 		else print '&nbsp;';
 		print '</td>';
-		*/
 
 		// Status/Percent
 		print '<td align="right" class="nowrap">'.$actionstatic->LibStatut($obj->percent,6).'</td>';
@@ -434,6 +389,6 @@ else
 }
 
 
-$db->close();
-
 llxFooter();
+
+$db->close();
diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php
index 22cf8841c0253679733b3cb5a7f0b3a253a90ae6..04353190adbb3f9d54ff7edce4c29fb0f26edd4b 100644
--- a/htdocs/comm/action/peruser.php
+++ b/htdocs/comm/action/peruser.php
@@ -39,9 +39,7 @@ if (! empty($conf->projet->enabled)) require_once DOL_DOCUMENT_ROOT.'/core/class
 if (! isset($conf->global->AGENDA_MAX_EVENTS_DAY_VIEW)) $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW=3;
 
 $filter=GETPOST("filter",'',3);
-$filtera = GETPOST("userasked","int",3)?GETPOST("userasked","int",3):GETPOST("filtera","int",3);
 $filtert = GETPOST("usertodo","int",3)?GETPOST("usertodo","int",3):GETPOST("filtert","int",3);
-$filterd = GETPOST("userdone","int",3)?GETPOST("userdone","int",3):GETPOST("filterd","int",3);
 $usergroup = GETPOST("usergroup","int",3);
 //if (! ($usergroup > 0) && ! ($filtert > 0)) $filtert = $user->id;
 //$showbirthday = empty($conf->use_javascript_ajax)?GETPOST("showbirthday","int"):1;
@@ -73,9 +71,7 @@ if (! $user->rights->agenda->myactions->read) accessforbidden();
 if (! $user->rights->agenda->allactions->read) $canedit=0;
 if (! $user->rights->agenda->allactions->read || $filter =='mine')  // If no permission to see all, we show only affected to me
 {
-    $filtera=$user->id;
     $filtert=$user->id;
-    $filterd=$user->id;
 }
 
 //$action=GETPOST('action','alpha');
@@ -130,6 +126,7 @@ if (GETPOST('viewday') || $action == 'show_day')  {
 }                                  // View by day
 
 
+$langs->load("users");
 $langs->load("agenda");
 $langs->load("other");
 $langs->load("commercial");
@@ -198,9 +195,7 @@ $param='';
 if ($actioncode || isset($_GET['actioncode']) || isset($_POST['actioncode'])) $param.="&actioncode=".$actioncode;
 if ($status || isset($_GET['status']) || isset($_POST['status'])) $param.="&status=".$status;
 if ($filter)  $param.="&filter=".$filter;
-if ($filtera) $param.="&filtera=".$filtera;
 if ($filtert) $param.="&filtert=".$filtert;
-if ($filterd) $param.="&filterd=".$filterd;
 if ($usergroup) $param.="&usergroup=".$usergroup;
 if ($socid)   $param.="&socid=".$socid;
 if ($showbirthday) $param.="&showbirthday=1";
@@ -280,7 +275,7 @@ $paramnoaction=preg_replace('/action=[a-z_]+/','',$param);
 $head = calendars_prepare_head($paramnoaction);
 
 dol_fiche_head($head, $tabactive, $langs->trans('Agenda'), 0, 'action');
-print_actions_filter($form, $canedit, $status, $year, $month, $day, $showbirthday, $filtera, $filtert, $filterd, $pid, $socid, $action, $listofextcals, $actioncode, $usergroup);
+print_actions_filter($form, $canedit, $status, $year, $month, $day, $showbirthday, 0, $filtert, 0, $pid, $socid, $action, $listofextcals, $actioncode, $usergroup);
 dol_fiche_end();
 
 $showextcals=$listofextcals;
@@ -332,27 +327,29 @@ print_fiche_titre($s,$link.' &nbsp; &nbsp; '.$nav, '');
 // Get event in an array
 $eventarray=array();
 
-$sql = 'SELECT a.id,a.label,';
+$sql = 'SELECT';
+if ($usergroup > 0) $sql.=" DISTINCT";
+$sql.= ' a.id, a.label,';
 $sql.= ' a.datep,';
 $sql.= ' a.datep2,';
-$sql.= ' a.datea,';
-$sql.= ' a.datea2,';
 $sql.= ' a.percent,';
-$sql.= ' a.fk_user_author,a.fk_user_action,a.fk_user_done,';
+$sql.= ' a.fk_user_author,a.fk_user_action,';
 $sql.= ' a.transparency, a.priority, a.fulldayevent, a.location,';
 $sql.= ' a.fk_soc, a.fk_contact, a.fk_element, a.elementtype,';
 $sql.= ' ca.code, ca.color';
 $sql.= ' FROM '.MAIN_DB_PREFIX.'c_actioncomm as ca, '.MAIN_DB_PREFIX."actioncomm as a";
 if (! $user->rights->societe->client->voir && ! $socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON a.fk_soc = sc.fk_soc";
-if ($usergroup > 0) $sql.= ", ".MAIN_DB_PREFIX."usergroup_user as ugu";
+// We must filter on assignement table
+if ($filtert > 0 || $usergroup > 0) $sql.=", ".MAIN_DB_PREFIX."actioncomm_resources as ar";
+if ($usergroup > 0) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."usergroup_user as ugu ON ugu.fk_user = ar.fk_element";
 $sql.= ' WHERE a.fk_action = ca.id';
 $sql.= ' AND a.entity IN ('.getEntity('agenda', 1).')';
 if ($actioncode) $sql.=" AND ca.code='".$db->escape($actioncode)."'";
 if ($pid) $sql.=" AND a.fk_project=".$db->escape($pid);
 if (! $user->rights->societe->client->voir && ! $socid) $sql.= " AND (a.fk_soc IS NULL OR sc.fk_user = " .$user->id . ")";
 if ($socid > 0) $sql.= ' AND a.fk_soc = '.$socid;
-// FIXME: We must filter on assignement table
-if ($usergroup > 0) $sql.= " AND ugu.fk_user = a.fk_user_action";
+// We must filter on assignement table
+if ($filtert > 0 || $usergroup > 0) $sql.= " AND ar.fk_actioncomm = a.id AND ar.element_type='user'";
 if ($action == 'show_day')
 {
     $sql.= " AND (";
@@ -386,14 +383,12 @@ if ($status == '-1') { $sql.= " AND a.percent = -1"; }	// Not applicable
 if ($status == '50') { $sql.= " AND (a.percent > 0 AND a.percent < 100)"; }	// Running already started
 if ($status == 'done' || $status == '100') { $sql.= " AND (a.percent = 100 OR (a.percent = -1 AND a.datep2 <= '".$db->idate($now)."'))"; }
 if ($status == 'todo') { $sql.= " AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep2 > '".$db->idate($now)."'))"; }
-// FIXME: We must filter on assignement table
-if ($filtera > 0 || $filtert > 0 || $filterd > 0 || $usergroup > 0)
+// We must filter on assignement table
+if ($filtert > 0 || $usergroup > 0)
 {
     $sql.= " AND (";
-    if ($filtera > 0) $sql.= " a.fk_user_author = ".$filtera;
-    if ($filtert > 0) $sql.= ($filtera>0?" OR ":"")." a.fk_user_action = ".$filtert;
-    if ($filterd > 0) $sql.= ($filtera>0||$filtert>0?" OR ":"")." a.fk_user_done = ".$filterd;
-	if ($usergroup > 0) $sql.= ($filtera>0||$filtert>0||$filterd>0?" OR ":"")." ugu.fk_usergroup = ".$usergroup;
+    if ($filtert > 0) $sql.= "ar.fk_element = ".$filtert;
+    if ($usergroup > 0) $sql.= ($filtert>0?" OR ":"")." ugu.fk_usergroup = ".$usergroup;
     $sql.= ")";
 }
 // Sort on date
@@ -679,7 +674,7 @@ foreach ($usernames as $username)
 {
 	$var = ! $var;
 	echo "<tr>";
-	echo '<td class="cal_current_month"'.($var?' style="background: #F8F8F8"':'').'>' . $username->getNomUrl(1). '</td>';
+	echo '<td class="cal_current_month cal_peruserviewname"'.($var?' style="background: #F8F8F8"':'').'>' . $username->getNomUrl(1). '</td>';
 	$tmpday = $sav;
 
 	// Lopp on each day of week
@@ -809,7 +804,7 @@ function show_day_events2($username, $day, $month, $year, $monthshown, $style, &
 {
 	global $db;
 	global $user, $conf, $langs, $hookmanager, $action;
-	global $filter, $filtera, $filtert, $filterd, $status, $actioncode;	// Filters used into search form
+	global $filter, $filtert, $status, $actioncode;	// Filters used into search form
 	global $theme_datacolor;	// Array with a list of different we can use (come from theme)
 	global $cachethirdparties, $cachecontacts, $colorindexused;
 	global $begin_h, $end_h;
diff --git a/htdocs/core/lib/agenda.lib.php b/htdocs/core/lib/agenda.lib.php
index 23a17534ccf84e7b59db118e806c8617dd5e5ab0..80e556378c0c996de9d43905fb264ae866df5e3a 100644
--- a/htdocs/core/lib/agenda.lib.php
+++ b/htdocs/core/lib/agenda.lib.php
@@ -70,7 +70,7 @@ function print_actions_filter($form, $canedit, $status, $year, $month, $day, $sh
 	{
 		print '<tr>';
 		print '<td class="nowrap">';
-		print $langs->trans("ActionsOwnedBy").' &nbsp; ';
+		print $langs->trans("ActionsToDoBy").' &nbsp; ';
 		print '</td><td class="nowrap maxwidthonsmartphone">';
 		print $form->select_dolusers($filtert, 'usertodo', 1, '', ! $canedit);
 		if (empty($conf->dol_optimize_smallscreen)) print ' &nbsp; '.$langs->trans("or") . ' '.$langs->trans("Group").' &nbsp; ';
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index d83d1e8b1a505fb2f6391cd0dca115858c0257bf..bdccfa8d84dec518d8607dd6af453427ac0160f5 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -4633,6 +4633,7 @@ function dol_eval($s,$returnvalue=0)
 	global $leftmenu;
 	global $rights;
 	global $object;
+    global $soc;
 
 	//print $s."<br>\n";
 	if ($returnvalue) return @eval('return '.$s.';');
diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php
index 7517fac7d20698ace12563b836105e03aa0cc48b..9ab6f4a1ddc5ceb68958c412780578b43d3c71cc 100644
--- a/htdocs/core/lib/functions2.lib.php
+++ b/htdocs/core/lib/functions2.lib.php
@@ -628,8 +628,8 @@ function get_next_value($db,$mask,$table,$field,$where='',$objsoc='',$date='',$m
     if (preg_match('/\{(t+)\}/i',$mask,$regType))
     {
         $masktype=$regType[1];
-        $masktype_value=substr(preg_replace('/^TE_/','',$objsoc->typent_code),0,dol_strlen($regType[1]));//get n first characters of client code where n is length in mask
-        $masktype_value=str_pad($masktype_value,dol_strlen($regType[1]),"#",STR_PAD_RIGHT);
+        $masktype_value=substr(preg_replace('/^TE_/','',$objsoc->typent_code),0,dol_strlen($regType[1]));// get n first characters of thirdpaty typent_code (where n is length in mask)
+        $masktype_value=str_pad($masktype_value,dol_strlen($regType[1]),"#",STR_PAD_RIGHT);				 // we fill on right with # to have same number of char than into mask
     }
     else
     {
diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php
index 91a24db79ac41d73b585fa8b322eb276deb07a04..a2819ffb2c434dd22b9dfac633fcd61cb4d6e45e 100644
--- a/htdocs/core/menus/standard/eldy.lib.php
+++ b/htdocs/core/menus/standard/eldy.lib.php
@@ -354,7 +354,7 @@ function print_text_menu_entry($text, $showmode, $url, $id, $idsel, $classname,
 	if ($showmode == 1)
 	{
 		print '<a class="tmenuimage" href="'.$url.'"'.($atarget?' target="'.$atarget.'"':'').'>';
-		print '<div class="'.$id.' '.$idsel.'"><span class="'.$id.' tmenuimage" id="mainmenuspan_'.$idsel.'"></span></div>';
+		print '<div class="'.$id.' '.$idsel.' topmenuimage"><span class="'.$id.' tmenuimage" id="mainmenuspan_'.$idsel.'"></span></div>';
 		print '</a>';
 		print '<a '.$classname.' id="mainmenua_'.$idsel.'" href="'.$url.'"'.($atarget?' target="'.$atarget.'"':'').'>';
 		print '<span class="mainmenuaspan">';
diff --git a/htdocs/custom/.gitignore b/htdocs/custom/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ed069fdfd817943036a469f37b19cfd3b96cdeab
--- /dev/null
+++ b/htdocs/custom/.gitignore
@@ -0,0 +1,4 @@
+/a*
+/b*
+/c*
+/d*
diff --git a/htdocs/install/mysql/migration/3.6.0-3.7.0.sql b/htdocs/install/mysql/migration/3.6.0-3.7.0.sql
index ad05f850e161e4bfc4248cd567cbd5415e1f045f..7dbdb7eb7dc9492d185223eb8cd988d8f88645d1 100755
--- a/htdocs/install/mysql/migration/3.6.0-3.7.0.sql
+++ b/htdocs/install/mysql/migration/3.6.0-3.7.0.sql
@@ -153,6 +153,9 @@ ALTER TABLE llx_projet_task_time ADD COLUMN task_datehour datetime after task_da
 
 ALTER TABLE llx_actioncomm_resources CHANGE COLUMN transparent transparency smallint default 1;
 
+ALTER TABLE llx_actioncomm_resources DROP INDEX idx_actioncomm_resources_idx1;
+ALTER TABLE llx_actioncomm_resources ADD UNIQUE INDEX uk_actioncomm_resources(fk_actioncomm, element_type, fk_element);
+
 
 -- Localtaxes by thirds
 ALTER TABLE llx_c_tva MODIFY COLUMN localtax1 varchar(10);
diff --git a/htdocs/install/mysql/tables/llx_actioncomm_resources.key.sql b/htdocs/install/mysql/tables/llx_actioncomm_resources.key.sql
index caaa096994455655c6dbde5a8bb2f3685faacc15..8c7bb4ad237e2fcadbf09a7cea1f12300965a616 100644
--- a/htdocs/install/mysql/tables/llx_actioncomm_resources.key.sql
+++ b/htdocs/install/mysql/tables/llx_actioncomm_resources.key.sql
@@ -18,7 +18,7 @@
 -- ============================================================================
 
 
-ALTER TABLE llx_actioncomm_resources ADD UNIQUE INDEX idx_actioncomm_resources_idx1 (fk_actioncomm, element_type, fk_element);
+ALTER TABLE llx_actioncomm_resources ADD UNIQUE INDEX uk_actioncomm_resources(fk_actioncomm, element_type, fk_element);
 ALTER TABLE llx_actioncomm_resources ADD INDEX idx_actioncomm_resources_fk_element (fk_element);
 
 -- Pas de contrainte sur fk_source et fk_target car pointe sur differentes tables
diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php
index 57004f3cb16bf28e643f12284a8717be7a1f930c..86ab911c71bc5e6e78473f5b99dd365c66fc1b15 100644
--- a/htdocs/install/upgrade2.php
+++ b/htdocs/install/upgrade2.php
@@ -362,6 +362,8 @@ if (! GETPOST("action") || preg_match('/upgrade/i',GETPOST('action')))
         $beforeversionarray=explode('.','3.7.9');	// target is before this
         if (versioncompare($versiontoarray,$afterversionarray) >= 0 && versioncompare($versiontoarray,$beforeversionarray) <= 0)
         {
+       	    migrate_event_assignement($db,$langs,$conf);
+
         	// Reload modules (this must be always and only into last targeted version)
 			$listofmodule=array(
 				    	'MAIN_MODULE_AGENDA',
@@ -391,6 +393,7 @@ if (! GETPOST("action") || preg_match('/upgrade/i',GETPOST('action')))
         $db->commit();
         $db->close();
 
+
         // Actions for all version (not in database)
         migrate_delete_old_files($db,$langs,$conf);
 
@@ -3519,6 +3522,83 @@ function migrate_categorie_association($db,$langs,$conf)
 	print '</td></tr>';
 }
 
+/**
+ * Migrate event assignement to owner
+ *
+ * @param	DoliDB		$db				Database handler
+ * @param	Translate	$langs			Object langs
+ * @param	Conf		$conf			Object conf
+ * @return	void
+ */
+function migrate_event_assignement($db,$langs,$conf)
+{
+	print '<tr><td colspan="4">';
+
+	print '<br>';
+	print '<b>'.$langs->trans('MigrationEvents')."</b><br>\n";
+
+	$error = 0;
+
+	dolibarr_install_syslog("upgrade2::migrate_event_assignement");
+
+	$db->begin();
+
+	$sqlSelect = "SELECT a.id, a.fk_user_action";
+	$sqlSelect.= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
+	$sqlSelect.= " LEFT JOIN ".MAIN_DB_PREFIX."actioncomm_resources as ar ON ar.fk_actioncomm = a.id AND ar.element_type = 'user' AND ar.fk_element = a.fk_user_action";
+	$sqlSelect.= " WHERE fk_user_action > 0 AND fk_user_action NOT IN (SELECT fk_element FROM ".MAIN_DB_PREFIX."actioncomm_resources as ar WHERE ar.fk_actioncomm = a.id AND ar.element_type = 'user')";
+	$sqlSelect.= " ORDER BY a.id";
+	//print $sqlSelect;
+
+	$resql = $db->query($sqlSelect);
+	if ($resql)
+	{
+		$i = 0;
+		$num = $db->num_rows($resql);
+
+		if ($num)
+		{
+			while ($i < $num)
+			{
+				$obj = $db->fetch_object($resql);
+
+				$sqlUpdate = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm_resources(fk_actioncomm, element_type, fk_element) ";
+				$sqlUpdate.= "VALUES(".$obj->id.", 'user', ".$obj->fk_user_action.")";
+
+				$result=$db->query($sqlUpdate);
+				if (! $result)
+				{
+					$error++;
+					dol_print_error($db);
+				}
+				print ". ";
+				$i++;
+			}
+		}
+		else
+		{
+			print $langs->trans('AlreadyDone')."<br>\n";
+		}
+
+		if (! $error)
+		{
+			$db->commit();
+		}
+		else
+		{
+			$db->rollback();
+		}
+	}
+	else
+	{
+		dol_print_error($db);
+		$db->rollback();
+	}
+
+
+	print '</td></tr>';
+}
+
 /**
  * Migration directory
  *
diff --git a/htdocs/langs/en_US/agenda.lang b/htdocs/langs/en_US/agenda.lang
index 1cc01ec2e7b43b4c77967352343ee5d1b9744424..9ed2d79edd22205f30708f7d8e0ff671babd3c7b 100644
--- a/htdocs/langs/en_US/agenda.lang
+++ b/htdocs/langs/en_US/agenda.lang
@@ -68,7 +68,7 @@ DateActionDoneEnd= Real end date
 DateActionStart= Start date
 DateActionEnd= End date
 AgendaUrlOptions1=You can also add following parameters to filter output:
-AgendaUrlOptions2=<b>login=%s</b> to restrict output to actions created by, assigned to or done by user <b>%s</b>.
+AgendaUrlOptions2=<b>login=%s</b> to restrict output to actions created by or assigned to user <b>%s</b>.
 AgendaUrlOptions3=<b>logina=%s</b> to restrict output to actions owned by a user <b>%s</b>.
 AgendaUrlOptions4=<b>logint=%s</b> to restrict output to actions assigned to user <b>%s</b>.
 AgendaUrlOptionsProject=<b>project=PROJECT_ID</b> to restrict output to actions associated to project <b>PROJECT_ID</b>.
diff --git a/htdocs/langs/en_US/install.lang b/htdocs/langs/en_US/install.lang
index 20abe7b9c704aa9a5dfa34c5a66074c6dfb4c13c..c296bd788e8736755c5f0af9cc1949f52f4d5230 100644
--- a/htdocs/langs/en_US/install.lang
+++ b/htdocs/langs/en_US/install.lang
@@ -206,6 +206,7 @@ MigrationProjectTaskTime=Update time spent in seconds
 MigrationActioncommElement=Update data on actions
 MigrationPaymentMode=Data migration for payment mode
 MigrationCategorieAssociation=Migration of categories
+MigrationEvents=Migration of events to add event owner into assignement table
 
 ShowNotAvailableOptions=Show not available options
 HideNotAvailableOptions=Hide not available options
\ No newline at end of file
diff --git a/htdocs/public/agenda/agendaexport.php b/htdocs/public/agenda/agendaexport.php
index c36766e2777900bb83bb70eebd76d5eccec38b22..2b1d02ef493e21d5c0c16cd572206b48357beb40 100644
--- a/htdocs/public/agenda/agendaexport.php
+++ b/htdocs/public/agenda/agendaexport.php
@@ -69,7 +69,6 @@ if (! empty($_GET["project"]))  $filters['project']=$_GET["project"];
 if (! empty($_GET["login"]))    $filters['login']=$_GET["login"];
 if (! empty($_GET["logina"]))   $filters['logina']=$_GET["logina"];
 if (! empty($_GET["logint"]))   $filters['logint']=$_GET["logint"];
-if (! empty($_GET["logind"]))   $filters['logind']=$_GET["logind"];
 // Not older than
 if (! isset($conf->global->MAIN_AGENDA_EXPORT_PAST_DELAY)) $conf->global->MAIN_AGENDA_EXPORT_PAST_DELAY=100;
 $filters['notolderthan']=$conf->global->MAIN_AGENDA_EXPORT_PAST_DELAY;
@@ -111,8 +110,7 @@ foreach ($filters as $key => $value)
     if ($key == 'project')         $filename.='-project'.$value;
     if ($key == 'login')	       $filename.='-login'.$value;
 	if ($key == 'logina')	       $filename.='-logina'.$value;	// Author
-	if ($key == 'logind')	       $filename.='-logind'.$value;	// Affected to
-	if ($key == 'logint')	       $filename.='-logint'.$value;	// Done by
+	if ($key == 'logint')	       $filename.='-logint'.$value;	// Assigned to
 }
 // Add extension
 if ($format == 'vcal') { $shortfilename.='.vcs'; $filename.='.vcs'; }
diff --git a/htdocs/societe/agenda.php b/htdocs/societe/agenda.php
index 8d731875442caed691ea5ef63866367e1ad72b41..a6ba3d7b1cf793f446e9d43c34e53fa91cf6fca3 100644
--- a/htdocs/societe/agenda.php
+++ b/htdocs/societe/agenda.php
@@ -59,9 +59,6 @@ $contactstatic = new Contact($db);
 
 $form = new Form($db);
 
-/*
- * Fiche categorie de client et/ou fournisseur
- */
 if ($socid)
 {
 	require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
@@ -70,79 +67,79 @@ if ($socid)
 	$langs->load("companies");
 
 
-	$soc = new Societe($db);
-	$result = $soc->fetch($socid);
+	$object = new Societe($db);
+	$result = $object->fetch($socid);
 	llxHeader("",$langs->trans("Agenda"),'');
 
 	if (! empty($conf->notification->enabled)) $langs->load("mails");
-	$head = societe_prepare_head($soc);
+	$head = societe_prepare_head($object);
 
 	dol_fiche_head($head, 'agenda', $langs->trans("ThirdParty"),0,'company');
 
 	print '<table class="border" width="100%">';
 
 	print '<tr><td width="25%">'.$langs->trans("ThirdPartyName").'</td><td colspan="3">';
-	print $form->showrefnav($soc,'socid','',($user->societe_id?0:1),'rowid','nom');
+	print $form->showrefnav($object,'socid','',($user->societe_id?0:1),'rowid','nom');
 	print '</td></tr>';
 
     if (! empty($conf->global->SOCIETE_USEPREFIX))  // Old not used prefix field
     {
-        print '<tr><td>'.$langs->trans('Prefix').'</td><td colspan="3">'.$soc->prefix_comm.'</td></tr>';
+        print '<tr><td>'.$langs->trans('Prefix').'</td><td colspan="3">'.$object->prefix_comm.'</td></tr>';
     }
 
-	if ($soc->client)
+	if ($object->client)
 	{
 		print '<tr><td>';
 		print $langs->trans('CustomerCode').'</td><td colspan="3">';
-		print $soc->code_client;
-		if ($soc->check_codeclient() <> 0) print ' <font class="error">('.$langs->trans("WrongCustomerCode").')</font>';
+		print $object->code_client;
+		if ($object->check_codeclient() <> 0) print ' <font class="error">('.$langs->trans("WrongCustomerCode").')</font>';
 		print '</td></tr>';
 	}
 
-	if ($soc->fournisseur)
+	if ($object->fournisseur)
 	{
 		print '<tr><td>';
 		print $langs->trans('SupplierCode').'</td><td colspan="3">';
-		print $soc->code_fournisseur;
-		if ($soc->check_codefournisseur() <> 0) print ' <font class="error">('.$langs->trans("WrongSupplierCode").')</font>';
+		print $object->code_fournisseur;
+		if ($object->check_codefournisseur() <> 0) print ' <font class="error">('.$langs->trans("WrongSupplierCode").')</font>';
 		print '</td></tr>';
 	}
 
 	if (! empty($conf->barcode->enabled))
 	{
-		print '<tr><td>'.$langs->trans('Gencod').'</td><td colspan="3">'.$soc->barcode.'</td></tr>';
+		print '<tr><td>'.$langs->trans('Gencod').'</td><td colspan="3">'.$object->barcode.'</td></tr>';
 	}
 
 	print "<tr><td valign=\"top\">".$langs->trans('Address')."</td><td colspan=\"3\">";
-	dol_print_address($soc->address, 'gmap', 'thirdparty', $soc->id);
+	dol_print_address($object->address, 'gmap', 'thirdparty', $object->id);
 	print "</td></tr>";
 
 	// Zip / Town
-	print '<tr><td width="25%">'.$langs->trans('Zip').'</td><td width="25%">'.$soc->zip."</td>";
-	print '<td width="25%">'.$langs->trans('Town').'</td><td width="25%">'.$soc->town."</td></tr>";
+	print '<tr><td width="25%">'.$langs->trans('Zip').'</td><td width="25%">'.$object->zip."</td>";
+	print '<td width="25%">'.$langs->trans('Town').'</td><td width="25%">'.$object->town."</td></tr>";
 
 	// Country
-	if ($soc->country) {
+	if ($object->country) {
 		print '<tr><td>'.$langs->trans('Country').'</td><td colspan="3">';
-		$img=picto_from_langcode($soc->country_code);
+		$img=picto_from_langcode($object->country_code);
 		print ($img?$img.' ':'');
-		print $soc->country;
+		print $object->country;
 		print '</td></tr>';
 	}
 
 	// EMail
 	print '<tr><td>'.$langs->trans('EMail').'</td><td colspan="3">';
-	print dol_print_email($soc->email,0,$soc->id,'AC_EMAIL');
+	print dol_print_email($object->email,0,$object->id,'AC_EMAIL');
 	print '</td></tr>';
 
 	// Web
 	print '<tr><td>'.$langs->trans('Web').'</td><td colspan="3">';
-	print dol_print_url($soc->url);
+	print dol_print_url($object->url);
 	print '</td></tr>';
 
 	// Phone / Fax
-	print '<tr><td>'.$langs->trans('Phone').'</td><td>'.dol_print_phone($soc->phone,$soc->country_code,0,$soc->id,'AC_TEL').'</td>';
-	print '<td>'.$langs->trans('Fax').'</td><td>'.dol_print_phone($soc->fax,$soc->country_code,0,$soc->id,'AC_FAX').'</td></tr>';
+	print '<tr><td>'.$langs->trans('Phone').'</td><td>'.dol_print_phone($object->phone,$object->country_code,0,$object->id,'AC_TEL').'</td>';
+	print '<td>'.$langs->trans('Fax').'</td><td>'.dol_print_phone($object->fax,$object->country_code,0,$object->id,'AC_FAX').'</td></tr>';
 
 	print '</table>';
 
@@ -171,7 +168,7 @@ if ($socid)
 
     print '<br>';
 
-    $objthirdparty=$soc;
+    $objthirdparty=$object;
     $objcon=new stdClass();
 
     $out='';
@@ -189,10 +186,10 @@ if ($socid)
     print load_fiche_titre($langs->trans("ActionsOnCompany"),$out,'');
 
     // List of todo actions
-    show_actions_todo($conf,$langs,$db,$soc);
+    show_actions_todo($conf,$langs,$db,$object);
 
     // List of done actions
-    show_actions_done($conf,$langs,$db,$soc);
+    show_actions_done($conf,$langs,$db,$object);
 }
 
 
diff --git a/htdocs/societe/info.php b/htdocs/societe/info.php
index 305936e6f568b4e8dd29377b44f68b7e674901a7..9d06d203d9c5ead152f1d0676c8228b2b4e2de2c 100644
--- a/htdocs/societe/info.php
+++ b/htdocs/societe/info.php
@@ -59,21 +59,21 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e
 $help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas';
 llxHeader('',$langs->trans("ThirdParty"),$help_url);
 
-$soc = new Societe($db);
-$soc->fetch($socid);
-$soc->info($socid);
+$object = new Societe($db);
+$object->fetch($socid);
+$object->info($socid);
 
 /*
  * Affichage onglets
  */
-$head = societe_prepare_head($soc);
+$head = societe_prepare_head($object);
 
 dol_fiche_head($head, 'info', $langs->trans("ThirdParty"),0,'company');
 
 
 
 print '<table width="100%"><tr><td>';
-dol_print_object_info($soc);
+dol_print_object_info($object);
 print '</td></tr></table>';
 
 
diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php
index 656e88ec83c24bac06a1a2c42c4f6a23c8f3c5f8..b1a3413433c2733038a16f0fa2ee129c4e8c4fac 100644
--- a/htdocs/societe/soc.php
+++ b/htdocs/societe/soc.php
@@ -1751,7 +1751,8 @@ else
         print '<tr><td>'.$langs->trans("Country").'</td><td colspan="'.(2+(($showlogo || $showbarcode)?0:1)).'" class="nowrap">';
     	if (! empty($object->country_code))
     	{
-           	$img=picto_from_langcode($object->country_code);
+           	//$img=picto_from_langcode($object->country_code);
+           	$img='';
            	if ($object->isInEEC()) print $form->textwithpicto(($img?$img.' ':'').$object->country,$langs->trans("CountryIsInEEC"),1,0);
            	else print ($img?$img.' ':'').$object->country;
     	}
diff --git a/htdocs/theme/eldy/img/menus/README.md b/htdocs/theme/eldy/img/menus/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..1b3942d1913a833e595a36a58e1b74520f425f67
--- /dev/null
+++ b/htdocs/theme/eldy/img/menus/README.md
@@ -0,0 +1,12 @@
+
+Tutorial to create a new image for menu:
+
+1) First find an image.
+2) With Gimp, open image and check there is a alpha channel. If not add one.
+3) Convert image into back and white.
+4) Use the degrade tool with option:
+* Erase color
+* Opacity: 50 +/-
+* Offset: 0
+* Shape: Linear
+Il est possible aussi d'augmenter la transparence globale depuis le calque.
diff --git a/htdocs/theme/eldy/img/menus/chart.png b/htdocs/theme/eldy/img/menus/chart.png
new file mode 100644
index 0000000000000000000000000000000000000000..6efce90a78859b6f4649304a8481fd193e6cb609
Binary files /dev/null and b/htdocs/theme/eldy/img/menus/chart.png differ
diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php
index bb5941c813017a62ee896d974b760e6b2caebb1a..a6d492aa9c4e2970bacd0e876e75b0fdc705ba40 100644
--- a/htdocs/theme/eldy/style.css.php
+++ b/htdocs/theme/eldy/style.css.php
@@ -532,8 +532,8 @@ margin : 0px auto;
 
 <?php
 $minwidthtmenu=66;
-$heightmenu=52;
-$heightmenu2=40;
+$heightmenu=46;			/* height of top menu, part with image */
+$heightmenu2=46;        /* height of top menu, ârt with login  */
 ?>
 
 div#tmenu_tooltip {
@@ -679,7 +679,7 @@ div.mainmenu {
 	position : relative;
 	background-repeat:no-repeat;
 	background-position:center top;
-	height: <?php echo ($heightmenu-17); ?>px;
+	height: <?php echo ($heightmenu-19); ?>px;
 	margin-left: 0px;
 	min-width: 40px;
 }
@@ -704,16 +704,10 @@ div.mainmenu.bank {
     background-image: url(<?php echo dol_buildpath($path.'/theme/'.$theme.'/img/menus/bank.png',1) ?>);
 }
 
-div.mainmenu.bookmark {
-}
-
 div.mainmenu.cashdesk {
 	background-image: url(<?php echo dol_buildpath($path.'/theme/'.$theme.'/img/menus/pointofsale.png',1) ?>);
 }
 
-div.mainmenu.click2dial {
-}
-
 div.mainmenu.companies {
 	background-image: url(<?php echo dol_buildpath($path.'/theme/'.$theme.'/img/menus/company.png',1) ?>);
 }
@@ -734,12 +728,6 @@ div.mainmenu.ftp {
     background-image: url(<?php echo dol_buildpath($path.'/theme/'.$theme.'/img/menus/tools.png',1) ?>);
 }
 
-div.mainmenu.gravatar {
-}
-
-div.mainmenu.geopipmaxmind {
-}
-
 div.mainmenu.hrm {
 	background-image: url(<?php echo dol_buildpath($path.'/theme/'.$theme.'/img/menus/holiday.png',1) ?>);
 }
@@ -748,9 +736,6 @@ div.mainmenu.members {
 	background-image: url(<?php echo dol_buildpath($path.'/theme/'.$theme.'/img/menus/members.png',1) ?>);
 }
 
-div.mainmenu.paypal {
-}
-
 div.mainmenu.products {
 	background-image: url(<?php echo dol_buildpath($path.'/theme/'.$theme.'/img/menus/products.png',1) ?>);
 	margin-left: 10px;
@@ -764,14 +749,6 @@ div.mainmenu.tools {
 	background-image: url(<?php echo dol_buildpath($path.'/theme/'.$theme.'/img/menus/tools.png',1) ?>);
 }
 
-div.mainmenu.webservices {
-}
-
-div.mainmenu.google {
-	background-image: url(<?php echo dol_buildpath($path.'/theme/'.$theme.'/img/menus/globe.png',1) ?>);
-}
-
-
 <?php
 // Add here more div for other menu entries. moduletomainmenu=array('module name'=>'name of class for div')
 
@@ -2443,6 +2420,11 @@ li.cal_event       { border: none; list-style-type: none; }
 .cal_event a:active  { color: #111111; font-size: 11px; font-weight: normal !important; }
 .cal_event a:hover   { color: #111111; font-size: 11px; font-weight: normal !important; color:rgba(255,255,255,.75); }
 .cal_event_busy      { }
+.cal_peruserviewname { max-width: 100px; height: 22px; }
+
+.topmenuimage {
+	background-size: 28px auto;
+}
 
 /* ============================================================================== */
 /*  Ajax - Liste deroulante de l'autocompletion                                   */
diff --git a/test/phpunit/NumberingModulesTest.php b/test/phpunit/NumberingModulesTest.php
index 043b8ae5a8345994cf6531fade59dc1d5958ad9f..904c102e0a8ae5377a15f0ad6a2b0f0d86a8c328 100644
--- a/test/phpunit/NumberingModulesTest.php
+++ b/test/phpunit/NumberingModulesTest.php
@@ -167,7 +167,7 @@ class NumberingModulesTest extends PHPUnit_Framework_TestCase
 		$this->assertEquals(1, $result);						// Can be deleted
 		$result=$localobject->is_erasable();
 		print __METHOD__." is_erasable=".$result."\n";
-		$this->assertEquals(0, $result, 'Test for {yyyy}-{0000} that is_erasable is 0 for 1st invoice');						// 1 can no more be deleted (2 is more recent
+		$this->assertEquals(0, $result, 'Test for {yyyy}-{0000} that is_erasable is 0 for 1st invoice');						// 1 can no more be deleted (2 is more recent)
 
 		// Now we try with a reset
 		$conf->global->FACTURE_MERCURE_MASK_CREDIT='{yyyy}-{0000@1}';
@@ -502,7 +502,7 @@ class NumberingModulesTest extends PHPUnit_Framework_TestCase
     	$conf->global->SOCIETE_FISCAL_MONTH_START=6;
     	$conf->global->FACTURE_MERCURE_MASK_CREDIT='{yyyy}{mm}-{0000@99}';
     	$conf->global->FACTURE_MERCURE_MASK_INVOICE='{yyyy}{mm}-{0000@99}';
-    	
+
     	$localobject=new Facture($this->savdb);
     	$localobject->initAsSpecimen();
     	$localobject->date=dol_mktime(12, 0, 0, 1, 1, 1980);	// we use year 1980 to be sure to not have existing invoice for this year
@@ -512,7 +512,7 @@ class NumberingModulesTest extends PHPUnit_Framework_TestCase
     	$result3=$localobject->validate($user, $result);
     	print __METHOD__." result=".$result."\n";
     	$this->assertEquals('198001-0001', $result);	// counter must start to 1
-    	
+
     	$localobject=new Facture($this->savdb);
     	$localobject->initAsSpecimen();
     	$localobject->date=dol_mktime(12, 0, 0, 1, 1, 1980);	// we use year 1980 to be sure to not have existing invoice for this year
@@ -522,7 +522,7 @@ class NumberingModulesTest extends PHPUnit_Framework_TestCase
     	$result3=$localobject->validate($user, $result);
     	print __METHOD__." result=".$result."\n";
     	$this->assertEquals('198001-0002', $result);	// counter must start to 2
-    	
+
     	$localobject=new Facture($this->savdb);
     	$localobject->initAsSpecimen();
     	$localobject->date=dol_mktime(12, 0, 0, 2, 1, 1980);	// we use year 1980 to be sure to not have existing invoice for this year
@@ -532,7 +532,7 @@ class NumberingModulesTest extends PHPUnit_Framework_TestCase
     	$result3=$localobject->validate($user, $result);
     	print __METHOD__." result=".$result."\n";
     	$this->assertEquals('198002-0001', $result);	// counter must start to 1
-    	
+
     	$localobject=new Facture($this->savdb);
     	$localobject->initAsSpecimen();
     	$localobject->date=dol_mktime(12, 0, 0, 1, 1, 1981);	// we use year 1981 to be sure to not have existing invoice for this year
@@ -542,7 +542,28 @@ class NumberingModulesTest extends PHPUnit_Framework_TestCase
     	$result3=$localobject->validate($user, $result);
     	print __METHOD__." result=".$result."\n";
     	$this->assertEquals('198101-0001', $result);	// counter must start to 1
-      	
+
+    	// Test with {t} tag
+    	$conf->global->SOCIETE_FISCAL_MONTH_START=1;
+    	$conf->global->FACTURE_MERCURE_MASK_CREDIT='{t}{yyyy}{mm}-{0000}';
+    	$conf->global->FACTURE_MERCURE_MASK_INVOICE='{t}{yyyy}{mm}-{0000}';
+
+    	$tmpthirdparty=new Societe($this->savdb);
+    	$tmpthirdparty->initAsSpecimen();
+    	$tmpthirdparty->typent_code = 'TE_ABC';
+
+    	$localobject=new Facture($this->savdb);
+    	$localobject->initAsSpecimen();
+    	$localobject->date=dol_mktime(12, 0, 0, 1, 1, 1982);	// we use year 1982 to be sure to not have existing invoice for this year
+    	$numbering=new mod_facture_mercure();
+    	$result=$numbering->getNextValue($tmpthirdparty, $localobject);
+    	$result2=$localobject->create($user,1);
+    	$result3=$localobject->validate($user, $result);
+    	print __METHOD__." result=".$result."\n";
+    	$this->assertEquals('A198201-0001', $result);	// counter must start to 1
+
+
+
     	return $result;
     }