diff --git a/CMakeLists.txt b/CMakeLists.txt
index b986d2939ddcb2b80d67b308af58672c9bd5d945..94060c8af68f0ad1bd1b90ded032cf900e78724a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,16 +1,41 @@
-cmake_minimum_required(VERSION 3.15)
+cmake_minimum_required(VERSION 3.16)
 
-project(ring-daemon C CXX)
+project(jami-daemon CXX)
+set(PACKAGE_NAME "Jami Daemon")
+
+################################################################################
+# Build options
+################################################################################
+option(JAMI_NATPMP "Build with NAT-PMP" ON)
+option(JAMI_PUPNP "Build with PUPNP" ON)
+option(JAMI_PLUGIN "Build with plugin support" ON)
+option(JAMI_JNI "Build the JNI binding" OFF)
+option(JAMI_VIDEO "Build with video support" ON)
+
+################################################################################
+# Check dependencies
+################################################################################
+
+if(NOT MSVC)
+    include(FindPkgConfig)
+    if (JAMI_NATPNP)
+        pkg_search_module (natpmp REQUIRED IMPORTED_TARGET natpmp)
+    endif()
+    if (JAMI_PUPNP)
+        pkg_search_module (upnp REQUIRED IMPORTED_TARGET upnp libupnp)
+    endif()
+endif()
 
 ################################################################################
 # Source groups
 ################################################################################
 
 # compat, src source group
+if(MSVC)
+    add_subdirectory("compat")
+endif()
 
-add_subdirectory("compat")
 add_subdirectory("src")
-
 source_group("Source Files" FILES ${Source_Files})
 source_group("Source Files\\client" FILES ${Source_Files__client})
 source_group("Source Files\\config" FILES ${Source_Files__config})
@@ -42,6 +67,20 @@ if(MSVC)
    source_group("Source Files\\media\\video\\winvideo" FILES ${Source_Files__media__video__winvideo})
 endif()
 
+# Android target mapping for contrib
+if (ANDROID_ABI STREQUAL "x86")
+    set(TARGET "i686-linux-android")
+elseif (ANDROID_ABI STREQUAL "x86_64")
+    set(TARGET "x86_64-linux-android")
+elseif (ANDROID_ABI STREQUAL "arm64-v8a")
+    set(TARGET "aarch64-linux-android")
+elseif (ANDROID_ABI STREQUAL "armeabi-v7a")
+    set(TARGET "arm-linux-androideabi")
+else()
+    set(TARGET ${TARGET})
+endif()
+set(CONTRIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/contrib/${TARGET})
+
 list (APPEND ALL_FILES
       ${Source_Files}
       ${Source_Files__client}
@@ -62,30 +101,82 @@ list (APPEND ALL_FILES
       ${Source_Files__sip}
       ${Source_Files__upnp}
       ${Source_Files__upnp__protocol}
-      ${Source_Files__upnp__protocol__natpmp}
-      ${Source_Files__upnp__protocol__pupnp}
-      ${Source_Files__plugin}
 )
-
+if (JAMI_NATPMP)
+    list (APPEND ALL_FILES ${Source_Files__upnp__protocol__natpmp})
+endif()
+if (JAMI_PUPNP)
+    list (APPEND ALL_FILES ${Source_Files__upnp__protocol__pupnp})
+endif()
+if (JAMI_PLUGIN)
+    list (APPEND ALL_FILES ${Source_Files__plugin})
+endif()
+if (ANDROID)
+    list (APPEND ALL_FILES ${ALL_FILES}
+        ${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/androidvideo/video_device_impl.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/androidvideo/video_device_monitor_impl.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/opensl/audio_player.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/opensl/audio_recorder.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/opensl/opensllayer.cpp
+    )
+endif()
 if(MSVC)
    list (APPEND ALL_FILES ${ALL_FILES}
          "${Source_Files__media__audio__portaudio}"
          "${Source_Files__media__video__uwpvideo}"
          "${Source_Files__media__video__winvideo}"
    )
+endif()
+
+add_library(${PROJECT_NAME} STATIC ${ALL_FILES})
+set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER "daemon")
+set_target_properties (${PROJECT_NAME} PROPERTIES CXX_STANDARD 17)
+target_compile_definitions(${PROJECT_NAME} PRIVATE
+    PACKAGE_NAME="${PACKAGE_NAME}"
+    PACKAGE="jami"
+    LIBJAMI_BUILD
+    HAVE_RINGNS
+    ASIO_STANDALONE
+    MSGPACK_NO_BOOST
+)
+if (JAMI_VIDEO)
+    target_compile_definitions(${PROJECT_NAME} PRIVATE ENABLE_VIDEO)
+endif()
+if (JAMI_PLUGIN)
+    target_compile_definitions(${PROJECT_NAME} PRIVATE ENABLE_PLUGIN)
+endif()
+if (JAMI_NATPMP)
+    target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_LIBNATPMP)
+endif()
+if (ANDROID)
+    target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_OPENSL)
+endif()
+target_include_directories(${PROJECT_NAME} PRIVATE
+    "${CMAKE_CURRENT_SOURCE_DIR}/.;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/config;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/security;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/sip;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/igd;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/protocol;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/mapping;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/client;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/hooks;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/im;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/media;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/jamidht;"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/jamidht/eth;"
+    PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src;" "${CMAKE_CURRENT_SOURCE_DIR}/src/jami;"
+)
 
