diff --git a/src/frontend/app/administration/group/group-administration.component.html b/src/frontend/app/administration/group/group-administration.component.html
index 6a11eedae5d67aa5103a2cdf276b4e92d461172e..887a8b64cd4ef4017e2c71792d970f32338b7274 100755
--- a/src/frontend/app/administration/group/group-administration.component.html
+++ b/src/frontend/app/administration/group/group-administration.component.html
@@ -77,6 +77,11 @@
                             </mat-tab>
                         </mat-tab-group>
                     </mat-tab>
+                    <mat-tab label="{{lang.indexation}}" *ngIf="!creationMode">
+                        <ng-template matTabContent>
+                            <app-indexing-administration [groupId]="group.id"></app-indexing-administration>
+                        </ng-template>
+                    </mat-tab>
                     <mat-tab label="{{lang.relatedUsers}}" *ngIf="!creationMode">
                         <div class="row" style="margin:0px;">
                             <div class="col-md-12" *ngIf="group.canAdminUsers" style="padding:5px;">
@@ -132,11 +137,6 @@
                             <mat-row *matRowDef="let row; columns: basketsDisplayedColumns;" routerLink="/administration/baskets/{{row.basket_id}}" matTooltip="{{lang.view}}" style="cursor:pointer;"></mat-row>
                         </mat-table>
                     </mat-tab>
-                    <mat-tab label="Indexation" *ngIf="!creationMode">
-                        <ng-template matTabContent>
-                            <app-indexing-administration [groupId]="group.id"></app-indexing-administration>
-                        </ng-template>
-                    </mat-tab>
                 </mat-tab-group>
             </mat-card>
         </mat-sidenav-content>
diff --git a/src/frontend/app/administration/group/indexing/indexing-administration.component.html b/src/frontend/app/administration/group/indexing/indexing-administration.component.html
index 753eb8f4b1429450ad5d82779fc6a93731cab2dc..186f67734465b3c554ee32506be4bd32f4ce88c9 100644
--- a/src/frontend/app/administration/group/indexing/indexing-administration.component.html
+++ b/src/frontend/app/administration/group/indexing/indexing-administration.component.html
@@ -1,15 +1,17 @@
+<div *ngIf="loading" class="loading">
+    <mat-spinner style="margin:auto;"></mat-spinner>
+</div>
 <div class="row" style="margin:0px;">
     <div class="col-md-12">
-        <div *ngIf="!indexingInfo.canIndex" class="alert-message alert-message-danger" role="alert" style="margin-top: 30px;">Le
-            groupe ne peut pas enregistrer de document. <a (click)="indexingInfo.canIndex=true">Activer l'indexation
-                pour ce groupe</a></div>
-        <button *ngIf="indexingInfo.canIndex" color="warn" mat-raised-button (click)="indexingInfo.canIndex=false">Désactiver
-            l'indexation pour ce groupe</button>
+        <div *ngIf="!indexingInfo.canIndex" class="alert-message alert-message-danger" role="alert" style="margin-top: 30px;">{{lang.warnIndex}} 
+            <button mat-raised-button (click)="toggleIndex(!indexingInfo.canIndex)">{{lang.enableIndex}}</button>
+        </div>
+        <button *ngIf="indexingInfo.canIndex" color="warn" mat-raised-button (click)="toggleIndex(!indexingInfo.canIndex)">{{lang.disableIndex}}</button>
     </div>
     <div class="col-md-8">
         <div class="formType">
             <div class="formType-title">
-                Action(s) choisie(s)
+                {{lang.actionChosen}}
             </div>
             <plugin-autocomplete [labelPlaceholder]="'Associer une nouvelle action'" [labelList]="'Action(s) disponible(s)'"
                 [datas]="actionList" [targetSearchKey]="'label_action'" (triggerEvent)="addAction($event)"></plugin-autocomplete>
@@ -29,7 +31,7 @@
     <div class="col-md-4">
         <div class="formType">
             <div class="formType-title">
-                Service de destination autorisé
+                {{lang.authorizedEntities}}
             </div>
             <div #jstree id="jstree"></div>
         </div>
