diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5e670bc1ceb92579ebf2e2aa39bbef6eede619be..90bc7c9edaf6cff8ea8046204bda453848beb8b8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,7 @@
 stages:
   - build
   - test
+  - package
   - release
 
 #########
@@ -12,11 +13,16 @@ build:
   script:
     - echo "TODO build pamhyr"
 
-# build-lang:
-#   stage: build
-#   script:
-#     - cd ./src/lang/
-#     - ./create_ts.sh
+build-lang:
+  stage: build
+  tags:
+    - linux
+  script:
+    - cd ./src/lang/
+    - ./create_ts.sh
+  artifacts:
+    paths:
+      - src/lang/*.qm
 
 #########
 # TESTS #
@@ -32,56 +38,64 @@ test:
 ############
 
 linux-package:
-  stage: release
+  stage: package
   tags:
     - release
     - linux
-  rules:
-    - if: $CI_COMMIT_BRANCH == 'master'
-    - if: $CI_COMMIT_TAG
-      when: never
+  needs:
+    - job: build-lang
+      artifacts: true
+  # rules:
+  #   - if: $CI_COMMIT_BRANCH == 'master' || $CI_COMMIT_TAG
+  #     when: never
   artifacts:
     paths:
-      # - packages/pamhyr-src.tar.gz
       - packages/pamhyr-gnulinux-amd64.tar.xz
   script:
     - cd packages
     - ./linux.sh
 
-# windows-package:
-#   stage: release
-#   tags:
-#     - release
-#     - wine
-#   rules:
-#     - if: $CI_COMMIT_BRANCH == 'master'
-#     - if: $CI_COMMIT_TAG
-#       when: never
-#   artifacts:
-#     paths:
-#       - packages/pamhyr-win-amd64.zip
-#       - packages/pamhyr-win-amd64.exe
-#   script:
-#     - cd packages
-#     - ./wine.sh ci
+windows-package:
+  stage: package
+  tags:
+    - release
+    - wine
+  needs:
+    - job: build-lang
+      artifacts: true
+  # rules:
+  #   - if: $CI_COMMIT_BRANCH == 'master' || $CI_COMMIT_TAG
+  #     when: never
+  artifacts:
+    paths:
+      - packages/pamhyr-win-amd64.exe
+  script:
+    - cd packages
+    - ./windows.bat
+
+###########
+# RELEASE #
+###########
 
 tag-release:
   stage: release
   tags:
     - release
     - linux
-    - wine
+  needs:
+    - job: linux-package
+      artifacts: true
+    - job: windows-package
+      artifacts: true
   rules:
     - if: $CI_COMMIT_TAG
   artifacts:
     paths:
       - packages/pamhyr-gnulinux-amd64.tar.xz
-      # - packages/pamhyr-win-amd64.zip
-      # - packages/pamhyr-win-amd64.exe
   script:
     - cd packages
-    - ./linux.sh
-    # - ./wine.sh ci
+    # - ./linux.sh
+    # # - ./wine.sh ci
   release:
     name: '$CI_COMMIT_TAG'
     description: 'Automatic release from tag $CI_COMMIT_TAG'
@@ -97,7 +111,7 @@ tag-release:
         #   url: '${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/packages/pamhyr-win-amd64.zip'
         #   filepath: '/packages/pamhyr-win-amd64.zip'
         #   link_type: 'Packages'
-        # - name: 'Windows amd64 (exe)'
-        #   url: '${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/packages/pamhyr-win-amd64.exe'
-        #   filepath: '/packages/pamhyr-win-amd64.exe'
-        #   link_type: 'Packages'
+        - name: 'Windows amd64 (exe)'
+          url: '${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/packages/pamhyr-win-amd64.exe'
+          filepath: '/packages/pamhyr-win-amd64.exe'
+          link_type: 'other'
diff --git a/packages/windows.bat b/packages/windows.bat
new file mode 100644
index 0000000000000000000000000000000000000000..42c46ba09cc6353cc13eb22fcf2095854c86cb62
--- /dev/null
+++ b/packages/windows.bat
@@ -0,0 +1,20 @@
+rem Windows batch for pamhyr windows version building
+@ECHO ON
+
+rem Python environment
+python -m pip install -r ..\requirements.txt
+
+rem Build windows version
+pyinstaller ..\src\pamhyr.py -y
+
+rem Copy data
+mkdir dist\pamhyr\View\ui\ressources
+mkdir dist\pamhyr\View\ui\Widgets
+
+copy /y ..\src\View\ui\ressources\ dist\pamhyr\View\ui\ressources
+copy /y ..\src\View\ui\Widgets\*.ui dist\pamhyr\View\ui\Widgets
+copy /y ..\src\View\ui\*.ui dist\pamhyr\View\ui\
+copy /y ..\src\lang\*.qm dist\pamhyr\lang\
+
+rem Make installer
+"C:\Program Files (x86)\NSIS\makensis.exe" pamhyr.nsi