+if(MSVC)
    ################################################################################
    # Target
    ################################################################################
    include("CMake/Utils.cmake")
-
-   add_library(${PROJECT_NAME} STATIC ${ALL_FILES})
-   set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER "daemon")
-
    use_props(${PROJECT_NAME} "${CMAKE_CONFIGURATION_TYPES}" "${DEFAULT_CXX_PROPS}")
 
-   set_target_properties (${PROJECT_NAME} PROPERTIES CXX_STANDARD 17)
-
    ################################################################################
    # Include necessary .cmake file (need to init use_props first)
    ################################################################################
@@ -94,7 +185,6 @@ if(MSVC)
 
    # Supress generation of ZERO_CHECK
    set(CMAKE_SUPPRESS_REGENERATION true)
-
    set(ROOT_NAMESPACE ringdaemon)
 
    ################################################################################
@@ -123,23 +213,6 @@ if(MSVC)
    ################################################################################
    if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
        target_include_directories(${PROJECT_NAME} PUBLIC
-           "${CMAKE_CURRENT_SOURCE_DIR}/.;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/client;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/config;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/security;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/sip;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/igd;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/protocol;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/upnp/mapping;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/jami;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/hooks;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/im;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/media;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/jamidht;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/src/jamidht/eth;"
            "${CMAKE_CURRENT_SOURCE_DIR}/compat/msvc;"
            "${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc;"
            "${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/include;"
@@ -176,14 +249,12 @@ if(MSVC)
    if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
        target_compile_definitions(${PROJECT_NAME} PRIVATE
            "_WIN32_WINNT=0x0A00;"
-           "ASIO_STANDALONE;"
            "STATIC_GETOPT;"
            "LIBARCHIVE_STATIC;"
            "OPENDHT_PROXY_CLIENT;"
            "OPENDHT_PROXY_SERVER;"
            "OPENDHT_PUSH_NOTIFICATIONS;"
            "NATPMP_STATICLIB;"
-           "ENABLE_PLUGIN;"
            "NDEBUG;"
            "_USE_MATH_DEFINES;"
            "_SCL_SECURE_NO_WARNINGS;"
@@ -194,7 +265,6 @@ if(MSVC)
            "WEBRTC_WIN;"
            "WEBRTC_AUDIO_PROCESSING_ONLY_BUILD;"
            "WEBRTC_NS_FLOAT;"
-           "MSGPACK_NO_BOOST;"
        )
    endif()
 
@@ -287,5 +357,96 @@ if(MSVC)
    )
 
    set ( CMAKE_STATIC_LINKER_FLAGS ${libAdditionalDependencies} )