diff --git a/src/frontend/app/administration/group/indexing/indexing-administration.component.scss b/src/frontend/app/administration/group/indexing/indexing-administration.component.scss
index 08db799bed293ccfc7f1c2e0f9d8ba62b2c3e366..c48ad500a5d79b82e23324b71f61a47594e32615 100644
--- a/src/frontend/app/administration/group/indexing/indexing-administration.component.scss
+++ b/src/frontend/app/administration/group/indexing/indexing-administration.component.scss
@@ -1,3 +1,11 @@
+.loading {
+    display: flex;
+    height: 100%;
+    position: absolute;
+    width: 100%;
+    background: white;
+    z-index: 2;
+}
 .selectedActionList {
     width: 100%;
 }
diff --git a/src/frontend/app/administration/group/indexing/indexing-administration.component.ts b/src/frontend/app/administration/group/indexing/indexing-administration.component.ts
index ce734fd2571e9ab7b8b8a126cdb35544ea0cb142..731f7ab551d9dac89f81080033f25e70dbc76542 100644
--- a/src/frontend/app/administration/group/indexing/indexing-administration.component.ts
+++ b/src/frontend/app/administration/group/indexing/indexing-administration.component.ts
@@ -3,7 +3,10 @@ import { HttpClient } from '@angular/common/http';
 import { LANG } from '../../../translate.component';
 import { NotificationService } from '../../../notification.service';
 import { tap } from 'rxjs/internal/operators/tap';
-import { map } from 'rxjs/operators';
+import { map, catchError, filter, exhaustMap, finalize } from 'rxjs/operators';
+import { of } from 'rxjs';
+import { MatDialogRef, MatDialog } from '@angular/material';
+import { ConfirmComponent } from '../../../../plugins/modal/confirm.component';
 
 declare function $j(selector: any): any;
 
