diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0385bdba7868171455a86370c1855d931e690d32..40e8f893f524af44e839739a009451f3840ff45b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,6 +10,7 @@ stages:
   - static
   - build
   - test
+  - pack
 
 flawfinder-sast:
   stage: static
@@ -52,7 +53,7 @@ linux:build:
   script:
     - DEBIAN_FRONTEND=noninteractive apt update && apt install -y build-essential uuid-dev git libmsgpack-dev liburiparser-dev libgnutls28-dev cmake ninja-build cppcheck
     - mkdir build && cd build
-    - cmake $CI_PROJECT_DIR -GNinja -DCMAKE_CXX_FLAGS="-fdiagnostics-color" -DUSE_CPPCHECK=TRUE -DCMAKE_BUILD_TYPE=Release -DCPACK_GENERATOR=DEB
+    - cmake $CI_PROJECT_DIR -GNinja -DFTL_VERSION=$CI_COMMIT_TAG -DCMAKE_CXX_FLAGS="-fdiagnostics-color" -DUSE_CPPCHECK=TRUE -DCMAKE_BUILD_TYPE=Release -DCPACK_GENERATOR=DEB
     - ninja
 
   #cache:
@@ -108,6 +109,26 @@ linux:valgrind:
     reports:
       junit: build/report.xml
 
+linux:pack:
+  only:
+    - main
+
+  stage: pack
+  tags:
+    - docker
+  
+  needs: ["linux:build"]
+  script:
+    - DEBIAN_FRONTEND=noninteractive apt update && apt install -y libmsgpackc2 liburiparser1 cmake
+    - cd build
+    - cpack
+
+  artifacts:
+    when: always
+    paths:
+      - build/*.deb
+    expire_in: 1 week
+
 ### Windows
 
 windows:build:
@@ -157,3 +178,29 @@ windows:test:
     - $env:PATH+=";C:/Shared/Deploy"
     - cd build
     - ctest -V --output-on-failure --timeout 60
+
+windows:pack:
+  only:
+    - main
+  
+  stage: pack
+
+  tags:
+    - windows
+  needs: ["windows:build"]
+
+  cache: # use artifacts instead if multiple runners available
+    key: $CI_COMMIT_SHORT_SHA
+    paths:
+      - build/
+
+  script:
+    - $env:PATH+=";C:/Shared/Deploy"
+    - cd build
+    - cpack
+
+  artifacts:
+    when: always
+    paths:
+      - build/*.zip
+    expire_in: 1 week
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3f718626f578ffe51522e276b2892e91478541ec..14523cb787ce39db39e7a49141126a192fe2a068 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,7 +3,11 @@ include (CheckIncludeFile)
 include (CheckIncludeFileCXX)
 include (CheckFunctionExists)
 
-project (beyond-protocol VERSION 0.0.1)
+if (NOT FTL_VERSION)
+	set(FTL_VERSION 0.0.1)
+endif()
+
+project (beyond-protocol VERSION "${FTL_VERSION}")
 
 include(GNUInstallDirs)
 include(CTest)
@@ -145,7 +149,7 @@ if (WIN32) # TODO(nick) Should do based upon compiler (VS)
 	#set_property(TARGET voltu-node PROPERTY VS_DEBUGGER_WORKING_DIRECTORY ${VS_DEBUG_WORKING_DIRECTORY})
 endif()
 
-#include(ftl_CPack)
+include(ftl_CPack)
 
 ### ========
 
diff --git a/cmake/ftl_CPack.cmake b/cmake/ftl_CPack.cmake
index 2fb65fa614df7c11ab8f7aae2cd26767890eff33..47261558cce7d45f200029020698047c8307e914 100644
--- a/cmake/ftl_CPack.cmake
+++ b/cmake/ftl_CPack.cmake
@@ -1,15 +1,18 @@
 # use build date as patch version
 string(TIMESTAMP BUILD_TIME "%Y%m%d")
 set(CPACK_PACKAGE_VERSION_PATCH "${BUILD_TIME}")
-
+set(CPACK_PACKAGE_NAME "libftl-protocol")
+set(CPACK_DEBIAN_PACKAGE_NAME "FTL Protocol Library")
+set(CPACK_PACKAGE_VENDOR "University of Turku")
+set(CPACK_PACKAGE_DESCRIPTION "Networking and streaming library for FTL data")
 set(CPACK_DEBIAN_PACKAGE_MAINTAINER "UTU Future Tech Lab")
 set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
 set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS ON)
 set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY ">=")
-set(CPACK_DEB_PACKAGE_COMPONENT ON)
+#set(CPACK_DEB_PACKAGE_COMPONENT ON)
 set(CPACK_DEBIAN_PACKAGE_SECTION "Miscellaneous")
 
-install(DIRECTORY "${PROJECT_SOURCE_DIR}/data/" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/ftl/data/")
+#install(DIRECTORY "${PROJECT_SOURCE_DIR}/data/" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/ftl/data/")
 
 macro(deb_append_dependency DEPENDS)
 	if ("${CPACK_DEBIAN_PACKAGE_DEPENDS}" STREQUAL "")
@@ -19,16 +22,22 @@ macro(deb_append_dependency DEPENDS)
 	endif()
 endmacro()
 
-if (HAVE_PYLON)
-	deb_append_dependency("pylon (>= 6.1.1)")
-	set(ENV{LD_LIBRARY_PATH} "=/opt/pylon/lib/")
-endif()
+#if (HAVE_PYLON)
+#	deb_append_dependency("pylon (>= 6.1.1)")
+#	set(ENV{LD_LIBRARY_PATH} "=/opt/pylon/lib/")
+#endif()
+
+deb_append_dependency("libmsgpackc2 (>= 3.0.1-3)")
+deb_append_dependency("liburiparser1 (>= 0.9.3-2)")
+deb_append_dependency("libgnutlsxx28 (>= 3.6.13)")
 
 if(WIN32)
-	message(STATUS "Copying DLLs: OpenCV")
-	file(GLOB WINDOWS_LIBS "${OpenCV_INSTALL_PATH}/${OpenCV_ARCH}/${OpenCV_RUNTIME}/bin/*.dll")
-	install(FILES ${WINDOWS_LIBS} DESTINATION bin)
-	set(CPACK_GENERATOR "WiX")
+	#message(STATUS "Copying DLLs: OpenCV")
+	#file(GLOB WINDOWS_LIBS "${OpenCV_INSTALL_PATH}/${OpenCV_ARCH}/${OpenCV_RUNTIME}/bin/*.dll")
+	#install(FILES ${WINDOWS_LIBS} DESTINATION bin)
+	set(CPACK_GENERATOR "ZIP")
+else()
+	set(CPACK_GENERATOR "DEB")
 endif()
 
 include(CPack)