diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ea9d4ea2ee86c3ce6193a9576bd7333a37815afc..492009b76630610c115e2365104f1cd039fbdf10 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,6 +6,8 @@ variables:
     DOCKER_TLS_CERTDIR:
     DOCKER_DRIVER: overlay2
 
+    PROJECT_NAME: DojoExerciseChecker
+
     VERSION_DEV_SUFFIX: '-dev'
 
     GITLAB_API_PROJECT_URL: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}
@@ -15,12 +17,24 @@ variables:
 
     PROJECT_FOLDER: ExerciseChecker
 
+    PACKAGE_REGISTRY_URL: "${GITLAB_API_PROJECT_URL}/packages/generic/${PROJECT_NAME}"
+
+    WIKI_FOLDER: Wiki
+
 
 .get_version:
     script:
         - IS_DEV=$([[ $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ]] && echo false || echo true)
         - VERSION=$(jq -r .version $PROJECT_FOLDER/package.json)$([[ $IS_DEV == true ]] && echo $VERSION_DEV_SUFFIX || echo '')
 
+
+.get_packages_url:
+    script:
+        # Wiki
+        - WIKI_ARCHIVE_NAME="${PROJECT_NAME}_Wiki_${VERSION}.tar.xz"
+        - PACKAGE_URL_WIKI="${PACKAGE_REGISTRY_URL}_Wiki/${VERSION}/${WIKI_ARCHIVE_NAME}"
+
+
 .init_dind_script:
     script:
         # Install dependencies
@@ -28,20 +42,25 @@ variables:
         - apk add git
         - apk add jq
         - apk add curl
+
         # Init docker buildx
         - docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD $DOCKER_REGISTRY
         - docker buildx create --use
+
         # Get version from package.json
         - !reference [.get_version, script]
         - CONTAINER_IMAGE=$DOCKER_REGISTRY_IMAGE:$VERSION
 
+
 .build_script:
     script:
         - !reference [ .init_dind_script, script ]
         - mkdir -p $ARTIFACTS_FOLDER
+
         # Download secure files
         - curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | sh
         - mv .secure_files/env_$VERSION $PROJECT_FOLDER/.env
+
         # Need to build for each platform separately because of multi-stage builds (docker buildx don't use cache same way as docker build)
         - >
             platform_array=$(echo $DOCKER_PLATFORMS | tr "," "\n");
@@ -50,20 +69,40 @@ variables:
               docker buildx build --pull --platform $platform --file $DOCKERFILE --tag $CONTAINER_IMAGE .
             done
 
+
 .clean_release:
     script:
         # Delete release if it already exists
         - 'curl --request DELETE --header "JOB-TOKEN: $CI_JOB_TOKEN" "${GITLAB_API_PROJECT_URL}/releases/${VERSION}"'
+
         # Delete tag if it already exists (use private-token because job-token don't have permission to delete tags)
         - 'curl --request DELETE --header "PRIVATE-TOKEN: $GITLAB_PROJECT_ACCESS_TOKEN" "${GITLAB_API_PROJECT_URL}/repository/tags/${VERSION}"'
+
+
+.clean_packages:
+    script:
+        # Get all packages of the project
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "${GITLAB_API_PROJECT_URL}/packages" > gitlabPackages.json'
+
+        # Filter and select packages to delete (based on version)
+        - packagesToDelete=`jq -r '.[] | select(.version=="'${VERSION}'") | ._links.delete_api_path' gitlabPackages.json`
+
+        # Delete packages by calling Gitlab API
+        - >
+            for deletePath in $packagesToDelete; do
+              echo "Deleting package at path : ${deletePath}"
+              curl --request DELETE --header "JOB-TOKEN: $CI_JOB_TOKEN" "${deletePath}"
+            done
     
 
 stages:
     - test
     - build
     - clean
+    - upload
     - release
 
+
 test:build:
     stage: test
     tags:
@@ -77,6 +116,7 @@ test:build:
     rules:
         - if: '$CI_COMMIT_TAG =~ "/^$/" && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_COMMIT_BRANCH !~ /^v[0-9]+(\.[0-9]+)*$/'
 
+
 build:version:
     stage: build
     tags:
@@ -87,11 +127,13 @@ build:version:
         - docker:dind
     script:
         - !reference [ .build_script, script ]
+
         # Here docker buildx can use cached images created in previous step
         - docker buildx build --platform $DOCKER_PLATFORMS --file $DOCKERFILE --push --tag $CONTAINER_IMAGE .
     rules:
         - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/'
 
+
 clean:release:
     stage: clean
     tags:
@@ -103,6 +145,19 @@ clean:release:
     rules:
         - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/'
 
+
+clean:packages:
+    stage: clean
+    tags:
+        - gitlab_clean
+    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
+    script:
+        - !reference [.get_version, script]
+        - !reference [.clean_packages, script]
+    rules:
+        - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/'
+
+
 clean:dev:release:
     stage: clean
     tags:
@@ -115,6 +170,20 @@ clean:dev:release:
     rules:
         - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
 
+
+clean:dev:packages:
+    stage: clean
+    tags:
+        - gitlab_clean
+    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
+    script:
+        - !reference [.get_version, script]
+        - VERSION="${VERSION}${VERSION_DEV_SUFFIX}"
+        - !reference [.clean_packages, script]
+    rules:
+        - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+
+
 clean:dev:dockerhub:
     stage: clean
     tags:
