diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 93966ccf5d060acde6e8445b46d8ad940fbeb19a..a3befbf2a3a67cb00914dbc48594473891f48262 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -20,6 +20,7 @@ linux:
     - linux
   variables:
     FTL_LIB: ../../build/SDK/C/libftl-dev.so
+    LD_LIBRARY_PATH: /opt/pylon/lib/
 #  before_script:
 #    - export DEBIAN_FRONTEND=noninteractive
 #    - apt-get update -qq && apt-get install -y -qq g++ cmake git
@@ -27,8 +28,9 @@ linux:
   script:
     - mkdir build
     - cd build
-    - cmake .. -DWITH_OPTFLOW=TRUE -DUSE_CPPCHECK=FALSE -DBUILD_CALIBRATION=TRUE -DWITH_CERES=TRUE -DCMAKE_BUILD_TYPE=Release
+    - cmake .. -DWITH_OPTFLOW=TRUE -DUSE_CPPCHECK=FALSE -DBUILD_CALIBRATION=TRUE -DWITH_CERES=TRUE -DCMAKE_BUILD_TYPE=Release -DCPACK_GENERATOR=DEB
     - make
+    - make package
     - ctest --output-on-failure
     - cd ../SDK/Python
     - python3 -m unittest discover test
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3f2c96fb1656f40babca3c38cf2808f8906455c6..96fb65323bbab37cd9bc4c9ad3b99b28bc0466ab 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,6 +8,7 @@ project (ftl.utu.fi VERSION 0.0.4)
 
 include(GNUInstallDirs)
 include(CTest)
+
 enable_testing()
 
 option(WITH_OPTFLOW "Use NVIDIA Optical Flow if available" OFF)
@@ -119,7 +120,7 @@ endif()
 
 if (WITH_OPUS)
 	find_library( OPUS_LIBRARY NAMES opus PATHS ${OPUS_DIR} PATH_SUFFIXES lib)
-	
+
 	if (OPUS_LIBRARY)
 		find_path( OPUS_INCLUDE NAMES opus/opus.h)
 
@@ -184,7 +185,7 @@ if(${CMAKE_VERSION} VERSION_GREATER "3.12.0")
 	cmake_policy(SET CMP0074 NEW)
 endif()
 
-set(CMAKE_CXX_STANDARD 17) # For PCL/VTK https://github.com/PointCloudLibrary/pcl/issues/2686
+set(CMAKE_CXX_STANDARD 17)
 set(HAVE_OPENCV TRUE)
 
 # Readline library is not required on Windows
@@ -487,17 +488,9 @@ configure_file(${CMAKE_SOURCE_DIR}/components/common/cpp/src/config.cpp.in
 			   ${CMAKE_SOURCE_DIR}/components/common/cpp/src/config.cpp
 )
 
-# For issue #17
-# https://gitlab.kitware.com/cmake/cmake/issues/16915#note_456382
-if ( TARGET Qt5::Core )
-	get_property( core_options TARGET Qt5::Core PROPERTY INTERFACE_COMPILE_OPTIONS )
-	string( REPLACE "-fPIC" "" new_core_options "${core_options}" )
-	set_property( TARGET Qt5::Core PROPERTY INTERFACE_COMPILE_OPTIONS ${new_core_options} )
-	set_property( TARGET Qt5::Core PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE "ON" )
-	set( CMAKE_CXX_COMPILE_OPTIONS_PIE "-fPIC" )
-endif()
-
 if (WIN32) # TODO(nick) Should do based upon compiler (VS)
 	set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${VS_STARTUP_PROJECT})
 	set_property(TARGET ftl-vision PROPERTY VS_DEBUGGER_WORKING_DIRECTORY ${VS_DEBUG_WORKING_DIRECTORY})
 endif()
+
+include(ftl_CPack)
diff --git a/applications/gui/CMakeLists.txt b/applications/gui/CMakeLists.txt
index 8cd06d328bef06845dd5626feeaff340d6a26529..8b552cb9368844a2d4c5ef7776de9d8adc8d22a4 100644
--- a/applications/gui/CMakeLists.txt
+++ b/applications/gui/CMakeLists.txt
@@ -28,6 +28,7 @@ add_definitions(${NANOGUI_EXTRA_DEFS})
 include_directories(${NANOGUI_EXTRA_INCS})
 
 add_executable(ftl-gui ${GUISRC})
+install(TARGETS ftl-gui DESTINATION bin COMPONENT gui)
 
 target_include_directories(ftl-gui PUBLIC
 	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
diff --git a/applications/vision/CMakeLists.txt b/applications/vision/CMakeLists.txt
index a40126b95f7cc9234078528a0f59263eecf0f802..4c2674d8da075a997792027591260e5bd09bd5b1 100644
--- a/applications/vision/CMakeLists.txt
+++ b/applications/vision/CMakeLists.txt
@@ -10,6 +10,7 @@ set(CVNODESRC
 )
 
 add_executable(ftl-vision ${CVNODESRC})
+install(TARGETS ftl-vision DESTINATION bin COMPONENT vision)
 
 target_include_directories(ftl-vision PUBLIC
 	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
diff --git a/cmake/ftl_CPack.cmake b/cmake/ftl_CPack.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..b496c30bee1bb4a6cfcbe0eecd8c04db3ba3708e
--- /dev/null
+++ b/cmake/ftl_CPack.cmake
@@ -0,0 +1,32 @@
+# use build date as patch version
+string(TIMESTAMP BUILD_TIME "%Y%m%d")
+set(CPACK_PACKAGE_VERSION_PATCH "${BUILD_TIME}")
+
+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_DEBIAN_PACKAGE_SECTION "Miscellaneous")
+
+macro(deb_append_dependency DEPENDS)
+	if ("${CPACK_DEBIAN_PACKAGE_DEPENDS}" STREQUAL "")
+		set(CPACK_DEBIAN_PACKAGE_DEPENDS "${DEPENDS}")
+	else()
+		set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, ${DEPENDS}")
+	endif()
+endmacro()
+
+if (HAVE_PYLON)
+	deb_append_dependency("pylon (>= 6.1.1)")
+	set(ENV{LD_LIBRARY_PATH} "=/opt/pylon/lib/")
+endif()
+
+if(WIN32)
+	message(INFO "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")
+endif()
+
+include(CPack)
diff --git a/lib/libsgm/src/CMakeLists.txt b/lib/libsgm/src/CMakeLists.txt
index 89e5035877010c146dd4d0d988b263a9ccddf9df..a338f8380db8656ca4c3f1d84a9a8d119b834df4 100644
--- a/lib/libsgm/src/CMakeLists.txt
+++ b/lib/libsgm/src/CMakeLists.txt
@@ -31,12 +31,12 @@ install(
 )
 
 install(
-	DIRECTORY ${CMAKE_SOURCE_DIR}/include
+	DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../include
 	DESTINATION ${CMAKE_INSTALL_PREFIX}
 	FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp"
 )
 
 install(
-	FILES ${CMAKE_SOURCE_DIR}/FindLibSGM.cmake
+	FILES ${CMAKE_CURRENT_SOURCE_DIR}/../FindLibSGM.cmake
 	DESTINATION ${CMAKE_INSTALL_PREFIX}
 )