@@ -18,7 +21,7 @@ export class IndexingAdministrationComponent implements OnInit {
     mobileQuery: MediaQueryList;
 
     lang: any = LANG;
-    loading: boolean = false;
+    loading: boolean = true;
 
     @Input('groupId') groupId: number;
 
@@ -31,9 +34,11 @@ export class IndexingAdministrationComponent implements OnInit {
         keywords: [],
         entities: []
     };
+    dialogRef: MatDialogRef<any>;
 
     constructor(public http: HttpClient,
         private notify: NotificationService,
+        private dialog: MatDialog,
     ) {
 
         this.keywordEntities = [{
@@ -102,12 +107,12 @@ export class IndexingAdministrationComponent implements OnInit {
             tap((data: any) => this.getSelectedActions(data.group.indexationParameters.actions)),
             map((data: any) => this.getEntities(data)),
             map((data: any) => this.getSelectedEntities(data)),
-            tap((data: any) => this.initEntitiesTree(data))
+            tap((data: any) => this.initEntitiesTree(data)),
+            finalize(() => this.loading = false)
         ).subscribe();
     }
 
     initEntitiesTree(entities: any) {
-        
         $j('#jstree').jstree({
             "checkbox": {
                 "three_state": false //no cascade selection
@@ -143,20 +148,20 @@ export class IndexingAdministrationComponent implements OnInit {
     }
 
     getEntities(data: any) {
+        this.keywordEntities.forEach((entity: any) => {
+            if (data.group.indexationParameters.keywords.indexOf(entity.id) > -1) {
+                entity.state = { "opened": true, "selected": true };
+            } else {
+                entity.state = { "opened": true, "selected": false };
+            } 
+        });
         data.entities = this.keywordEntities.concat(data.entities);
         return data;
     }
 
     getSelectedEntities(data: any) {
         this.indexingInfo.entities = [...data.group.indexationParameters.entities];
-        /*data.entities.forEach((entity: any) => {
-            if (this.indexingInfo.entities.indexOf(entity.id) > -1 ) {
-                entity.state = { "opened": true, "selected": true };
-            } else {
-                entity.state = { "opened": true, "selected": false };
-            }
-            
-        });*/
+        this.indexingInfo.keywords = [...data.group.indexationParameters.keywords];
         return data.entities;
     }
 
@@ -180,37 +185,141 @@ export class IndexingAdministrationComponent implements OnInit {
     }
 
     addEntity(entityId: number) {
-        this.indexingInfo.entities.push(entityId);
-        console.log(this.indexingInfo.entities);
+        const newEntityList = this.indexingInfo.entities.concat([entityId]);
+        
+        this.http.put('../../rest/groups/' + this.groupId + '/indexing', { entities : newEntityList }).pipe(
+            tap(() => {
+                this.indexingInfo.entities.push(entityId);
+            }),
+            tap(() => {
+                this.notify.success(this.lang.entityAdded);
+            }),
+            catchError((err: any) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();  
     }
 
     removeEntity(entityId: number) {
         const index = this.indexingInfo.entities.indexOf(entityId);
-        this.indexingInfo.entities.splice(index, 1);
-        console.log(this.indexingInfo.entities);
+        let newEntityList = [...this.indexingInfo.entities];
+        newEntityList.splice(index, 1);
+
+        this.http.put('../../rest/groups/' + this.groupId + '/indexing', { entities : newEntityList }).pipe(
+            tap(() => {
+                this.indexingInfo.entities.splice(index, 1);
+            }),
+            tap(() => {
+                this.notify.success(this.lang.entityDeleted);
+            }),
+            catchError((err: any) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();  
     }
 
     addKeyword(keyword: string) {
-        this.indexingInfo.keywords.push(keyword);
-        console.log(this.indexingInfo.keywords);
+        const newKeywordList = this.indexingInfo.keywords.concat([keyword]);
+        
+        this.http.put('../../rest/groups/' + this.groupId + '/indexing', { keywords : newKeywordList }).pipe(
+            tap(() => {
+                this.indexingInfo.keywords.push(keyword);
+            }),
+            tap(() => {
+                this.notify.success(this.lang.keywordAdded);
+            }),
+            catchError((err: any) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();  
     }
 
     removeKeyword(keyword: string) {
         const index = this.indexingInfo.keywords.indexOf(keyword);
-        this.indexingInfo.keywords.splice(index, 1);
-        console.log(this.indexingInfo.keywords);
+        let newKeywordList = [...this.indexingInfo.keywords];
+        newKeywordList.splice(index, 1);
+
+        this.http.put('../../rest/groups/' + this.groupId + '/indexing', { keywords : newKeywordList }).pipe(
+            tap(() => {
+                this.indexingInfo.keywords.splice(index, 1);
+            }),
+            tap(() => {
+                this.notify.success(this.lang.keywordDeleted);
+            }),
+            catchError((err: any) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe(); 
     }
 
     addAction(actionOpt: any) {
-        const index = this.actionList.findIndex(action => action.id === actionOpt.id);
-        const action = {...this.actionList[index]};
-        this.indexingInfo.actions.push(action);
-        this.actionList.splice(index, 1);
+        const newActionListIds = this.indexingInfo.actions.map((action: any) => action.id).concat([actionOpt].map((action: any) => action.id));
+
+        this.http.put('../../rest/groups/' + this.groupId + '/indexing', { actions : newActionListIds }).pipe(
+            tap(() => {
+                const index = this.actionList.findIndex(action => action.id === actionOpt.id);
+                const action = {...this.actionList[index]};
+                this.indexingInfo.actions.push(action);
+                this.actionList.splice(index, 1);
+            }),
+            tap(() => {
+                this.notify.success(this.lang.actionAdded);
+            }),
+            catchError((err: any) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();   
     }
 
     removeAction(index: number) {
-        const action = {...this.indexingInfo.actions[index]};
-        this.actionList.push(action);
-        this.indexingInfo.actions.splice(index, 1);
+        this.dialogRef = this.dialog.open(ConfirmComponent, { autoFocus: false, disableClose: true, data: { title: this.lang.delete, msg: this.lang.confirmAction } });
+        
+        this.dialogRef.afterClosed().pipe(
+            filter((data: string) => data === 'ok'),
+            map(() => {
+                this.dialogRef = null;
+                let newActionList = [...this.indexingInfo.actions];
+                newActionList.splice(index, 1);
+                return newActionList.map((action: any) => action.id);
+            }),
+            exhaustMap((data) => this.http.put('../../rest/groups/' + this.groupId + '/indexing', { actions : data})),
+            tap(() => {
+                this.actionList.push(this.indexingInfo.actions[index]);
+                this.indexingInfo.actions.splice(index, 1);
+            }),
+            tap(() => {
+                this.notify.success(this.lang.actionDeleted);
+            }),
+            catchError((err: any) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();
     }
+
+    toggleIndex(canIndex: boolean) {
+
+        this.http.put('../../rest/groups/' + this.groupId + '/indexing', { canIndex : canIndex }).pipe(
+            tap(() => {
+                this.indexingInfo.canIndex = canIndex;
+            }),
+            tap(() => {
+                if (this.indexingInfo.canIndex) {
+                    this.notify.success(this.lang.indexEnabled);
+                } else {
+                    this.notify.success(this.lang.indexDisabled);
+                }
+            }),
+            catchError((err: any) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();   
+    }
+
 }
diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts
index 73a0a0ab81ff3b5b1debaf92c52531e757e5f3ea..72f51334dded1df5437d1996dd30c42cefd4bf23 100755
--- a/src/frontend/lang/lang-en.ts
+++ b/src/frontend/lang/lang-en.ts
@@ -1037,4 +1037,13 @@ export const LANG_EN = {
     "autocompleteInfo" : "The criteria must contain at least&nbsp;<b>3 letters</b>",
     "availableUsers" : "Available users",
     "userUnauthorized" : "User Unauthorized",
+    "authorizedEntities" : "Authorized entities destination",
+    "warnIndex" : "This group can not index document.",
+    "enableIndex" : "Enable document indexation for this group",
+    "disableIndex" : "Disable document indexation for this group",
+    "indexEnabled" : "Document indexation enabled",
+    "indexDisabled" : "Document indexation disabled",
+    "indexation" : "Document indexation",
+    "keywordAdded" : "Keyword added",
+    "keywordDeleted" : "Keyword deleted",
 };
diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts
index ee50a7d79998ea0ca4efd17e27309085bd3fc166..cff881d5a00d1707aa62c6a6c82c198b081f6557 100755
--- a/src/frontend/lang/lang-fr.ts
+++ b/src/frontend/lang/lang-fr.ts
@@ -1070,5 +1070,13 @@ export const LANG_FR = {
     "autocompleteInfo" : "La recherche doit contenir au minimum&nbsp;<b>3 caractères</b>",
     "availableUsers" : "Utilisateur(s) disponible(s)",
     "userUnauthorized" : "Utilisateur non autorisé",
-
+    "authorizedEntities" : "Entité(s) traitante(s) authorisée(s)",
+    "warnIndex" : "Le groupe ne peut pas enregistrer de document.",
+    "enableIndex" : "Activer l'enregistrement de document pour ce groupe",
+    "disableIndex" : "Désactiver l'enregistrement de document pour ce groupe",
+    "indexEnabled" : "Enregistrement de document activé",
+    "indexDisabled" : "Enregistrement de document désactivé",
+    "indexation" : "Enregistrement de document",
+    "keywordAdded" : "Mot-clé ajouté",
+    "keywordDeleted" : "Mot-clé supprimé",
 };
\ No newline at end of file
diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts
index 732c5204905008a3f4abce76bbaae73c81ecab0e..734284137b173b3e9d19bda0cf96698591931279 100755
--- a/src/frontend/lang/lang-nl.ts
+++ b/src/frontend/lang/lang-nl.ts
@@ -1063,4 +1063,13 @@ export const LANG_NL = {
     "autocompleteInfo" : "The criteria must contain at least&nbsp;<b>3 letters</b>", //_TO_TRANSLATE
     "availableUsers" : "Available users", //_TO_TRANSLATE
     "userUnauthorized" : "User Unauthorized", //_TO_TRANSLATE
+    "warnIndex" : "This group can not index document.", //_TO_TRANSLATE
+    "authorizedEntities" : "Authorized entities destination", //_TO_TRANSLATE
+    "enableIndex" : "Activate document indexation for this group", //_TO_TRANSLATE
+    "disableIndex" : "Disable document indexation for this group", //_TO_TRANSLATE
+    "indexEnabled" : "Document indexation enabled", //_TO_TRANSLATE
+    "indexDisabled" : "Document indexation disabled", //_TO_TRANSLATE
+    "indexation" : "Document indexation", //_TO_TRANSLATE
+    "keywordAdded" : "Keyword added", //_TO_TRANSLATE
+    "keywordDeleted" : "Keyword deleted", //_TO_TRANSLATE
 };