diff --git a/.gitmodules b/.gitmodules
index ddfbe1ddd01a8cfd0e70cddd99ae3f86af293856..01f7b1730f126e484a545253c2df6f88c4f5ba58 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -11,3 +11,6 @@
 	url = https://github.com/atraczyk/SortFilterProxyModel.git
 	branch = qt-6
 	ignore = dirty
+[submodule "daemon"]
+	path = daemon
+	url = https://review.jami.net/jami-daemon
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f2850f5d43e9290ad1fa7f560aeea8e17d50ba2b..d0a8fd709f4c3f92c0d8066706d0249fcb18100a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,6 +39,8 @@ set(CMAKE_AUTOUIC ON)
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
 # Main project directories:
+# daemon
+set(DAEMON_DIR ${PROJECT_SOURCE_DIR}/daemon)
 # src
 set(LIBCLIENT_SRC_DIR ${PROJECT_SOURCE_DIR}/src/libclient)
 set(APP_SRC_DIR ${PROJECT_SOURCE_DIR}/src/app)
@@ -102,6 +104,16 @@ set(CMAKE_CXX_FLAGS
 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH true)
 
 # jami-daemon
+if(NOT DEFINED WITH_DAEMON_SUBMODULE)
+  set(WITH_DAEMON_SUBMODULE false)
+endif()
+if (WITH_DAEMON_SUBMODULE AND NOT EXISTS ${DAEMON_DIR}/src)
+  message(FATAL_ERROR
+    "Jami Daemon sources not found in ${DAEMON_DIR}/src.  If you \
+cloned this repository via git, perhaps you did not initialize its \
+submodules afterwards.  You can do so by running \"git submodule \
+update --init\" in the repository.")
+endif()
 set(CMAKE_MODULE_PATH
   ${CMAKE_MODULE_PATH} "${EXTRAS_DIR}/build/cmake/modules")
 find_package(LibJami REQUIRED)
diff --git a/daemon b/daemon
new file mode 160000
index 0000000000000000000000000000000000000000..8abb7a04dcd08078662b95a26bf4dd5e15f1a2f2
--- /dev/null
+++ b/daemon
@@ -0,0 +1 @@
+Subproject commit 8abb7a04dcd08078662b95a26bf4dd5e15f1a2f2
diff --git a/extras/build/cmake/modules/FindLibJami.cmake b/extras/build/cmake/modules/FindLibJami.cmake
index 5aa72a9a5bdf012e71343e17402a472d0051f79f..ddb05319015149a94f409c01b4abb257143b3bad 100644
--- a/extras/build/cmake/modules/FindLibJami.cmake
+++ b/extras/build/cmake/modules/FindLibJami.cmake
@@ -26,20 +26,24 @@
 
 set(LIBJAMI_FOUND true)
 
-if(EXISTS ${LIBJAMI_INCLUDE_DIR}/jami.h)
-  set(LIBJAMI_INCLUDE_DIRS ${LIBJAMI_INCLUDE_DIR})
-elseif(EXISTS ${LIBJAMI_BUILD_DIR}/jami/jami.h)
-  set(LIBJAMI_INCLUDE_DIRS ${LIBJAMI_BUILD_DIR}/jami)
-elseif(EXISTS ${RING_INCLUDE_DIR}/jami.h)
-  set(LIBJAMI_INCLUDE_DIRS ${RING_INCLUDE_DIR})
-elseif(EXISTS ${RING_BUILD_DIR}/jami/jami.h)
-  set(LIBJAMI_INCLUDE_DIRS ${RING_BUILD_DIR}/jami)
-elseif(EXISTS ${CMAKE_INSTALL_PREFIX}/include/jami/jami.h)
-  set(LIBJAMI_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/include/jami)
+if(WITH_DAEMON_SUBMODULE)
+  set(LIBJAMI_INCLUDE_DIRS ${DAEMON_DIR}/src/jami)
 else()
