diff --git a/src/frontend/app/folder/document-list/folder-document-list.component.html b/src/frontend/app/folder/document-list/folder-document-list.component.html
index 0752e1ea218342ba6775db40a7783261eecacfde..ff9c8b81be88cf7b1b1102587512be3075921a5c 100644
--- a/src/frontend/app/folder/document-list/folder-document-list.component.html
+++ b/src/frontend/app/folder/document-list/folder-document-list.component.html
@@ -124,7 +124,11 @@
                                         [class.undefined]="row.subject == lang.undefined"
                                         title="{{row.subject}}">{{row.subject | shorten: 150: '...'}}</span>
                                     <span class="main-info-action">
-                                        <button mat-icon-button title="{{lang.notes}}"
+                                        <div *ngIf="!row.allowed" color="warn">
+                                            {{lang.documentOutOfPerimeter}}
+                                        </div>
+                                        <ng-container *ngIf="row.allowed">
+                                            <button mat-icon-button title="{{lang.notes}}"
                                             (click)="$event.stopPropagation();togglePanel('note',row)"
                                             [class.noData]="row.countNotes == 0">
                                             <mat-icon matBadgeHidden="{{row.countNotes == 0}}" fontSet="fas"
@@ -147,14 +151,15 @@
                                             </mat-icon>
                                         </button>
                                         <button mat-icon-button title="{{row.hasDocument ? lang.viewResource : lang.noDocument}}" (click)="$event.stopPropagation();viewDocument(row)"
-                                                (mouseenter)="viewThumbnail(row);" (mouseleave)="closeThumbnail();"
-                                                [disabled]="!row.hasDocument">
-                                                <mat-icon class="fa" [ngClass]="[row.hasDocument ? 'fa-eye' : 'fa-eye-slash']"></mat-icon>
-                                            </button>
-                                            <button mat-icon-button title="{{lang.linkDetails}}"
-                                                    (click)="$event.stopPropagation();goToDetail(row);">
-                                                <mat-icon fontSet="fas" fontIcon="fa-info-circle fa-2x"></mat-icon>
-                                            </button>
+                                            (mouseenter)="viewThumbnail(row);" (mouseleave)="closeThumbnail();"
+                                            [disabled]="!row.hasDocument">
+                                            <mat-icon class="fa" [ngClass]="[row.hasDocument ? 'fa-eye' : 'fa-eye-slash']"></mat-icon>
+                                        </button>
+                                        <button mat-icon-button title="{{lang.linkDetails}}"
+                                                (click)="$event.stopPropagation();goToDetail(row);">
+                                            <mat-icon fontSet="fas" fontIcon="fa-info-circle fa-2x"></mat-icon>
+                                        </button>
+                                        </ng-container>  
                                     </span>
                                 </div>
                                 <div *ngIf="row.folders !== undefined && row.folders.length > 0" class="folder-info">
@@ -164,7 +169,7 @@
                         </ng-container>
                         <tr mat-row *matRowDef="let row; columns: displayedColumnsBasket;"
                             (contextmenu)="open($event,row);" (click)="open($event,row);" class="rowData"
-                            style="cursor: pointer;" [class.locked]="row.isLocked == true" cdkDrag
+                            style="cursor: pointer;" [class.locked]="row.isLocked == true" cdkDrag [cdkDragDisabled]="!row.allowed"
                             (cdkDragStarted)="selectSpecificRes(row);" [cdkDragData]="row">
                             <div class="example-custom-placeholder" *cdkDragPlaceholder></div>
                             <div class="dragPreview" *cdkDragPreview><i class="fas fa-envelope-open-text fa-2x"></i>
diff --git a/src/frontend/app/folder/document-list/folder-document-list.component.ts b/src/frontend/app/folder/document-list/folder-document-list.component.ts
index d8360c7f3648b21f69b7c7bd491338be079eb164..a04cd55dc8d826644ebc2158f77865f39cf23a75 100644
--- a/src/frontend/app/folder/document-list/folder-document-list.component.ts
+++ b/src/frontend/app/folder/document-list/folder-document-list.component.ts
@@ -1,18 +1,15 @@
 import { Component, OnInit, ViewChild, EventEmitter, ViewContainerRef } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { LANG } from '../../translate.component';
-import { merge, Observable, of as observableOf, Subject, of, Subscription } from 'rxjs';
 import { NotificationService } from '../../notification.service';
 import { MatDialog, MatDialogRef } from '@angular/material/dialog';
 import { MatPaginator } from '@angular/material/paginator';
 import { MatSidenav } from '@angular/material/sidenav';
 import { MatSort } from '@angular/material/sort';
-
 import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
 import { startWith, switchMap, map, catchError, takeUntil, tap } from 'rxjs/operators';
 import { ActivatedRoute, Router } from '@angular/router';
 import { HeaderService } from '../../../service/header.service';
-
 import { Overlay } from '@angular/cdk/overlay';
 import { PanelListComponent } from '../../list/panel/panel-list.component';
 import { AppService } from '../../../service/app.service';
@@ -21,12 +18,12 @@ import { FolderActionListComponent } from '../folder-action-list/folder-action-l
 import { FiltersListService } from '../../../service/filtersList.service';
 import { FoldersService } from '../folders.service';
 import { FunctionsService } from '../../../service/functions.service';
