diff --git a/src/app/home/controllers/HomeController.php b/src/app/home/controllers/HomeController.php
index 3197de680d0d8fb0948b6e4f2f452ded9c4b3980..b8dd005c2aac8bfe69435d4f34e39ea3d794724d 100755
--- a/src/app/home/controllers/HomeController.php
+++ b/src/app/home/controllers/HomeController.php
@@ -38,16 +38,18 @@ class HomeController
 
         $preferences = json_decode($user['preferences'], true);
         if (!empty($preferences['homeGroups'])) {
-            $copyGroups = $groups;
-            foreach ($copyGroups as $group) {
+            $orderGroups   = [];
+            $noOrderGroups = [];
+            foreach ($groups as $group) {
                 $key = array_search($group['id'], $preferences['homeGroups']);
                 if ($key === false) {
-                    $groups[] = $group;
+                    $noOrderGroups[] = $group;
                 } else {
-                    $groups[$key] = $group;
+                    $orderGroups[$key] = $group;
                 }
             }
-            $groups = array_values($groups);
+            ksort($orderGroups);
+            $groups = array_merge($orderGroups, $noOrderGroups);
         }
 
         foreach ($groups as $group) {
diff --git a/src/frontend/app/basket/basket-home.component.html b/src/frontend/app/basket/basket-home.component.html
index 6909dc72d7fb626f1a3fb8dd833c13b8b8ee36c6..28a3f98344bec60021de48a39403f0fffc100b2d 100755
--- a/src/frontend/app/basket/basket-home.component.html
+++ b/src/frontend/app/basket/basket-home.component.html
@@ -3,16 +3,29 @@
         <mat-panel-title>
             <i class="fa fa-inbox panelIconMenu"></i>&nbsp;{{lang.myBaskets}}
         </mat-panel-title>
+        <div title="{{lang.listConfiguration}}" (click)="$event.stopPropagation();editGroupOrder()"><mat-icon [ngStyle]="{'color': editOrderGroups ? 'orange' : '#135F7F'}" mat-list-icon class="fa fa-cog"></mat-icon></div>
     </mat-expansion-panel-header>
     <ng-container *ngIf="!loading">
         <mat-form-field [style.display]="homeData.assignedBaskets.length > 0 || homeData.regroupedBaskets.length > 0 ? 'inline-block' : 'none'" floatLabel="never" appearance="outline" class="basketsFilter"
             style="padding-left:20px;padding-right:20px;font-size: 11px;">
             <input matInput placeholder="{{lang.filterBy}}" #listFilter>
         </mat-form-field>
+        <div *ngIf="editOrderGroups" style="color: rgba(0,0,0,0.25);text-align:center">
+            {{lang.noticeGroupeOrder}}
+        </div>
+        <mat-list *ngIf="editOrderGroups">
+            <span dnd-sortable-container [dropZones]="['boxers-zone']" [sortableData]="homeData.regroupedBaskets">
+                <mat-list-item disableRipple="true" *ngFor="let regroupedBasket of homeData.regroupedBaskets;let i = index" title="{{lang.move}}" dnd-sortable
+                               [sortableIndex]="i" (onDropSuccess)="updateGroupsOrder()">
+                    <mat-icon color="primary" mat-list-icon class="fa fa-users" style="font-size:19px"></mat-icon>
+                    <span class="basketGroupTitle">{{regroupedBasket.groupDesc}}</span>
+                </mat-list-item>
+            </span>
+        </mat-list>
         <ng-container *ngFor="let regroupedBasket of homeData.regroupedBaskets">
-            <span *ngIf="regroupedBasket.baskets[0]" class="basketGroupTitle">{{regroupedBasket.groupDesc}}</span>
-            <mat-divider *ngIf="regroupedBasket.baskets[0]" style="width: 80%;"></mat-divider>
-            <mat-nav-list style="padding-bottom: 10px;">
+            <span *ngIf="regroupedBasket.baskets[0] && !editOrderGroups" class="basketGroupTitle">{{regroupedBasket.groupDesc}}</span>
+            <mat-divider *ngIf="regroupedBasket.baskets[0] && !editOrderGroups" style="width: 80%;"></mat-divider>
+            <mat-nav-list style="padding-bottom: 10px;" *ngIf="!editOrderGroups">
                 <ng-container
                     *ngFor="let basket of regroupedBasket.baskets | filterList:listFilter.value:'basket_name'">
                     <a mat-list-item *ngIf="basket.redirected" disableRipple="true" style="cursor:not-allowed;">
@@ -41,7 +54,7 @@
                 </ng-container>
             </mat-nav-list>
         </ng-container>
-        <ng-container *ngIf="homeData.assignedBaskets.length>0">
+        <ng-container *ngIf="homeData.assignedBaskets.length>0 && !editOrderGroups">
             <span color="primary" style="font-weight:bold;"
                 title="{{lang.basketsAssigned}}">{{lang.basketsAssignedShort}}</span>
             <mat-divider></mat-divider>
@@ -65,4 +78,4 @@
             {{lang.noAvailableBasket}}
         </div>
     </ng-container>
-</mat-expansion-panel>
\ No newline at end of file
+</mat-expansion-panel>
diff --git a/src/frontend/app/basket/basket-home.component.ts b/src/frontend/app/basket/basket-home.component.ts
index 6e69243cedd5b958c410fc91644851f053b8761a..3b0c6cd773b94e04d466b9aad63ff9f7c54bbafe 100755
--- a/src/frontend/app/basket/basket-home.component.ts
+++ b/src/frontend/app/basket/basket-home.component.ts
@@ -3,8 +3,10 @@ import { HttpClient } from '@angular/common/http';
 import { LANG } from '../translate.component';
 import { MatSidenav } from '@angular/material/sidenav';
 import { AppService } from '../../service/app.service';
-import { tap, finalize } from 'rxjs/operators';
+import { tap, finalize, catchError } from 'rxjs/operators';
 import { MatExpansionPanel } from '@angular/material';
+import { of } from 'rxjs';
+import { NotificationService } from '../notification.service';
 
 declare function $j(selector: any) : any;
 
@@ -27,10 +29,12 @@ export class BasketHomeComponent implements OnInit {
     @Input() snavL: MatSidenav;
     @Output('refreshEvent') refreshEvent = new EventEmitter<string>();
     @ViewChild('basketPanel', { static: true }) basketPanel: MatExpansionPanel;
+    editOrderGroups: boolean = false;
 
     constructor(
         public http: HttpClient,
-        public appService: AppService
+        public appService: AppService,
+        private notify: NotificationService
     ) {
     }
 
@@ -80,4 +84,19 @@ export class BasketHomeComponent implements OnInit {
             this.basketPanel.close();
         }
     }
+
+    editGroupOrder() {
+        this.editOrderGroups = !this.editOrderGroups;
+    }
+
+    updateGroupsOrder() {
+        var groupsOrder = this.homeData.regroupedBaskets.map((element: any) => element.groupSerialId);
+        this.http.put("../../rest/currentUser/profile/preferences", { homeGroups: groupsOrder }).pipe(
+            tap(() => this.notify.success(this.lang.parameterUpdated)),
+            catchError((err) => {
+                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 629fe0d42cf6ebcfa606201d0cac22b1e81512f6..197cf86430448595addf7fa5cc65a43b6a24ee50 100755
--- a/src/frontend/lang/lang-en.ts
+++ b/src/frontend/lang/lang-en.ts
@@ -1338,4 +1338,6 @@ export const LANG_EN = {
     "editorOptionAdmin": "Manage editor option",
     "documentEditor": "Document editor",
     "contactsList": "Contacts list",
+    "listConfiguration": "Manage list display",
+    "noticeGroupeOrder": "Drag and drop group to set order",
 };
diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts
index bb158d1432c1bb0dc58678fdb44f4ec702e9f6e4..1326e068cc97f4a193eb3ac58b39a80616f004f5 100755
--- a/src/frontend/lang/lang-fr.ts
+++ b/src/frontend/lang/lang-fr.ts
@@ -1376,4 +1376,6 @@ export const LANG_FR = {
     "editorOptionAdmin": "Gérer les paramètres d'édition",
     "documentEditor": "Editeur de document",
     "contactsList": "Liste des contacts",
+    "listConfiguration": "Paramétrer l'affichage de la liste",
+    "noticeGroupeOrder": "Glisser-déposer les groupes pour définir l'ordre",
 };
diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts
index b965c4675f4bb5c47557994dc6a1dc00d0d468b5..2a791e0b590c476fab33f5b6af1341e1213ed571 100755
--- a/src/frontend/lang/lang-nl.ts
+++ b/src/frontend/lang/lang-nl.ts
@@ -1363,4 +1363,6 @@ export const LANG_NL = {
     "editorOptionAdmin": "Manage editor option", //_TO_TRANSLATE
     "documentEditor": "Document editor", //_TO_TRANSLATE
     "contactsList": "Contacts list", //_TO_TRANSLATE
+    "listConfiguration": "Manage list display", //_TO_TRANSLATE
+    "noticeGroupeOrder": "Drag and drop group to set order", //_TO_TRANSLATE
 };
diff --git a/test/unitTests/app/user/UserControllerTest.php b/test/unitTests/app/user/UserControllerTest.php
index 4afe896ed0ea34a6e1f166ef9c1d45b2d5cd42f1..3c92cad8a6e6a3cf7d5eba64f9d60aeee418c729 100755
--- a/test/unitTests/app/user/UserControllerTest.php
+++ b/test/unitTests/app/user/UserControllerTest.php
@@ -773,7 +773,7 @@ class UserControllerTest extends TestCase
             'lastname'      => 'ADMIN',
             'mail'          => 'dev@maarch.org',
             'initials'      => 'SU',
-            'preferences'   => ['homeGroups' => [999]]
+            'preferences'   => ['documentEdition' => 'maarchOnline']
         ];
         $fullRequest = \httpRequestCustom::addContentInBody($aArgs, $request);
 
@@ -781,7 +781,7 @@ class UserControllerTest extends TestCase
         $this->assertSame(400, $response->getStatusCode());
 
         $responseBody = json_decode((string)$response->getBody(), true);
-        $this->assertSame('Body preferences[homeGroups] is not filled with all user\'s groups', $responseBody['errors']);
+        $this->assertSame('Body preferences[documentEdition] is not allowed', $responseBody['errors']);
     }
 
     public function testSetRedirectedBasket()