diff --git a/ui/ui-frontend/angular.json b/ui/ui-frontend/angular.json
index a17d362fe318e1d4a40888dbd1f45e18f6741563..f45b34c940d5fd2223f08966b33add08406bc153 100644
--- a/ui/ui-frontend/angular.json
+++ b/ui/ui-frontend/angular.json
@@ -52,7 +52,9 @@
                   "replace": "projects/identity/src/environments/environment.ts",
                   "with": "projects/identity/src/environments/environment.prod.ts"
                 }
-              ]
+              ],
+              "serviceWorker": true,
+              "ngswConfigPath": "projects/identity/ngsw-config.json"
             },
             "en": {
               "aot": true,
@@ -170,7 +172,9 @@
                   "replace": "projects/portal/src/environments/environment.ts",
                   "with": "projects/portal/src/environments/environment.prod.ts"
                 }
-              ]
+              ],
+              "serviceWorker": true,
+              "ngswConfigPath": "projects/portal/ngsw-config.json"
             },
             "en": {
               "aot": true,
diff --git a/ui/ui-frontend/package-lock.json b/ui/ui-frontend/package-lock.json
index 8f68f14df930857f557e870a190d0de9b6963191..ad1bf412c818a1e7ebdc5c6d9c57238a82eabd0f 100644
--- a/ui/ui-frontend/package-lock.json
+++ b/ui/ui-frontend/package-lock.json
@@ -789,6 +789,93 @@
         "tslib": "^1.9.0"
       }
     },
+    "@angular/pwa": {
+      "version": "0.1001.3",
+      "resolved": "https://nexus.teamdlab.com/repository/npm/@angular/pwa/-/pwa-0.1001.3.tgz",
+      "integrity": "sha512-qfrwvMExbjKnHmmtfopM2Iog1uIt28zpfbJQttmsLEmnOaWSwWutcRhOZhy+fKuLkD2KrFojAOxGEy411eMVXw==",
+      "requires": {
+        "@angular-devkit/core": "10.1.3",
+        "@angular-devkit/schematics": "10.1.3",
+        "@schematics/angular": "10.1.3",
+        "parse5-html-rewriting-stream": "6.0.1"
+      },
+      "dependencies": {
+        "@angular-devkit/core": {
+          "version": "10.1.3",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/@angular-devkit/core/-/core-10.1.3.tgz",
+          "integrity": "sha512-Ub31/eqFtSuQy3V+B74Jt0jAUw8fs8sbd0ZL2UHYUJyrwm20iIRam+mOD3Sj8HFrDGLR8m56KsxJ12KvC1oxtQ==",
+          "requires": {
+            "ajv": "6.12.4",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.6.2",
+            "source-map": "0.7.3"
+          }
+        },
+        "@angular-devkit/schematics": {
+          "version": "10.1.3",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/@angular-devkit/schematics/-/schematics-10.1.3.tgz",
+          "integrity": "sha512-5+E2bBBsphuz1KfloC5yA+hXSEbxMokkp5UEp+X9VC7zUGTXV8sxuvcbBo+JVutaoNHezJGu2JUx/LqNrKd58w==",
+          "requires": {
+            "@angular-devkit/core": "10.1.3",
+            "ora": "5.0.0",
+            "rxjs": "6.6.2"
+          }
+        },
+        "@schematics/angular": {
+          "version": "10.1.3",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/@schematics/angular/-/angular-10.1.3.tgz",
+          "integrity": "sha512-X3tNnpfF/jkl1KcyCC8PaOYogQlTZ9s7Yuz0va0DAVOptIqorpf8e6+lY0PPLKshaK9TSiFUcQ8SYYnjAVKcdA==",
+          "requires": {
+            "@angular-devkit/core": "10.1.3",
+            "@angular-devkit/schematics": "10.1.3",
+            "jsonc-parser": "2.3.0"
+          }
+        },
+        "ajv": {
+          "version": "6.12.4",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+        },
+        "fast-json-stable-stringify": {
+          "version": "2.1.0",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+          "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+        },
+        "magic-string": {
+          "version": "0.25.7",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/magic-string/-/magic-string-0.25.7.tgz",
+          "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+          "requires": {
+            "sourcemap-codec": "^1.4.4"
+          }
+        },
+        "rxjs": {
+          "version": "6.6.2",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+        }
+      }
+    },
     "@angular/router": {
       "version": "8.2.14",
       "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.14.tgz",
@@ -797,6 +884,14 @@
         "tslib": "^1.9.0"
       }
     },