-
+import { merge, Observable, Subject, of, Subscription } from 'rxjs';
 
 declare function $j(selector: any): any;
 
 @Component({
-    templateUrl: "folder-document-list.component.html",
+    templateUrl: 'folder-document-list.component.html',
     styleUrls: ['folder-document-list.component.scss'],
     providers: [NotificationService, AppService]
 })
@@ -123,7 +120,7 @@ export class FolderDocumentListComponent implements OnInit {
         this.subscription = this.foldersService.catchEvent().subscribe((result: any) => {
             
             if (result.type === 'refreshFolderInformations') {
-                if(result.content.id == this.folderInfo.id) {
+                if (result.content.id == this.folderInfo.id) {
                     this.refreshFolderInformations();
                 }
             }
@@ -146,23 +143,22 @@ export class FolderDocumentListComponent implements OnInit {
 
             this.http.get('../../rest/folders/' + params['folderId'])
                 .subscribe((data: any) => {
-                    let keywordEntities = [{
+                    const keywordEntities = [{
                         keyword: 'ALL_ENTITIES',
                         text: this.lang.allEntities,
                     }];
-                    this.folderInfo =
-                        {
-                            'id': params['folderId'],
-                            'label': data.folder.label,
-                            'ownerDisplayName': data.folder.ownerDisplayName,
-                            'entitiesSharing': data.folder.sharing.entities.map((entity: any) => {
-                                if (!this.functions.empty(entity.label)) {
-                                    return entity.label;
-                                } else {
-                                    return keywordEntities.filter((element: any) => element.keyword == entity.keyword)[0].text
-                                }
-                            }),
-                        };
+                    this.folderInfo = {
+                        'id': params['folderId'],
+                        'label': data.folder.label,
+                        'ownerDisplayName': data.folder.ownerDisplayName,
+                        'entitiesSharing': data.folder.sharing.entities.map((entity: any) => {
+                            if (!this.functions.empty(entity.label)) {
+                                return entity.label;
+                            } else {
+                                return keywordEntities.filter((element: any) => element.keyword === entity.keyword)[0].text;
+                            }
+                        }),
+                    };
                     this.foldersService.setFolder(this.folderInfo);
                     this.headerService.setHeader(this.folderInfo.label, '', 'fa fa-folder-open');
 
@@ -207,20 +203,20 @@ export class FolderDocumentListComponent implements OnInit {
                     return this.resultListDatabase!.getRepoIssues(
                         this.sort.active, this.sort.direction, this.paginator.pageIndex, this.basketUrl, this.filtersListService.getUrlFilters(), this.paginator.pageSize);
                 }),
-                map(data => {
+                map((data: any) => {
                     // Flip flag to show that loading has finished.
                     this.isLoadingResults = false;
                     data = this.processPostData(data);
                     this.resultsLength = data.countResources;
                     this.allResInBasket = data.allResources;
-                    //this.headerService.setHeader('Dossier : ' + this.folderInfo.label);
+                    // this.headerService.setHeader('Dossier : ' + this.folderInfo.label);
                     return data.resources;
                 }),
                 catchError((err: any) => {
                     this.notify.handleErrors(err);
                     this.router.navigate(['/home']);
                     this.isLoadingResults = false;
-                    return observableOf([]);
+                    return of(false);
                 })
             ).subscribe(data => this.data = data);
     }
@@ -233,8 +229,8 @@ export class FolderDocumentListComponent implements OnInit {
             this.docUrl = '../../rest/resources/' + row.resId + '/content';
             this.currentChrono = row.chrono;
             this.innerHtml = this.sanitizer.bypassSecurityTrustHtml(
-                "<iframe style='height:100%;width:100%;' src='" + this.docUrl + "' class='embed-responsive-item'>" +
-                "</iframe>");
+                '<iframe style=\'height:100%;width:100%;\' src=\'' + this.docUrl + '\' class=\'embed-responsive-item\'>' +
+                '</iframe>');
             this.sidenavRight.open();
         }
     }
@@ -248,13 +244,13 @@ export class FolderDocumentListComponent implements OnInit {
     }
 
     togglePanel(mode: string, row: any) {
-        let thisSelect = { checked: true };
-        let thisDeselect = { checked: false };
+        const thisSelect = { checked: true };
+        const thisDeselect = { checked: false };
         row.checked = true;
         this.toggleAllRes(thisDeselect);
         this.toggleRes(thisSelect, row);
 
-        if (this.currentResource.resId == row.resId && this.sidenavRight.opened && this.currentMode == mode) {
+        if (this.currentResource.resId === row.resId && this.sidenavRight.opened && this.currentMode === mode) {
             this.sidenavRight.close();
         } else {
             this.currentMode = mode;
@@ -271,23 +267,22 @@ export class FolderDocumentListComponent implements OnInit {
     refreshFolderInformations() {
         this.http.get('../../rest/folders/' + this.folderInfo.id)
             .subscribe((data: any) => {
-                let keywordEntities = [{
+                const keywordEntities = [{
                     keyword: 'ALL_ENTITIES',
                     text: this.lang.allEntities,
                 }];
-                this.folderInfo =
-                    {
-                        'id': data.folder.id,
-                        'label': data.folder.label,
-                        'ownerDisplayName': data.folder.ownerDisplayName,
-                        'entitiesSharing': data.folder.sharing.entities.map((entity: any) => {
-                            if (!this.functions.empty(entity.label)) {
-                                return entity.label;
-                            } else {
-                                return keywordEntities.filter((element: any) => element.keyword == entity.keyword)[0].text
-                            }
-                        }),
-                    };
+                this.folderInfo = {
+                    'id': data.folder.id,
+                    'label': data.folder.label,
+                    'ownerDisplayName': data.folder.ownerDisplayName,
+                    'entitiesSharing': data.folder.sharing.entities.map((entity: any) => {
+                        if (!this.functions.empty(entity.label)) {
+                            return entity.label;
+                        } else {
+                            return keywordEntities.filter((element: any) => element.keyword === entity.keyword)[0].text;
+                        }
+                    }),
+                };
                 this.headerService.setHeader(this.folderInfo.label, '', 'fa fa-folder-open');
             });
     }
@@ -312,22 +307,22 @@ export class FolderDocumentListComponent implements OnInit {
         if (row.hasDocument) {
             this.thumbnailUrl = '../../rest/resources/' + row.resId + '/thumbnail';
             $j('#viewThumbnail').show();
-            $j('#listContent').css({"overflow": "hidden"});
+            $j('#listContent').css({'overflow': 'hidden'});
         }
     }
 
     closeThumbnail() {
         $j('#viewThumbnail').hide();
-        $j('#listContent').css({ "overflow": "auto" });
+        $j('#listContent').css({ 'overflow': 'auto' });
     }
 
     processPostData(data: any) {
         data.resources.forEach((element: any) => {
             // Process main datas
             Object.keys(element).forEach((key) => {
-                if (key == 'statusImage' && element[key] == null) {
+                if (key === 'statusImage' && element[key] == null) {
                     element[key] = 'fa-question undefined';
-                } else if ((element[key] == null || element[key] == '') && ['closingDate', 'countAttachments', 'countNotes', 'display', 'mailTracking', 'hasDocument'].indexOf(key) === -1) {
+                } else if ((element[key] == null || element[key] === '') && ['closingDate', 'countAttachments', 'countNotes', 'display', 'mailTracking', 'hasDocument'].indexOf(key) === -1) {
                     element[key] = this.lang.undefined;
                 }
             });
@@ -345,7 +340,7 @@ export class FolderDocumentListComponent implements OnInit {
                 row.checked = true;
             }
         } else {
-            let index = this.selectedRes.indexOf(row.resId);
+            const index = this.selectedRes.indexOf(row.resId);
             this.selectedRes.splice(index, 1);
             row.checked = false;
         }
@@ -366,8 +361,8 @@ export class FolderDocumentListComponent implements OnInit {
     }
 
     selectSpecificRes(row: any) {
-        let thisSelect = { checked: true };
-        let thisDeselect = { checked: false };
+        const thisSelect = { checked: true };
+        const thisDeselect = { checked: false };
 
         this.toggleAllRes(thisDeselect);
         this.toggleRes(thisSelect, row);
@@ -375,14 +370,14 @@ export class FolderDocumentListComponent implements OnInit {
 
     open({ x, y }: MouseEvent, row: any) {
 
-        let thisSelect = { checked: true };
-        let thisDeselect = { checked: false };
+        const thisSelect = { checked: true };
+        const thisDeselect = { checked: false };
         if (row.checked === false) {
             row.checked = true;
             this.toggleAllRes(thisDeselect);
             this.toggleRes(thisSelect, row);
         }
-        this.actionsList.open(x, y, row)
+        this.actionsList.open(x, y, row);
 
         // prevents default
         return false;
@@ -394,23 +389,28 @@ export class FolderDocumentListComponent implements OnInit {
 
     toggleMailTracking(row: any) {
         if (!row.mailTracking) {
-            this.http.post('../../rest/resources/follow', {resources: [row.resId]}).pipe(
-                tap(() => this.headerService.nbResourcesFollowed++),
+            this.http.post('../../rest/resources/follow', { resources: [row.resId] }).pipe(
+                tap(() => {
+                    this.headerService.nbResourcesFollowed++;
+                    row.mailTracking = !row.mailTracking;
+                }),
                 catchError((err: any) => {
-                    this.notify.handleErrors(err);
+                    this.notify.handleSoftErrors(err);
                     return of(false);
                 })
             ).subscribe();
         } else {
             this.http.request('DELETE', '../../rest/resources/unfollow', { body: { resources: [row.resId] } }).pipe(
-                tap(() => this.headerService.nbResourcesFollowed--),
+                tap(() => {
+                    this.headerService.nbResourcesFollowed--;
+                    row.mailTracking = !row.mailTracking;
+                }),
                 catchError((err: any) => {
-                    this.notify.handleErrors(err);
+                    this.notify.handleSoftErrors(err);
                     return of(false);
                 })
             ).subscribe();
         }
-        row.mailTracking = !row.mailTracking;
     }
 
     viewDocument(row: any) {
@@ -431,7 +431,7 @@ export class ResultListHttpDao {
     getRepoIssues(sort: string, order: string, page: number, href: string, filters: string, pageSize: number): Observable<BasketList> {
         this.filtersListService.updateListsPropertiesPage(page);
         this.filtersListService.updateListsPropertiesPageSize(pageSize);
-        let offset = page * pageSize;
+        const offset = page * pageSize;
         const requestUrl = `${href}?limit=${pageSize}&offset=${offset}${filters}`;
 
         return this.http.get<BasketList>(requestUrl);
diff --git a/src/frontend/app/folder/folder-action-list/folder-action-list.component.ts b/src/frontend/app/folder/folder-action-list/folder-action-list.component.ts
index c8051b40775e97cfc30db9bf60b1cbc5ef3c81ee..ea2c0abceda35bf7552e13fa301354b501d988b7 100644
--- a/src/frontend/app/folder/folder-action-list/folder-action-list.component.ts
+++ b/src/frontend/app/folder/folder-action-list/folder-action-list.component.ts
@@ -7,13 +7,14 @@ import { MatMenuTrigger } from '@angular/material/menu';
 
 import { Router } from '@angular/router';
 import { ConfirmComponent } from '../../../plugins/modal/confirm.component';
-import { filter, exhaustMap, tap, map } from 'rxjs/operators';
+import { filter, exhaustMap, tap, map, catchError } from 'rxjs/operators';
 import { HeaderService } from '../../../service/header.service';
 import { FoldersService } from '../folders.service';
+import { of } from 'rxjs/internal/observable/of';
 
 @Component({
     selector: 'app-folder-action-list',
-    templateUrl: "folder-action-list.component.html",
+    templateUrl: 'folder-action-list.component.html',
     styleUrls: ['folder-action-list.component.scss'],
     providers: [NotificationService],
 })
@@ -39,25 +40,25 @@ export class FolderActionListComponent implements OnInit {
         list: []
     };
 
-    @Input('selectedRes') selectedRes: any;
-    @Input('totalRes') totalRes: number;
-    @Input('contextMode') contextMode: boolean;
-    @Input('currentFolderInfo') currentFolderInfo: any;
+    @Input() selectedRes: any;
+    @Input() totalRes: number;
+    @Input() contextMode: boolean;
+    @Input() currentFolderInfo: any;
 
-    @Output('refreshEvent') refreshEvent = new EventEmitter<string>();
-    @Output('refreshPanelFolders') refreshPanelFolders = new EventEmitter<string>();
+    @Output() refreshEvent = new EventEmitter<string>();
+    @Output() refreshPanelFolders = new EventEmitter<string>();
 
     constructor(
-        public http: HttpClient, 
-        private notify: NotificationService, 
-        public dialog: MatDialog, 
+        public http: HttpClient,
+        private notify: NotificationService,
+        public dialog: MatDialog,
         private router: Router,
         private headerService: HeaderService,
         private foldersService: FoldersService
-        ) { }
+    ) { }
 
     dialogRef: MatDialogRef<any>;
-    
+
     ngOnInit(): void { }
 
     open(x: number, y: number, row: any) {
@@ -77,7 +78,7 @@ export class FolderActionListComponent implements OnInit {
     }
 
     refreshFolders() {
-        this.refreshPanelFolders.emit();  
+        this.refreshPanelFolders.emit();
     }
 
     refreshDaoAfterAction() {
@@ -95,6 +96,10 @@ export class FolderActionListComponent implements OnInit {
                 this.refreshFolders();
                 this.foldersService.getPinnedFolders();
                 this.refreshDaoAfterAction();
+            }),
+            catchError((err: any) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
             })
         ).subscribe();
     }
@@ -104,6 +109,10 @@ export class FolderActionListComponent implements OnInit {
             tap((data: any) => {
                 this.basketList.groups = data.groupsBaskets.filter((x: any, i: any, a: any) => x && a.map((info: any) => info.groupId).indexOf(x.groupId) === i);
                 this.basketList.list = data.groupsBaskets;
+            }),
+            catchError((err: any) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
             })
         ).subscribe();
     }
@@ -127,6 +136,10 @@ export class FolderActionListComponent implements OnInit {
                 this.notify.success(this.lang.removedFromFolder);
                 this.headerService.nbResourcesFollowed -= data.unFollowed;
                 this.refreshDaoAfterAction();
+            }),
+            catchError((err: any) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
             })
         ).subscribe();
     }
diff --git a/src/frontend/app/folder/folder-menu/folder-menu.component.ts b/src/frontend/app/folder/folder-menu/folder-menu.component.ts
index 027deaff281dabb17218ab034f82beb08e771f4a..a5d72017e4b080f301fc4ed221e3463e7219ecb7 100644
--- a/src/frontend/app/folder/folder-menu/folder-menu.component.ts
+++ b/src/frontend/app/folder/folder-menu/folder-menu.component.ts
@@ -13,7 +13,7 @@ import { FunctionsService } from '../../../service/functions.service';
 
 @Component({
     selector: 'folder-menu',
-    templateUrl: "folder-menu.component.html",
+    templateUrl: 'folder-menu.component.html',
     styleUrls: ['folder-menu.component.scss'],
     providers: [NotificationService],
 })
@@ -56,8 +56,8 @@ export class FolderMenuComponent implements OnInit {
             }),
             filter(value => value.length > 2),
             tap(() => this.loading = true),
-            //distinctUntilChanged(),
-            switchMap(data => this.http.get('../../rest/autocomplete/folders', { params: { "search": data } })),
+            // distinctUntilChanged(),
+            switchMap(data => this.http.get('../../rest/autocomplete/folders', { params: { 'search': data } })),
             tap((data: any) => {
                 this.pinnedFolder = false;
                 this.foldersList = data.map(
@@ -86,7 +86,7 @@ export class FolderMenuComponent implements OnInit {
 
     getFolders() {
         this.loading = true;
-        this.http.get("../../rest/pinnedFolders").pipe(
+        this.http.get('../../rest/pinnedFolders').pipe(
             map((data: any) => data.folders),
             tap((data: any) => {
                 this.foldersList = data;
@@ -126,6 +126,10 @@ export class FolderMenuComponent implements OnInit {
                 this.foldersService.getPinnedFolders();
                 this.refreshList.emit();
                 this.refreshFolders.emit();
+            }),
+            catchError((err) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
             })
         ).subscribe();
     }
diff --git a/src/frontend/app/home/followed-action-list/followed-action-list.component.ts b/src/frontend/app/home/followed-action-list/followed-action-list.component.ts
index a0987700c55059020812682ab59d985547aadd1c..76f16f8752ef08ac2fa5da2160230ec9fe98f193 100644
--- a/src/frontend/app/home/followed-action-list/followed-action-list.component.ts
+++ b/src/frontend/app/home/followed-action-list/followed-action-list.component.ts
@@ -7,13 +7,14 @@ import { MatMenuTrigger } from '@angular/material/menu';
 
 import { Router } from '@angular/router';
 import { ConfirmComponent } from '../../../plugins/modal/confirm.component';
-import { filter, exhaustMap, tap, map } from 'rxjs/operators';
+import { filter, exhaustMap, tap, map, catchError } from 'rxjs/operators';
 import { HeaderService } from '../../../service/header.service';
-import {MenuShortcutComponent} from "../../menu/menu-shortcut.component";
+import { MenuShortcutComponent } from '../../menu/menu-shortcut.component';
+import { of } from 'rxjs/internal/observable/of';
 
 @Component({
     selector: 'app-followed-action-list',
-    templateUrl: "followed-action-list.component.html",
+    templateUrl: 'followed-action-list.component.html',
     styleUrls: ['followed-action-list.component.scss'],
     providers: [NotificationService],
 })
@@ -40,15 +41,15 @@ export class FollowedActionListComponent implements OnInit {
         list: []
     };
 
-    @Input('selectedRes') selectedRes: any;
-    @Input('totalRes') totalRes: number;
-    @Input('contextMode') contextMode: boolean;
-    @Input('currentFolderInfo') currentFolderInfo: any;
+    @Input() selectedRes: any;
+    @Input() totalRes: number;
+    @Input() contextMode: boolean;
+    @Input() currentFolderInfo: any;
 
-    @Input('menuShortcut') menuShortcut: MenuShortcutComponent;
+    @Input() menuShortcut: MenuShortcutComponent;
 
-    @Output('refreshEvent') refreshEvent = new EventEmitter<string>();
-    @Output('refreshPanelFolders') refreshPanelFolders = new EventEmitter<string>();
+    @Output() refreshEvent = new EventEmitter<string>();
+    @Output() refreshPanelFolders = new EventEmitter<string>();
 
     constructor(
         public http: HttpClient,
@@ -56,7 +57,7 @@ export class FollowedActionListComponent implements OnInit {
         public dialog: MatDialog,
         private router: Router,
         private headerService: HeaderService,
-        ) { }
+    ) { }
 
     dialogRef: MatDialogRef<any>;
 
@@ -79,7 +80,7 @@ export class FollowedActionListComponent implements OnInit {
     }
 
     refreshFolders() {
-        this.refreshPanelFolders.emit();  
+        this.refreshPanelFolders.emit();
     }
 
     refreshDaoAfterAction() {
@@ -91,11 +92,15 @@ export class FollowedActionListComponent implements OnInit {
 
         this.dialogRef.afterClosed().pipe(
             filter((data: string) => data === 'ok'),
-            exhaustMap(() => this.http.request('DELETE', '../../rest/resources/unfollow' , { body: { resources: this.selectedRes } })),
+            exhaustMap(() => this.http.request('DELETE', '../../rest/resources/unfollow', { body: { resources: this.selectedRes } })),
             tap((data: any) => {
                 this.notify.success(this.lang.removedFromFolder);
                 this.headerService.nbResourcesFollowed -= data.unFollowed;
                 this.refreshDaoAfterAction();
+            }),
+            catchError((err: any) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
             })
         ).subscribe();
     }
@@ -105,6 +110,10 @@ export class FollowedActionListComponent implements OnInit {
             tap((data: any) => {
                 this.basketList.groups = data.groupsBaskets.filter((x: any, i: any, a: any) => x && a.map((info: any) => info.groupId).indexOf(x.groupId) === i);
                 this.basketList.list = data.groupsBaskets;
+            }),
+            catchError((err: any) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
             })
         ).subscribe();
     }
diff --git a/src/frontend/app/home/followed-list/followed-document-list.component.html b/src/frontend/app/home/followed-list/followed-document-list.component.html
index f4fff7ee1b94af4699ec9cee3d5320cca1c00184..8f71ecadcf4f5caf1ec68ab5c3d182bfc35db2c8 100644
--- a/src/frontend/app/home/followed-list/followed-document-list.component.html
+++ b/src/frontend/app/home/followed-list/followed-document-list.component.html
@@ -99,7 +99,11 @@
                                         [class.undefined]="row.subject == lang.undefined"
                                         title="{{row.subject}}">{{row.subject | shorten: 150: '...'}}</span>
                                     <span class="main-info-action">
-                                        <button mat-icon-button title="{{lang.notes}}"
+                                        <div *ngIf="!row.allowed" color="warn">
+                                            {{lang.documentOutOfPerimeter}}
+                                        </div>
+                                        <ng-container *ngIf="row.allowed">
+                                            <button mat-icon-button title="{{lang.notes}}"
                                             (click)="$event.stopPropagation();togglePanel('note',row)"
                                             [class.noData]="row.countNotes == 0">
                                             <mat-icon matBadgeHidden="{{row.countNotes == 0}}" fontSet="fas"
@@ -130,6 +134,7 @@
                                                 (click)="$event.stopPropagation();goToDetail(row);">
                                             <mat-icon fontSet="fas" fontIcon="fa-info-circle fa-2x"></mat-icon>
                                         </button>
+                                        </ng-container>  
                                     </span>
                                 </div>
                                 <div *ngIf="row.folders !== undefined && row.folders.length > 0" class="folder-info">
@@ -139,7 +144,7 @@
                         </ng-container>
                         <tr mat-row *matRowDef="let row; columns: displayedColumnsBasket;"
                             (contextmenu)="open($event,row);" (click)="open($event,row);" class="rowData"
-                            style="cursor: pointer;" [class.locked]="row.isLocked == true" cdkDrag
+                            style="cursor: pointer;" [class.locked]="row.isLocked == true" cdkDrag [cdkDragDisabled]="!row.allowed"
                             (cdkDragStarted)="selectSpecificRes(row);" [cdkDragData]="row">
                             <div class="example-custom-placeholder" *cdkDragPlaceholder></div>
                             <div class="dragPreview" *cdkDragPreview><i class="fas fa-envelope-open-text fa-2x"></i>
diff --git a/src/frontend/app/home/followed-list/followed-document-list.component.ts b/src/frontend/app/home/followed-list/followed-document-list.component.ts
index 3f28ca3940b7633e5ff90d89c63273e4d30b1ea3..0e07ccf532d838a3b75a558b844cc46de6d6eb8b 100644
--- a/src/frontend/app/home/followed-list/followed-document-list.component.ts
+++ b/src/frontend/app/home/followed-list/followed-document-list.component.ts
@@ -1,18 +1,15 @@
-import { Component, OnInit, ViewChild, EventEmitter, ViewContainerRef } from '@angular/core';
+import { Component, OnInit, ViewChild, EventEmitter, ViewContainerRef, OnDestroy } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { LANG } from '../../translate.component';
-import {merge, Observable, of as observableOf, Subject, Subscription} from 'rxjs';
 import { NotificationService } from '../../notification.service';
 import { MatDialog, MatDialogRef } from '@angular/material/dialog';
 import { MatPaginator } from '@angular/material/paginator';
 import { MatSidenav } from '@angular/material/sidenav';
 import { MatSort } from '@angular/material/sort';
-
 import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
 import { startWith, switchMap, map, catchError, takeUntil, tap, exhaustMap, filter } from 'rxjs/operators';
 import { ActivatedRoute, Router } from '@angular/router';
 import { HeaderService } from '../../../service/header.service';
-
 import { Overlay } from '@angular/cdk/overlay';
 import { PanelListComponent } from '../../list/panel/panel-list.component';
 import { AppService } from '../../../service/app.service';
@@ -20,18 +17,18 @@ import { BasketHomeComponent } from '../../basket/basket-home.component';
 import { ConfirmComponent } from '../../../plugins/modal/confirm.component';
 import { FollowedActionListComponent } from '../followed-action-list/followed-action-list.component';
 import { FiltersListService } from '../../../service/filtersList.service';
-import {MenuShortcutComponent} from "../../menu/menu-shortcut.component";
+import { MenuShortcutComponent } from '../../menu/menu-shortcut.component';
 import { FoldersService } from '../../folder/folders.service';
-
+import {merge, Observable, Subject, Subscription, of} from 'rxjs';
 
 declare function $j(selector: any): any;
 
 @Component({
-    templateUrl: "followed-document-list.component.html",
+    templateUrl: 'followed-document-list.component.html',
     styleUrls: ['followed-document-list.component.scss'],
     providers: [NotificationService, AppService]
 })
-export class FollowedDocumentListComponent implements OnInit {
+export class FollowedDocumentListComponent implements OnInit, OnDestroy {
 
     lang: any = LANG;
 
@@ -182,7 +179,7 @@ export class FollowedDocumentListComponent implements OnInit {
                     return this.resultListDatabase!.getRepoIssues(
                         this.sort.active, this.sort.direction, this.paginator.pageIndex, this.basketUrl, this.filtersListService.getUrlFilters(), this.paginator.pageSize);
                 }),
-                map(data => {
+                map((data: any) => {
                     // Flip flag to show that loading has finished.
                     this.isLoadingResults = false;
                     data = this.processPostData(data);
@@ -194,21 +191,21 @@ export class FollowedDocumentListComponent implements OnInit {
                     this.notify.handleErrors(err);
                     this.router.navigate(['/home']);
                     this.isLoadingResults = false;
-                    return observableOf([]);
+                    return of(false);
                 })
             ).subscribe(data => this.data = data);
     }
 
     goTo(row: any) {
         this.filtersListService.filterMode = false;
-        if (this.docUrl == '../../rest/resources/' + row.resId + '/content' && this.sidenavRight.opened) {
+        if (this.docUrl === '../../rest/resources/' + row.resId + '/content' && this.sidenavRight.opened) {
             this.sidenavRight.close();
         } else {
             this.docUrl = '../../rest/resources/' + row.resId + '/content';
             this.currentChrono = row.chrono;
             this.innerHtml = this.sanitizer.bypassSecurityTrustHtml(
-                "<iframe style='height:100%;width:100%;' src='" + this.docUrl + "' class='embed-responsive-item'>" +
-                "</iframe>");
+                '<iframe style=\'height:100%;width:100%;\' src=\'' + this.docUrl + '\' class=\'embed-responsive-item\'>' +
+                '</iframe>');
             this.sidenavRight.open();
         }
     }
@@ -222,13 +219,13 @@ export class FollowedDocumentListComponent implements OnInit {
     }
 
     togglePanel(mode: string, row: any) {
-        let thisSelect = { checked: true };
-        let thisDeselect = { checked: false };
+        const thisSelect = { checked: true };
+        const thisDeselect = { checked: false };
         row.checked = true;
         this.toggleAllRes(thisDeselect);
         this.toggleRes(thisSelect, row);
 
-        if (this.currentResource.resId == row.resId && this.sidenavRight.opened && this.currentMode == mode) {
+        if (this.currentResource.resId === row.resId && this.sidenavRight.opened && this.currentMode === mode) {
             this.sidenavRight.close();
         } else {
             this.currentMode = mode;
@@ -262,22 +259,22 @@ export class FollowedDocumentListComponent implements OnInit {
         if (row.hasDocument) {
             this.thumbnailUrl = '../../rest/resources/' + row.resId + '/thumbnail';
             $j('#viewThumbnail').show();
-            $j('#listContent').css({"overflow": "hidden"});
+            $j('#listContent').css({'overflow': 'hidden'});
         }
     }
 
     closeThumbnail() {
         $j('#viewThumbnail').hide();
-        $j('#listContent').css({ "overflow": "auto" });
+        $j('#listContent').css({ 'overflow': 'auto' });
     }
 
     processPostData(data: any) {
         data.resources.forEach((element: any) => {
             // Process main datas
             Object.keys(element).forEach((key) => {
-                if (key == 'statusImage' && element[key] == null) {
+                if (key === 'statusImage' && element[key] == null) {
                     element[key] = 'fa-question undefined';
-                } else if ((element[key] == null || element[key] == '') && ['closingDate', 'countAttachments', 'countNotes', 'display', 'mailTracking', 'hasDocument', 'folders'].indexOf(key) === -1) {
+                } else if ((element[key] == null || element[key] === '') && ['closingDate', 'countAttachments', 'countNotes', 'display', 'mailTracking', 'hasDocument', 'folders'].indexOf(key) === -1) {
                     element[key] = this.lang.undefined;
                 }
             });
@@ -295,7 +292,7 @@ export class FollowedDocumentListComponent implements OnInit {
                 row.checked = true;
             }
         } else {
-            let index = this.selectedRes.indexOf(row.resId);
+            const index = this.selectedRes.indexOf(row.resId);
             this.selectedRes.splice(index, 1);
             row.checked = false;
         }
@@ -316,16 +313,16 @@ export class FollowedDocumentListComponent implements OnInit {
     }
 
     selectSpecificRes(row: any) {
-        let thisSelect = { checked: true };
-        let thisDeselect = { checked: false };
+        const thisSelect = { checked: true };
+        const thisDeselect = { checked: false };
 
         this.toggleAllRes(thisDeselect);
         this.toggleRes(thisSelect, row);
     }
 
     open({ x, y }: MouseEvent, row: any) {
-        let thisSelect = { checked: true };
-        let thisDeselect = { checked: false };
+        const thisSelect = { checked: true };
+        const thisDeselect = { checked: false };
         if (row.checked === false) {
             row.checked = true;
             this.toggleAllRes(thisDeselect);
@@ -346,10 +343,14 @@ export class FollowedDocumentListComponent implements OnInit {
 
         this.dialogRef.afterClosed().pipe(
             filter((data: string) => data === 'ok'),
-            exhaustMap(() => this.http.request('DELETE', '../../rest/resources/unfollow' , { body: { resources: [row.resId] } })),
+            exhaustMap(() => this.http.request('DELETE', '../../rest/resources/unfollow', { body: { resources: [row.resId] } })),
             tap((data: any) => {
                 this.headerService.nbResourcesFollowed--;
                 this.initResultList();
+            }),
+            catchError((err: any) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
             })
         ).subscribe();
     }
@@ -372,7 +373,7 @@ export class ResultListHttpDao {
     getRepoIssues(sort: string, order: string, page: number, href: string, filters: string, pageSize: number): Observable<BasketList> {
         this.filtersListService.updateListsPropertiesPage(page);
         this.filtersListService.updateListsPropertiesPageSize(pageSize);
-        let offset = page * pageSize;
+        const offset = page * pageSize;
         const requestUrl = `${href}?limit=${pageSize}&offset=${offset}${filters}`;
 
         return this.http.get<BasketList>(requestUrl);
diff --git a/src/frontend/app/notification.service.ts b/src/frontend/app/notification.service.ts
index d0cf400b4cba36dc6b024361178b902ea7e15803..24dcb8512cb42e190ded0f07b10065e0c5a81921 100755
--- a/src/frontend/app/notification.service.ts
+++ b/src/frontend/app/notification.service.ts
@@ -5,7 +5,7 @@ import { Router } from '@angular/router';
 import { LANG } from './translate.component';
 @Component({
     selector: 'custom-snackbar',
-    templateUrl: "notification.service.html",
+    templateUrl: 'notification.service.html',
     styleUrls: ['notification.service.scss'],
 })
 export class CustomSnackbarComponent {
@@ -55,8 +55,10 @@ export class NotificationService {
                 if (err.error.errors !== undefined) {
                     if (err.error.lang !== undefined) {
                         this.error(this.lang[err.error.lang]);
-                    } else if (err.error.errors == 'Document out of perimeter' || err.error.errors == 'Resource out of perimeter' || err.error.errors == 'Resources out of perimeter') {
+                    } else if (err.error.errors === 'Document out of perimeter' || err.error.errors === 'Resource out of perimeter') {
                         this.error(this.lang.documentOutOfPerimeter);
+                    } else if (err.error.errors === 'Resources out of perimeter') {
+                        this.error(this.lang.documentsOutOfPerimeter);
                     } else {
                         this.error(err.error.errors, err.url);
                     }
@@ -82,8 +84,10 @@ export class NotificationService {
             if (err.error.errors !== undefined) {
                 if (err.error.lang !== undefined) {
                     this.error(this.lang[err.error.lang]);
-                } else if (err.error.errors == 'Document out of perimeter' || err.error.errors == 'Resource out of perimeter' || err.error.errors == 'Resources out of perimeter') {
+                } else if (err.error.errors === 'Document out of perimeter' || err.error.errors === 'Resource out of perimeter') {
                     this.error(this.lang.documentOutOfPerimeter);
+                } else if (err.error.errors === 'Resources out of perimeter') {
+                    this.error(this.lang.documentsOutOfPerimeter);
                 } else {
                     this.error(err.error.errors, err.url);
                 }
diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts
index 8966207511595f7f7c539273ca73dbe6dfedeae5..152cd2a8adef11e38b64e6ac1462371b208ab33f 100755
--- a/src/frontend/lang/lang-en.ts
+++ b/src/frontend/lang/lang-en.ts
@@ -538,6 +538,7 @@ export const LANG_EN = {
     "documentOutOfPerimeter":                      "This document is out of your perimeter",
     "documents":                                   "document(s)",
     "documentSignedMsg":                           "The document has been signed, you cannot edit this document",
+    "documentsOutOfPerimeter":                     "Some documents are out of your perimeter",
     "documentTypeAdded":                           "Document type added",
     "documentTypeDeleted":                         "Document type deleted",
     "documentTypeReplacement":                     "Document type replacement",
diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts
index 06c0fc8ab2ae761167055042c2ce49ae628a29f5..a332e68392bbeb349336c84fdbd409bfa8974dc3 100755
--- a/src/frontend/lang/lang-fr.ts
+++ b/src/frontend/lang/lang-fr.ts
@@ -540,6 +540,7 @@ export const LANG_FR = {
     "documentOutOfPerimeter":                      "Ce document est en dehors de votre périmètre",
     "documents":                                   "document(s)",
     "documentSignedMsg":                           "Le document a été signé, vous ne pouvez pas editer ce document",
+    "documentsOutOfPerimeter":                     "Certains documents sont en dehors de votre périmètre",
     "documentTypeAdded":                           "Type de courrier ajouté",
     "documentTypeDeleted":                         "Type de courrier supprimé",
     "documentTypeReplacement":                     "Remplacement du type de courrier",
diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts
index 582b36862988fd9f96a850e4011ac149e453bc6b..156c2fb13270c029c1d5d8be17a9e5979bda7d04 100755
--- a/src/frontend/lang/lang-nl.ts
+++ b/src/frontend/lang/lang-nl.ts
@@ -1702,4 +1702,5 @@ export const LANG_NL = {
     "targetIdentifier": "Target identifier__TO_TRANSLATE",
     "canUpdateResourcesInSignatureBook": "Can modify the main document included in the signature book__TO_TRANSLATE",
     "includeFolderPerimeter": "Consulter les courriers hors périmètre dans les dossiers et courriers suivis__TO_TRANSLATE",
+    "documentsOutOfPerimeter": "Certains documents sont en dehors de votre périmètre__TO_TRANSLATE",
 };