diff --git a/src/frontend/app/administration/basket/basket-administration.component.ts b/src/frontend/app/administration/basket/basket-administration.component.ts
index e84db6c585d625267f80fc727449ce8444d1989e..bd062c2c0910dcd08ceca9f823097762bf092667 100755
--- a/src/frontend/app/administration/basket/basket-administration.component.ts
+++ b/src/frontend/app/administration/basket/basket-administration.component.ts
@@ -354,7 +354,7 @@ export class BasketAdministrationSettingsModalComponent extends AutoCompletePlug
     statusCtrl = new FormControl();
 
     constructor(public http: HttpClient, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef<BasketAdministrationSettingsModalComponent>) {
-        super(http, ['users', 'statuses']);
+        super(http, ['statuses']);
     }
 
     @ViewChild('statusInput') statusInput: ElementRef;
diff --git a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html
index 4a62807522091cf3d6dfb65e2356bc31df31c833..dfb0eb58dfeb111e164040f70c5595cb54dc2f6c 100755
--- a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html
+++ b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.html
@@ -51,22 +51,7 @@
                         <mat-tab label="{{lang.diffusionList}}">
                                 <div class="row" style="margin:0px;" id="visaCircuitContent">
                                     <div class="col-md-12">
-                                        <mat-form-field>
-                                            <input #autocompleteFilter type="text" class="autocompleteSearch" placeholder="{{lang.addUser}}" matInput [matAutocomplete]="auto" [formControl]="userCtrl">
-                                            <mat-autocomplete #auto="matAutocomplete">
-                                                <mat-option *ngFor="let elem of filteredUsers | async" [value]="elem.id" (click)="addElemListModelVisa(elem);autocompleteFilter.isOpen=true">
-                                                    <p mat-line *ngIf="elem.type == 'user'" style="margin:0;">
-                                                        <span class="col-xm-1" style="padding-right:5px;">
-                                                            <mat-icon color="primary" class="fa fa-user fa-2x" style="margin-right:0px;"></mat-icon>
-                                                        </span>
-                                                        <span class="col-xm-11">
-                                                            {{ elem.idToDisplay }}
-                                                            <small>{{ elem.otherInfo }}</small>
-                                                        </span>
-                                                    </p>
-                                                </mat-option>
-                                            </mat-autocomplete>
-                                        </mat-form-field>
+                                        <plugin-autocomplete [labelPlaceholder]="lang.addUser" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModelVisa($event)"></plugin-autocomplete>
                                         <mat-list>
                                             <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="diffusionModel.diffusionList">
                                                 <mat-list-item disableRipple="true" *ngFor="let template of diffusionModel.diffusionList; let i = index" title="{{lang.move}}"
diff --git a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts
index d9677d0afa11ab7769a1b71a6ff772543a026db3..72c3e8349cc384d85c1ddc5f1465ac44bfd83942 100755
--- a/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts
+++ b/src/frontend/app/administration/diffusionModel/diffusionModel-administration.component.ts
@@ -5,8 +5,6 @@ import { ActivatedRoute, Router } from '@angular/router';
 import { LANG } from '../../translate.component';
 import { NotificationService } from '../../notification.service';
 import { HeaderService }        from '../../../service/header.service';
-
-import { AutoCompletePlugin } from '../../../plugins/autocomplete.plugin';
 import { MatSidenav } from '@angular/material';
 
 declare function $j(selector: any): any;
@@ -19,7 +17,7 @@ declare const angularGlobals: any;
     styleUrls: ['diffusionModel-administration.component.css'],
     providers: [NotificationService]
 })
