diff --git a/CMakeLists.txt b/CMakeLists.txt
index f8eee01e..643613d1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,6 +19,7 @@ if(POLICY CMP0042)
   cmake_policy(SET CMP0042 OLD)
 endif()
 
+option(QT6 "Build with Qt 6" OFF)
 option(BUILD_TESTS "Create test" ON)
 option(BUILD_TOOLS "Compile mozcerts and qcatool" ON)
 set(BUILD_PLUGINS "auto" CACHE STRING "Plugins for building (also possible values: none, all and auto)")
@@ -43,15 +44,27 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" )
 
 # Do not automatically link Qt executables to qtmain target on Windows.
 # QCA exucatables use console mode only. Not need to link against qtmain.lib.
-set(Qt5_NO_LINK_QTMAIN ON)
-find_package(Qt5 5.9 REQUIRED Core)
+if(QT6)
+  message(STATUS "Building Qt 6 version")
+  find_package(Qt6 COMPONENTS Core Test Core5Compat REQUIRED)
+else()
+  message(STATUS "Building Qt 5 version")
+  set(Qt5_NO_LINK_QTMAIN ON)
+  find_package(Qt5 5.14 REQUIRED Core)
+endif()
+
 set(CMAKE_AUTOMOC ON)
 
 include(QcaMacro)
 include(GNUInstallDirs)
-setup_qt5_dirs()
-set(QCA_QT_PC_VERSION "Qt5Core")
-set(QCA_SUFFIX "qt5")
+setup_qt_dirs()
+if(QT6)
+  set(QCA_QT_PC_VERSION "Qt6Core")
+  set(QCA_SUFFIX "qt6")
+else()
+  set(QCA_QT_PC_VERSION "Qt5Core")
+  set(QCA_SUFFIX "qt5")
+endif()
 
 # QCA can be shared but plugins will be static
 # if Qt is static.
@@ -341,9 +354,11 @@ set( qca_HEADERS ${private_HEADERS} ${public_HEADERS} )
 
 include_directories("${qca_INCLUDEDIR}/QtCrypto")
 
-configure_file("crypto.prf.cmake" "${CMAKE_BINARY_DIR}/mkspecs/features/crypto.prf" @ONLY)
-if(NOT DEVELOPER_MODE)
-  install(FILES "${CMAKE_BINARY_DIR}/mkspecs/features/crypto.prf" DESTINATION "${QCA_FEATURE_INSTALL_DIR}")
+if(NOT QT6)
+  configure_file("crypto.prf.cmake" "${CMAKE_BINARY_DIR}/mkspecs/features/crypto.prf" @ONLY)
+  if(NOT DEVELOPER_MODE)
+    install(FILES "${CMAKE_BINARY_DIR}/mkspecs/features/crypto.prf" DESTINATION "${QCA_FEATURE_INSTALL_DIR}")
+  endif()
 endif()
 
 configure_file(man/qcatool.1 "${CMAKE_BINARY_DIR}/share/man/man1/${QCA_TOOL_NAME}.1" COPYONLY)
@@ -455,8 +470,13 @@ if(NOT DEVELOPER_MODE)
     if(NOT QCA_SUFFIX)
 
       message("${ESCAPE}[31mYou don't have QCA_SUFFIX set. Please note that the recommended way of")
-      message("building Qt5 version of qca for Linux distributions is to set")
-      message("QCA_SUFFIX to qt5 (-DQCA_SUFFIX=qt5).")
+      if(QT6)
+        message("building Qt6 version of qca for Linux distributions is to set")
+        message("QCA_SUFFIX to qt6 (-DQCA_SUFFIX=qt6).")
+      else()
+        message("building Qt5 version of qca for Linux distributions is to set")
+        message("QCA_SUFFIX to qt5 (-DQCA_SUFFIX=qt5).")
+      endif()
       message("${ESCAPE}[0m")
     endif()
   endif()
diff --git a/cmake/modules/QcaMacro.cmake b/cmake/modules/QcaMacro.cmake
index 5d86e472..80af6e84 100644
--- a/cmake/modules/QcaMacro.cmake
+++ b/cmake/modules/QcaMacro.cmake
@@ -1,6 +1,10 @@
 
