diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..e4c71e6e37f4289abd1285cc657241b69ada0df7
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,8 @@
+.git
+.gitignore
+
+.dockerignore
+
+**/node_modules
+
+jams
diff --git a/Dockerfile b/Dockerfile
index 591b5571c230c067dee11d6a7f47511f5c98b345..0d6818ab8a12782747a05d871e016a4109c987fb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,9 +1,32 @@
-FROM adoptopenjdk/openjdk11:jdk-11.0.2.9-alpine
+FROM maven:3.9.2-eclipse-temurin-11-alpine as build
+RUN apk update && apk add --no-cache python3 npm
+
+WORKDIR /app/jams-react-client
+COPY jams-react-client/package*.json ./
+RUN npm install
 
-WORKDIR /opt/jams
-COPY jams/*.jar ./
-COPY jams/libs libs/
-ADD jams/libs libs/
+WORKDIR /app
+COPY pom.xml .
+COPY ad-connector/pom.xml ad-connector/pom.xml
+COPY authentication-module/pom.xml authentication-module/pom.xml
+COPY datastore/pom.xml datastore/pom.xml
+COPY jami-dht/pom.xml jami-dht/pom.xml
+COPY jami-nameserver/pom.xml jami-nameserver/pom.xml
+COPY jams-ca/pom.xml jams-ca/pom.xml
+COPY jams-common/pom.xml jams-common/pom.xml
+COPY jams-launcher/pom.xml jams-launcher/pom.xml
+COPY ldap-connector/pom.xml ldap-connector/pom.xml
+COPY jams-server/pom.xml jams-server/pom.xml
+# RUN mvn verify --fail-never
+# RUN mvn dependency:resolve --fail-never
+RUN mvn dependency:go-offline --fail-never
 
+COPY . .
+# RUN mvn clean package
+RUN mvn package
+
+FROM adoptopenjdk/openjdk11:jdk-11.0.2.9-alpine
+WORKDIR /app
+COPY --from=build /app/jams .
 EXPOSE 8080
 ENTRYPOINT ["java","-jar","jams-launcher.jar"]
diff --git a/README.md b/README.md
index a666bd5c51fe0f52e54ab2c6c7db3a97b0f66038..1c7567a47c365b23df95d364cb330290e9fdc46c 100644
--- a/README.md
+++ b/README.md
@@ -10,18 +10,25 @@
 Clone the contents of this repository and run
 
 ```
+cd jams-react-client
+npm install
+npm start
+cd ..
 mvn clean package
 ```
 
 This will create a distribution folder called `jams` in the root folder. You can
 then launch the server by running
 
-`java -jar jams-launcher`
+```
+cd jams
+java -jar jams-launcher.jar
+```
 
 If you want to start the server with an SSL certificate and on a port different
 from 8080, then run:
 
-`java -jar jams-launcher 8443 server.pem server.key`
+`java -jar jams-launcher.jar 8443 server.pem server.key`
 
 Where the `pem` and `key` files are a pem encoded certificate and key.
 
@@ -40,6 +47,8 @@ To build the documentation, change enter the `jams-server` directory and simply
 
 `apidoc -i src/ -o doc/`
 
+You can then open `doc/index.html`. Click on 1.0.0 in the top right corner if the doc doesn't appear.
+
 ##### Building the Docker container
 
 You can build the docker container using:
@@ -48,8 +57,8 @@ You can build the docker container using:
 docker build -f Dockerfile -t jams:latest .
 ```
 
-To run the docker container (assuming you want to have it on port 80 locally):
+To run the docker container (assuming you want to have it on port 8080 locally):
 
 ```
-docker run -p 80:8080 --rm jams:latest
+docker run -p 8080:8080 --rm jams:latest
 ```
diff --git a/jams-react-client/.eslintrc.js b/jams-react-client/.eslintrc.js
index e254df4e39c6f254a7cf35a90fb4e4293f857d31..825c08260d227a0820b09f2eef5b55893be9b60c 100644
--- a/jams-react-client/.eslintrc.js
+++ b/jams-react-client/.eslintrc.js
@@ -18,4 +18,7 @@ module.exports = {
     "plugin:react/recommended",
     "plugin:prettier/recommended",
   ],
+  rules: {
+    "react/prop-types": "off",
+  },
 };
diff --git a/jams-react-client/jsconfig.json b/jams-react-client/jsconfig.json
index 256380f5ef4b1cc3b00ed8e56d5a5b930f67f57e..7057df91f1fe2916507b5fc052919b9c563c57d4 100644
--- a/jams-react-client/jsconfig.json
+++ b/jams-react-client/jsconfig.json
@@ -2,7 +2,7 @@
   "compilerOptions": {
     "baseUrl": "src",
     "paths": {
-      "*": ["src/*"]
+      "*": ["./src/*"]
     }
   }
 }
diff --git a/jams-react-client/package.json b/jams-react-client/package.json
index e7d90b82dd8b082bfe37773cdf15571640f025aa..5dffbf29cea097498949f0595272bac6ee4500ed 100644
--- a/jams-react-client/package.json
+++ b/jams-react-client/package.json
@@ -5,7 +5,6 @@
   "private": false,
   "main": "dist/index.js",
   "dependencies": {
-    "@lingui/react": "^2.9.2",
     "@material-ui/core": "4.12.1",
     "@material-ui/icons": "4.9.1",
     "@material-ui/lab": "^4.0.0-alpha.56",
@@ -22,16 +21,14 @@
     "image-to-base64": "^2.1.1",
     "lodash": "^4.17.19",
     "material-ui-popup-state": "^1.6.1",
-    "notistack": "^0.9.17",
-    "package.json": "^2.0.1",
     "perfect-scrollbar": "1.5.0",
     "prop-types": "15.7.2",
     "react": "^16.13.1",
-    "react-chartist": "0.14.3",
+    "react-color": "^2.19.3",
     "react-copy-to-clipboard": "^5.0.2",
     "react-dom": "16.13.1",
+    "react-dropzone": "^14.2.3",
     "react-easy-crop": "^3.1.1",
-    "react-google-maps": "9.4.5",
     "react-i18next": "^11.7.3",
     "react-image-file-resizer": "^0.3.8",
     "react-intl": "5.0.2",
@@ -43,12 +40,12 @@
     "yup-phone": "^1.2.3"
   },
   "scripts": {
-    "start": "NODE_PATH=./src react-scripts start",
-    "build": "react-scripts build && ./node_modules/.bin/i18next-scanner",
+    "start": "export SET NODE_OPTIONS=--openssl-legacy-provider && NODE_PATH=./src react-scripts start",
+    "build": "export SET NODE_OPTIONS=--openssl-legacy-provider && react-scripts build && ./node_modules/.bin/i18next-scanner",
     "test": "react-scripts test --env=jsdom",
     "eject": "react-scripts eject",
     "install:clean": "rm -rf node_modules/ && rm -rf package-lock.json && npm install && npm start",
-    "format": "prettier --write \"src/**/*\"",
+    "format": "prettier --write --loglevel warn 'src/**/*.js'",
     "lint:check": "eslint . --ext=js,jsx;  exit 0",
     "lint:fix": "eslint . --ext=js,jsx --fix;  exit 0",
     "build-package-css": "cp src/assets/css/material-dashboard-react.css dist/material-dashboard-react.css",
@@ -64,17 +61,11 @@
   "bugs": {
     "url": "https://github.com/creativetimofficial/material-dashboard-react/issues"
   },
-  "homepage": "https://creativetimofficial.github.io/material-dashboard-react/#/dashboard",
   "optionalDependencies": {
-    "@types/googlemaps": "3.39.6",
-    "@types/markerclustererplus": "2.1.33",
-    "ajv": "6.12.2",
     "typescript": "3.9.3"
   },
   "devDependencies": {
     "@babel/core": "^7.11.6",
-    "@lingui/cli": "^2.9.2",
-    "@lingui/macro": "^2.9.2",
     "babel-core": "^7.0.0-bridge.0",
     "babel-plugin-i18next-extract": "^0.8.0",
     "eslint-config-prettier": "6.11.0",
@@ -84,7 +75,7 @@
     "i18next-parser": "^3.3.0",
     "i18next-scanner": "^2.11.0",
     "prettier": "2.0.5",
-    "webpack-cli": "^3.3.12"
+    "react-error-overlay": "^6.0.9"
   },
   "browserslist": {
     "production": [