diff --git a/lang/en.json b/lang/en.json
index 0cad9841c225fd602bd669f3e874ca152561579e..3044b5feead6d7e150231e634d77e1da77f93030 100755
--- a/lang/en.json
+++ b/lang/en.json
@@ -239,6 +239,16 @@
 		"emailSendInProgress" : "Email send in progress",
 		"emailSendSuccess" : "Email send success",
 		"manage_groupsAlt" : "Group(s)",
-		"groupCreation" : "Add a group"
+		"groupCreation" : "Add a group",
+		"manage_usersAdmin" : "Manage users",
+		"manage_groupsAdmin" : "Manage groups",
+		"manage_connectionsAdmin" : "Manage connections",
+		"manage_email_configurationAdmin" : "Manage email server",
+		"manage_documentsAdmin" : "All access of documents",
+		"linkedUsers" : "Linked users",
+		"addUser" : "Add user",
+		"privileges" : "Privileges",
+		"groupWarnMsg" : "You may no longer be able to access this page!",
+		"groupDeleted" : "Group deleted"
 	}
 }
diff --git a/lang/fr.json b/lang/fr.json
index 756c6ab0170f9208617f46dac2ef25dcc6fbce07..6b8065586d5296ec36a47bdb0f3a180f7b87aa9b 100755
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -240,7 +240,16 @@
 		"emailSendInProgress" : "En cours d'envoi",
 		"emailSendSuccess" : "Envoi réussi",
 		"manage_groupsAlt" : "Groupe(s)",
-		"groupCreation" : "Ajouter un groupe"
-
+		"groupCreation" : "Ajouter un groupe",
+		"manage_usersAdmin" : "Administrer les utilisateurs",
+		"manage_groupsAdmin" : "Administrer les groupes",
+		"manage_connectionsAdmin" : "Administrer les connexions",
+		"manage_email_configurationAdmin" : "Administrer le serveur courriel",
+		"manage_documentsAdmin" : "Accéder à tous les documents",
+		"linkedUsers" : "Utilisateur(s) associé(s)",
+		"addUser" : "Ajouter un utilisateur",
+		"privileges" : "Privilèges",
+		"groupWarnMsg" : "Vous risquez de ne plus pouvoir accéder à cette page !",
+		"groupDeleted" : "Groupe supprimé"
 	}
 }