-export class DiffusionModelAdministrationComponent extends AutoCompletePlugin implements OnInit {
+export class DiffusionModelAdministrationComponent implements OnInit {
 
     @ViewChild('snav') public  sidenavLeft   : MatSidenav;
     @ViewChild('snav2') public sidenavRight  : MatSidenav;
@@ -42,7 +40,6 @@ export class DiffusionModelAdministrationComponent extends AutoCompletePlugin im
     dataSource          : any;
 
     constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private route: ActivatedRoute, private router: Router, private notify: NotificationService, private headerService: HeaderService) {
-        super(http, ['users']);
         $j("link[href='merged_css.php']").remove();
         this.mobileQuery = media.matchMedia('(max-width: 768px)');
         this._mobileQueryListener = () => changeDetectorRef.detectChanges();
@@ -109,15 +106,13 @@ export class DiffusionModelAdministrationComponent extends AutoCompletePlugin im
             "item_id": element.id,
             "sequence": this.diffusionModel.diffusionList.length,
             "idToDisplay": element.idToDisplay,
-            "descriptionToDisplay": element.otherInfo
+            "descriptionToDisplay": element.descriptionToDisplay
         };
 
         this.diffusionModel.diffusionList.push(newElemListModel);
         if (this.diffusionModel.diffusionList.length > 1) {
             this.diffusionModel.diffusionList[this.diffusionModel.diffusionList.length-2].item_mode = item_mode2;
         }
-        this.userCtrl.setValue('');
-        $j('.autocompleteSearch').blur();
     }
 
     updateDiffListVisa(template: any): any {
diff --git a/src/frontend/app/administration/entity/entities-administration-redirect-modal.component.html b/src/frontend/app/administration/entity/entities-administration-redirect-modal.component.html
index e37d5d2a84ba9eef2557c30cc930ed0ddb78cdd8..d8e55dded09caa1397408d59f78d399fe40d02de 100755
--- a/src/frontend/app/administration/entity/entities-administration-redirect-modal.component.html
+++ b/src/frontend/app/administration/entity/entities-administration-redirect-modal.component.html
@@ -1,49 +1,38 @@
 <h2 mat-dialog-title>{{lang.entityReplacement}}</h2>
-<form #changeEntityForm="ngForm">
-    <mat-dialog-content>
-        <div class="alert alert-info" role="alert">
-            <mat-list>
-                <mat-list-item *ngIf="data.entity.documents > 0">
-                    <mat-icon color="primary" mat-list-icon class="fa fa-file fa-2x"></mat-icon>
-                    <p mat-line>
-                        <b>{{data.entity.entity_label}}</b> {{lang.isDestTo}}
-                        <b>{{data.entity.documents}}</b> {{lang.documents}}</p>
-                </mat-list-item>
-                <mat-list-item *ngIf="data.entity.instances > 0">
-                    <mat-icon color="primary" mat-list-icon class="fa fa-sitemap fa-2x"></mat-icon>
-                    <p mat-line>
-                        <b>{{data.entity.entity_label}}</b> {{lang.isCopyTo}}
-                        <b>{{data.entity.instances}}</b> {{lang.documents}}</p>
-                </mat-list-item>
-                <mat-list-item *ngIf="data.entity.users.length > 0">
-                    <mat-icon color="primary" mat-list-icon class="fa fa-user fa-2x"></mat-icon>
-                    <p mat-line>
-                        <b>{{data.entity.entity_label}}</b> {{lang.isLinkedTo | lowercase}}
-                        <b>{{data.entity.users.length}}</b> {{lang.users | lowercase}}</p>
-                </mat-list-item>
-                <mat-list-item *ngIf="data.entity.templates.length > 0">
-                    <mat-icon color="primary" mat-list-icon class="fa fa-file-alt fa-2x"></mat-icon>
-                    <p mat-line>
-                        <b>{{data.entity.entity_label}}</b> {{lang.isLinkedTo | lowercase}}
-                        <b>{{data.entity.templates.length}}</b> {{lang.templates | lowercase}}</p>
-                </mat-list-item>
-            </mat-list>
-        </div>
-        <mat-form-field>
-            <input type="text" placeholder="{{lang.chooseEntity}}" matInput [matAutocomplete]="auto" [formControl]="elementCtrl"
-                [(ngModel)]="data.entity.redirectEntity">
-            <mat-autocomplete #auto="matAutocomplete">
-                <mat-option *ngFor="let elem of filteredElements | async" [value]="elem.id">
-                    <p mat-line>
-                        <mat-icon [class]="elem.type == 'entity' ? 'fa fa-sitemap' : 'fa fa-user'" style="margin-right:0px;"></mat-icon> {{ elem.idToDisplay }}
-                        <small>{{ elem.otherInfo }}</small>
-                    </p>
-                </mat-option>
-            </mat-autocomplete>
-        </mat-form-field>
-    </mat-dialog-content>
-    <mat-dialog-actions>
-        <button style="margin:auto;" mat-raised-button color="warn" type="submit" class="btn btn-danger" (click)="dialogRef.close(data.entity)"
-            [disabled]="!changeEntityForm.form.valid || data.entity.redirectEntity == data.entity.entity_id">{{lang.delete}}</button>
-    </mat-dialog-actions>
-</form>
\ No newline at end of file
+<mat-dialog-content>
+    <div class="alert alert-info" role="alert">
+        <mat-list>
+            <mat-list-item *ngIf="data.entity.documents > 0">
+                <mat-icon color="primary" mat-list-icon class="fa fa-file fa-2x"></mat-icon>
+                <p mat-line>
+                    <b>{{data.entity.entity_label}}</b> {{lang.isDestTo}}
+                    <b>{{data.entity.documents}}</b> {{lang.documents}}</p>
+            </mat-list-item>
+            <mat-list-item *ngIf="data.entity.instances > 0">
+                <mat-icon color="primary" mat-list-icon class="fa fa-sitemap fa-2x"></mat-icon>
+                <p mat-line>
+                    <b>{{data.entity.entity_label}}</b> {{lang.isCopyTo}}
+                    <b>{{data.entity.instances}}</b> {{lang.documents}}</p>
+            </mat-list-item>
+            <mat-list-item *ngIf="data.entity.users.length > 0">
+                <mat-icon color="primary" mat-list-icon class="fa fa-user fa-2x"></mat-icon>
+                <p mat-line>
+                    <b>{{data.entity.entity_label}}</b> {{lang.isLinkedTo | lowercase}}
+                    <b>{{data.entity.users.length}}</b> {{lang.users | lowercase}}</p>
+            </mat-list-item>
+            <mat-list-item *ngIf="data.entity.templates.length > 0">
+                <mat-icon color="primary" mat-list-icon class="fa fa-file-alt fa-2x"></mat-icon>
+                <p mat-line>
+                    <b>{{data.entity.entity_label}}</b> {{lang.isLinkedTo | lowercase}}
+                    <b>{{data.entity.templates.length}}</b> {{lang.templates | lowercase}}</p>
+            </mat-list-item>
+        </mat-list>
+    </div>
+    <plugin-autocomplete [labelPlaceholder]="lang.chooseEntity" [labelList]="lang.availableEntities" [routeDatas]="['/rest/autocomplete/entities']"
+        [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="setRedirectEntity($event)"
+        singleMode required></plugin-autocomplete>
+</mat-dialog-content>
+<mat-dialog-actions>
+    <button style="margin:auto;" mat-raised-button color="warn" type="submit" class="btn btn-danger" (click)="dialogRef.close(data.entity)"
+        [disabled]="data.entity.redirectEntity === undefined || data.entity.redirectEntity == data.entity.entity_id">{{lang.delete}}</button>
+</mat-dialog-actions>
\ No newline at end of file
diff --git a/src/frontend/app/administration/entity/entities-administration.component.html b/src/frontend/app/administration/entity/entities-administration.component.html
index 45a34b27036299bcfce8d874666162311c05d999..8179f53accfbe126e35d880578e2305fb8f9b50e 100755
--- a/src/frontend/app/administration/entity/entities-administration.component.html
+++ b/src/frontend/app/administration/entity/entities-administration.component.html
@@ -201,23 +201,7 @@
                     <mat-tab label="{{lang.diffusionList}}" *ngIf="!creationMode">
                         <div class="row" style="margin:0px;">
                             <div class="col-md-12">
-                                <mat-form-field>
-                                    <input class="autocompleteSearch" #autocompleteFilter type="text" placeholder="{{lang.addUserOrEntity}}" matInput [matAutocomplete]="auto"
-                                        [formControl]="elementCtrl">
-                                    <mat-autocomplete #auto="matAutocomplete">
-                                        <mat-option *ngFor="let elem of filteredElements | async" [value]="elem.id" (click)="addElemListModel(elem)">
-                                            <p mat-line style="margin:0;">
-                                                <span class="col-xm-1" style="padding-right:5px;">
-                                                    <mat-icon color="primary" [class]="elem.type == 'entity' ? 'fa fa-sitemap fa-2x' : 'fa fa-user fa-2x'" style="margin-right:0px;"></mat-icon>
-                                                </span>
-                                                <span class="col-xm-11">
-                                                    {{ elem.idToDisplay }}
-                                                    <small>{{ elem.otherInfo }}</small>
-                                                </span>
-                                            </p>
-                                        </mat-option>
-                                    </mat-autocomplete>
-                                </mat-form-field>
+                                <plugin-autocomplete [labelPlaceholder]="lang.addUserOrEntity" [routeDatas]="['/rest/autocomplete/users','/rest/autocomplete/entities']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModel($event)"></plugin-autocomplete>
                                 <mat-list *ngIf="currentEntity.entity_id">
                                     <span *ngFor="let role of listTemplateRoles; let i = index">
                                         <h3 *ngIf="role.available" mat-subheader style="font-weight:bold;" color="primary">{{role.label}}</h3>
@@ -250,23 +234,7 @@
                     <mat-tab label="{{lang.visaWorkflow}}" *ngIf="!creationMode">
                         <div class="row" style="margin:0px;" id="visaCircuitContent">
                             <div class="col-md-12">
-                                <mat-form-field>
-                                    <input #autocompleteFilter class="autocompleteSearch" type="text" placeholder="{{lang.addVisaSignUser}}" matInput [matAutocomplete]="auto"
-                                        [formControl]="visaUserCtrl">
-                                    <mat-autocomplete #auto="matAutocomplete">
-                                        <mat-option *ngFor="let elem of filteredVisaUsers | async" [value]="elem.id" (click)="addElemListModelVisa(elem);autocompleteFilter.isOpen=true">
-                                            <p mat-line *ngIf="elem.type == 'user'" style="margin:0;">
-                                                <span class="col-xm-1" style="padding-right:5px;">
-                                                    <mat-icon color="primary" class="fa fa-user fa-2x" style="margin-right:0px;"></mat-icon>
-                                                </span>
-                                                <span class="col-xm-11">
-                                                    {{ elem.idToDisplay }}
-                                                    <small>{{ elem.otherInfo }}</small>
-                                                </span>
-                                            </p>
-                                        </mat-option>
-                                    </mat-autocomplete>
-                                </mat-form-field>
+                                <plugin-autocomplete [labelPlaceholder]="lang.addVisaSignUser" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users/visa']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElemListModelVisa($event)"></plugin-autocomplete>
                                 <mat-list>
                                     <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="currentEntity.visaTemplate">
                                         <mat-list-item disableRipple="true" *ngFor="let template of currentEntity.visaTemplate; let i = index" title="{{lang.move}}"
@@ -293,23 +261,7 @@
                     <mat-tab label="{{lang.users}}" *ngIf="!creationMode">
                         <div class="row" style="margin:0px;">
                             <div class="col-md-12" *ngIf="currentEntity.canAdminUsers" style="padding:5px;">
-                                <mat-form-field>
-                                    <span matPrefix><mat-icon class="fa fa-user-plus" color="primary"></mat-icon>&nbsp;&nbsp;</span>
-                                    <input class="autocompleteSearch" #autocompleteFilter type="text" placeholder="{{lang.linkUser}}" matInput [matAutocomplete]="auto" [formControl]="userCtrl">
-                                    <mat-autocomplete #auto="matAutocomplete">
-                                        <mat-option *ngFor="let user of filteredUsers | async" [value]="user.idToDisplay" (click)="linkUser(user)">
-                                            <p mat-line style="margin:0;">
-                                                <span class="col-xm-1" style="padding-right:5px;">
-                                                    <mat-icon color="primary" [class]="user.type == 'entity' ? 'fa fa-sitemap fa-2x' : 'fa fa-user fa-2x'" style="margin-right:0px;"></mat-icon>
-                                                </span>
-                                                <span class="col-xm-11">
-                                                    {{ user.idToDisplay }}
-                                                    <small>{{ user.otherInfo }}</small>
-                                                </span>
-                                            </p>
-                                        </mat-option>
-                                    </mat-autocomplete>
-                                </mat-form-field>
+                                <plugin-autocomplete [labelPlaceholder]="lang.linkUser" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users/administration']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="linkUser($event)"></plugin-autocomplete>
                                 <hr/>
                             </div>
                             <div class="col-md-6 col-xs-6">
diff --git a/src/frontend/app/administration/entity/entities-administration.component.ts b/src/frontend/app/administration/entity/entities-administration.component.ts
index b3afb89a82987d4b902e3257e1a01126ed27af10..f0b2668260ae895c71f6728b117d5fb2b9c1ba3a 100755
--- a/src/frontend/app/administration/entity/entities-administration.component.ts
+++ b/src/frontend/app/administration/entity/entities-administration.component.ts
@@ -8,8 +8,6 @@ import { NotificationService } from '../../notification.service';
 import { HeaderService }        from '../../../service/header.service';
 import { Router } from '@angular/router';
 
-import { AutoCompletePlugin } from '../../../plugins/autocomplete.plugin';
-
 declare function $j(selector: any): any;
 
 declare var angularGlobals: any;
@@ -19,7 +17,7 @@ declare var angularGlobals: any;
     styleUrls: ['entities-administration.component.css'],
     providers: [NotificationService]
 })
-export class EntitiesAdministrationComponent extends AutoCompletePlugin implements OnInit {
+export class EntitiesAdministrationComponent implements OnInit {
     /*HEADER*/
     titleHeader                              : string;
     @ViewChild('snav') public  sidenavLeft   : MatSidenav;
@@ -67,7 +65,6 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen
     }
 
     constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private notify: NotificationService, public dialog: MatDialog, private headerService: HeaderService, private router: Router) {
-        super(http, ['adminUsers', 'usersAndEntities', 'visaUsers']);
         $j("link[href='merged_css.php']").remove();
         this.mobileQuery = media.matchMedia('(max-width: 768px)');
         this._mobileQueryListener = () => changeDetectorRef.detectChanges();
@@ -264,8 +261,6 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen
                 this.currentEntity.listTemplate.cc.unshift(newElemListModel);
             }
         }