-  message(STATUS "Jami daemon headers not found!
+  if(EXISTS ${LIBJAMI_INCLUDE_DIR}/jami.h)
+    set(LIBJAMI_INCLUDE_DIRS ${LIBJAMI_INCLUDE_DIR})
+  elseif(EXISTS ${LIBJAMI_BUILD_DIR}/jami/jami.h)
+    set(LIBJAMI_INCLUDE_DIRS ${LIBJAMI_BUILD_DIR}/jami)
+  elseif(EXISTS ${RING_INCLUDE_DIR}/jami.h)
+    set(LIBJAMI_INCLUDE_DIRS ${RING_INCLUDE_DIR})
+  elseif(EXISTS ${RING_BUILD_DIR}/jami/jami.h)
+    set(LIBJAMI_INCLUDE_DIRS ${RING_BUILD_DIR}/jami)
+  elseif(EXISTS ${CMAKE_INSTALL_PREFIX}/include/jami/jami.h)
+    set(LIBJAMI_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/include/jami)
+  else()
+    message(STATUS "Jami daemon headers not found!
 Set -DLIBJAMI_BUILD_DIR or -DCMAKE_INSTALL_PREFIX")
-  set(LIBJAMI_FOUND false)
+    set(LIBJAMI_FOUND false)
+  endif()
 endif()
 
 # Save the current value of CMAKE_FIND_LIBRARY_SUFFIXES.
@@ -47,39 +51,51 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES_orig ${CMAKE_FIND_LIBRARY_SUFFIXES})
 
 set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so;.dll")
 
-# Search only in these given PATHS.
-find_library(LIBJAMI_LIB NAMES jami ring
-  PATHS ${LIBJAMI_BUILD_DIR}/.libs
-  PATHS ${RING_BUILD_DIR}/.libs
-  PATHS ${CMAKE_INSTALL_PREFIX}/lib
-  PATHS ${CMAKE_INSTALL_PREFIX}/libexec
-  PATHS ${CMAKE_INSTALL_PREFIX}/bin
-  NO_DEFAULT_PATH)
-
-# Search elsewhere as well (e.g. system-wide).
-if(NOT LIBJAMI_LIB)
-  find_library(LIBJAMI_LIB NAMES jami ring)
-endif()
-
-# Try for a static version also.
-if(NOT LIBJAMI_LIB)
-  set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.lib")
-
+if(WITH_DAEMON_SUBMODULE)
+  find_library(LIBJAMI_LIB NAMES jami ring
+    PATHS ${DAEMON_DIR}/src/.libs
+    NO_DEFAULT_PATH)
+else()
   # Search only in these given PATHS.
   find_library(LIBJAMI_LIB NAMES jami ring
     PATHS ${LIBJAMI_BUILD_DIR}/.libs
     PATHS ${RING_BUILD_DIR}/.libs
     PATHS ${CMAKE_INSTALL_PREFIX}/lib
     PATHS ${CMAKE_INSTALL_PREFIX}/libexec
+    PATHS ${CMAKE_INSTALL_PREFIX}/bin
     NO_DEFAULT_PATH)
 
   # Search elsewhere as well (e.g. system-wide).
   if(NOT LIBJAMI_LIB)
     find_library(LIBJAMI_LIB NAMES jami ring)
   endif()
+endif()
+
+# Try for a static version also.
+if(NOT LIBJAMI_LIB)
+  set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.lib")
+
+  if(WITH_DAEMON_SUBMODULE)
+    find_library(LIBJAMI_LIB NAMES jami ring
+      PATHS ${DAEMON_DIR}/src/.libs
+      NO_DEFAULT_PATH)
+  else()
+    # Search only in these given PATHS.
+    find_library(LIBJAMI_LIB NAMES jami ring
+      PATHS ${LIBJAMI_BUILD_DIR}/.libs
+      PATHS ${RING_BUILD_DIR}/.libs
+      PATHS ${CMAKE_INSTALL_PREFIX}/lib
+      PATHS ${CMAKE_INSTALL_PREFIX}/libexec
+      NO_DEFAULT_PATH)
+
+    # Search elsewhere as well (e.g. system-wide).
+    if(NOT LIBJAMI_LIB)
+      find_library(LIBJAMI_LIB NAMES jami ring)
+    endif()
 
-  if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows")
-    add_definitions(-fPIC)
+    if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows")
+      add_definitions(-fPIC)
+    endif()
   endif()
 endif()