diff --git a/rest/index.php b/rest/index.php
index d888c6b65d441edf122f04760733f34d1752e4bb..92e997d1a40f6d02a6c4dda8cac1fd8705d6e7b8 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -281,9 +281,6 @@ $app->get('/links/resId/{resId}', \Link\controllers\LinkController::class . ':ge
 
 //Listinstance
 $app->get('/listinstance/{id}', \Entity\controllers\ListInstanceController::class . ':getById');
-$app->get('/resources/{resId}/listInstance', \Entity\controllers\ListInstanceController::class . ':getByResId');
-$app->get('/res/{resId}/visaCircuit', \Entity\controllers\ListInstanceController::class . ':getVisaCircuitByResId');
-$app->get('/res/{resId}/avisCircuit', \Entity\controllers\ListInstanceController::class . ':getAvisCircuitByResId');
 $app->put('/listinstances', \Entity\controllers\ListInstanceController::class . ':update');
 
 //ListTemplates
@@ -344,6 +341,9 @@ $app->get('/resources/{resId}/contacts', \Contact\controllers\ContactController:
 $app->get('/resources/{resId}/emails', \Email\controllers\EmailController::class . ':getByResId');
 $app->get('/resources/{resId}/notes', \Note\controllers\NoteController::class . ':getByResId');
 $app->get('/resources/{resId}/templates', \Template\controllers\TemplateController::class . ':getByResId');
+$app->get('/resources/{resId}/listInstance', \Entity\controllers\ListInstanceController::class . ':getByResId');
+$app->get('/resources/{resId}/visaCircuit', \Entity\controllers\ListInstanceController::class . ':getVisaCircuitByResId');
+$app->get('/resources/{resId}/opinionCircuit', \Entity\controllers\ListInstanceController::class . ':getOpinionCircuitByResId');
 $app->get('/res/{resId}/acknowledgementReceipt/{id}', \AcknowledgementReceipt\controllers\AcknowledgementReceiptController::class . ':getAcknowledgementReceipt');
 $app->put('/res/resource/status', \Resource\controllers\ResController::class . ':updateStatus');
 $app->post('/res/list', \Resource\controllers\ResController::class . ':getList');
@@ -458,6 +458,7 @@ $app->put('/versionsUpdate', \VersionUpdate\controllers\VersionUpdateController:
 //CurrentUser
 $app->get('/currentUser/profile', \User\controllers\UserController::class . ':getProfile');
 $app->put('/currentUser/profile', \User\controllers\UserController::class . ':updateProfile');
+$app->put('/currentUser/profile/preferences', \User\controllers\UserController::class . ':updateCurrentUserPreferences');
 $app->post('/currentUser/emailSignature', \User\controllers\UserController::class . ':createCurrentUserEmailSignature');
 $app->put('/currentUser/emailSignature/{id}', \User\controllers\UserController::class . ':updateCurrentUserEmailSignature');
 $app->delete('/currentUser/emailSignature/{id}', \User\controllers\UserController::class . ':deleteCurrentUserEmailSignature');
diff --git a/src/app/entity/controllers/ListInstanceController.php b/src/app/entity/controllers/ListInstanceController.php
index 6c2610591ecdb06421debcfe8b29a4c6edaa406d..549e737a689eb74c31114f86dd8ff1a737e5ba17 100755
--- a/src/app/entity/controllers/ListInstanceController.php
+++ b/src/app/entity/controllers/ListInstanceController.php
@@ -62,6 +62,7 @@ class ListInstanceController
         if (!Validator::intVal()->validate($aArgs['resId']) || !ResController::hasRightByResId(['resId' => [$aArgs['resId']], 'userId' => $GLOBALS['id']])) {
             return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']);
         }
+
         $listInstances = ListInstanceModel::getVisaCircuitByResId(['select' => ['listinstance_id', 'sequence', 'item_id', 'item_type', 'firstname as item_firstname', 'lastname as item_lastname', 'entity_label as item_entity', 'viewed', 'process_date', 'process_comment', 'signatory', 'requested_signature'], 'id' => $aArgs['resId']]);
         foreach ($listInstances as $key => $value) {
             $listInstances[$key]['labelToDisplay'] = $listInstances[$key]['item_firstname'].' '.$listInstances[$key]['item_lastname'];
@@ -70,11 +71,12 @@ class ListInstanceController
         return $response->withJson($listInstances);
     }
 
-    public function getAvisCircuitByResId(Request $request, Response $response, array $aArgs)
+    public function getOpinionCircuitByResId(Request $request, Response $response, array $aArgs)
     {
         if (!Validator::intVal()->validate($aArgs['resId']) || !ResController::hasRightByResId(['resId' => [$aArgs['resId']], 'userId' => $GLOBALS['id']])) {
             return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']);
         }
+
         $listInstances = ListInstanceModel::getAvisCircuitByResId(['select' => ['listinstance_id', 'sequence', 'item_id', 'item_type', 'firstname as item_firstname', 'lastname as item_lastname', 'entity_label as item_entity', 'viewed', 'process_date', 'process_comment'], 'id' => $aArgs['resId']]);
         foreach ($listInstances as $key => $value) {
             $listInstances[$key]['labelToDisplay'] = $listInstances[$key]['item_firstname'].' '.$listInstances[$key]['item_lastname'];
diff --git a/src/app/home/controllers/HomeController.php b/src/app/home/controllers/HomeController.php
index f3242a446b69323d2e2d1ab1cacb69bde27a68ad..3197de680d0d8fb0948b6e4f2f452ded9c4b3980 100755
--- a/src/app/home/controllers/HomeController.php
+++ b/src/app/home/controllers/HomeController.php
@@ -41,7 +41,11 @@ class HomeController
             $copyGroups = $groups;
             foreach ($copyGroups as $group) {
                 $key = array_search($group['id'], $preferences['homeGroups']);
-                $groups[$key] = $group;
+                if ($key === false) {
+                    $groups[] = $group;
+                } else {
+                    $groups[$key] = $group;
+                }
             }
             $groups = array_values($groups);
         }
diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php
index 785948a52ac8e188bab71f4a917b67a20816032f..fd7f420466efe60f39b23f20149943969e954fd7 100755
--- a/src/app/user/controllers/UserController.php
+++ b/src/app/user/controllers/UserController.php
@@ -540,13 +540,6 @@ class UserController
         if (!in_array($body['preferences']['documentEdition'], DocumentEditorController::DOCUMENT_EDITION_METHODS)) {
             return $response->withStatus(400)->withJson(['errors' => 'Body preferences[documentEdition] is not allowed']);
         }
-        if (!empty($body['preferences']['homeGroups'])) {
-            $groups = UserGroupModel::get(['select' => ['group_id'], 'where' => ['user_id = ?'], 'data' => [$GLOBALS['id']]]);
-            $groups = array_column($groups, 'group_id');
-            if (!empty(array_diff($body['preferences']['homeGroups'], $groups))) {
-                return $response->withStatus(400)->withJson(['errors' => 'Body preferences[homeGroups] is not filled with all user\'s groups']);
-            }
-        }
 
         UserModel::update([
             'set'   => [
@@ -564,6 +557,39 @@ class UserController
         return $response->withStatus(204);
     }
 
+    public function updateCurrentUserPreferences(Request $request, Response $response)
+    {
+        $body = $request->getParsedBody();
+
+        $user = UserModel::getById(['id' => $GLOBALS['id'], 'select' => ['preferences']]);
+        $preferences = json_decode($user['preferences'], true);
+
+        if (!empty($body['documentEdition'])) {
+            if (!in_array($body['documentEdition'], DocumentEditorController::DOCUMENT_EDITION_METHODS)) {
+                return $response->withStatus(400)->withJson(['errors' => 'Body preferences[documentEdition] is not allowed']);
+            }
+            $preferences['documentEdition'] = $body['documentEdition'];
+        }
+        if (!empty($body['homeGroups'])) {
+            $groups = UserGroupModel::get(['select' => ['group_id'], 'where' => ['user_id = ?'], 'data' => [$GLOBALS['id']]]);
+            $groups = array_column($groups, 'group_id');
+            if (!empty(array_diff($body['homeGroups'], $groups))) {
+                return $response->withStatus(400)->withJson(['errors' => 'Body homeGroups is not filled with all user\'s groups']);
+            }
+            $preferences['homeGroups'] = $body['homeGroups'];
+        }
+
+        UserModel::update([
+            'set'   => [
+                'preferences'   => json_encode($preferences)
+            ],
+            'where' => ['id = ?'],
+            'data'  => [$GLOBALS['id']]
+        ]);
+
+        return $response->withStatus(204);
+    }
+
     public function updatePassword(Request $request, Response $response, array $aArgs)
     {
         $error = $this->hasUsersRights(['id' => $aArgs['id'], 'himself' => true]);
diff --git a/src/frontend/app/avis/avis-workflow.component.ts b/src/frontend/app/avis/avis-workflow.component.ts
index 56651008c049298391fafb06af6421305a756db6..043b1566a1c3c46bba2cd97b0ab301e41e552781 100644
--- a/src/frontend/app/avis/avis-workflow.component.ts
+++ b/src/frontend/app/avis/avis-workflow.component.ts
@@ -88,7 +88,7 @@ export class AvisWorkflowComponent implements OnInit {
     loadWorkflow(resId: number) {
         this.loading = true;
         this.avisWorkflow.items = [];
-        this.http.get("../../rest/res/" + resId + "/avisCircuit")
+        this.http.get("../../rest/resources/" + resId + "/opinionCircuit")
          .subscribe((data: any) => {
             data.forEach((element:any) => {
                 this.avisWorkflow.items.push(element);
@@ -106,4 +106,4 @@ export class AvisWorkflowComponent implements OnInit {
     getAvisCount() {
         return this.avisWorkflow.items.length;
     }
-}
\ No newline at end of file
+}
diff --git a/src/frontend/app/visa/visa-workflow.component.ts b/src/frontend/app/visa/visa-workflow.component.ts
index 87cfb52d698f58a906a0e0b1dca958fbda68f8e4..d77621146f8715b4af220ae6528d22c2410fc9d4 100644
--- a/src/frontend/app/visa/visa-workflow.component.ts
+++ b/src/frontend/app/visa/visa-workflow.component.ts
@@ -75,7 +75,7 @@ export class VisaWorkflowComponent implements OnInit {
     loadWorkflow(resId: number) {
         this.loading = true;
         this.visaWorkflow.items = [];
-        this.http.get("../../rest/res/" + resId + "/visaCircuit")
+        this.http.get("../../rest/resources/" + resId + "/visaCircuit")
             .subscribe((data: any) => {
                 data.forEach((element: any) => {
                     this.visaWorkflow.items.push(element);
@@ -128,4 +128,4 @@ export class VisaWorkflowComponent implements OnInit {
                 this.notify.handleErrors(err);
             });
     }
-}
\ No newline at end of file
+}
diff --git a/test/unitTests/app/user/UserControllerTest.php b/test/unitTests/app/user/UserControllerTest.php
index 4e45719c1e5b2c7b08c518f4d00d7c4846c25829..4afe896ed0ea34a6e1f166ef9c1d45b2d5cd42f1 100755
--- a/test/unitTests/app/user/UserControllerTest.php
+++ b/test/unitTests/app/user/UserControllerTest.php
@@ -629,7 +629,7 @@ class UserControllerTest extends TestCase
         $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'DELETE']);
         $request        = \Slim\Http\Request::createFromEnvironment($environment);
         $response       = $userController->delete($request, new \Slim\Http\Response(), ['id' => self::$id]);
-        $responseBody   = json_decode((string)$response->getBody());
+        $this->assertSame(204, $response->getStatusCode());
 
         //  READ
         $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
@@ -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[homeGroups] is not filled with all user\'s groups', $responseBody['errors']);
     }
 
     public function testSetRedirectedBasket()