-        this.elementCtrl.setValue('');
-        $j('.autocompleteSearch').blur();
     }
 
     addElemListModelVisa(element: any) {
@@ -284,8 +279,6 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen
         if (this.currentEntity.visaTemplate.length > 1) {
             this.currentEntity.visaTemplate[this.currentEntity.visaTemplate.length-2].item_mode = 'visa';
         }
-        this.visaUserCtrl.setValue('');
-        $j('.autocompleteSearch').blur();
     }
 
     saveEntity() {
@@ -704,8 +697,6 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen
     }
 
     linkUser(newUser:any) {
-        this.userCtrl.setValue('');
-        $j('.autocompleteSearch').blur();
         let entity = {
             "entityId"  : this.currentEntity.entity_id,
             "role"      : ''
@@ -739,10 +730,14 @@ export class EntitiesAdministrationComponent extends AutoCompletePlugin implemen
 @Component({
     templateUrl: "entities-administration-redirect-modal.component.html"
 })
-export class EntitiesAdministrationRedirectModalComponent extends AutoCompletePlugin {
+export class EntitiesAdministrationRedirectModalComponent {
     lang: any = LANG;
 
     constructor(public http: HttpClient, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef<EntitiesAdministrationRedirectModalComponent>) {
-        super(http, ['entities']);
+        console.log(this.data.entity.redirectEntity);
+    }
+
+    setRedirectEntity(entity: any) {
+        this.data.entity.redirectEntity = entity.id;
     }
 }
diff --git a/src/frontend/app/administration/group/group-administration.component.html b/src/frontend/app/administration/group/group-administration.component.html
index 6325c66399c7418136a2db0a9ff0f50ca8b3a587..6b0c166bc7806710ef4ac247134d18bd47f82f56 100755
--- a/src/frontend/app/administration/group/group-administration.component.html
+++ b/src/frontend/app/administration/group/group-administration.component.html
@@ -80,7 +80,7 @@
                     <mat-tab label="{{lang.relatedUsers}}" *ngIf="!creationMode">
                         <div class="row" style="margin:0px;">
                             <div class="col-md-12" *ngIf="group.canAdminUsers" style="padding:5px;">
-                                <plugin-autocomplete [labelPlaceholder]="lang.linkUser" [labelList]="lang.availableUsers" [routeDatas]="'/rest/autocomplete/users'" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'id'" (triggerEvent)="linkUser($event)"></plugin-autocomplete>
+                                <plugin-autocomplete [labelPlaceholder]="lang.linkUser" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'id'" (triggerEvent)="linkUser($event)"></plugin-autocomplete>
                                 <hr/>
                             </div>
                             <div class="col-md-6 col-xs-6">
diff --git a/src/frontend/app/administration/updateStatus/update-status-administration.component.html b/src/frontend/app/administration/updateStatus/update-status-administration.component.html
index 49afcd80e25b74f8c642720181bc279f83bf6f30..4f3c5b2e186053f55fc3afed3a4a159b9c036bcf 100755
--- a/src/frontend/app/administration/updateStatus/update-status-administration.component.html
+++ b/src/frontend/app/administration/updateStatus/update-status-administration.component.html
@@ -57,16 +57,7 @@
                             <mat-divider></mat-divider>
                         </mat-tab>
                     </mat-tab-group>
-                    <mat-form-field>
-                            <input matInput [formControl]="statusCtrl" name="statusesList" placeholder="{{lang.availableStatuses}}" [(ngModel)]="this.statusId"
-                                [matAutocomplete]="auto" required>
-                            <mat-autocomplete #auto="matAutocomplete">
-                                <mat-option *ngFor="let status of filteredStatuses | async" [value]="status.id">
-                                    {{status.idToDisplay}}
-                                    <small style="opacity:0.3;">{{status.id}}</small>
-                                </mat-option>
-                            </mat-autocomplete>    
-                    </mat-form-field>
+                    <plugin-autocomplete [labelPlaceholder]="lang.availableStatuses" [labelList]="lang.availableStatuses" [datas]="statuses" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'id'" (triggerEvent)="setStatus($event)" singleMode required></plugin-autocomplete>
                     <div class="form-group">
                         <div class="col-md-12 text-center" style="padding:10px;">
                             <button mat-raised-button [disabled]="(resIdList.length == 0 && chronoList.length == 0) || (resIdList.length > 0 && chronoList.length > 0) || !statusId" color="primary">{{lang.save}}</button>
diff --git a/src/frontend/app/administration/updateStatus/update-status-administration.component.ts b/src/frontend/app/administration/updateStatus/update-status-administration.component.ts
index b2e38e040191207e94a2bc8bcd3dd53450c9499f..e13243341c07e389aa598e9a332ac6e213afde95 100755
--- a/src/frontend/app/administration/updateStatus/update-status-administration.component.ts
+++ b/src/frontend/app/administration/updateStatus/update-status-administration.component.ts
@@ -5,8 +5,7 @@ import { LANG } from '../../translate.component';
 import { MatSidenav } from '@angular/material';
 import { NotificationService } from '../../notification.service';
 import { HeaderService }        from '../../../service/header.service';
-
-import { AutoCompletePlugin } from '../../../plugins/autocomplete.plugin';
+import { tap } from 'rxjs/internal/operators/tap';
 
 declare function $j(selector: any): any;
 declare var angularGlobals: any;
@@ -17,7 +16,7 @@ declare var angularGlobals: any;
     styleUrls: ['update-status-administration.component.css'],
     providers: [NotificationService]
 })
-export class UpdateStatusAdministrationComponent extends AutoCompletePlugin implements OnInit {
+export class UpdateStatusAdministrationComponent implements OnInit {
 
     @ViewChild('snav') public  sidenavLeft   : MatSidenav;
     @ViewChild('snav2') public sidenavRight  : MatSidenav;
@@ -37,7 +36,6 @@ export class UpdateStatusAdministrationComponent extends AutoCompletePlugin impl
     chronoList                      : string[]  = [];
 
     constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private notify: NotificationService, private headerService: HeaderService) {
-        super(http, ['statuses']);
         $j("link[href='merged_css.php']").remove();
         this.mobileQuery = media.matchMedia('(max-width: 768px)');
         this._mobileQueryListener = () => changeDetectorRef.detectChanges();
@@ -55,7 +53,11 @@ export class UpdateStatusAdministrationComponent extends AutoCompletePlugin impl
 
         this.loading = true;
         this.coreUrl = angularGlobals.coreUrl;
-        this.loading = false;
+
+        this.http.get(this.coreUrl + 'rest/autocomplete/statuses').pipe(
+            tap((data : any) => this.statuses = data),
+            tap(() => this.loading = false)
+        ).subscribe();
     }
 
     onSubmit() {
@@ -95,6 +97,10 @@ export class UpdateStatusAdministrationComponent extends AutoCompletePlugin impl
         this.chrono = "";
     }
 
+    setStatus(status: any) {
+        this.statusId = status.id;
+    }
+
     removeResId(resId: string) :void {
         var resIdIndex = this.resIdList.indexOf(resId);
         this.resIdList.splice(resIdIndex,1);
diff --git a/src/frontend/app/administration/user/account-link/account-link.component.html b/src/frontend/app/administration/user/account-link/account-link.component.html
index c28c0c2e3810461ca21820ab89afff71826a9d87..f5388f5001f5140a1794b8e18ee9bc778aaf1e77 100644
--- a/src/frontend/app/administration/user/account-link/account-link.component.html
+++ b/src/frontend/app/administration/user/account-link/account-link.component.html
@@ -1,14 +1,6 @@
 <h1 mat-dialog-title>{{lang.linkAccount}}</h1>
 <mat-dialog-content class="modal-container">
-  <mat-form-field appearance="outline" floatLabel="never" [style.fontSize.px]="10">
-    <input id="availableUsers" type="text" matInput placeholder="{{lang.searchUserInMaarchParapheur}}"
-      [matAutocomplete]="auto" [formControl]="userCtrl">
-    <mat-autocomplete #auto="matAutocomplete" (optionSelected)="selectUser($event)" isOpen="true">
-      <mat-option *ngFor="let user of filteredUsers | async" [value]="user">
-        {{user.idToDisplay}}
-      </mat-option>
-    </mat-autocomplete>
-  </mat-form-field>
+  <plugin-autocomplete [labelPlaceholder]="lang.searchUserInMaarchParapheur" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/maarchParapheurUsers']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'email'" (triggerEvent)="selectUser($event)"></plugin-autocomplete>
   <mat-list *ngIf="externalUser.inMaarchParapheur">
     <mat-list-item >
       <mat-icon class="avatarAccount" color="primary" mat-list-icon
diff --git a/src/frontend/app/administration/user/account-link/account-link.component.ts b/src/frontend/app/administration/user/account-link/account-link.component.ts
index 54ff6205fe8433fb594039719e152a715c1f388c..eadac752f8c58c4fd136a077a9f15328d7d7c451 100644
--- a/src/frontend/app/administration/user/account-link/account-link.component.ts
+++ b/src/frontend/app/administration/user/account-link/account-link.component.ts
@@ -1,7 +1,6 @@
 import { Component, Inject } from '@angular/core';
 import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
 import { LANG } from '../../../translate.component';
-import { AutoCompletePlugin } from '../../../../plugins/autocomplete.plugin';
 import { HttpClient } from '@angular/common/http';
 import { NotificationService } from '../../../notification.service';
 
@@ -12,7 +11,7 @@ declare function $j(selector: any): any;
     styleUrls: ['account-link.component.scss'],
     providers: [NotificationService]
 })
-export class AccountLinkComponent extends AutoCompletePlugin {
+export class AccountLinkComponent {
     lang: any = LANG;
     externalUser: any = {
         inMaarchParapheur: false,
@@ -24,11 +23,10 @@ export class AccountLinkComponent extends AutoCompletePlugin {
     };
 
     constructor(public http: HttpClient, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef<AccountLinkComponent>, private notify: NotificationService) {
-        super(http, ['signatureBookUsersNotLinked']);
     }
 
     ngOnInit(): void {
-        this.http.get(this.coreUrl + 'rest/autocomplete/maarchParapheurUsers', { params: { "search": this.data.user.mail, "exludeAlreadyConnected": 'true' } })
+        this.http.get('../../rest/autocomplete/maarchParapheurUsers', { params: { "search": this.data.user.mail, "exludeAlreadyConnected": 'true' } })
         .subscribe((dataUsers: any) => {
             if ( dataUsers.length > 0) {
                 this.externalUser = dataUsers[0];
@@ -51,10 +49,8 @@ export class AccountLinkComponent extends AutoCompletePlugin {
 
     }
 
-    selectUser(event: any) {
-        $j('#availableUsers').blur();
-        this.userCtrl.setValue('');
-        this.externalUser = event.option.value;
+    selectUser(user: any) {
+        this.externalUser = user;
         this.externalUser.inMaarchParapheur = true;
         this.http.get("../../rest/maarchParapheur/user/" + this.externalUser.id + "/picture")
         .subscribe((data: any) => {
diff --git a/src/frontend/app/administration/user/user-administration-redirect-modal.component.html b/src/frontend/app/administration/user/user-administration-redirect-modal.component.html
index b5e2c896b254760ba6a8a154bfb81e9f39d9059b..157cd4156b9d4a8e0957e7fd15a88790c0db2644 100755
--- a/src/frontend/app/administration/user/user-administration-redirect-modal.component.html
+++ b/src/frontend/app/administration/user/user-administration-redirect-modal.component.html
@@ -19,28 +19,7 @@
                         {{lang.reaffectUserRedirect}}
                     </mat-radio-button>
                 </mat-radio-group>
-                <mat-form-field *ngIf="this.processMode == 'reaffect'">
-                    <input name="userDestRedirectModel" id="userDestRedirectModel" type="text" placeholder="{{lang.userReplacement}}" matInput
-                        [matAutocomplete]="auto" [formControl]="userCtrl" [(ngModel)]="this.redirectUser" tabindex="-1" required>
-                    <mat-autocomplete #auto="matAutocomplete">
-                        <mat-option value="NO_USER" style="text-align:center;">
-                            <i>- {{lang.noUserReplacement}} -</i>
-                        </mat-option>
-                        <ng-container *ngFor="let user of filteredUsers | async">
-                            <mat-option [value]="user.id">
-                                <div class="container-fluid">
-                                    <span class="col-xm-1">
-                                        <mat-icon color="primary" class="fa fa-user fa-2x" style="margin-right:0px;"></mat-icon>
-                                    </span>
-                                    <span class="col-xm-11">
-                                        {{ user.idToDisplay }}
-                                        <small>{{ user.otherInfo }}</small>
-                                    </span>
-                                </div>
-                            </mat-option>
-                        </ng-container>
-                    </mat-autocomplete>
-                </mat-form-field>
+                <plugin-autocomplete *ngIf="this.processMode == 'reaffect'" [labelPlaceholder]="lang.userReplacement" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="setRedirectUser($event)" singleMode required></plugin-autocomplete>
 
                 <div class="alert-message alert-message-info" role="alert" style="max-width: inherit;">
                     <span *ngIf="this.processMode == ''"><em>{{lang.doNothingRedirectInformations}}</em></span>
diff --git a/src/frontend/app/administration/user/user-administration.component.html b/src/frontend/app/administration/user/user-administration.component.html
index c5f4bb2a61a00ddfb4f4b68044db73ba837168a9..1a53580033dc6cc918662bf0cd3b8eccdfe9b5c5 100755
--- a/src/frontend/app/administration/user/user-administration.component.html
+++ b/src/frontend/app/administration/user/user-administration.component.html
@@ -265,27 +265,8 @@
                                             (click)="toggleBasket(true)">
                                             <mat-icon class="fa fa-check"></mat-icon>
                                         </button>
-                                        <mat-menu #menu="matMenu">
-                                            <mat-form-field style="padding:10px;width:200px !important;">
-                                                <input (click)="$event.stopPropagation()" type="text"
-                                                    placeholder="{{ lang.users }}" matInput [matAutocomplete]="auto"
-                                                    [formControl]="userCtrl">
-                                                <mat-autocomplete #auto="matAutocomplete">
-                                                    <mat-option *ngFor="let user of filteredUsers | async"
-                                                        [value]="user.id" (click)="addBasketRedirection(user)">
-                                                        <p mat-line matTooltip="{{ user.otherInfo }}">
-                                                            <span class="col-xm-1">
-                                                                <mat-icon color="primary" class="fa fa-user fa-2x"
-                                                                    style="margin-right:0px;"></mat-icon>
-                                                            </span>
-                                                            <span class="col-xm-11">
-                                                                {{ user.idToDisplay }}
-                                                                <small>{{ user.otherInfo }}</small>
-                                                            </span>
-                                                        </p>
-                                                    </mat-option>
-                                                </mat-autocomplete>
-                                            </mat-form-field>
+                                        <mat-menu #menu="matMenu" style="width:200px !important;">
+                                            <plugin-autocomplete [labelPlaceholder]="lang.redirectBaskets" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addBasketRedirection($event)"></plugin-autocomplete>
                                         </mat-menu>
                                     </p>
                                 </mat-list-item>
@@ -356,30 +337,7 @@
                                                         style="font-weight:normal">{{basket.group_desc}}</span>
                                                 </h4>
                                                 <p mat-line>
-                                                    <mat-form-field *ngIf="basket.userToDisplay == null"
-                                                        floatLabel="never">
-                                                        <input matTooltip="{{lang.redirectBasket}}"
-                                                            matTooltipPosition="above" type="text"
-                                                            placeholder="{{lang.redirectBasket}}" matInput
-                                                            [matAutocomplete]="auto" [formControl]="userCtrl">
-                                                        <mat-autocomplete #auto="matAutocomplete">
-                                                            <mat-option *ngFor="let user of filteredUsers | async"
-                                                                [value]="user.id"
-                                                                (click)="reassignBasketRedirection(user.id,basket,i)">
-                                                                <p mat-line matTooltip="{{ user.otherInfo }}">
-                                                                    <span class="col-xm-1">
-                                                                        <mat-icon color="primary"
-                                                                            class="fa fa-user fa-2x"
-                                                                            style="margin-right:0px;"></mat-icon>
-                                                                    </span>
-                                                                    <span class="col-xm-11">
-                                                                        {{ user.idToDisplay }}
-                                                                        <small>{{ user.otherInfo }}</small>
-                                                                    </span>
-                                                                </p>
-                                                            </mat-option>
-                                                        </mat-autocomplete>
-                                                    </mat-form-field>
+                                                    <plugin-autocomplete *ngIf="basket.userToDisplay == null" [labelPlaceholder]="lang.redirectBaskets" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="reassignBasketRedirection($event,basket,i)"></plugin-autocomplete>
                                                     <mat-form-field>
                                                         <input type="text" color="warn" matInput disabled
                                                             value="{{lang.assignBy}} {{basket.userToDisplay}}">
diff --git a/src/frontend/app/administration/user/user-administration.component.ts b/src/frontend/app/administration/user/user-administration.component.ts
index 635b41b8354646a856d3424cbceffac5847e26c9..93cc7ca026b85a5a5782b138594907645c6c7de2 100755
--- a/src/frontend/app/administration/user/user-administration.component.ts
+++ b/src/frontend/app/administration/user/user-administration.component.ts
@@ -4,11 +4,10 @@ import { HttpClient } from '@angular/common/http';
 import { ActivatedRoute, Router } from '@angular/router';
 import { LANG } from '../../translate.component';
 import { MatSidenav, MatPaginator, MatTableDataSource, MatSort, MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
-import { FormControl, FormGroup, Validators, AbstractControl, ValidationErrors, ValidatorFn, FormBuilder } from '@angular/forms';
+import { FormGroup, Validators, AbstractControl, ValidationErrors, ValidatorFn, FormBuilder } from '@angular/forms';
 import { NotificationService } from '../../notification.service';
 import { HeaderService } from '../../../service/header.service';
 
-import { AutoCompletePlugin } from '../../../plugins/autocomplete.plugin';
 import { SelectionModel } from '@angular/cdk/collections';
 import { AccountLinkComponent } from './account-link/account-link.component';
 
@@ -21,7 +20,7 @@ declare const angularGlobals: any;
     styleUrls: ['user-administration.component.scss'],
     providers: [NotificationService]
 })
-export class UserAdministrationComponent extends AutoCompletePlugin implements OnInit {
+export class UserAdministrationComponent implements OnInit {
     @ViewChild('snav') public sidenavLeft: MatSidenav;
     @ViewChild('snav2') public sidenavRight: MatSidenav;
 
@@ -111,7 +110,6 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O
 
 
     constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private route: ActivatedRoute, private router: Router, private zone: NgZone, private notify: NotificationService, public dialog: MatDialog, private headerService: HeaderService, private _formBuilder: FormBuilder) {
-        super(http, ['users']);
         $j("link[href='merged_css.php']").remove();
         this.mobileQuery = media.matchMedia('(max-width: 768px)');
         this._mobileQueryListener = () => changeDetectorRef.detectChanges();
@@ -560,7 +558,6 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O
         if (r) {
             this.http.post(this.coreUrl + "rest/users/" + this.serialId + "/redirectedBaskets", basketsRedirect)
                 .subscribe((data: any) => {
-                    this.userCtrl.setValue('');
                     this.user.baskets = data["baskets"];
                     this.user.redirectedBaskets = data["redirectedBaskets"];
                     this.selectionBaskets.clear();
@@ -584,7 +581,6 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O
                 }
             ])
                 .subscribe((data: any) => {
-                    this.userCtrl.setValue('');
                     this.user.baskets = data["baskets"];
                     this.user.assignedBaskets.splice(i, 1);
                     this.notify.success(this.lang.basketUpdated);
@@ -600,7 +596,6 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O
         if (r) {
             this.http.delete(this.coreUrl + "rest/users/" + this.serialId + "/redirectedBaskets?redirectedBasketIds[]=" + basket.id)
                 .subscribe((data: any) => {
-                    this.userCtrl.setValue('');
                     this.user.baskets = data["baskets"];
                     this.user.redirectedBaskets.splice(i, 1);
                     this.notify.success(this.lang.basketUpdated);
@@ -616,7 +611,6 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O
         if (r) {
             this.http.delete(this.coreUrl + "rest/users/" + this.serialId + "/redirectedBaskets?redirectedBasketIds[]=" + basket.id)
                 .subscribe((data: any) => {
-                    this.userCtrl.setValue('');
                     this.user.baskets = data["baskets"];
                     this.user.assignedBaskets.splice(i, 1);
                     this.notify.success(this.lang.basketUpdated);
@@ -904,13 +898,16 @@ export class UserAdministrationComponent extends AutoCompletePlugin implements O
     templateUrl: "user-administration-redirect-modal.component.html",
     styles: [".mat-dialog-content{max-height: 65vh;width:600px;}"]
 })
-export class UserAdministrationRedirectModalComponent extends AutoCompletePlugin {
+export class UserAdministrationRedirectModalComponent {
     lang: any = LANG;
 
     redirectUser: String = '';
     processMode: String = '';
 
     constructor(public http: HttpClient, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef<UserAdministrationRedirectModalComponent>) {
-        super(http, ['users']);
+    }
+
+    setRedirectUser(user: any) {
+        this.redirectUser = user;
     }
 }
diff --git a/src/frontend/app/administration/user/users-administration-redirect-modal.component.html b/src/frontend/app/administration/user/users-administration-redirect-modal.component.html
index 4ad6a1e8fdc200717d01c979ed08f2714dff34aa..3efed8e4d5afd9a2d4f76eb96d6586656dea4e97 100755
--- a/src/frontend/app/administration/user/users-administration-redirect-modal.component.html
+++ b/src/frontend/app/administration/user/users-administration-redirect-modal.component.html
@@ -13,26 +13,7 @@
 
                     <div *ngFor="let redirectModel of data.redirectListModels; index as i" id="{{redirectModel.object_id}}"
                         class="form-group">
-                        <mat-form-field class="example-full-width">
-                            <input name="redirectModel_{{i}}" id="redirectModel_{{i}}" [(ngModel)]="redirectModel.redirectUserId"
-                                type="text" placeholder="{{lang.newDest}} : {{redirectModel.title}}" matInput
-                                [matAutocomplete]="auto" [formControl]="userCtrl" required>
-                            <mat-autocomplete #auto="matAutocomplete">
-                                <ng-container *ngFor="let user of filteredUsers | async">
-                                    <mat-option [value]="user.id" *ngIf="this.data.userDestRedirect.user_id != user.id">
-                                        <div class="container-fluid">
-                                            <span class="col-xm-1">
-                                                <mat-icon color="primary" class="fa fa-user fa-2x" style="margin-right:0px;"></mat-icon>
-                                            </span>
-                                            <span class="col-xm-11">
-                                                {{ user.idToDisplay }}
-                                                <small>{{ user.otherInfo }}</small>
-                                            </span>
-                                        </div>
-                                    </mat-option>
-                                </ng-container>
-                            </mat-autocomplete>
-                        </mat-form-field>
+                        <plugin-autocomplete [labelPlaceholder]="lang.newDest + ' : ' + redirectModel.title" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="setRedirectUserListModels(i, $event)" singleMode required></plugin-autocomplete>
                     </div>
                 </div>
 
@@ -44,26 +25,7 @@
                     </div>
 
                     <div id="{{this.data.userDestRedirect.user_id}}" class="form-group">
-                        <mat-form-field class="example-full-width">
-                            <input name="redirectModel_resDest" id="redirectModel_resDest" [(ngModel)]="this.data.redirectDestResUserId"
-                                type="text" placeholder="{{lang.newDestRes}} : " matInput [matAutocomplete]="auto"
-                                [formControl]="userCtrl" required>
-                            <mat-autocomplete #auto="matAutocomplete">
-                                <ng-container *ngFor="let user of filteredUsers | async">
-                                    <mat-option [value]="user.id" *ngIf="this.data.userDestRedirect.user_id != user.id">
-                                        <div class="container-fluid">
-                                            <span class="col-xm-1">
-                                                <mat-icon color="primary" class="fa fa-user fa-2x" style="margin-right:0px;"></mat-icon>
-                                            </span>
-                                            <span class="col-xm-11">
-                                                {{ user.idToDisplay }}
-                                                <small>{{ user.otherInfo }}</small>
-                                            </span>
-                                        </div>
-                                    </mat-option>
-                                </ng-container>
-                            </mat-autocomplete>
-                        </mat-form-field>
+                        <plugin-autocomplete [labelPlaceholder]="lang.newDestRes" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="setRedirectUserRes($event)" singleMode required></plugin-autocomplete>
                     </div>
                 </div>
 
diff --git a/src/frontend/app/administration/user/users-administration.component.ts b/src/frontend/app/administration/user/users-administration.component.ts
index afc92dc49cde84c036b5f827d6074ee961fdfffd..c1c0c8becec8ea26fc8de7baa8c3e720634e12f6 100755
--- a/src/frontend/app/administration/user/users-administration.component.ts
+++ b/src/frontend/app/administration/user/users-administration.component.ts
@@ -16,7 +16,7 @@ declare var angularGlobals: any;
     styleUrls: ['users-administration.component.scss'],
     providers: [NotificationService]
 })
-export class UsersAdministrationComponent extends AutoCompletePlugin implements OnInit {
+export class UsersAdministrationComponent implements OnInit {
 
     /*RESPONSIVE*/
     private _mobileQueryListener            : () => void;
@@ -54,7 +54,6 @@ export class UsersAdministrationComponent extends AutoCompletePlugin implements
     }
 
     constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private notify: NotificationService, public dialog: MatDialog, private headerService: HeaderService) {
-        super(http, ['users']);
         $j("link[href='merged_css.php']").remove();
         this.mobileQuery = media.matchMedia('(max-width: 768px)');
         this._mobileQueryListener = () => changeDetectorRef.detectChanges();
@@ -411,16 +410,20 @@ export class UsersAdministrationComponent extends AutoCompletePlugin implements
 }
 @Component({
     templateUrl: "users-administration-redirect-modal.component.html",
-    styleUrls: ['users-administration-redirect-modal.scss']
+    styleUrls: ['users-administration-redirect-modal.scss'],
+    providers: [NotificationService]
 })
-export class UsersAdministrationRedirectModalComponent extends AutoCompletePlugin {
+export class UsersAdministrationRedirectModalComponent {
     lang: any               = LANG;
     loadModel: boolean      = false;
     loadInstance: boolean   = false;
     modalTitle: string      = this.lang.confirmAction;
 
-    constructor(public http: HttpClient, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef<UsersAdministrationRedirectModalComponent>) {
-        super(http, ['users']);
+    constructor(
+        public http: HttpClient, 
+        @Inject(MAT_DIALOG_DATA) public data: any, 
+        public dialogRef: MatDialogRef<UsersAdministrationRedirectModalComponent>,
+        private notify: NotificationService) {
     }
 
     ngOnInit(): void {
@@ -451,7 +454,26 @@ export class UsersAdministrationRedirectModalComponent extends AutoCompletePlugi
                 this.data.inInstanceList = true;
             }
         }
+    }
+
+    setRedirectUserListModels(index:number, user: any) {
+        if(this.data.userDestRedirect.user_id != user.id) {
+            this.data.redirectListModels[index].redirectUserId = user.id;
+        } else {
+            this.data.redirectListModels[index].redirectUserId = null;
+            this.notify.error(this.lang.userUnauthorized);
+        }
+        
+    }
 
+    setRedirectUserRes(user: any) {
+        if(this.data.userDestRedirect.user_id != user.id) {
+            this.data.redirectDestResUserId = user.id;
+        } else {
+            this.data.redirectDestResUserId = null;
+            this.notify.error(this.lang.userUnauthorized);
+        }
+        
     }
 
     sendFunction() {
diff --git a/src/frontend/app/diffusions/diffusions-list.component.html b/src/frontend/app/diffusions/diffusions-list.component.html
index 6503c99e5b238e43c4ba2d61834003f30b7acb2c..89da05c22345ec618a980ffaaf9f65a764557523 100644
--- a/src/frontend/app/diffusions/diffusions-list.component.html
+++ b/src/frontend/app/diffusions/diffusions-list.component.html
@@ -6,25 +6,7 @@
     <div *ngIf="diffList.length == 0" style="text-align:center;font-size:24px;font-weight:bold;opacity:0.3;">
         {{lang.noDiffusionList}}
     </div>
-    <mat-form-field *ngIf="injectDatas.editable" appearance="outline" floatLabel="never" [style.fontSize.px]="10">
-        <input class="userDiffList" #autocompleteFilter type="text" placeholder="{{lang.addUserOrEntity}}" matInput
-            [matAutocomplete]="auto" [formControl]="elementCtrl">
-        <mat-autocomplete #auto="matAutocomplete">
-            <mat-option *ngFor="let elem of filteredElements | async" [value]="elem.id" (click)="addElem(elem)">
-                <p mat-line style="margin:0;">
-                    <span class="col-xm-1" style="padding-right:5px;">
-                        <mat-icon color="primary"
-                            [class]="elem.type == 'entity' ? 'fa fa-sitemap fa-2x' : 'fa fa-user fa-2x'"
-                            style="margin-right:0px;"></mat-icon>
-                    </span>
-                    <span class="col-xm-11">
-                        {{ elem.idToDisplay }}
-                        <small>{{ elem.descriptionToDisplay }}</small>
-                    </span>
-                </p>
-            </mat-option>
-        </mat-autocomplete>
-    </mat-form-field>
+    <plugin-autocomplete *ngIf="injectDatas.editable" [labelPlaceholder]="lang.addUserOrEntity" [routeDatas]="['/rest/autocomplete/users','/rest/autocomplete/entities']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addElem($event)"></plugin-autocomplete>
     <div cdkDropListGroup class="roleList">
         <ng-container *ngFor="let role of availableRoles">
             <h3 mat-subheader>{{role.label}}</h3>
diff --git a/src/frontend/app/diffusions/diffusions-list.component.ts b/src/frontend/app/diffusions/diffusions-list.component.ts
index 0e192cf6cf4460147d6319914a1ddfacbbc9ce16..8f4e1aac5c1e3785bbc51dd3c0f7dd935a3dcf82 100644
--- a/src/frontend/app/diffusions/diffusions-list.component.ts
+++ b/src/frontend/app/diffusions/diffusions-list.component.ts
@@ -3,7 +3,6 @@ import { HttpClient } from '@angular/common/http';
 import { LANG } from '../translate.component';
 import { NotificationService } from '../notification.service';
 import { CdkDragDrop, transferArrayItem } from '@angular/cdk/drag-drop';
-import { AutoCompletePlugin } from '../../plugins/autocomplete.plugin';
 
 declare function $j(selector: any): any;
 
@@ -13,7 +12,7 @@ declare function $j(selector: any): any;
     styleUrls: ['diffusions-list.component.scss'],
     providers: [NotificationService]
 })
-export class DiffusionsListComponent extends AutoCompletePlugin implements OnInit {
+export class DiffusionsListComponent implements OnInit {
 
     lang: any = LANG;
     listinstance: any = [];
@@ -29,9 +28,7 @@ export class DiffusionsListComponent extends AutoCompletePlugin implements OnIni
 
     @Input('injectDatas') injectDatas: any;
 
-    constructor(public http: HttpClient, private notify: NotificationService) {
-        super(http, ['usersAndEntities']);
-    }
+    constructor(public http: HttpClient, private notify: NotificationService) { }
 
     ngOnInit(): void { }
 
@@ -249,9 +246,5 @@ export class DiffusionsListComponent extends AutoCompletePlugin implements OnIni
             };
             this.diffList['copy'].items.unshift(newElemListModel);
         }
-
-        $j('.userDiffList').val('');
-        $j('.userDiffList').blur();
-
     }
 }
\ No newline at end of file
diff --git a/src/frontend/app/home/home.component.ts b/src/frontend/app/home/home.component.ts
index 7a201c7152798e9ecf8d472365139a392a409405..9d6bc80874753c7b3bb04c62a804dc924be945fc 100644
--- a/src/frontend/app/home/home.component.ts
+++ b/src/frontend/app/home/home.component.ts
@@ -5,9 +5,6 @@ import { LANG } from '../translate.component';
 import { MatDialog, MatSidenav, MatExpansionPanel, MatTableDataSource } from '@angular/material';
 import { NotificationService } from '../notification.service';
 import { HeaderService }        from '../../service/header.service';
-
-
-import { AutoCompletePlugin } from '../../plugins/autocomplete.plugin';
 import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
 
 declare function $j(selector: any): any;
@@ -19,7 +16,7 @@ declare var angularGlobals: any;
     styleUrls: ['home.component.scss'],
     providers: [NotificationService]
 })
-export class HomeComponent extends AutoCompletePlugin implements OnInit {
+export class HomeComponent implements OnInit {
 
     private _mobileQueryListener    : () => void;
     mobileQuery                     : MediaQueryList;
@@ -46,7 +43,6 @@ export class HomeComponent extends AutoCompletePlugin implements OnInit {
     @ViewChildren(MatExpansionPanel) viewPanels: QueryList<MatExpansionPanel>;
 
     constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, public dialog: MatDialog, private sanitizer: DomSanitizer, private notify: NotificationService, private headerService: HeaderService) {
-        super(http, ['users']);
         this.mobileMode = angularGlobals.mobileMode;
         $j("link[href='merged_css.php']").remove();
         this.mobileQuery = media.matchMedia('(max-width: 768px)');
diff --git a/src/frontend/app/profile.component.html b/src/frontend/app/profile.component.html
index 0968bd463510119871b9fcef6d69a7e9fc7bee6f..d2e0990aecd539a42abf9a788b8e4ef82e8aef3a 100755
--- a/src/frontend/app/profile.component.html
+++ b/src/frontend/app/profile.component.html
@@ -221,27 +221,7 @@
                                                     style="opacity: 0.5;font-style: italic;font-size: 80%;">
                                                     {{lang.selectAll}}
                                                 </span>
-                                                <mat-form-field *ngIf="selectionBaskets.hasValue()">
-                                                    <input matTooltip="{{lang.redirectWhenAbscence}}"
-                                                        matTooltipPosition="above" type="text"
-                                                        placeholder="{{ lang.redirectBaskets }}" matInput
-                                                        [matAutocomplete]="auto" [formControl]="userCtrl">
-                                                    <mat-autocomplete #auto="matAutocomplete">
-                                                        <mat-option *ngFor="let user of filteredUsers | async"
-                                                            [value]="user.id" (click)="addBasketRedirection(user)">
-                                                            <p mat-line matTooltip="{{ user.otherInfo }}">
-                                                                <span class="col-xm-1">
-                                                                    <mat-icon color="primary" class="fa fa-user fa-2x"
-                                                                        style="margin-right:0px;"></mat-icon>
-                                                                </span>
-                                                                <span class="col-xm-11">
-                                                                    {{ user.idToDisplay }}
-                                                                    <small>{{ user.otherInfo }}</small>
-                                                                </span>
-                                                            </p>
-                                                        </mat-option>
-                                                    </mat-autocomplete>
-                                                </mat-form-field>
+                                                <plugin-autocomplete *ngIf="selectionBaskets.hasValue()" [labelPlaceholder]="lang.redirectBaskets" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addBasketRedirection($event)"></plugin-autocomplete>
                                             </p>
                                         </mat-list-item>
                                         <mat-divider></mat-divider>
@@ -314,32 +294,7 @@
                                                                 style="font-weight:normal">{{basket.group_desc}}</span>
                                                         </h4>
                                                         <p mat-line>
-                                                            <mat-form-field *ngIf="basket.userToDisplay == null"
-                                                                floatLabel="never">
-                                                                <input matTooltip="{{lang.redirectBasket}}"
-                                                                    matTooltipPosition="above" type="text"
-                                                                    placeholder="{{lang.redirectBasket}}" matInput
-                                                                    [matAutocomplete]="auto" [formControl]="userCtrl">
-                                                                <mat-autocomplete #auto="matAutocomplete">
-                                                                    <mat-option
-                                                                        *ngFor="let user of filteredUsers | async"
-                                                                        [value]="user.id"
-                                                                        (click)="reassignBasketRedirection(user,basket,i)">
-                                                                        <p mat-line matTooltip="{{ user.otherInfo }}">
-                                                                            <span class="col-xm-1">
-                                                                                <mat-icon color="primary"
-                                                                                    class="fa fa-user fa-2x"
-                                                                                    style="margin-right:0px;">
-                                                                                </mat-icon>
-                                                                            </span>
-                                                                            <span class="col-xm-11">
-                                                                                {{ user.idToDisplay }}
-                                                                                <small>{{ user.otherInfo }}</small>
-                                                                            </span>
-                                                                        </p>
-                                                                    </mat-option>
-                                                                </mat-autocomplete>
-                                                            </mat-form-field>
+                                                            <plugin-autocomplete *ngIf="basket.userToDisplay == null" [labelPlaceholder]="lang.redirectBaskets" [labelList]="lang.availableUsers" [routeDatas]="['/rest/autocomplete/users']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="reassignBasketRedirection($event,basket,i)"></plugin-autocomplete>
                                                             <mat-form-field>
                                                                 <input type="text" color="warn" matInput disabled
                                                                     value="{{lang.assignBy}} {{basket.userToDisplay}}">
diff --git a/src/frontend/app/profile.component.ts b/src/frontend/app/profile.component.ts
index cbff836e40d75b8d56301e9e512e7c7015dc0377..cc2d1ad3c17e37eb55d3eba499642d49a51b50d0 100755
--- a/src/frontend/app/profile.component.ts
+++ b/src/frontend/app/profile.component.ts
@@ -7,7 +7,6 @@ import { HeaderService }        from '../service/header.service';
 import { debounceTime, switchMap, distinctUntilChanged, filter } from 'rxjs/operators';
 import { MatPaginator, MatTableDataSource, MatSort, MatDialog, MatDialogRef, MatSidenav, MatExpansionPanel } from '@angular/material';
 
-import { AutoCompletePlugin } from '../plugins/autocomplete.plugin';
 import { SelectionModel } from '@angular/cdk/collections';
 import { FormControl, FormGroup, Validators, AbstractControl, ValidationErrors, ValidatorFn, FormBuilder } from '@angular/forms';
 
@@ -22,7 +21,7 @@ declare var angularGlobals: any;
     styleUrls: ['profile.component.css'],
     providers: [NotificationService]
 })
-export class ProfileComponent extends AutoCompletePlugin implements OnInit {
+export class ProfileComponent implements OnInit {
 
     private _mobileQueryListener: () => void;
     mobileQuery: MediaQueryList;
@@ -163,7 +162,6 @@ export class ProfileComponent extends AutoCompletePlugin implements OnInit {
 
 
     constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private zone: NgZone, private notify: NotificationService, public dialog: MatDialog, private _formBuilder: FormBuilder, private headerService: HeaderService) {
-        super(http, ['users']);
         this.mobileMode = angularGlobals.mobileMode;
         $j("link[href='merged_css.php']").remove();
         this.mobileQuery = media.matchMedia('(max-width: 768px)');
@@ -528,7 +526,6 @@ export class ProfileComponent extends AutoCompletePlugin implements OnInit {
         if (r) {
             this.http.post(this.coreUrl + "rest/users/" + this.user.id + "/redirectedBaskets", basketsRedirect)
                 .subscribe((data: any) => {
-                    this.userCtrl.setValue('');
                     this.user.baskets = data["baskets"];
                     this.user.redirectedBaskets = data["redirectedBaskets"];
                     this.selectionBaskets.clear();
@@ -545,7 +542,6 @@ export class ProfileComponent extends AutoCompletePlugin implements OnInit {
         if (r) {
             this.http.delete(this.coreUrl + "rest/users/" + this.user.id + "/redirectedBaskets?redirectedBasketIds[]=" + basket.id)
                 .subscribe((data: any) => {
-                    this.userCtrl.setValue('');
                     this.user.baskets = data["baskets"];
                     this.user.redirectedBaskets.splice(i, 1);
                     this.notify.success(this.lang.basketUpdated);
@@ -561,7 +557,6 @@ export class ProfileComponent extends AutoCompletePlugin implements OnInit {
         if (r) {
             this.http.delete(this.coreUrl + "rest/users/" + this.user.id + "/redirectedBaskets?redirectedBasketIds[]=" + basket.id)
                 .subscribe((data: any) => {
-                    this.userCtrl.setValue('');
                     this.user.baskets = data["baskets"];
                     this.user.assignedBaskets.splice(i, 1);
                     this.notify.success(this.lang.basketUpdated);
@@ -584,7 +579,6 @@ export class ProfileComponent extends AutoCompletePlugin implements OnInit {
                 }
             ])
                 .subscribe((data: any) => {
-                    this.userCtrl.setValue('');
                     this.user.baskets = data["baskets"];
                     this.user.assignedBaskets.splice(i, 1);
                     this.notify.success(this.lang.basketUpdated);
diff --git a/src/frontend/app/visa/visa-workflow.component.html b/src/frontend/app/visa/visa-workflow.component.html
index 7ef776405204b4dfcdfabee23beb2ea558472f77..bea953a2ced15cb4f9697d7b166890a411b836cc 100644
--- a/src/frontend/app/visa/visa-workflow.component.html
+++ b/src/frontend/app/visa/visa-workflow.component.html
@@ -1,13 +1,5 @@
 <mat-list *ngIf="!loading">
-    <mat-form-field *ngIf="injectDatas.editable" appearance="outline" floatLabel="never" [style.fontSize.px]="10">
-        <input id="availableUsers" type="text" matInput placeholder="{{lang.addPerson}}" [matAutocomplete]="auto"
-            [formControl]="userCtrl">
-        <mat-autocomplete #auto="matAutocomplete" (optionSelected)="addItem($event)" isOpen="true">
-            <mat-option *ngFor="let user of filteredUsers | async" [value]="user">
-                {{user.idToDisplay}}
-            </mat-option>
-        </mat-autocomplete>
-    </mat-form-field>
+    <plugin-autocomplete *ngIf="injectDatas.editable" [labelPlaceholder]="lang.addPerson" [routeDatas]="['/rest/autocomplete/maarchParapheurUsers']" [targetSearchKey]="'idToDisplay'" [subInfoKey]="'descriptionToDisplay'" (triggerEvent)="addItem($event)"></plugin-autocomplete>
     <div cdkDropList #dataAvailableList="cdkDropList" [cdkDropListData]="visaWorkflow.items" class="cdk-list"
         (cdkDropListDropped)="drop($event)" [cdkDropListDisabled]="!injectDatas.editable">
         <div class="emptyContent" *ngIf="visaWorkflow.items.length === 0">
diff --git a/src/frontend/app/visa/visa-workflow.component.ts b/src/frontend/app/visa/visa-workflow.component.ts
index 3b3c60c4c663b2d814e76af744a1937e98afdcac..a5b7686223648bcde2f9c6815f45e175e8816947 100644
--- a/src/frontend/app/visa/visa-workflow.component.ts
+++ b/src/frontend/app/visa/visa-workflow.component.ts
@@ -1,9 +1,8 @@
-import { Component, Input, OnInit, ElementRef, ViewChild } from '@angular/core';
+import { Component, Input, OnInit } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { LANG } from '../translate.component';
 import { NotificationService } from '../notification.service';
 import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';
-import { AutoCompletePlugin } from '../../plugins/autocomplete.plugin';
 
 declare function $j(selector: any): any;
 
@@ -13,7 +12,7 @@ declare function $j(selector: any): any;
     styleUrls: ['visa-workflow.component.scss'],
     providers: [NotificationService]
 })
-export class VisaWorkflowComponent extends AutoCompletePlugin implements OnInit {
+export class VisaWorkflowComponent implements OnInit {
 
     lang: any = LANG;
     visaWorkflow: any = {
@@ -25,9 +24,7 @@ export class VisaWorkflowComponent extends AutoCompletePlugin implements OnInit
 
     @Input('injectDatas') injectDatas: any;
 
-    constructor(public http: HttpClient, private notify: NotificationService) {
-        super(http, ['signatureBookUsers']);
-    }
+    constructor(public http: HttpClient, private notify: NotificationService) { }
 
     ngOnInit(): void { }
 
@@ -105,16 +102,14 @@ export class VisaWorkflowComponent extends AutoCompletePlugin implements OnInit
         return usersMissing;
     }
 
-    addItem(event: any) {
+    addItem(userRest: any) {
         const user = {
-            'externalId': event.option.value.externalId,
-            'labelToDisplay': event.option.value.idToDisplay,
+            'externalId': userRest.externalId,
+            'labelToDisplay': userRest.idToDisplay,
             'requested_signature': false,
             'picture': ''
         }
         this.visaWorkflow.items.push(user);
-        $j('#availableUsers').blur();
-        this.userCtrl.setValue('');
         this.http.get("../../rest/maarchParapheur/user/" + user.externalId.maarchParapheur + "/picture")
             .subscribe((data: any) => {
                 this.visaWorkflow.items[this.visaWorkflow.items.length - 1].picture = data.picture;
diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts
index c4a25a3943359189e810ca88aa7e20d5104f0163..73a0a0ab81ff3b5b1debaf92c52531e757e5f3ea 100755
--- a/src/frontend/lang/lang-en.ts
+++ b/src/frontend/lang/lang-en.ts
@@ -1036,4 +1036,5 @@ export const LANG_EN = {
     "noAvailableValue" : "No available value",
     "autocompleteInfo" : "The criteria must contain at least&nbsp;<b>3 letters</b>",
     "availableUsers" : "Available users",
+    "userUnauthorized" : "User Unauthorized",
 };
diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts
index 6a2327244eda0695f5dc89f98fbc6f516ac6f76d..ee50a7d79998ea0ca4efd17e27309085bd3fc166 100755
--- a/src/frontend/lang/lang-fr.ts
+++ b/src/frontend/lang/lang-fr.ts
@@ -1069,4 +1069,6 @@ export const LANG_FR = {
     "noAvailableValue" : "Aucun élément disponible",
     "autocompleteInfo" : "La recherche doit contenir au minimum&nbsp;<b>3 caractères</b>",
     "availableUsers" : "Utilisateur(s) disponible(s)",
+    "userUnauthorized" : "Utilisateur non autorisé",
+
 };
\ No newline at end of file
diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts
index 40866eb569a7955985373b56dfe28511c2bcc13e..732c5204905008a3f4abce76bbaae73c81ecab0e 100755
--- a/src/frontend/lang/lang-nl.ts
+++ b/src/frontend/lang/lang-nl.ts
@@ -1062,4 +1062,5 @@ export const LANG_NL = {
     "noAvailableValue" : "No available value", //_TO_TRANSLATE
     "autocompleteInfo" : "The criteria must contain at least&nbsp;<b>3 letters</b>", //_TO_TRANSLATE
     "availableUsers" : "Available users", //_TO_TRANSLATE
+    "userUnauthorized" : "User Unauthorized", //_TO_TRANSLATE
 };
diff --git a/src/frontend/plugins/autocomplete/autocomplete.component.html b/src/frontend/plugins/autocomplete/autocomplete.component.html
index e78b74f5d003da028fcd09a25c968f215da06c4d..3a55bf219eba8d31e2d38086df2eb10f4f4fcab6 100644
--- a/src/frontend/plugins/autocomplete/autocomplete.component.html
+++ b/src/frontend/plugins/autocomplete/autocomplete.component.html
@@ -1,12 +1,13 @@
 <form>
-  <mat-form-field appearance="outline">
+  <mat-form-field [appearance]="singleMode !== undefined ? 'standard' : 'outline'">
+    <mat-label *ngIf="singleMode !== undefined">{{placeholder}}</mat-label>
     <mat-icon color="primary" class="fa fa-search" matPrefix></mat-icon>
-    <input type="text" #autoCompleteInput [placeholder]="placeholder" aria-label="Number" matInput [formControl]="myControl"
-      [matAutocomplete]="auto" (focus)="resetAutocomplete()">
+    <input type="text" #autoCompleteInput [placeholder]="singleMode !== undefined ? '' : placeholder" aria-label="Number" matInput [formControl]="myControl"
+      [matAutocomplete]="auto" (click)="$event.stopPropagation()" (focus)="resetAutocomplete()" [required]="required">
     <mat-autocomplete #auto="matAutocomplete" (optionSelected)="selectOpt($event)">
       <mat-optgroup [label]="optGroupLabel" *ngIf="options.length > 0 && !loading">
         <mat-option *ngFor="let option of filteredOptions | async | sortBy: key" [value]="option">
-          <span color="primary">{{option[key]}}</span>&nbsp;<small>{{option[subInfoKey]}}</small>
+          <mat-icon *ngIf="type[option['type']]" class="autcompleteIcon fas {{type[option['type']]}}" color="primary"></mat-icon>&nbsp;<span color="primary">{{option[key]}}</span>&nbsp;<small>{{option[subInfoKey]}}</small>
         </mat-option>
       </mat-optgroup>
       <mat-option *ngIf="options.length === 0 && !loading" disabled [innerHTML]="listInfo">
diff --git a/src/frontend/plugins/autocomplete/autocomplete.component.scss b/src/frontend/plugins/autocomplete/autocomplete.component.scss
index c1033720f9b990664abe011d7593b0f0e2803b71..cb76a4545eda2d53aaa72b7cdcba4c4e1623d76b 100644
--- a/src/frontend/plugins/autocomplete/autocomplete.component.scss
+++ b/src/frontend/plugins/autocomplete/autocomplete.component.scss
@@ -1,5 +1,8 @@
 @import '../../css/vars.scss';
 
+.mat-form-field-appearance-outline {
+    font-size: 11px;
+}
 /deep/.mat-form-field-appearance-outline .mat-form-field-outline-thick {
     color: $primary;
 }
@@ -8,8 +11,17 @@
     top: 0px !important;
 }
 .mat-option {
+    ::ng-deep.mat-option-text {
+        display: flex;
+    }
     span {
         font-size: 110%;
         font-weight: bold;
     }
+}
+
+.autcompleteIcon {
+    width: 20px;
+    display: flex;
+    align-items: center;
 }
\ No newline at end of file
diff --git a/src/frontend/plugins/autocomplete/autocomplete.component.ts b/src/frontend/plugins/autocomplete/autocomplete.component.ts
index 85a8611599e481f54b6308ddf12ef351f860ef12..6b2bfe2584f749abe8b218f2a495537365b0d879 100644
--- a/src/frontend/plugins/autocomplete/autocomplete.component.ts
+++ b/src/frontend/plugins/autocomplete/autocomplete.component.ts
@@ -1,7 +1,7 @@
 import { Component, OnInit } from '@angular/core';
 import { FormControl } from '@angular/forms';
 import { Input, EventEmitter, Output, ViewChild, ElementRef } from '@angular/core';
-import { Observable, of } from 'rxjs';
+import { Observable, of, forkJoin } from 'rxjs';
 import { map, startWith, debounceTime, filter, distinctUntilChanged, switchMap, tap } from 'rxjs/operators';
 import { LatinisePipe } from 'ngx-pipes';
 import { LANG } from '../../app/translate.component';
@@ -19,8 +19,15 @@ export class PluginAutocomplete implements OnInit {
 
     listInfo: string;
 
+    type = {
+        user : 'fa-user',
+        entity : 'fa-sitemap'
+    }
+
+    @Input('singleMode') singleMode: boolean;
+    @Input('required') required: boolean;
     @Input('datas') options: any;
-    @Input('routeDatas') routeDatas: string;
+    @Input('routeDatas') routeDatas: string[];
     @Input('labelPlaceholder') placeholder: string;
     @Input('labelList') optGroupLabel: string;
     @Input('targetSearchKey') key: string;
@@ -65,7 +72,7 @@ export class PluginAutocomplete implements OnInit {
                 filter(value => value.length > 2),
                 distinctUntilChanged(),
                 tap(() => this.loading = true),
-                switchMap((data: any) => this.http.get('../..' + this.routeDatas, { params: { "search": data } })),
+                switchMap((data: any) => this.getDatas(data)),
                 tap((data: any) => {
                     this.listInfo = data.length === 0 ? this.lang.noAvailableValue : '';
                     this.options = data;
@@ -75,14 +82,38 @@ export class PluginAutocomplete implements OnInit {
             ).subscribe();
     }
 
+    getDatas(data: string) {
+        let arrayObs:any = [];
+        let test: any = [];
+        this.routeDatas.forEach(element => {
+            arrayObs.push(this.http.get('../..' + element, { params: { "search": data } }));
+        });
+
+        return forkJoin(arrayObs).pipe(
+            map(data => {
+                data.forEach((element: any) => {
+                    element.forEach((element2: any) => {
+                        test.push(element2);
+                    });
+                });
+                return test;
+            })
+        );
+    }
+
     selectOpt(ev: any) {
+        if (this.singleMode !== undefined) {
+            this.myControl.setValue(ev.option.value[this.key]);
+        }
         this.resetAutocomplete();
         this.autoCompleteInput.nativeElement.blur();
         this.selectedOpt.emit(ev.option.value);
     }
 
     resetAutocomplete() {
-        this.myControl.setValue('');
+        if (this.singleMode === undefined) {
+            this.myControl.setValue(''); 
+        }
         if (this.routeDatas !== undefined) {
             this.options = [];
             this.listInfo = this.lang.autocompleteInfo;
@@ -92,7 +123,7 @@ export class PluginAutocomplete implements OnInit {
     private _filter(value: string): string[] {
         if (typeof value === 'string') {
             const filterValue = this.latinisePipe.transform(value.toLowerCase());
-            return this.options.filter((option: any) => this.latinisePipe.transform(option.label_action.toLowerCase()).includes(filterValue));
+            return this.options.filter((option: any) => this.latinisePipe.transform(option[this.key].toLowerCase()).includes(filterValue));
         } else {
             return this.options;
         }