diff --git a/cmake/luajit.cmake b/cmake/luajit.cmake
index 24f57eb6b230f891229b63010b7dbb7c9ab614c4..06ac79d6a16d1737c3e259c8eceb6bb0e7052d87 100644
--- a/cmake/luajit.cmake
+++ b/cmake/luajit.cmake
@@ -178,7 +178,7 @@ macro(luajit_build)
         add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/third_party/luajit/src/libluajit.a
             WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/third_party/luajit
             COMMAND $(MAKE) ${luajit_buildoptions} clean
-            COMMAND $(MAKE) -C src ${luajit_buildoptions} libluajit.a
+            COMMAND $(MAKE) -C src ${luajit_buildoptions}
             DEPENDS ${CMAKE_SOURCE_DIR}/CMakeCache.txt
         )
     else()
@@ -189,7 +189,7 @@ macro(luajit_build)
             WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/third_party/luajit
             COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/third_party/luajit ${PROJECT_BINARY_DIR}/third_party/luajit
             COMMAND $(MAKE) ${luajit_buildoptions} clean
-            COMMAND $(MAKE) -C src ${luajit_buildoptions} libluajit.a
+            COMMAND $(MAKE) -C src ${luajit_buildoptions}
             DEPENDS ${PROJECT_BINARY_DIR}/CMakeCache.txt ${PROJECT_BINARY_DIR}/third_party/luajit
         )
     endif()
diff --git a/cmake/utils.cmake b/cmake/utils.cmake
index d7cbc4a58d515ddded4971d937bf1c5f6fa81dda..3fee04483fe82f72c02ff35b75b92dafc69f0da8 100644
--- a/cmake/utils.cmake
+++ b/cmake/utils.cmake
@@ -56,7 +56,7 @@ function(lua_source varname filename)
         COMMAND ${ECHO} '\;' >> ${tmpfile}
         COMMAND ${CMAKE_COMMAND} -E copy_if_different ${tmpfile} ${dstfile}
         COMMAND ${CMAKE_COMMAND} -E remove ${tmpfile}
-        DEPENDS ${srcfile} txt2c)
+        DEPENDS ${srcfile} txt2c libluajit)
 
     set(var ${${varname}})
     set(${varname} ${var} ${dstfile} PARENT_SCOPE)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ed9aa3d8e3a7d9e22c4a8717032f92148c609e11..fc7bb5b64ad39c7b26c7383218e485815d8115b8 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -31,6 +31,19 @@ lua_source(lua_sources lua/tap.lua)
 lua_source(lua_sources lua/fio.lua)
 lua_source(lua_sources lua/strict.lua)
 lua_source(lua_sources ../third_party/luafun/fun.lua)
+# LuaJIT jit.* library
+lua_source(lua_sources ../third_party/luajit/src/jit/bc.lua)
+lua_source(lua_sources ../third_party/luajit/src/jit/bcsave.lua)
+lua_source(lua_sources ../third_party/luajit/src/jit/dis_x86.lua)
+lua_source(lua_sources ../third_party/luajit/src/jit/dis_x64.lua)
+lua_source(lua_sources ../third_party/luajit/src/jit/dump.lua)
+lua_source(lua_sources ../third_party/luajit/src/jit/vmdef.lua)
+lua_source(lua_sources ../third_party/luajit/src/jit/v.lua)
+if (EXISTS ../third_party/luajit/src/jit/p.lua)
+    # Profiler LuaJIT 2.1+
+    lua_source(lua_sources ../third_party/luajit/src/jit/p.lua)
+    lua_source(lua_sources ../third_party/luajit/src/jit/zone.lua)
+endif()
 
 add_custom_target(generate_lua_sources
     WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src/box
diff --git a/src/lua/init.cc b/src/lua/init.cc
index 00f3a9885208a13775d4098ef3b74fc23adf8622..230bf235ab3fad9e2f5025462ab0110ae1ddaa50 100644
--- a/src/lua/init.cc
+++ b/src/lua/init.cc
@@ -88,7 +88,18 @@ extern char strict_lua[],
 	help_lua[],
 	help_en_US_lua[],
 	tap_lua[],
-	fio_lua[];
+	fio_lua[],
+	/* jit.* library */
+	vmdef_lua[],
+	bc_lua[],
+	bcsave_lua[],
+	dis_x86_lua[],
+	dis_x64_lua[],
+	dump_lua[],
+	v_lua[];
+#if LUAJIT_VERSION_NUM >= 20100 /* LuaJIT 2.1+ */
+extern char p_lua[], zone_lua[];
+#endif /* LuaJIT 2.1+ */
 
 static const char *lua_modules[] = {
 	/* Make it first to affect load of all other modules */
@@ -109,6 +120,19 @@ static const char *lua_modules[] = {
 	"tap", tap_lua,
 	"help.en_US", help_en_US_lua,
 	"help", help_lua,
+	/* jit.* library */
+	"jit.vmdef", vmdef_lua,
+	"jit.bc", bc_lua,
+	"jit.bcsave", bcsave_lua,
+	"jit.dis_x86", dis_x86_lua,
+	"jit.dis_x64", dis_x64_lua,
+	"jit.dump", dump_lua,
+	"jit.v", v_lua,
+#if LUAJIT_VERSION_NUM >= 20100 /* LuaJIT 2.1+ */
+	/* Profiler */
+	"jit.p", p_lua,
+	"jit.zone", zone_lua,
+#endif /* LuaJIT 2.1+ */
 	NULL
 };
 
@@ -366,8 +390,13 @@ tarantool_lua_init(const char *tarantool_bin, int argc, char **argv)
 		if (luaL_loadbuffer(L, modsrc, strlen(modsrc), modfile))
 			panic("Error loading Lua module %s...: %s",
 			      modname, lua_tostring(L, -1));
-		lua_call(L, 0, 1);
-		lua_setfield(L, -3, modname); /* package.loaded.modname = t */
+		lua_pushstring(L, modname);
+		lua_call(L, 1, 1);
+		if (!lua_isnil(L, -1)) {
+			lua_setfield(L, -3, modname); /* package.loaded.modname = t */
+		} else {
+			lua_pop(L, 1); /* nil */
+		}
 		lua_pop(L, 1); /* chunkname */
 	}
 	lua_pop(L, 1); /* _LOADED */