+else()
+    list(APPEND CMAKE_FIND_ROOT_PATH ${CONTRIB_PATH})
+    set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
+    list(APPEND CMAKE_PREFIX_PATH ${CONTRIB_PATH})
+
+    find_package (jsoncpp REQUIRED)
+    find_package (yaml-cpp REQUIRED)
+    find_package (fmt REQUIRED)
+    pkg_search_module (webrtcap REQUIRED IMPORTED_TARGET webrtc-audio-processing)
+    pkg_search_module (gnutls REQUIRED IMPORTED_TARGET gnutls)
+    pkg_search_module (opendht REQUIRED IMPORTED_TARGET opendht)
+    pkg_search_module (git2 REQUIRED IMPORTED_TARGET libgit2)
+    pkg_search_module (archive REQUIRED IMPORTED_TARGET libarchive)
+    pkg_search_module (secp256k1 REQUIRED IMPORTED_TARGET libsecp256k1)
+    pkg_search_module (pjproject REQUIRED IMPORTED_TARGET libpjproject)
+    pkg_search_module (avformat REQUIRED IMPORTED_TARGET libavformat)
+    pkg_search_module (avdevice REQUIRED IMPORTED_TARGET libavdevice)
+    pkg_search_module (avfilter REQUIRED IMPORTED_TARGET libavfilter)
+    pkg_search_module (avcodec REQUIRED IMPORTED_TARGET libavcodec)
+    pkg_search_module (swresample REQUIRED IMPORTED_TARGET libswresample)
+    pkg_search_module (swscale REQUIRED IMPORTED_TARGET libswscale)
+    pkg_search_module (avutil REQUIRED IMPORTED_TARGET libavutil)
+
+    target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC ${CONTRIB_PATH}/include)
+    target_link_libraries(${PROJECT_NAME} PRIVATE
+        PkgConfig::opendht
+        PkgConfig::pjproject
+        PkgConfig::git2
+        PkgConfig::archive
+        PkgConfig::gnutls
+        PkgConfig::webrtcap
+        PkgConfig::avformat
+        PkgConfig::avdevice
+        PkgConfig::avfilter
+        PkgConfig::avcodec
+        PkgConfig::swresample
+        PkgConfig::swscale
+        jsoncpp
+        yaml-cpp
+        fmt
+        secp256k1
+        PUBLIC
+        PkgConfig::avutil
+    )
+    target_compile_options(${PROJECT_NAME} PRIVATE
+        -fvisibility=hidden
+        -Wall -Wextra
+        -Wnon-virtual-dtor
+        -Wno-deprecated
+        -Wno-deprecated-declarations
+        -Wno-unknown-pragmas
+    )
+    target_compile_definitions(${PROJECT_NAME} PRIVATE
+        JAMI_DATADIR="${JAMI_DATADIR}"
+        PJ_AUTOCONF=1
+    )
+    if (ANDROID)
+        target_link_libraries(${PROJECT_NAME} PRIVATE OpenSLES log)
+    endif()
+    if (JAMI_NATPMP)
+        target_link_libraries(${PROJECT_NAME} PRIVATE natpmp)
+    endif()
+    if (JAMI_PUPNP)
+        target_link_libraries(${PROJECT_NAME} PRIVATE upnp)
+    endif()
+
+    if (JAMI_JNI)
+        # Generate swig binding
+        add_custom_command(
+            OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/jami_wrapper.cpp
+            COMMAND env PACKAGEDIR=${JAMI_JNI_PACKAGEDIR} "./make-swig.sh"
+            DEPENDS
+            ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/make-swig.sh
+            ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/jni_interface.i
+            ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/callmanager.i
+            ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/configurationmanager.i
+            ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/conversation.i
+            ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/managerimpl.i
+            ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/data_view.i
+            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni
+        )
+        # Build jni binding
+        add_library(${PROJECT_NAME}-jni SHARED ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/jami_wrapper.cpp)
+        target_link_directories(${PROJECT_NAME}-jni PRIVATE ${CONTRIB_PATH}/lib)
+        target_link_libraries(${PROJECT_NAME}-jni ${PROJECT_NAME} android log)
+        set_target_properties(${PROJECT_NAME}-jni PROPERTIES CXX_STANDARD 17)
+        target_link_options(${PROJECT_NAME}-jni PRIVATE
+            -Wl,-Bsymbolic
+            -Wall -Wextra
+        )
+    endif()
 
 endif()
diff --git a/bin/jni/make-swig.sh b/bin/jni/make-swig.sh
index b4e6612d0587bfad314e0fcc83b8939785b07eab..924371fd891f30b150ad2410ef284366738dc3e7 100755
--- a/bin/jni/make-swig.sh
+++ b/bin/jni/make-swig.sh
@@ -37,17 +37,18 @@ if [[ $SWIGVER1 -lt 4 ]]; then
     exit 3
 fi
 
-mkdir -p $PACKAGEDIR
+PACKAGE_PATH="$PACKAGEDIR/${PACKAGE//.//}"
+mkdir -p $PACKAGE_PATH
 
-echo "Generating jami_wrapper.cpp..."
+echo "Generating jami_wrapper.cpp and java bindings to $PACKAGE_PATH"
 swig -v -c++ -java \
 -package $PACKAGE \
--outdir $PACKAGEDIR \
+-outdir $PACKAGE_PATH \
 -o $JNIDIR/jami_wrapper.cpp $JNIDIR/jni_interface.i
 
 echo "Generating jamiservice_loader.c..."
 python $JNIDIR/JavaJNI2CJNI_Load.py \
--i $PACKAGEDIR/JamiServiceJNI.java \
+-i $PACKAGE_PATH/JamiServiceJNI.java \
 -o $JNIDIR/jamiservice_loader.c \
 -t $JNIDIR/jamiservice.c.template \
 -m JamiService \