+    "@angular/service-worker": {
+      "version": "8.2.14",
+      "resolved": "https://nexus.teamdlab.com/repository/npm/@angular/service-worker/-/service-worker-8.2.14.tgz",
+      "integrity": "sha512-Xv1ES5bXDRxPJ5uyRqeKw6mGKaJVzKK0oFcR0mr4OSdyLXGZ+x6fC2S/QcLy4ugpb64fyEksrnHhHjeMVzGh2Q==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
     "@babel/code-frame": {
       "version": "7.8.3",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
@@ -1854,8 +1949,7 @@
     "@types/color-name": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
-      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
-      "dev": true
+      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
     },
     "@types/events": {
       "version": "3.0.0",
@@ -3341,11 +3435,15 @@
       "version": "3.1.0",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/cli-cursor/-/cli-cursor-3.1.0.tgz",
       "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-      "dev": true,
       "requires": {
         "restore-cursor": "^3.1.0"
       }
     },
+    "cli-spinners": {
+      "version": "2.4.0",
+      "resolved": "https://nexus.teamdlab.com/repository/npm/cli-spinners/-/cli-spinners-2.4.0.tgz",
+      "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA=="
+    },
     "cli-width": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
@@ -4216,6 +4314,21 @@
         }
       }
     },
+    "defaults": {
+      "version": "1.0.3",
+      "resolved": "https://nexus.teamdlab.com/repository/npm/defaults/-/defaults-1.0.3.tgz",
+      "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+      "requires": {
+        "clone": "^1.0.2"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "1.0.4",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/clone/-/clone-1.0.4.tgz",
+          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+        }
+      }
+    },
     "define-properties": {
       "version": "1.1.3",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/define-properties/-/define-properties-1.1.3.tgz",
@@ -6435,6 +6548,11 @@
         "is-extglob": "^2.1.1"
       }
     },
+    "is-interactive": {
+      "version": "1.0.0",
+      "resolved": "https://nexus.teamdlab.com/repository/npm/is-interactive/-/is-interactive-1.0.0.tgz",
+      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="
+    },
     "is-number": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -6846,8 +6964,7 @@
     "json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
     },
     "json-stringify-safe": {
       "version": "5.0.1",
@@ -6870,6 +6987,11 @@
         "minimist": "^1.2.0"
       }
     },
+    "jsonc-parser": {
+      "version": "2.3.0",
+      "resolved": "https://nexus.teamdlab.com/repository/npm/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
+      "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA=="
+    },
     "jsonfile": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
@@ -7350,6 +7472,60 @@
       "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
       "dev": true
     },
