diff --git a/pgproto/CMakeLists.txt b/pgproto/CMakeLists.txt
index 58ae0ab7e584be76b98eb31285ce3f5bb4c8a015..169ffd50f6e7aa71c9f317596367560d9e3b06e9 100644
--- a/pgproto/CMakeLists.txt
+++ b/pgproto/CMakeLists.txt
@@ -2,31 +2,30 @@ cmake_minimum_required(VERSION 2.8)
 
 project(protocol C)
 
-include(cmake/utils.cmake)
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
+set(CMAKE_INCLUDE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_INCLUDE_PATH})
 
+include(utils)
+
+# It's not really a target dir, it's `target/debug` or something...
+# TODO: rename this variable to PICODATA_BUILD_DIR
 if (NOT PICODATA_TARGET_DIR)
-    message(FATAL_ERROR
-        "Specify the picodata target directory via PICODATA_TARGET_DIR.")
+    message(FATAL_ERROR "PICODATA_TARGET_DIR not set")
 endif()
 
-include(cmake/FindMsgPuck.cmake)
-if (NOT MSGPUCK_FOUND)
-    message(FATAL_ERROR
-        "MsgPuck were not found.")
-endif()
+set(TARANTOOL_PREFIX "${PICODATA_TARGET_DIR}/build/tarantool-sys/tarantool-prefix")
+set(TARANTOOL_INCLUDE_DIRS "${TARANTOOL_PREFIX}/include/tarantool")
 
-set(TARANTOOL_INCLUDE_DIRS
-    "${PICODATA_TARGET_DIR}/build/tarantool-sys/tarantool-prefix/include/tarantool")
-set(PICODATA_EXECUTABLE
-    "${PICODATA_TARGET_DIR}/picodata")
+# Set search hints and find the MsgPuck library
+list(APPEND MSGPUCK_ROOT_DIR "${PICODATA_TARGET_DIR}/../../tarantool-sys/src/lib/msgpuck")
+list(APPEND MSGPUCK_ROOT_DIR "${TARANTOOL_PREFIX}/src/tarantool-build/src/lib/msgpuck")
+find_package(MsgPuck REQUIRED)
 
-# EXISTS works only with real pathes
+# All the necessary prerequisites should be available if we've found the executable
+set(PICODATA_EXECUTABLE "${PICODATA_TARGET_DIR}/picodata")
 get_filename_component(PICODATA_EXECUTABLE ${PICODATA_EXECUTABLE} REALPATH)
-get_filename_component(TARANTOOL_INCLUDE_DIRS ${TARANTOOL_INCLUDE_DIRS} REALPATH)
-
-if (NOT EXISTS "${PICODATA_EXECUTABLE}" OR NOT EXISTS "${TARANTOOL_INCLUDE_DIRS}/module.h")
-    message(FATAL_ERROR
-        "Can't find picodata executable or tarantool headers. Rebuild can fix this issue.")
+if (NOT EXISTS "${PICODATA_EXECUTABLE}")
+    message(FATAL_ERROR "Can't find picodata executable at ${PICODATA_EXECUTABLE}")
 endif()
 
 include_directories(${PROJECT_SOURCE_DIR}/src)
diff --git a/pgproto/cmake/FindMsgPuck.cmake b/pgproto/cmake/FindMsgPuck.cmake
index 289560d4f25779d3c869f2b02124a86f7ea371cb..c3e0b933414a1b810a162efad75641190f2ebffd 100644
--- a/pgproto/cmake/FindMsgPuck.cmake
+++ b/pgproto/cmake/FindMsgPuck.cmake
@@ -3,16 +3,23 @@
 #
 #  MSGPUCK_FOUND - true if MsgPuck was found
 #  MSGPUCK_INCLUDE_DIRS - the directory of the MsgPuck headers
-#  MSGPUCK_LIBRARIES - the MsgPuck static library needed for linking
-#
+#  MSGPUCK_LIB - the MsgPuck static library needed for linking
+
+set(_MSGPUCK_ROOT_HINTS
+    HINTS ${MSGPUCK_ROOT_DIR})
 
-find_path(MSGPUCK_INCLUDE_DIR msgpuck.h PATH_SUFFIXES msgpuck)
-find_library(MSGPUCK_LIBRARY NAMES libmsgpuck.a)
+find_path(MSGPUCK_INCLUDE_DIRS
+    NAMES msgpuck.h
+    PATH_SUFFIXES msgpuck
+    ${_MSGPUCK_ROOT_HINTS})
+
+find_library(MSGPUCK_LIB
+    NAMES libmsgpuck.a
+    ${_MSGPUCK_ROOT_HINTS})
 
 include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(MsgPuck
-    REQUIRED_VARS MSGPUCK_INCLUDE_DIR MSGPUCK_LIBRARY)
-set(MSGPUCK_INCLUDE_DIRS ${MSGPUCK_INCLUDE_DIR})
-set(MSGPUCK_LIBRARIES ${MSGPUCK_LIBRARY})
-mark_as_advanced(MSGPUCK_INCLUDE_DIR MSGPUCK_INCLUDE_DIRS
-                 MSGPUCK_LIBRARY MSGPUCK_LIBRARIES)
+    REQUIRED_VARS MSGPUCK_INCLUDE_DIRS MSGPUCK_LIB)
+
+set(MSGPUCK_FOUND TRUE)
+mark_as_advanced(MSGPUCK_INCLUDE_DIRS MSGPUCK_LIB)