@@ -126,6 +195,7 @@ clean:dev:dockerhub:
     script:
         - !reference [.init_dind_script, script]
         - VERSION="${VERSION}${VERSION_DEV_SUFFIX}"
+
         # Remove dev tag
         ## Login to dockerhub (get JWT token)
         - GET_TOKEN_DATA=$(jq --null-input --arg username "$DOCKER_REGISTRY_USER" --arg password "$DOCKER_REGISTRY_PASSWORD" '{"username":$username,"password":$password}')
@@ -134,11 +204,36 @@ clean:dev:dockerhub:
               --header "Content-Type: application/json" \
               --header "JOB-TOKEN: $CI_JOB_TOKEN" \
               "https://hub.docker.com/v2/users/login/" | jq -r .token`
+
         ## Delete tag
         - 'curl --header "Authorization: JWT ${TOKEN}" --request DELETE "https://hub.docker.com/v2/repositories/${DOCKER_REGISTRY_IMAGE}/tags/${VERSION}/"'
     rules:
          - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
 
+
+upload:packages:wiki:
+    stage: upload
+    tags:
+        - gitlab_package
+    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
+    script:
+        # Install dependencies
+        - apk update
+        - apk add xz
+
+        - !reference [.get_version, script]
+        - !reference [.get_packages_url, script]
+
+        # Create archive
+        - WIKI_ARCHIVE_PATH="${ARTIFACTS_FOLDER}/${WIKI_ARCHIVE_NAME}"
+        - tar -v -c -C "${CI_PROJECT_DIR}/${WIKI_FOLDER}" -J -f "${WIKI_ARCHIVE_PATH}" . # Ubuntu: tar --verbose --create --cd wiki-test-2 --xz --file file.tar.bz2
+
+        # Send package
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${WIKI_ARCHIVE_PATH} "${PACKAGE_URL_WIKI}";'
+    rules:
+        - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/'
+
+
 release:dockerhub:latest:
     stage: release
     tags:
@@ -149,11 +244,60 @@ release:dockerhub:latest:
         - docker:dind
     script:
         - !reference [.init_dind_script, script]
+
         # Push latest tag
         - docker buildx imagetools create $CONTAINER_IMAGE --tag $DOCKER_REGISTRY_IMAGE:latest
     rules:
          - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
 
+
+release:wiki:
+    stage: release
+    tags:
+        - release
+    image: alpine:latest
+    script:
+        - !reference [.get_version, script]
+
+        - apk update
+        - apk add git
+
+        # Define URL for the wiki in terms of project-agnostic predefined variables
+        - WIKI_URL="${CI_SERVER_PROTOCOL}://project_${CI_PROJECT_ID}_bot:${GITLAB_PROJECT_ACCESS_TOKEN}@${CI_SERVER_HOST}:${CI_SERVER_PORT}/${CI_PROJECT_PATH}.wiki.git"
+
+        # Clone this project's wiki under /tmp
+        - rm -rf "/tmp/${CI_PROJECT_NAME}.wiki"
+        - cd /tmp
+        - git clone "${WIKI_URL}"
+
+        # Enter the cloned repo
+        - cd "${CI_PROJECT_NAME}.wiki"
+
+        # Update the file
+        - mv .git/ ../
+        - rm -rf ./*
+        - mv ../.git/ ./
+        - cp "${CI_PROJECT_DIR}/.gitignore" .
+        - cp -R "${CI_PROJECT_DIR}/${WIKI_FOLDER}/." .
+
+        # Set committer info
+        - git config user.name "$GITLAB_USER_NAME"
+        - git config user.email "$GITLAB_USER_EMAIL"
+
+        # Commit the gitignore file
+        - git add ".gitignore"
+        - git commit -m "Add gitignore file" || true
+
+        # Commit the file
+        - git add .
+        - git commit -m "${VERSION}" || true
+
+        # Push the change back to the master branch of the wiki
+        - git push origin "HEAD:main"
+    rules:
+        - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+
+
 release:gitlab:
     stage: release
     tags:
@@ -162,17 +306,28 @@ release:gitlab:
     script:
         - !reference [.get_version, script]
         - echo 'Running release_job'
+        - !reference [.get_packages_url, script]
+
         # Extract description from CHANGELOG.md
         - CHANGELOG_LINE_START=`awk '/##\ [0-9]+\.[0-9]+\.[0-9]+/{print NR; exit;}' CHANGELOG.md`
         - CHANGELOG_LINE_END=`awk '/##\ [0-9]+\.[0-9]+\.[0-9]+/{ count++; if(count>1) {print NR; exit;}}' CHANGELOG.md`
         - DESCRIPTION=`awk 'NR > '$CHANGELOG_LINE_START' && NR < '$CHANGELOG_LINE_END'' CHANGELOG.md`
+
         # Create Release (can't be done by release_step of gitlab image because it don't have access to env var defined in script_step)
         - >
             RELEASE_DATA=$(jq --null-input --arg version "$VERSION" --arg description "# Changelog (version $VERSION) $DESCRIPTION" --arg tag_name "$VERSION" --arg ref "$CI_COMMIT_SHORT_SHA" '{
                 "name": $version,
                 "description": $description,
                 "tag_name": $tag_name,
-                "ref": $ref
+                "ref": $ref,
+                "assets": {
+                    "links": [
+                        {
+                          "name": "Wiki",
+                          "url": "'${PACKAGE_URL_WIKI}'",
+                        }
+                    ]   
+                }
             }')
         - >
             curl --data "${RELEASE_DATA}" \
diff --git a/Wiki/Home.md b/Wiki/Home.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391