+    "log-symbols": {
+      "version": "4.0.0",
+      "resolved": "https://nexus.teamdlab.com/repository/npm/log-symbols/-/log-symbols-4.0.0.tgz",
+      "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
+      "requires": {
+        "chalk": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
     "log4js": {
       "version": "6.3.0",
       "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz",
@@ -7763,8 +7939,7 @@
     "mimic-fn": {
       "version": "2.1.0",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
     },
     "mini-css-extract-plugin": {
       "version": "0.8.0",
@@ -7924,8 +8099,7 @@
     "mute-stream": {
       "version": "0.0.8",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/mute-stream/-/mute-stream-0.0.8.tgz",
-      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
-      "dev": true
+      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
     },
     "nan": {
       "version": "2.14.1",
@@ -8465,7 +8639,6 @@
       "version": "5.1.0",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/onetime/-/onetime-5.1.0.tgz",
       "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
-      "dev": true,
       "requires": {
         "mimic-fn": "^2.1.0"
       }
@@ -8494,6 +8667,80 @@
         "is-wsl": "^1.1.0"
       }
     },
+    "ora": {
+      "version": "5.0.0",
+      "resolved": "https://nexus.teamdlab.com/repository/npm/ora/-/ora-5.0.0.tgz",
+      "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==",
+      "requires": {
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-spinners": "^2.4.0",
+        "is-interactive": "^1.0.0",
+        "log-symbols": "^4.0.0",
+        "mute-stream": "0.0.8",
+        "strip-ansi": "^6.0.0",
+        "wcwidth": "^1.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
     "original": {
       "version": "1.0.2",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/original/-/original-1.0.2.tgz",
@@ -8724,6 +8971,37 @@
       "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
       "optional": true
     },
+    "parse5-html-rewriting-stream": {
+      "version": "6.0.1",
+      "resolved": "https://nexus.teamdlab.com/repository/npm/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz",
+      "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==",
+      "requires": {
+        "parse5": "^6.0.1",
+        "parse5-sax-parser": "^6.0.1"
+      },
+      "dependencies": {
+        "parse5": {
+          "version": "6.0.1",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/parse5/-/parse5-6.0.1.tgz",
+          "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+        }
+      }
+    },
+    "parse5-sax-parser": {
+      "version": "6.0.1",
+      "resolved": "https://nexus.teamdlab.com/repository/npm/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz",
+      "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==",
+      "requires": {
+        "parse5": "^6.0.1"
+      },
+      "dependencies": {
+        "parse5": {
+          "version": "6.0.1",
+          "resolved": "https://nexus.teamdlab.com/repository/npm/parse5/-/parse5-6.0.1.tgz",
+          "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+        }
+      }
+    },
     "parseqs": {
       "version": "0.0.5",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/parseqs/-/parseqs-0.0.5.tgz",
@@ -9537,8 +9815,7 @@
     "punycode": {
       "version": "2.1.1",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
     },
     "puppeteer": {
       "version": "1.20.0",
@@ -10020,7 +10297,6 @@
       "version": "3.1.0",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/restore-cursor/-/restore-cursor-3.1.0.tgz",
       "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-      "dev": true,
       "requires": {
         "onetime": "^5.1.0",
         "signal-exit": "^3.0.2"
@@ -10419,8 +10695,7 @@
     "signal-exit": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
-      "dev": true
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
     },
     "slash": {
       "version": "1.0.0",
@@ -10858,8 +11133,7 @@
     "sourcemap-codec": {
       "version": "1.4.8",
       "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
-      "dev": true
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
     },
     "spdx-correct": {
       "version": "3.1.1",
@@ -11681,7 +11955,6 @@
     },
     "ui-frontend-common": {
       "version": "file:../ui-frontend-common/ui-frontend-common-1.0.6.tgz",
-      "integrity": "sha512-bftHRYwqlxo1QVhFvLuGoDoScdGQsUo52EWDwvTyJ4pFcUxbK8BxVAzR/7G0kg02rbe1lHHJH/ZMbnzqVJ23Lw==",
       "requires": {
         "@angular/animations": "8.2.14",
         "@angular/cdk": "^8.2.3",
@@ -11865,7 +12138,6 @@
       "version": "4.2.2",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/uri-js/-/uri-js-4.2.2.tgz",
       "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
-      "dev": true,
       "requires": {
         "punycode": "^2.1.0"
       }
@@ -12200,6 +12472,14 @@
         "minimalistic-assert": "^1.0.0"
       }
     },
+    "wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://nexus.teamdlab.com/repository/npm/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+      "requires": {
+        "defaults": "^1.0.3"
+      }
+    },
     "web-animations-js": {
       "version": "2.3.2",
       "resolved": "https://nexus.dev.programmevitam.fr/repository/npm-group/web-animations-js/-/web-animations-js-2.3.2.tgz",
diff --git a/ui/ui-frontend/package.json b/ui/ui-frontend/package.json
index efbfa697e487937906f4d1dd087ef5dc21f4f825..8c7a75f4fb91006ab144fb8379336a29880c03e3 100644
--- a/ui/ui-frontend/package.json
+++ b/ui/ui-frontend/package.json
@@ -55,7 +55,9 @@
     "@angular/material": "^8.2.3",
     "@angular/platform-browser": "8.2.14",
     "@angular/platform-browser-dynamic": "8.2.14",
+    "@angular/pwa": "^0.1001.3",
     "@angular/router": "8.2.14",
+    "@angular/service-worker": "8.2.14",
     "bootstrap": "^4.5.0",
     "bufferutil": "^4.0.1",
     "classlist.js": "^1.1.20150312",
diff --git a/ui/ui-frontend/projects/identity/ngsw-config.json b/ui/ui-frontend/projects/identity/ngsw-config.json
new file mode 100644
index 0000000000000000000000000000000000000000..ac7a93048b03fc8508c1f228b06bd400761b2722
--- /dev/null
+++ b/ui/ui-frontend/projects/identity/ngsw-config.json
@@ -0,0 +1,26 @@
+{
+  "$schema": "../../node_modules/@angular/service-worker/config/schema.json",
+  "index": "/index.html",
+  "assetGroups": [
+    {
+      "name": "app",
+      "installMode": "prefetch",
+      "resources": {
+        "files": [
+          "/*.css",
+          "/*.js"
+        ]
+      }
+    }, {
+      "name": "assets",
+      "installMode": "lazy",
+      "updateMode": "prefetch",
+      "resources": {
+        "files": [
+          "/assets/**",
+          "/*.(eot|otf|svg|ttf|woff|woff2|ani)"
+        ]
+      }
+    }
+  ]
+}
diff --git a/ui/ui-frontend/projects/identity/src/app/app.module.ts b/ui/ui-frontend/projects/identity/src/app/app.module.ts
index 4460e0ffb55e91a627fbf5dd089879652862be70..9215311447e94c568c9f660d108624da70507d05 100644
--- a/ui/ui-frontend/projects/identity/src/app/app.module.ts
+++ b/ui/ui-frontend/projects/identity/src/app/app.module.ts
@@ -41,7 +41,9 @@ import { BrowserModule, Title } from '@angular/platform-browser';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { VitamUICommonModule, WINDOW_LOCATION } from 'ui-frontend-common';
 
+import { ServiceWorkerModule } from '@angular/service-worker';
 import { QuicklinkModule } from 'ngx-quicklink';
+import { environment } from '../environments/environment';
 import { AppRoutingModule } from './app-routing.module';
 import { AppComponent } from './app.component';
 import { CoreModule } from './core/core.module';
@@ -59,6 +61,7 @@ registerLocaleData(localeFr, 'fr');
     VitamUICommonModule,
     AppRoutingModule,
     QuicklinkModule,
+    ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),
   ],
   providers: [
     Title,
diff --git a/ui/ui-frontend/projects/identity/src/index.html b/ui/ui-frontend/projects/identity/src/index.html
index 26d84feea6518499adf0c661d709d0bff92496dd..e13224396abc8069e56429a077f35940b966d605 100644
--- a/ui/ui-frontend/projects/identity/src/index.html
+++ b/ui/ui-frontend/projects/identity/src/index.html
@@ -11,7 +11,8 @@
   <link rel="dns-prefetch" href="https://fonts.googleapis.com">
   <link rel="preconnect" href="https://fonts.gstatic.com">
   <link rel="dns-prefetch" href="https://fonts.gstatic.com">
-  <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet">
+  <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&amp;display=swap" rel="stylesheet">
+  <meta name="theme-color" content="#1976d2">
 </head>
 <body>
   <app-root> <!-- selector from app.component.ts -->
@@ -26,5 +27,6 @@
     </div>
 
   </app-root>
+  <noscript>Please enable JavaScript to continue using this application.</noscript>
 </body>
 </html>
diff --git a/ui/ui-frontend/projects/portal/ngsw-config.json b/ui/ui-frontend/projects/portal/ngsw-config.json
new file mode 100644
index 0000000000000000000000000000000000000000..ac7a93048b03fc8508c1f228b06bd400761b2722
--- /dev/null
+++ b/ui/ui-frontend/projects/portal/ngsw-config.json
@@ -0,0 +1,26 @@
+{
+  "$schema": "../../node_modules/@angular/service-worker/config/schema.json",
+  "index": "/index.html",
+  "assetGroups": [
+    {
+      "name": "app",
+      "installMode": "prefetch",
+      "resources": {
+        "files": [
+          "/*.css",
+          "/*.js"
+        ]
+      }
+    }, {
+      "name": "assets",
+      "installMode": "lazy",
+      "updateMode": "prefetch",
+      "resources": {
+        "files": [
+          "/assets/**",
+          "/*.(eot|otf|svg|ttf|woff|woff2|ani)"
+        ]
+      }
+    }
+  ]
+}
diff --git a/ui/ui-frontend/projects/portal/src/app/app.module.ts b/ui/ui-frontend/projects/portal/src/app/app.module.ts
index 9c9165e45eb995d0b0760e3aee82223c5705d55d..db0abc34ef43f04816b2d0dbef68d4aafac7401f 100644
--- a/ui/ui-frontend/projects/portal/src/app/app.module.ts
+++ b/ui/ui-frontend/projects/portal/src/app/app.module.ts
@@ -44,6 +44,7 @@ import { MatSnackBarModule } from '@angular/material/snack-bar';
 import { BrowserModule, Title } from '@angular/platform-browser';
 
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { ServiceWorkerModule } from '@angular/service-worker';
 import { QuicklinkModule } from 'ngx-quicklink';
 import { environment } from '../environments/environment';
 import { AppRoutingModule } from './app-routing.module';
@@ -67,6 +68,7 @@ registerLocaleData(localeFr, 'fr');
     AppRoutingModule,
     LoggerModule.forRoot(),
     QuicklinkModule,
+    ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),
   ],
   providers: [
     Title,
diff --git a/ui/ui-frontend/projects/portal/src/index.html b/ui/ui-frontend/projects/portal/src/index.html
index 26d84feea6518499adf0c661d709d0bff92496dd..e13224396abc8069e56429a077f35940b966d605 100644
--- a/ui/ui-frontend/projects/portal/src/index.html
+++ b/ui/ui-frontend/projects/portal/src/index.html
@@ -11,7 +11,8 @@
   <link rel="dns-prefetch" href="https://fonts.googleapis.com">
   <link rel="preconnect" href="https://fonts.gstatic.com">
   <link rel="dns-prefetch" href="https://fonts.gstatic.com">
-  <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet">
+  <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&amp;display=swap" rel="stylesheet">
+  <meta name="theme-color" content="#1976d2">
 </head>
 <body>
   <app-root> <!-- selector from app.component.ts -->
@@ -26,5 +27,6 @@
     </div>
 
   </app-root>
+  <noscript>Please enable JavaScript to continue using this application.</noscript>
 </body>
 </html>