-MACRO(SETUP_QT5_DIRS)
-  GET_TARGET_PROPERTY(QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} LOCATION)
+MACRO(SETUP_QT_DIRS)
+  if(QT6)
+    GET_TARGET_PROPERTY(QMAKE_EXECUTABLE Qt6::qmake LOCATION)
+  else()
+    GET_TARGET_PROPERTY(QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} LOCATION)
+  endif()
   EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_LIBS" OUTPUT_VARIABLE QT_LIBRARY_DIR )
   EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_PREFIX" OUTPUT_VARIABLE QT_PREFIX_DIR )
   EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_PLUGINS" OUTPUT_VARIABLE QT_PLUGINS_DIR )
@@ -10,7 +14,7 @@ MACRO(SETUP_QT5_DIRS)
   EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_INSTALL_DATA" OUTPUT_VARIABLE QT_DATA_DIR )
   EXEC_PROGRAM( ${QMAKE_EXECUTABLE} ARGS "-query QT_HOST_DATA" OUTPUT_VARIABLE QT_ARCHDATA_DIR )
   SET( QT_MKSPECS_DIR "${QT_ARCHDATA_DIR}/mkspecs" )
-ENDMACRO(SETUP_QT5_DIRS)
+ENDMACRO(SETUP_QT_DIRS)
 
 macro(set_enabled_plugin PLUGIN ENABLED)
   # To nice looks
@@ -50,7 +54,11 @@ endmacro(target_link_qca_libraries)
 # it used to build unittests
 macro(target_link_qca_test_libraries TARGET)
   target_link_qca_libraries(${TARGET})
-  target_link_libraries(${TARGET} Qt5::Test)
+  if(QT6)
+    target_link_libraries(${TARGET} Qt6::Test)
+  else()
+    target_link_libraries(${TARGET} Qt5::Test)
+  endif()
 endmacro(target_link_qca_test_libraries)
 
 # it used to build unittests
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index a8b16041..026d2c3d 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -1,5 +1,9 @@
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
-find_package(Qt5 REQUIRED Network)
+if(QT6)
+  find_package(Qt6 REQUIRED Network)
+else()
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
+  find_package(Qt5 REQUIRED Network)
+endif()
 add_subdirectory(aes-cmac)
 add_subdirectory(base64test)
 add_subdirectory(certtest)
diff --git a/examples/saslclient/CMakeLists.txt b/examples/saslclient/CMakeLists.txt
index 958a242f..90ca336d 100644
--- a/examples/saslclient/CMakeLists.txt
+++ b/examples/saslclient/CMakeLists.txt
@@ -3,4 +3,8 @@ set(saslclient_bin_SRCS saslclient.cpp)
 add_executable(saslclient ${saslclient_bin_SRCS})
 
 target_link_qca_libraries(saslclient)
-target_link_libraries(saslclient Qt5::Network)
+if(QT6)
+  target_link_libraries(saslclient Qt6::Network)
+else()
+  target_link_libraries(saslclient Qt5::Network)
+endif()
diff --git a/examples/saslserver/CMakeLists.txt b/examples/saslserver/CMakeLists.txt
index f4e871d5..cdc32f64 100644
--- a/examples/saslserver/CMakeLists.txt
+++ b/examples/saslserver/CMakeLists.txt
@@ -3,4 +3,8 @@ set(saslserver_bin_SRCS saslserver.cpp)
 add_executable(saslserver ${saslserver_bin_SRCS})
 
 target_link_qca_libraries(saslserver)
-target_link_libraries(saslserver Qt5::Network)
+if(QT6)
+  target_link_libraries(saslserver Qt6::Network)
+else()
+  target_link_libraries(saslserver Qt5::Network)
+endif()
diff --git a/examples/sslservtest/CMakeLists.txt b/examples/sslservtest/CMakeLists.txt
index a65b5484..43dc667e 100644
--- a/examples/sslservtest/CMakeLists.txt
+++ b/examples/sslservtest/CMakeLists.txt
@@ -3,4 +3,8 @@ set(sslservtest_bin_SRCS sslservtest.cpp)
 add_executable(sslservtest ${sslservtest_bin_SRCS})
 
 target_link_qca_libraries(sslservtest)
-target_link_libraries(sslservtest Qt5::Network)
+if(QT6)
+  target_link_libraries(sslservtest Qt6::Network)
+else()
+  target_link_libraries(sslservtest Qt5::Network)
+endif()
diff --git a/examples/ssltest/CMakeLists.txt b/examples/ssltest/CMakeLists.txt
index c3fececa..ddce01fc 100644
--- a/examples/ssltest/CMakeLists.txt
+++ b/examples/ssltest/CMakeLists.txt
@@ -3,4 +3,8 @@ set(ssltest_bin_SRCS ssltest.cpp)
 add_executable(ssltest ${ssltest_bin_SRCS})
 
 target_link_qca_libraries(ssltest)