diff --git a/src/frontend/app/administration/group/group.component.html b/src/frontend/app/administration/group/group.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..b9de9721b9fef1c3fc63c77fa09caaba7b865cee
--- /dev/null
+++ b/src/frontend/app/administration/group/group.component.html
@@ -0,0 +1,89 @@
+<mat-sidenav-container autosize>
+  <mat-sidenav #snav [disableClose]="!signaturesService.mobileMode"
+    [mode]="signaturesService.mobileMode ? 'over': 'side'" fixedInViewport="true"
+    [opened]="!signaturesService.mobileMode" [style.width.px]="350">
+    <app-admin-sidebar [snavLeftComponent]="this.snav" [snavRightComponent]="this.snavRight"></app-admin-sidebar>
+  </mat-sidenav>
+  <mat-sidenav-content class="mainView">
+    <header class="header">
+      <div class="header-title">
+        <button *ngIf="signaturesService.mobileMode" mat-icon-button (click)="this.snav.toggle();">
+          <mat-icon fontSet="fas" fontIcon="fa-bars" style="font-size: 24px;"></mat-icon>
+        </button>
+        <span *ngIf="!loading">{{title}}</span>
+      </div>
+      <div *ngIf="!creationMode" style="width: 70px;text-align: center;">
+        <button mat-icon-button (click)="deleteGroup()">
+          <mat-icon class="fa fa-trash-alt fa-2x"></mat-icon>
+        </button>
+      </div>
+    </header>
+    <div class="container">
+      <div *ngIf="loading" class="loader">
+        <mat-spinner></mat-spinner>
+      </div>
+      <form class="admin-form" *ngIf="!loading" (ngSubmit)="onSubmit()" #adminForm="ngForm">
+        <mat-form-field class="input-row">
+          <input name="label" matInput placeholder="{{'lang.label' | translate}}" type="text" [(ngModel)]="group.label"
+           required>
+        </mat-form-field>
+        <fieldset *ngIf="!creationMode">
+          <legend align="left">{{'lang.privileges' | translate}} :</legend>
+          <div class="form-container">
+            <div class="privilegesList" *ngFor="let privilege of group.privileges">
+              <mat-slide-toggle [name]="privilege.id" color="primary" [(ngModel)]="privilege.checked" (change)="togglePrivilege(privilege)">{{'lang.' + privilege.id + 'Admin' | translate}}</mat-slide-toggle>
+            </div>
+          </div>
+        </fieldset>
+        <fieldset *ngIf="!creationMode">
+          <legend align="left">{{'lang.linkedUsers' | translate}} :</legend>
+          <div class="form-container">
+            <mat-table #table class="dataTable" [dataSource]="dataSource" matSort matSortActive="lastname"
+              matSortDirection="asc" [class.emptyTable]="dataSource.filteredData.length === 0">
+              <ng-container matColumnDef="firstname">
+                <mat-header-cell *matHeaderCellDef mat-sort-header>{{'lang.firstname' | translate}}</mat-header-cell>
+                <mat-cell *matCellDef="let element"> {{element.firstname}} </mat-cell>
+              </ng-container>
+              <ng-container matColumnDef="lastname">
+                <mat-header-cell *matHeaderCellDef mat-sort-header>{{'lang.lastname' | translate}}</mat-header-cell>
+                <mat-cell *matCellDef="let element"> {{element.lastname}} </mat-cell>
+              </ng-container>
+              <ng-container matColumnDef="actions">
+                <mat-header-cell *matHeaderCellDef style="justify-content: end;">
+                  <mat-paginator #paginator [length]="100" [pageSize]="10"></mat-paginator>
+                </mat-header-cell>
+                <mat-cell *matCellDef="let element" style="justify-content: flex-end;">
+                  <button mat-icon-button color="warn" type="button" (click)="$event.stopPropagation();unlinkUser(element)">
+                    <mat-icon class="fa fa-unlink fa-2x"></mat-icon>
+                  </button>
+                </mat-cell>
+              </ng-container>
+              <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
+              <mat-row *matRowDef="let row; columns: displayedColumns;" routerLink="/administration/users/{{row.id}}"
+                style="cursor:pointer;"></mat-row>
+            </mat-table>
+            <div class="noResult" *ngIf="dataSource.filteredData.length === 0">
+                {{'lang.noResult' | translate}}
+            </div>
+            <div class="addButton">
+                <button mat-raised-button type="button" color="primary" [matMenuTriggerFor]="menu" [disabled]="usersList.length === group.users.length">{{'lang.addUser' | translate}}</button>
+                <mat-menu #menu="matMenu">
+                  <ng-container *ngFor="let user of usersList">
+                      <button mat-menu-item *ngIf="!isInGroup(user);" (click)="linkUser(user)">{{user.firstname}} {{user.lastname}}</button>
+                  </ng-container>
+                </mat-menu>
+            </div>
+          </div>
+        </fieldset>
+        <div class="actions-form">
+          <button mat-stroked-button type="submit" class="btn blue"
+            [disabled]="!adminForm.form.valid || !canValidate()">{{'lang.validate' | translate}}</button>
+          <button mat-stroked-button type="button" class="btn" (click)="cancel()">{{'lang.cancel' | translate}}</button>
+        </div>
+      </form>
+    </div>
+  </mat-sidenav-content>
+  <mat-sidenav #snavRight disableClose [mode]="signaturesService.mobileMode ? 'over': 'side'" [opened]="false"
+    fixedInViewport="true" position='end'>
+  </mat-sidenav>
+</mat-sidenav-container>
\ No newline at end of file
diff --git a/src/frontend/app/administration/group/group.component.scss b/src/frontend/app/administration/group/group.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..b3ae31e058a86214bfdf8badcb4d375cff42ee29
--- /dev/null
+++ b/src/frontend/app/administration/group/group.component.scss
@@ -0,0 +1,24 @@
+@import '../../../css/vars.scss';
+
+.privilegesList {
+  padding-top: 10px;
+  padding-bottom: 10px;
+  display: inline-block;
+  width: 100%;
+  @media (min-width: 768px) { 
+    width: 50%;
+  }
+  @media (min-width: 992px) { 
+    width: 33%;
+  }
+}
+
+fieldset {
+  border: solid 1px #F1F4F4;
+  align-items: center;
+  margin-top: 30px;
+}
+
+legend {
+  color: #F99830;
+}
diff --git a/src/frontend/app/administration/group/group.component.ts b/src/frontend/app/administration/group/group.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aaeab2d05b2236c01211d4e740d4d66e18edebb3
--- /dev/null
+++ b/src/frontend/app/administration/group/group.component.ts
@@ -0,0 +1,232 @@
+import { Component, OnInit, ViewChild } from '@angular/core';
+import { SignaturesContentService } from '../../service/signatures.service';
+import { NotificationService } from '../../service/notification.service';
+import { HttpClient } from '@angular/common/http';
+import { MatDialog, MatTableDataSource, MatPaginator, MatSort } from '@angular/material';
+import { map, tap, finalize, startWith } from 'rxjs/operators';
+import { ActivatedRoute, Router } from '@angular/router';
+import { ConfirmComponent } from '../../plugins/confirm.component';
+import { TranslateService } from '@ngx-translate/core';
+import { FormControl } from '@angular/forms';
+import { Observable } from 'rxjs';
+
+
+export interface Group {
+    id: string;
+    label: string;
+    users: any[];
+    privileges: any[];
+}
+
+@Component({
+    selector: 'app-administration-group',
+    templateUrl: 'group.component.html',
+    styleUrls: ['../administration.scss', 'group.component.scss'],
+})
+
+export class GroupComponent implements OnInit {
+
+    creationMode: boolean = true;
+    loading: boolean = true;
+    group: Group;
+    groupClone: Group;
+    title: string = '';
+    dataSource: MatTableDataSource<any>;
+    displayedColumns: string[];
+    usersList: any[];
+
+
+    @ViewChild(MatPaginator) paginator: MatPaginator;
+    @ViewChild(MatSort) sort: MatSort;
+
+    constructor(public http: HttpClient, private translate: TranslateService, private route: ActivatedRoute, private router: Router, public signaturesService: SignaturesContentService, public notificationService: NotificationService, public dialog: MatDialog) {
+        this.displayedColumns = ['firstname', 'lastname', 'actions'];
+        this.group = {
+            id: '',
+            label: '',
+            users: [],
+            privileges: []
+        };
+        this.dataSource = new MatTableDataSource(this.group.users);
+    }
+
+    ngOnInit(): void {
+        this.route.params.subscribe((params: any) => {
+            if (params['id'] === undefined) {
+                this.creationMode = true;
+                this.title = this.translate.instant('lang.groupCreation');
+                this.loading = false;
+                this.groupClone = JSON.parse(JSON.stringify(this.group));
+            } else {
+                this.creationMode = false;
+                this.usersList = [];
+
+                this.http.get('../rest/groups/' + params['id'])
+                    .pipe(
+                        map((data: any) => data.group),
+                        finalize(() => this.loading = false)
+                    )
+                    .subscribe({
+                        next: data => {
+                            this.group = data;
+
+                            // FOR TESTS
+                            this.group.privileges.forEach(element => {
+                                element.checked = true;
+                            });
+
+                            this.groupClone = JSON.parse(JSON.stringify(this.group));
+                            this.title = this.group.label;
+                            this.updateDataTable();
+                        },
+                    });
+
+                this.http.get('../rest/users')
+                    .pipe(
+                        map((data: any) => data.users)
+                    )
+                    .subscribe({
+                        next: data => {
+                            this.usersList = data;
+                        }
+                    });
+            }
+        });
+    }
+
+    updateDataTable() {
+        this.dataSource.data = this.group.users;
+        this.dataSource.paginator = this.paginator;
+        this.dataSource.sort = this.sort;
+    }
+
+    canValidate() {
+        if (this.group.label === this.groupClone.label) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    onSubmit() {
+        if (this.creationMode) {
+            this.createGroup();
+        } else {
+            this.modifyGroup();
+        }
+    }
+
+    linkUser(user: any) {
+        this.http.put('../rest/groups/' + this.group.id + '/users', { userId: user.id })
+            .subscribe({
+                next: () => {
+                    this.group.users.push(user);
+                    this.updateDataTable();
+                    this.notificationService.success('lang.userAdded');
+                },
+            });
+    }
+
+    unlinkUser(userToDelete: any) {
+        if (userToDelete.id === this.signaturesService.userLogged.id) {
+            const dialogRef = this.dialog.open(ConfirmComponent, { autoFocus: false, data: { mode: 'warning', title: 'lang.confirmMsg', msg: 'lang.groupWarnMsg' } });
+
+            dialogRef.afterClosed().subscribe(result => {
+                if (result === 'yes') {
+                    this.deleteUser(userToDelete);
+                }
+            });
+        } else {
+            this.deleteUser(userToDelete);
+        }
+    }
+
+
+    deleteUser(userToDelete: any) {
+        this.http.delete('../rest/groups/' + this.group.id + '/users/' + userToDelete.id, {})
+            .subscribe({
+                next: () => {
+                    const indexToDelete = this.group.users.findIndex((user: any) => user.id === userToDelete.id);
+                    this.group.users.splice(indexToDelete, 1);
+                    this.updateDataTable();
+                    this.notificationService.success('lang.userDeleted');
+                },
+            });
+    }
+
+    modifyGroup() {
+        this.loading = true;
+        this.http.put('../rest/groups/' + this.group.id, this.group)
+            .subscribe({
+                next: () => {
+                    this.router.navigate(['/administration/groups']);
+                    this.notificationService.success('lang.groupUpdated');
+                },
+            });
+    }
+
+    createGroup() {
+        this.loading = true;
+        this.http.post('../rest/groups', this.group)
+            .subscribe({
+                next: () => {
+                    this.router.navigate(['/administration/groups']);
+                    this.notificationService.success('lang.groupAdded');
+                },
+            });
+    }
+
+    deleteGroup() {
+        const dialogRef = this.dialog.open(ConfirmComponent, { autoFocus: false, data: { mode: '', title: 'lang.confirmMsg', msg: '' } });
+
+        dialogRef.afterClosed().subscribe(result => {
+            if (result === 'yes') {
+                this.loading = true;
+                this.http.delete('../rest/groups/' + this.group.id)
+                    .subscribe({
+                        next: () => {
+                            this.router.navigate(['/administration/groups']);
+                            this.notificationService.success('lang.groupDeleted');
+                        },
+                    });
+            }
+        });
+    }
+
+    togglePrivilege(privilege: any) {
+        if (privilege.id === 'manage_groups') {
+            const dialogRef = this.dialog.open(ConfirmComponent, { autoFocus: false, data: { mode: 'warning', title: 'lang.confirmMsg', msg: 'lang.groupWarnMsg' } });
+
+            dialogRef.afterClosed().subscribe(result => {
+                if (result === 'yes') {
+                    this.updatePrivilege(privilege);
+                } else {
+                    privilege.checked = !privilege.checked;
+                }
+            });
+        } else {
+            this.updatePrivilege(privilege);
+        }
+    }
+
+    updatePrivilege(privilege: any) {
+        this.http.put('../rest/groups/' + this.group.id + '/privilege/' + privilege.id, { checked: privilege.checked })
+            .subscribe({
+                next: () => {
+                    this.notificationService.success('lang.privilegeUpdated');
+                },
+            });
+    }
+
+    cancel() {
+        this.router.navigate(['/administration/groups']);
+    }
+
+    isInGroup(user: any) {
+        if (this.group.users.findIndex((userG: any) => userG.id === user.id) > -1) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+}
diff --git a/src/frontend/app/administration/group/groups-list.component.html b/src/frontend/app/administration/group/groups-list.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..f6c77c5888d4a198fd438cd4378862b9c85c55c3
--- /dev/null
+++ b/src/frontend/app/administration/group/groups-list.component.html
@@ -0,0 +1,55 @@
+<mat-sidenav-container autosize>
+  <mat-sidenav #snav [disableClose]="!signaturesService.mobileMode" [mode]="signaturesService.mobileMode ? 'over': 'side'" fixedInViewport="true"
+    [opened]="!signaturesService.mobileMode" [style.width.px]="350">
+    <app-admin-sidebar [snavLeftComponent]="this.snav" [snavRightComponent]="this.snavRight"></app-admin-sidebar>
+  </mat-sidenav>
+  <mat-sidenav-content class="mainView">
+    <header class="header">
+      <div class="header-title">
+        <button *ngIf="signaturesService.mobileMode" mat-icon-button (click)="this.snav.toggle();">
+          <mat-icon fontSet="fas" fontIcon="fa-bars" style="font-size: 24px;"></mat-icon>
+        </button>
+        <span><b>{{groupList.length}}</b> {{'lang.manage_groupsAlt' | translate}}</span>
+      </div>
+      <div>
+        <mat-paginator #paginator [length]="100" [pageSize]="10"></mat-paginator>
+      </div>
+    </header>
+    <div class="container">
+      <div *ngIf="loading" class="loader">
+        <mat-spinner></mat-spinner>
+      </div>
+      <mat-table #table class="dataTable" [dataSource]="dataSource" matSort matSortActive="label"
+        matSortDirection="asc" [class.emptyTable]="dataSource.filteredData.length === 0">
+        <ng-container matColumnDef="label">
+          <mat-header-cell *matHeaderCellDef mat-sort-header>{{'lang.label' | translate}}</mat-header-cell>
+          <mat-cell *matCellDef="let element"> {{element.label}} </mat-cell>
+        </ng-container>
+        <ng-container matColumnDef="actions">
+          <mat-header-cell *matHeaderCellDef style="justify-content: end;">
+            <mat-form-field>
+              <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filtrer">
+            </mat-form-field>
+          </mat-header-cell>
+          <mat-cell *matCellDef="let element" style="justify-content: flex-end;">
+            <button mat-icon-button color="warn" (click)="$event.stopPropagation();delete(element)">
+              <mat-icon class="fa fa-trash-alt fa-2x"></mat-icon>
+            </button>
+          </mat-cell>
+        </ng-container>
+        <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
+        <mat-row *matRowDef="let row; columns: displayedColumns;" routerLink="/administration/groups/{{row.id}}"
+          style="cursor:pointer;"></mat-row>
+      </mat-table>
+      <div class="addButton">
+        <button mat-stroked-button type="button" class="btn blue" routerLink="/administration/groups/new">{{'lang.groupCreation' | translate}}</button>
+      </div>
+      <div class="noResult" *ngIf="dataSource.filteredData.length === 0">
+          {{'lang.noResult' | translate}}
+      </div>
+    </div>
+  </mat-sidenav-content>
+  <mat-sidenav #snavRight disableClose [mode]="signaturesService.mobileMode ? 'over': 'side'" [opened]="false"
+    fixedInViewport="true" position='end'>
+  </mat-sidenav>
+</mat-sidenav-container>
\ No newline at end of file
diff --git a/src/frontend/app/administration/group/groups-list.component.scss b/src/frontend/app/administration/group/groups-list.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..a51c80f154a1252f042f167d98280c25b770ba7d
--- /dev/null
+++ b/src/frontend/app/administration/group/groups-list.component.scss
@@ -0,0 +1 @@
+@import '../../../css/vars.scss';
diff --git a/src/frontend/app/administration/group/groups-list.component.ts b/src/frontend/app/administration/group/groups-list.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..01478beaf43ab4dfa4acbd8403bfe089e7b78d1b
--- /dev/null
+++ b/src/frontend/app/administration/group/groups-list.component.ts
@@ -0,0 +1,105 @@
+import { Component, OnInit, ViewChild } from '@angular/core';
+import { SignaturesContentService } from '../../service/signatures.service';
+import { NotificationService } from '../../service/notification.service';
+import { HttpClient } from '@angular/common/http';
+import { MatTableDataSource, MatPaginator, MatSort, MatDialog } from '@angular/material';
+import { ConfirmComponent } from '../../plugins/confirm.component';
+import { TranslateService } from '@ngx-translate/core';
+import { map, tap, finalize } from 'rxjs/operators';
+import { LatinisePipe } from 'ngx-pipes';
+
+
+export interface Group {
+    id: string;
+    label: string;
+}
+
+@Component({
+    selector: 'app-administration-groups-list',
+    templateUrl: 'groups-list.component.html',
+    styleUrls: ['../administration.scss', 'groups-list.component.scss'],
+})
+
+export class GroupsListComponent implements OnInit {
+
+    groupList: Group[] = [];
+    dataSource: MatTableDataSource<Group>;
+    displayedColumns: string[];
+    loading: boolean = true;
+
+    @ViewChild(MatPaginator) paginator: MatPaginator;
+    @ViewChild(MatSort) sort: MatSort;
+
+    constructor(public http: HttpClient, private translate: TranslateService, private latinisePipe: LatinisePipe, public dialog: MatDialog, public signaturesService: SignaturesContentService, public notificationService: NotificationService) {
+        this.displayedColumns = ['label', 'actions'];
+        this.dataSource = new MatTableDataSource(this.groupList);
+        this.dataSource.filterPredicate = (data, filter) => {
+            let state = false;
+            this.displayedColumns.forEach(column => {
+                if (data[column] !== undefined) {
+                    const cleanData = this.latinisePipe.transform(data[column].trim().toLowerCase());
+                    const cleanFilter = this.latinisePipe.transform(filter.trim().toLowerCase());
+                    if (cleanData.indexOf(cleanFilter) !== -1) {
+                        state = true;
+                    }
+                }
+            });
+            return state;
+        };
+    }
+
+    updateDataTable() {
+        this.dataSource.data = this.groupList;
+        this.dataSource.paginator = this.paginator;
+        this.dataSource.sort = this.sort;
+    }
+
+    applyFilter(filterValue: string) {
+        this.dataSource.filter = filterValue;
+
+        if (this.dataSource.paginator) {
+            this.dataSource.paginator.firstPage();
+        }
+    }
+
+    ngOnInit(): void {
+        this.http.get('../rest/groups')
+            .pipe(
+                map((data: any) => data.groups),
+                finalize(() => this.loading = false)
+            )
+            .subscribe({
+                next: data => {
+                    this.groupList = data;
+                    this.updateDataTable();
+                },
+            });
+    }
+
+
+    delete(groupToDelete: Group) {
+        const dialogRef = this.dialog.open(ConfirmComponent, { autoFocus: false, data: { mode: '', title: 'lang.confirmMsg', msg: '' } });
+
+        dialogRef.afterClosed().subscribe(result => {
+            if (result === 'yes') {
+                this.loading = true;
+                this.http.delete('../rest/groups/' + groupToDelete.id)
+                    .pipe(
+                        finalize(() => this.loading = false)
+                    )
+                    .subscribe({
+                        next: data => {
+                            const indexToDelete = this.groupList.findIndex(group => group.id === groupToDelete.id);
+
+                            this.groupList.splice(indexToDelete, 1);
+
+                            this.updateDataTable();
+
+                            this.notificationService.success('lang.groupDeleted');
+
+                        },
+                    });
+            }
+        });
+    }
+}
diff --git a/src/frontend/app/app-material.module.ts b/src/frontend/app/app-material.module.ts
index 75c32c09b0b28623b109ff8ece96d784d1311198..ea5730e532e41a1432f3ec3f03af06ae9c78859d 100755
--- a/src/frontend/app/app-material.module.ts
+++ b/src/frontend/app/app-material.module.ts
@@ -21,7 +21,8 @@ import {
   MatTableModule,
   MatPaginatorModule,
   MatSortModule,
-  MatPaginatorIntl
+  MatPaginatorIntl,
+  MatAutocompleteModule
 } from '@angular/material';
 
 import { MatMenuModule } from '@angular/material/menu';
@@ -53,7 +54,8 @@ import { getFrenchPaginatorIntl } from './plugins/paginator-fr-intl';
       MatBadgeModule,
       MatTableModule,
       MatPaginatorModule,
-      MatSortModule
+      MatSortModule,
+      MatAutocompleteModule
   ],
   exports: [
       MatSidenavModule,
@@ -77,7 +79,8 @@ import { getFrenchPaginatorIntl } from './plugins/paginator-fr-intl';
       MatBadgeModule,
       MatTableModule,
       MatPaginatorModule,
-      MatSortModule
+      MatSortModule,
+      MatAutocompleteModule
   ],
   providers: [
       { provide: MatPaginatorIntl, useValue: getFrenchPaginatorIntl() },
diff --git a/src/frontend/app/app.module.ts b/src/frontend/app/app.module.ts
index d65bc68b15309827c6f0bc52b6e43f6359cbc5eb..feeddbd6f02bce0078e281f0e53a47ec62ec362e 100755
--- a/src/frontend/app/app.module.ts
+++ b/src/frontend/app/app.module.ts
@@ -62,6 +62,8 @@ import { ConnectionComponent } from './administration/connection/connection.comp
 import { LdapListComponent } from './administration/connection/ldap/ldap-list.component';
 import { LdapComponent } from './administration/connection/ldap/ldap.component';
 import { SendmailComponent } from './administration/sendmail/sendmail.component';
+import { GroupsListComponent } from './administration/group/groups-list.component';
+import { GroupComponent } from './administration/group/group.component';
 
 
 // SERVICES
@@ -109,7 +111,9 @@ import { AlertComponent } from './plugins/alert.component';
     ConnectionComponent,
     LdapListComponent,
     LdapComponent,
-    SendmailComponent
+    SendmailComponent,
+    GroupsListComponent,
+    GroupComponent
   ],
   imports: [
     FormsModule,
@@ -136,6 +140,9 @@ import { AlertComponent } from './plugins/alert.component';
       { path: 'administration/users', canActivate: [AuthGuard], component: UsersListComponent },
       { path: 'administration/users/new', canActivate: [AuthGuard], component: UserComponent },
       { path: 'administration/users/:id', canActivate: [AuthGuard], component: UserComponent },
+      { path: 'administration/groups', canActivate: [AuthGuard], component: GroupsListComponent },
+      { path: 'administration/groups/new', canActivate: [AuthGuard], component: GroupComponent },
+      { path: 'administration/groups/:id', canActivate: [AuthGuard], component: GroupComponent },
       { path: 'administration/connections', canActivate: [AuthGuard], component: ConnectionComponent },
       { path: 'administration/connections/ldaps', canActivate: [AuthGuard], component: LdapListComponent },
       { path: 'administration/connections/ldaps/new', canActivate: [AuthGuard], component: LdapComponent },
diff --git a/src/frontend/app/service/auth-interceptor.service.ts b/src/frontend/app/service/auth-interceptor.service.ts
index 092cc6f0b0e01d020b27a03b06550161634e3c15..ccf8fe9c52b322967f0e374380c1041bbd937041 100644
--- a/src/frontend/app/service/auth-interceptor.service.ts
+++ b/src/frontend/app/service/auth-interceptor.service.ts
@@ -12,6 +12,8 @@ import { AuthService } from './auth.service';
 export class AuthInterceptor implements HttpInterceptor {
 
   excludeUrls: string[] = ['../rest/authenticate', '../rest/authenticate/token', '../rest/authenticationInformations', '../rest/password', '../rest/passwordRules', '../rest/languages/fr', '../rest/languages/en'];
+  frontUrl: string[] = ['../rest/documents/', '../rest/users/', '../rest/groups/', '../rest/configurations/'];
+
   constructor(public http: HttpClient, private router: Router, public notificationService: NotificationService, public signaturesService: SignaturesContentService, public authService: AuthService) { }
 
   addAuthHeader(request: HttpRequest<any>) {
@@ -31,7 +33,6 @@ export class AuthInterceptor implements HttpInterceptor {
   }
 
   intercept(request: HttpRequest<any>, next: HttpHandler): Observable<any> {
-
     // We don't want to intercept some routes
     if (this.excludeUrls.indexOf(request.url) > -1 || request.url.indexOf('/password') > -1) {
       return next.handle(request);
@@ -82,9 +83,16 @@ export class AuthInterceptor implements HttpInterceptor {
               })
             );
           } else {
-            if (request.url.indexOf('../rest/documents/') > -1) {
-              this.router.navigate(['/documents']);
-              this.signaturesService.mainDocumentId = null;
+            if (request.method === 'GET') {
+                this.frontUrl.forEach(element => {
+                  if (request.url.indexOf(element) > -1) {
+                    if (element === '../rest/documents/') {
+                      this.signaturesService.mainDocumentId = null;
+                    }
+                    this.router.navigate(['/documents']);
+                    return empty();
+                  }
+                });
             }
             this.notificationService.handleErrors(error);
             return empty();