diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3fa5e333fdfd2e6463697a1b19a190e295850eb4..dbfbbe3fb06a3a8fdc977e6eec815319d12f92de 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,6 +8,16 @@ cmake_minimum_required(VERSION 3.2)
 option(BUILD_TESTS      "Build tests"    ON)
 option(BUILD_EXAMPLES   "Build examples" ON)
 
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules")
+
+find_package(LIBUBOX REQUIRED)
+
+add_library(libubox INTERFACE)
+target_include_directories(libubox
+INTERFACE
+	${LIBUBOX_LIBRARIES}
+)
+
 set(NLOHMANN_JSON_DIR "" CACHE STRING "path to json.hpp")
 
 # find nlohmann's json.hpp
diff --git a/cmake/modules/FindLIBUBOX.cmake b/cmake/modules/FindLIBUBOX.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..8b9341200ce3f99126379974abc1b4e5c24c7818
--- /dev/null
+++ b/cmake/modules/FindLIBUBOX.cmake
@@ -0,0 +1,21 @@
+find_package(PkgConfig)
+
+pkg_check_modules(PC_LIBUBOX QUIET libubox)
+
+find_path(LIBUBOX_INCLUDE_DIR libubox/uloop.h
+   HINTS ${PC_LIBUBOX_INCLUDEDIR} ${PC_LIBUBOX_INCLUDE_DIRS} PATH_SUFFIXES libubox)
+
+find_library(LIBUBOX_LIBRARY_ubox NAMES ubox
+   HINTS ${PC_LIBUBOX_LIBDIR} ${PC_LIBUBOX_LIBRARY_DIRS})
+
+find_library(LIBUBOX_LIBRARY_blobmsg_json NAMES blobmsg_json
+   HINTS ${PC_LIBUBOX_LIBDIR} ${PC_LIBUBOX_LIBRARY_DIRS})
+
+set(LIBUBOX_LIBRARIES ${LIBUBOX_LIBRARY_ubox} ${LIBUBOX_LIBRARY_blobmsg_json})
+set(LIBUBOX_INCLUDE_DIRS ${LIBUBOX_INCLUDE_DIR})
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args(LIBUBOX DEFAULT_MSG LIBUBOX_LIBRARY_ubox LIBUBOX_LIBRARY_blobmsg_json LIBUBOX_INCLUDE_DIR)
+
+mark_as_advanced(LIBUBOX_INCLUDE_DIR LIBUBOX_LIBRARY)