-target_link_libraries(ssltest Qt5::Network)
+if(QT6)
+  target_link_libraries(ssltest Qt6::Network)
+else()
+  target_link_libraries(ssltest Qt5::Network)
+endif()
diff --git a/examples/tlssocket/CMakeLists.txt b/examples/tlssocket/CMakeLists.txt
index e3f40220..2e856a30 100644
--- a/examples/tlssocket/CMakeLists.txt
+++ b/examples/tlssocket/CMakeLists.txt
@@ -1,4 +1,8 @@
 add_executable(tlssocket tlssocket.cpp main.cpp)
 
 target_link_qca_libraries(tlssocket)
-target_link_libraries(tlssocket Qt5::Network)
+if(QT6)
+  target_link_libraries(tlssocket Qt6::Network)
+else()
+  target_link_libraries(tlssocket Qt5::Network)
+endif()
diff --git a/plugins/qca-botan/CMakeLists.txt b/plugins/qca-botan/CMakeLists.txt
index d6837d0d..0777fe17 100644
--- a/plugins/qca-botan/CMakeLists.txt
+++ b/plugins/qca-botan/CMakeLists.txt
@@ -15,7 +15,11 @@ if(BOTAN_FOUND)
     set_property(TARGET qca-botan  PROPERTY SUFFIX ".dylib")
   endif()
 
