diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b790a8d84e289b370942c51d12cc59a5bfc958a9
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,83 @@
+cmake_minimum_required (VERSION 2.8.6)
+project (opendht)
+
+list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
+
+set (prefix ${CMAKE_INSTALL_PREFIX})
+set (exec_prefix "\${prefix}")
+set (libdir "\${exec_prefix}/lib")
+set (includedir "\${prefix}/include")
+
+option (OPENDHT_PYTHON "Build Python bindings" OFF)
+option (OPENDHT_TOOLS "Build DHT tools" ON)
+option (OPENDHT_DEBUG "Build with debug flags" OFF)
+
+set (CMAKE_CXX_FLAGS "-std=c++11 -Wno-return-type -Wall -Wextra -Wnon-virtual-dtor ${CMAKE_CXX_FLAGS}")
+
+find_package (GnuTLS REQUIRED)
+find_package (Msgpack REQUIRED)
+
+list (APPEND opendht_SOURCES
+    src/infohash.cpp
+    src/crypto.cpp
+    src/default_types.cpp
+    src/value.cpp
+    src/dht.cpp
+    src/securedht.cpp
+    src/dhtrunner.cpp
+)
+
+list (APPEND opendht_HEADERS
+    include/opendht/rng.h
+    include/opendht/crypto.h
+    include/opendht/infohash.h
+    include/opendht/default_types.h
+    include/opendht/value.h
+    include/opendht/dht.h
+    include/opendht/securedht.h
+    include/opendht.h
+)
+
+configure_file (
+    opendht.pc.in
+    opendht.pc
+    @ONLY
+)
+
+include_directories (
+ 	./
+    include/
+    include/opendht/
+    ${CMAKE_CURRENT_BINARY_DIR}/include/
+)
+
+if (OPENDHT_DEBUG)
+	set(CMAKE_BUILD_TYPE Debug)
+else ()
+	set(CMAKE_BUILD_TYPE Release)
+endif ()
+
+add_library (opendht SHARED
+    ${opendht_SOURCES}
+    ${opendht_HEADERS}
+)
+set_target_properties (opendht PROPERTIES IMPORT_SUFFIX "_import.lib")
+#set_target_properties (opendht PROPERTIES SOVERSION 1 VERSION 1.0.0)
+
+add_library (opendht-static STATIC
+    ${opendht_SOURCES}
+    ${opendht_HEADERS}
+)
+set_target_properties (opendht-static PROPERTIES OUTPUT_NAME "opendht")
+
+if (NOT DEFINED CMAKE_INSTALL_LIBDIR)
+	set(CMAKE_INSTALL_LIBDIR lib)
+endif ()
+
+if (OPENDHT_TOOLS)
+	add_subdirectory(tools)
+endif ()
+
+install (TARGETS opendht opendht-static DESTINATION ${CMAKE_INSTALL_LIBDIR})
+install (DIRECTORY include DESTINATION ${CMAKE_INSTALL_PREFIX})
+install (FILES ${CMAKE_CURRENT_BINARY_DIR}/opendht.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
diff --git a/cmake/FindMsgpack.cmake b/cmake/FindMsgpack.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..7d8813791568c0a79df2ddb339ad3e9db9975c9f
--- /dev/null
+++ b/cmake/FindMsgpack.cmake
@@ -0,0 +1,48 @@
+# - Try to find msgpack
+# Once done this will define
+#  MSGPACK_FOUND - System has msgpack
+#  MSGPACK_INCLUDE_DIRS - The msgpack include directories
+#  MSGPACK_LIBRARIES - The libraries needed to use msgpack
+
+if(NOT MSGPACK_USE_BUNDLED)
+  find_package(PkgConfig)
+  if (PKG_CONFIG_FOUND)
+    pkg_check_modules(PC_MSGPACK QUIET msgpack)
+  endif()
+else()
+  set(PC_MSGPACK_INCLUDEDIR)
+  set(PC_MSGPACK_INCLUDE_DIRS)
+  set(PC_MSGPACK_LIBDIR)
+  set(PC_MSGPACK_LIBRARY_DIRS)
+  set(LIMIT_SEARCH NO_DEFAULT_PATH)
+endif()
+
+set(MSGPACK_DEFINITIONS ${PC_MSGPACK_CFLAGS_OTHER})
+
+find_path(MSGPACK_INCLUDE_DIR msgpack.h
+  HINTS ${PC_MSGPACK_INCLUDEDIR} ${PC_MSGPACK_INCLUDE_DIRS}
+  ${LIMIT_SEARCH})
+
+# If we're asked to use static linkage, add libmsgpack.a as a preferred library name.
+if(MSGPACK_USE_STATIC)
+  list(APPEND MSGPACK_NAMES
+    "${CMAKE_STATIC_LIBRARY_PREFIX}msgpack${CMAKE_STATIC_LIBRARY_SUFFIX}")
+endif()
+
+list(APPEND MSGPACK_NAMES msgpack)
+
+find_library(MSGPACK_LIBRARY NAMES ${MSGPACK_NAMES}
+  HINTS ${PC_MSGPACK_LIBDIR} ${PC_MSGPACK_LIBRARY_DIRS}
+  ${LIMIT_SEARCH})
+
+mark_as_advanced(MSGPACK_INCLUDE_DIR MSGPACK_LIBRARY)
+
+set(MSGPACK_LIBRARIES ${MSGPACK_LIBRARY})
+set(MSGPACK_INCLUDE_DIRS ${MSGPACK_INCLUDE_DIR})
+
+include(FindPackageHandleStandardArgs)
+# handle the QUIETLY and REQUIRED arguments and set MSGPACK_FOUND to TRUE
+# if all listed variables are TRUE
+find_package_handle_standard_args(Msgpack DEFAULT_MSG
+                                  MSGPACK_LIBRARY MSGPACK_INCLUDE_DIR)
+
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a5122710f5c7d3643e18c46bdf6c4af68eef296d
--- /dev/null
+++ b/tools/CMakeLists.txt
@@ -0,0 +1,8 @@
+
+add_executable (dhtnode dhtnode.cpp tools_common.h)
+add_executable (dhtscanner dhtscanner.cpp tools_common.h)
+add_executable (dhtchat dhtchat.cpp tools_common.h)
+
+target_link_libraries (dhtnode LINK_PUBLIC opendht gnutls)
+target_link_libraries (dhtscanner LINK_PUBLIC opendht gnutls)
+target_link_libraries (dhtchat LINK_PUBLIC opendht gnutls)