diff --git a/assets/js/aap/aap.js b/assets/js/aap/aap.js
index a312386f92bcafde3f109f8adf6213e0d5e929a8..6f0e4844a4e40322013ab6933c39b37b446304db 100755
--- a/assets/js/aap/aap.js
+++ b/assets/js/aap/aap.js
@@ -5923,6 +5923,16 @@ var aapObj = {
 							canAddCard: isContributor,
 							canEditHeader: isContributor,
 							editable: isContributor,
+							enableMention: true,
+							canContributes: Object.keys(projectContributors).map(key => {
+								const contributor = projectContributors[key];
+								return {
+									id: key,
+									name: contributor.name,
+									alias: contributor.username,
+									image: contributor.image
+								};
+							}),
 							onParticipate: function (data) {
 								var contributors = data.contributors.map(contributor => contributor.id);
 								var index = contributors.indexOf(userId);
@@ -6088,59 +6098,54 @@ var aapObj = {
 									status: created.header,
 									parentId: projectId,
 									parentType: 'projects',
-									component: 'kanban'
+									component: 'kanban',
+									mentions: created.contributors.map(c => c.alias),
 								};
 								if (wsCO && wsCO.id)
 									post.emiter = wsCO.id;
+								const is_contributor = created.contributors.some(s => s.id === userId);
 								coInterface.actions.request_create_action(post).then(function (response) {
-									if (response.success) {
-										// send create notification
-										var id_at_kanban = created.id;
-										created.id = response.data._id.$id;
-										created.actions = [{
-											icon: 'fa fa-archive',
-											bstooltip: { text: trad.delete, position: 'top' },
-											action: 'onCardArchiveClick',
-											bstooltip: { text: trad['Archive'], position: 'top' }
-										}, { icon: 'fa fa-commenting', badge: '0', action: 'onCardCommentClick' }, {
-											icon: 'fa fa-picture-o',
-											badge: '0',
-											action: 'onCardPictureClick',
-											hideCondition: { badge: '0' }
-										},
-										{
-											icon: 'fa fa-file',
-											badge: '0',
-											action: 'onCardFileClick',
-											hideCondition: { badge: '0' }
+									// send create notification
+									var id_at_kanban = created.id;
+									created.id = response._id.$id;
+									created.actions = [{
+										icon: 'fa fa-archive',
+										bstooltip: { text: trad.delete, position: 'top' },
+										action: 'onCardArchiveClick',
+										bstooltip: { text: trad['Archive'], position: 'top' }
+									}, { icon: 'fa fa-commenting', badge: '0', action: 'onCardCommentClick' }, {
+										icon: 'fa fa-picture-o',
+										badge: '0',
+										action: 'onCardPictureClick',
+										hideCondition: { badge: '0' }
+									},
+									{
+										icon: 'fa fa-file',
+										badge: '0',
+										action: 'onCardFileClick',
+										hideCondition: { badge: '0' }
+									},
+									{
+										badge: '0/0',
+										className: 'kanban-no-task-action'
+									}, {
+										icon: `fa ${is_contributor ? "fa-unlink" : "fa-link"}`,
+										bstooltip: {
+											text: is_contributor ? coTranslate("Quit") : coTranslate("Participate"),
+											position: 'top'
 										},
-										{
-											badge: '0/0',
-											className: 'kanban-no-task-action'
-										}, {
-											icon: 'fa fa-link',
-											bstooltip: {
-												text: coTranslate('Participate'),
-												position: 'top'
-											},
-											action: 'onParticipate'
-										}];
-										$(container).kanban('setData', { column: created.header, id: id_at_kanban, data: created });
-										coInterface.actions.update_action_position({
-											action: created.id,
-											group: created.header,
-											emiter: wsCO && wsCO.id ? wsCO.id : null,
-											component: 'kanban',
-											server_url: baseUrl
-										}).then();
-									}
-									else
-										toastr.error(coTranslate(response.data));
+										action: 'onParticipate'
+									}];
+									$(container).kanban('setData', { column: created.header, id: id_at_kanban, data: created });
+									coInterface.actions.update_action_position({
+										action: created.id,
+										group: created.header,
+										emiter: wsCO && wsCO.id ? wsCO.id : null,
+										component: 'kanban',
+										server_url: baseUrl
+									}).then();
 								}).catch(function (error) {
-									if (error && error.data)
-										toastr.error(coTranslate(error.data));
-									else
-										mylog.error(error);
+									mylog.error(error);
 								});
 							},
 							onHeaderChange: function (changedHeader) {
@@ -6202,7 +6207,9 @@ var aapObj = {
 											text: trad.yes,
 											btnClass: 'btn btn-warning',
 											action: function () {
-												coInterface.actions.request_archive(action.id).then();
+												coInterface.actions.request_archive(action.id).then(() => {
+													kanbanContainerDom.kanban("deleteData", action)
+												});
 											}
 										}
 									}
@@ -6217,6 +6224,26 @@ var aapObj = {
 								ajaxPost(null, url, post, function (html) {
 									$('#action-modal-preview').empty().html(html);
 								}, null, 'text');
+							},
+							onContributorRemove: arg => {
+								const was_contributor = arg.contributor.id === userId;
+								const data = $.extend({}, arg.card, {actions: arg.card.actions.map(m => {
+										if (m.action === "onParticipate") {
+											m.icon = `fa ${was_contributor ? "fa-link" : "fa-unlink"}`;
+											m.bstooltip.text = was_contributor ? coTranslate("Participate") : coTranslate("Quit");
+										}
+										return m;
+									})});
+								if (was_contributor) {
+									kanbanContainerDom.kanban("setData", {
+										id: arg.card.id,
+										data: data,
+									})
+								}
+								coInterface.actions.request_participation({
+									action: arg.card.id,
+									contributors: arg.card.contributors.map(c => c.id),
+								}).then(r => toastr.success("La liste de contributeur a été mise à jour."));
 							}
 						});
 					$(document.body).off('action.set-contributor').on('action.set-contributor', function (event, data) {
diff --git a/assets/js/co.js b/assets/js/co.js
index 4d1c74d516fc527bb0dd45ed4b68310d090ec6de..ee55bfba35dd73783e1b0b03d12e636e0f680bb4 100755
--- a/assets/js/co.js
+++ b/assets/js/co.js
@@ -1837,20 +1837,21 @@ var coInterface = {
 			});
 		},
 		request_create_action: function (post) {
-			var url = baseUrl;
+			var url = "/costum/project/action/request/new";
 
 			return new Promise(function (resolve, reject) {
 				if (typeof post !== 'object' || !post)
 					reject({
-						success: false,
-						data: 'Empty parameter'
+						side: "client",
+						msg: 'Empty parameter',
+						fn: "request_create_action",
 					});
 				else {
-					if (post.serverUrl) {
-						url = post.serverUrl;
-						delete post.serverUrl;
-					}
-					url += '/costum/project/action/request/new';
+					if (post.server_url) {
+						url = post.server_url + url;
+						delete post.server_url;
+					} else
+						url = baseUrl + url;
 					var key_list = ['name', 'status', 'parentId', 'parentType'];
 					var ft = { success: true, data: [] };
 					key_list.forEach(function (key_item) {
@@ -1862,8 +1863,28 @@ var coInterface = {
 					if (!ft.success)
 						ft.data = 'Missing parameters : ' + ft.data.join(', ') + '.';
 					if (!ft.success)
-						reject(ft);
-					ajaxPost(null, url, post, resolve, reject);
+						reject({
+							side: "client",
+							msg: ft.data,
+							fn: "request_create_action",
+						});
+					else
+						ajaxPost(null, url, post, response => {
+							if (response.success)
+								resolve(response.content);
+							else
+								reject({
+									side: "server",
+									msg: response.content,
+									fn: "request_create_action",
+								});
+						}, (xhr, status, error) => {
+							reject({
+								side: "server",
+								msg: error,
+								fn: "request_create_action",
+							});
+						});
 				}
 			});
 		},
@@ -1948,10 +1969,26 @@ var coInterface = {
 		},
 		request_participation: function (args) {
 			return new Promise(function (resolve, reject) {
+				const fn = "request_participation";
+				
 				if (typeof args !== 'object' || !args)
-					reject('Undefined argument');
-				else if (typeof args.action === 'undefined' || typeof args.contributor === 'undefined')
-					reject('Argument error');
+					reject({
+						side: "client",
+						msg: "Argument format error",
+						fn,
+					});
+				else if (typeof args.action === 'undefined')
+					reject({
+						side: "client",
+						msg: "Undefined action id",
+						fn,
+					});
+				else if (typeof args.contributor === "undefined" && typeof args.contributors === "undefined")
+					reject({
+						side: "client",
+						msg: "Should provide contributor id(s)",
+						fn,
+					});
 				else {
 					var url = baseUrl;
 					if (typeof args.server_url === 'string')
@@ -1959,13 +1996,17 @@ var coInterface = {
 					url += '/costum/project/action/request/set_contributors';
 					var post = {
 						action: args.action,
-						contributor: args.contributor,
 						emiter: wsCO && wsCO.id ? wsCO.id : ''
 					};
-					if (typeof args.participate === 'number')
-						post.participate = args.participate;
-					else
-						post.participate = 0;
+					if (typeof args.contributors === "object")
+						post.contributors = args.contributors;
+					else if (typeof args.contributor === "string") {
+						post.contributor = args.contributor;
+						if (typeof args.participate === 'number')
+							post.participate = args.participate;
+						else
+							post.participate = 0;
+					}
 					ajaxPost(null, url, post, resolve, reject);
 				}
 			});
diff --git a/assets/js/directory/directorySocket.js b/assets/js/directory/directorySocket.js
index fb9d90c1b9105a0c308f79bcf35a6c245df86c72..350235a1d788e620442cc6a21b64aa317973c260 100644
--- a/assets/js/directory/directorySocket.js
+++ b/assets/js/directory/directorySocket.js
@@ -35,6 +35,12 @@ var directorySocket = {
 					filterGroup.results.$grid.masonry('destroy');
 					filterGroup.results.$grid.masonry({itemSelector: '.smartgrid-slide-element', 'columnWidth': '.searchEntityContainer.smartgrid-slide-element'});
 
+					targetDiv = document.querySelector(`.msr-id-${_id}`);
+					let image = targetDiv.querySelectorAll('img.lzy_img');
+					image.forEach((v) => {
+						v.dom = "#content-results-profil";
+						imageObserver.observe(v);
+					});
 					directory.bindEventAdmin();
 					if(filterGroup.results.map.active){
 						filterGroup.mapObj.addElts(datas);
@@ -90,12 +96,41 @@ var directorySocket = {
 					window[`kanbanDom${contextData.id}`].kanban('deleteData', { column: "memberof", id:_id,  index: indexToDelete });
 				}
             }).on("invite_user", function(data){
-				
+				let show = false;
 				if(data.invitedId == userId) {
 					directorySocket.events.invitedMe();
 				}
 
-                if(typeof data.donne != "undefined" && data.donne != null){
+				if(
+					typeof userConnected.roles != "undefined" && typeof userConnected.roles.superAdmin != "undefined" && userConnected.roles.superAdmin
+				){
+					show = true;
+				}else if(contextData.type == "organizations"){
+					if(typeof userConnected.links.memberOf[contextData.id] != "undefined"
+						&& typeof userConnected.links.memberOf[contextData.id].isAdmin != "undefined"
+						&& userConnected.links.memberOf[contextData.id].isAdmin
+						&& (typeof userConnected.links.memberOf[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.memberOf[contextData.id].isInviting == "undefined")
+					){
+						show = true;
+					}
+				}else if(contextData.type == "projects"){
+					if(typeof userConnected.links.projects[contextData.id] != "undefined"
+						&& typeof userConnected.links.projects[contextData.id].isAdmin != "undefined"
+						&& userConnected.links.projects[contextData.id].isAdmin
+						&& (typeof userConnected.links.projects[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.projects[contextData.id].isInviting == "undefined")
+					){
+						show = true;
+					}
+				}else if(contextData.type == "organizations"){
+					if(typeof userConnected.links.memberOf[contextData.id] != "undefined"
+						&& typeof userConnected.links.memberOf[contextData.id].isAdmin != "undefined"
+						&& userConnected.links.memberOf[contextData.id].isAdmin
+						&& (typeof userConnected.links.memberOf[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.memberOf[contextData.id].isInviting == "undefined")
+					){
+						show = true;
+					}
+				}
+                if(typeof data.donne != "undefined" && data.donne != null && show){
 					
 					let donne = data.donne;
 					let datas = {};
@@ -103,14 +138,18 @@ var directorySocket = {
 
 					let community = directorySocket.events.communityVariable(donne, data.invitedId);
 					let str = directory.showResultsDirectoryHtml(datas, "", "", community);
-					directorySocket.events.updateNomberElements(datas, "add");
+					var targetDiv = document.querySelector(`.msr-id-${data.invitedId}`);
+					if (targetDiv) {
+						targetDiv.parentElement.remove();
+					} else {
+						directorySocket.events.updateNomberElements(datas, "add");
+					}
 
 					filterGroup.results.$grid.prepend(str);
 					filterGroup.results.$grid.masonry('destroy');
 					filterGroup.results.$grid.masonry({itemSelector: '.smartgrid-slide-element', 'columnWidth': '.searchEntityContainer.smartgrid-slide-element'});
 
-					var targetDiv = document.querySelector(`.msr-id-${data.invitedId}`);
-
+					targetDiv = document.querySelector(`.msr-id-${data.invitedId}`);
 					var newSpan = document.createElement('span');
 					newSpan.className = 'entityStatusLink italic';
 					newSpan.textContent = 'Invitation envoyée';
@@ -119,6 +158,12 @@ var directorySocket = {
 					var textWrap = slideHover.querySelector('.text-wrap');
 					var adminToolBar = slideHover.querySelector('.adminToolBarDirectory');
 
+					let image = targetDiv.querySelectorAll('img.lzy_img');
+					image.forEach((v) => {
+						v.dom = "#content-results-profil";
+						imageObserver.observe(v);
+					});
+
 					directory.bindEventAdmin();
 					textWrap.insertBefore(newSpan, adminToolBar);
                 }
@@ -484,12 +529,42 @@ var directorySocket = {
 			
 			let community = {
 				connectType : "members",
-				edit : true,
 				links : {
 					"members" : {}
 				}
 			};
 			
+			if(
+				typeof userConnected.roles != "undefined" && typeof userConnected.roles.superAdmin != "undefined" && userConnected.roles.superAdmin
+			){
+				community.edit = true;
+			}else if(contextData.type == "organizations"){
+				if(typeof userConnected.links.memberOf[contextData.id] != "undefined"
+					&& typeof userConnected.links.memberOf[contextData.id].isAdmin != "undefined"
+					&& userConnected.links.memberOf[contextData.id].isAdmin
+					&& (typeof userConnected.links.memberOf[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.memberOf[contextData.id].isInviting == "undefined")
+				){
+					community.edit = true;
+				}
+			}else if(contextData.type == "projects"){
+				if(typeof userConnected.links.projects[contextData.id] != "undefined"
+					&& typeof userConnected.links.projects[contextData.id].isAdmin != "undefined"
+					&& userConnected.links.projects[contextData.id].isAdmin
+					&& (typeof userConnected.links.projects[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.projects[contextData.id].isInviting == "undefined")
+				){
+					community.edit = true;
+				}
+			}else if(contextData.type == "events"){
+				if(typeof userConnected.links.events[contextData.id] != "undefined"
+					&& typeof userConnected.links.events[contextData.id].isAdmin != "undefined"
+					&& userConnected.links.events[contextData.id].isAdmin
+					&& (typeof userConnected.links.events[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.events[contextData.id].isInviting == "undefined")
+				){
+					community.edit = true;
+				}
+			}
+			
+
 			community.links["members"][_id] = {
 				type: data.collection,
 				date : data.modified
@@ -498,11 +573,12 @@ var directorySocket = {
 			return community;
 		},
 		updateNomberElements: function(datas, type) {
-			let aElement = document.querySelector('a[data-type-dir="members"]');
-			let badgeElement = aElement.querySelector('.badge');
-			let newNbbadge = type == "add" ?  Object.keys(datas).length + parseInt(badgeElement.textContent) : parseInt(badgeElement.textContent) - 1;
-			badgeElement.textContent = newNbbadge;
-
+			if(contextData.type == "organizations" || contextData.type == "projects"){
+				let aElement = document.querySelector(`a[data-type-dir="${contextData.type == "organizations" ? "members" : "contributors"}"]`);
+				let badgeElement = aElement.querySelector('.badge');
+				let newNbbadge = type == "add" ?  Object.keys(datas).length + parseInt(badgeElement.textContent) : parseInt(badgeElement.textContent) - 1;
+				badgeElement.textContent = newNbbadge;
+			}
 			let spanElement = document.querySelector('.count-nbr');
 			let nbnewdata =  type == "add" ? Object.keys(datas).length + parseInt(spanElement.textContent) : parseInt(spanElement.textContent) - 1;
 			spanElement.textContent = nbnewdata;
diff --git a/views/admin/communityMailing.php b/views/admin/communityMailing.php
index 99d345948a83a2c450784aa639f9054359b4385c..4cf98404ee268ecb0ebcb72938334476285ca741 100755
--- a/views/admin/communityMailing.php
+++ b/views/admin/communityMailing.php
@@ -378,7 +378,7 @@ jQuery(document).ready(function() {
 								collection:costum.contextType,
 								path:"allToRoot",
 								value:listInvitation,
-								updateCache : true
+								// updateCache : true
 							}, function(){});
 					},
 					function(data){
diff --git a/views/admin/index.php b/views/admin/index.php
index 88fc372b67b0fa0c274d5b4d1fe9bf023f9b2f28..84ee6595bf616b7ff6141b4fae6e7e1e4e330158 100755
--- a/views/admin/index.php
+++ b/views/admin/index.php
@@ -76,7 +76,7 @@
     .admin-menu-item {
         text-align: left;
         padding: 10px 20px 10px 30px;
-        border-bottom: 1px solid;
+        /* border-bottom: 1px solid; */
     }
     .admin-menu-item.active, .admin-menu-item:hover {
         background-color: #d4e1ea;
@@ -359,7 +359,7 @@
                         <br>
                         <br>
                         <div class="col-xs-12 col-sm-12 no-padding text-center ">
-                            <img src="<?php echo Yii::app()->theme->baseUrl.'/assets/img/admin.gif'; ?>" class="" style="width: 70%">
+                            <img src="<?php echo Yii::app()->theme->baseUrl.'/assets/img/admin.png'; ?>" class="" style="width: 80%">
                         </div>
                             <?php }  ?>
                     <!--<div class="col-xs-12  col-sm-offset-1 col-sm-10  shadow2 bg-white margin-top-35">