-  target_link_libraries(qca-botan Qt5::Core ${QCA_LIB_NAME} PkgConfig::BOTAN)
+  if(QT6)
+    target_link_libraries(qca-botan Qt6::Core ${QCA_LIB_NAME} PkgConfig::BOTAN)
+  else()
+    target_link_libraries(qca-botan Qt5::Core ${QCA_LIB_NAME} PkgConfig::BOTAN)
+  endif()
 
   if(NOT DEVELOPER_MODE)
     install(TARGETS qca-botan
diff --git a/plugins/qca-cyrus-sasl/CMakeLists.txt b/plugins/qca-cyrus-sasl/CMakeLists.txt
index 160af7c8..efa7ecab 100644
--- a/plugins/qca-cyrus-sasl/CMakeLists.txt
+++ b/plugins/qca-cyrus-sasl/CMakeLists.txt
@@ -15,7 +15,11 @@ if(SASL2_FOUND)
     set_property(TARGET qca-cyrus-sasl PROPERTY SUFFIX ".dylib")
   endif()
 
-  target_link_libraries(qca-cyrus-sasl Qt5::Core ${QCA_LIB_NAME} ${SASL2_LIBRARIES})
+  if(QT6)
+    target_link_libraries(qca-cyrus-sasl Qt6::Core ${QCA_LIB_NAME} ${SASL2_LIBRARIES})
+  else()
+    target_link_libraries(qca-cyrus-sasl Qt5::Core ${QCA_LIB_NAME} ${SASL2_LIBRARIES})
+  endif()
 
   if(NOT DEVELOPER_MODE)
     install(TARGETS qca-cyrus-sasl
diff --git a/plugins/qca-gcrypt/CMakeLists.txt b/plugins/qca-gcrypt/CMakeLists.txt
index f01e8c2a..b17f5c57 100644
--- a/plugins/qca-gcrypt/CMakeLists.txt
+++ b/plugins/qca-gcrypt/CMakeLists.txt
@@ -25,7 +25,11 @@ if(LIBGCRYPT_FOUND)
       set_property(TARGET qca-gcrypt PROPERTY SUFFIX ".dylib")
     endif()
 
-    target_link_libraries(qca-gcrypt Qt5::Core ${QCA_LIB_NAME} ${LIBGCRYPT_LIBRARIES})
+    if(QT6)
+      target_link_libraries(qca-gcrypt Qt6::Core ${QCA_LIB_NAME} ${LIBGCRYPT_LIBRARIES})
+    else()
+      target_link_libraries(qca-gcrypt Qt5::Core ${QCA_LIB_NAME} ${LIBGCRYPT_LIBRARIES})
+    endif()
 
     if(NOT DEVELOPER_MODE)
       install(TARGETS qca-gcrypt
diff --git a/plugins/qca-gnupg/CMakeLists.txt b/plugins/qca-gnupg/CMakeLists.txt
index cbe33b6f..74dcb785 100644
--- a/plugins/qca-gnupg/CMakeLists.txt
+++ b/plugins/qca-gnupg/CMakeLists.txt
@@ -42,7 +42,11 @@ if(APPLE AND ${PLUGIN_TYPE} STREQUAL "MODULE")
 endif()
 
 include_directories(gpgproc)
-target_link_libraries(qca-gnupg Qt5::Core ${QCA_LIB_NAME})
+if(QT6)
+  target_link_libraries(qca-gnupg Qt6::Core ${QCA_LIB_NAME})
+else()
+  target_link_libraries(qca-gnupg Qt5::Core ${QCA_LIB_NAME})
+endif()
 
 if (WIN32)
   target_link_libraries(qca-gnupg advapi32)
diff --git a/plugins/qca-logger/CMakeLists.txt b/plugins/qca-logger/CMakeLists.txt
index 9f8b4349..c635ed91 100644
--- a/plugins/qca-logger/CMakeLists.txt
+++ b/plugins/qca-logger/CMakeLists.txt
@@ -11,7 +11,12 @@ endif()
 
 add_definitions(${LOGGERH_DEFINITIONS})
 include_directories(${LOGGERH_INCLUDE_DIR})
-target_link_libraries(qca-logger Qt5::Core)
+if(QT6)
+  target_link_libraries(qca-logger Qt6::Core)
+else()
+  target_link_libraries(qca-logger Qt5::Core)
+endif()
+
 target_link_libraries(qca-logger ${QCA_LIB_NAME})
 
 if(NOT DEVELOPER_MODE)
diff --git a/plugins/qca-nss/CMakeLists.txt b/plugins/qca-nss/CMakeLists.txt
index 533d09c1..f2e5577a 100644
--- a/plugins/qca-nss/CMakeLists.txt
+++ b/plugins/qca-nss/CMakeLists.txt
@@ -10,7 +10,11 @@ if(NSS_FOUND)
 
   set(QCA_NSS_SOURCES qca-nss.cpp)
   add_library(qca-nss ${PLUGIN_TYPE} ${QCA_NSS_SOURCES})
-  target_link_libraries(qca-nss Qt5::Core ${QCA_LIB_NAME} PkgConfig::NSS)
+  if(QT6)
+    target_link_libraries(qca-nss Qt6::Core ${QCA_LIB_NAME} PkgConfig::NSS)
+  else()
+    target_link_libraries(qca-nss Qt5::Core ${QCA_LIB_NAME} PkgConfig::NSS)
+  endif()
 
   if(APPLE AND ${PLUGIN_TYPE} STREQUAL "MODULE")
     set_property(TARGET qca-nss PROPERTY SUFFIX ".dylib")
diff --git a/plugins/qca-ossl/CMakeLists.txt b/plugins/qca-ossl/CMakeLists.txt
index efffbb5d..4eb265a5 100644
--- a/plugins/qca-ossl/CMakeLists.txt
+++ b/plugins/qca-ossl/CMakeLists.txt
@@ -55,7 +55,11 @@ if(OPENSSL_FOUND)
     set_property(TARGET qca-ossl PROPERTY SUFFIX ".dylib")
   endif()
 
-  target_link_libraries(qca-ossl Qt5::Core)
+  if(QT6)
+    target_link_libraries(qca-ossl Qt6::Core)
+  else()
+    target_link_libraries(qca-ossl Qt5::Core)
+  endif()
   target_link_libraries(qca-ossl ${QCA_LIB_NAME})
   target_link_libraries(qca-ossl OpenSSL::SSL OpenSSL::Crypto)
 
diff --git a/plugins/qca-pkcs11/CMakeLists.txt b/plugins/qca-pkcs11/CMakeLists.txt
index 51758a77..1a8212d8 100644
--- a/plugins/qca-pkcs11/CMakeLists.txt
+++ b/plugins/qca-pkcs11/CMakeLists.txt
@@ -20,7 +20,11 @@ if(OPENSSL_FOUND AND PKCS11H_FOUND)
 
   add_definitions(${PKCS11H_CFLAGS_OTHER})
   include_directories(${PKCS11H_INCLUDE_DIRS})
-  target_link_libraries(qca-pkcs11 Qt5::Core)
+  if(QT6)
+    target_link_libraries(qca-pkcs11 Qt6::Core)
+  else()
+    target_link_libraries(qca-pkcs11 Qt5::Core)
+  endif()
   target_link_libraries(qca-pkcs11 ${QCA_LIB_NAME})
   target_link_libraries(qca-pkcs11 ${PKCS11H_LDFLAGS})
   if (WIN32)
diff --git a/plugins/qca-softstore/CMakeLists.txt b/plugins/qca-softstore/CMakeLists.txt
index 0896801e..426b534e 100644
--- a/plugins/qca-softstore/CMakeLists.txt
+++ b/plugins/qca-softstore/CMakeLists.txt
@@ -11,7 +11,11 @@ endif()
 
 add_definitions(${SOFTSTOREH_DEFINITIONS})
 include_directories(${SOFTSTOREH_INCLUDE_DIR})
-target_link_libraries(qca-softstore Qt5::Core)
+if(QT6)
+  target_link_libraries(qca-softstore Qt6::Core)
+else()
+  target_link_libraries(qca-softstore Qt5::Core)
+endif()
 target_link_libraries(qca-softstore ${QCA_LIB_NAME})
 
 if(NOT DEVELOPER_MODE)
diff --git a/plugins/qca-wincrypto/CMakeLists.txt b/plugins/qca-wincrypto/CMakeLists.txt
index 150cfd05..d56c3b63 100644
--- a/plugins/qca-wincrypto/CMakeLists.txt
+++ b/plugins/qca-wincrypto/CMakeLists.txt
@@ -5,7 +5,11 @@ IF (WIN32)
 
    ADD_LIBRARY (qca-wincrypto MODULE ${QCA_WINCRYPTO_SOURCES})
    # use win32 includes
-   TARGET_LINK_LIBRARIES (qca-wincrypto Qt5::core)
+   if(QT6)
+     target_link_libraries(qca-wincrypto Qt6::Core)
+   else()
+     target_link_libraries(qca-wincrypto Qt5::Core)
+   endif()
    TARGET_LINK_LIBRARIES (qca-wincrypto ${QCA_LIB_NAME})
    TARGET_LINK_LIBRARIES (qca-wincrypto advapi32)
 
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1c24a885..7d49bd95 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -124,7 +124,11 @@ ENDIF(WIN32)
 SET( SOURCES ${SOURCES} ${botan_SOURCES})
 
 add_library(${QCA_LIB_NAME} ${SOURCES}  ${public_HEADERS})
-TARGET_LINK_LIBRARIES(${QCA_LIB_NAME} Qt5::Core)
+if(QT6)
+  target_link_libraries(${QCA_LIB_NAME} Qt6::Core Qt6::Core5Compat)
+else()
+  target_link_libraries(${QCA_LIB_NAME} Qt5::Core)
+endif()
 
 if(WIN32)
 	TARGET_LINK_LIBRARIES(${QCA_LIB_NAME} crypt32 ws2_32)
diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index a511e483..f882ecde 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -1,8 +1,12 @@
 ENABLE_TESTING()
-find_package(Qt5 REQUIRED Test)
+if(QT6)
+  find_package(Qt6 REQUIRED Test)
+else()
+  find_package(Qt5 REQUIRED Test)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
+endif()
 # QTEST_MAIN is using QApplication when QT_GUI_LIB is defined
 remove_definitions(-DQT_GUI_LIB)
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
 
 add_subdirectory(base64unittest)
 add_subdirectory(bigintunittest)
diff --git a/unittest/velox/CMakeLists.txt b/unittest/velox/CMakeLists.txt
index f555bb77..2dbba95e 100644
--- a/unittest/velox/CMakeLists.txt
+++ b/unittest/velox/CMakeLists.txt
@@ -1,4 +1,8 @@
-find_package(Qt5 REQUIRED Network)
+if(QT6)
+  find_package(Qt6 COMPONENTS Network REQUIRED)
+else()
+  find_package(Qt5 REQUIRED Network)
+endif()
 
 ENABLE_TESTING()
 
@@ -7,7 +11,11 @@ set(veloxunittest_bin_SRCS veloxunittest.cpp)
 add_executable(veloxunittest ${veloxunittest_bin_SRCS} )
 
 target_link_qca_test_libraries(veloxunittest)
-target_link_libraries(veloxunittest Qt5::Network)
+if(QT6)
+  target_link_libraries(veloxunittest Qt6::Network)
+else()
+  target_link_libraries(veloxunittest Qt5::Network)
+endif()
 
 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/root.crt ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/root.crt COPYONLY)