diff --git a/.gitmodules b/.gitmodules
index d45e9ce8b8c0d9b413e86327ad6bfcc92a320818..8e3a17a632e277a7740955a8d318c43670eff6b7 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -34,9 +34,6 @@
 [submodule "third_party/decNumber"]
 	path = third_party/decNumber
 	url = https://github.com/tarantool/decNumber.git
-[submodule "third_party/serpent"]
-	path = third_party/serpent
-	url = https://github.com/tarantool/serpent.git
 [submodule "third_party/curl"]
 	path = third_party/curl
 	url = https://github.com/tarantool/curl.git
diff --git a/.luacheckrc b/.luacheckrc
index 2a652cd06f3259329f13e5bb75f0c2dcf75c1af5..6fe34c2e1f6139d48ae72bfb01129f50aeabc166 100644
--- a/.luacheckrc
+++ b/.luacheckrc
@@ -29,7 +29,6 @@ include_files = {
 exclude_files = {
     "build/**/*.lua",
     -- Third-party source code.
-    "src/box/lua/serpent.lua",
     "test-run/**/*.lua",
     "test/**/*.lua",
     "third_party/**/*.lua",
diff --git a/src/box/CMakeLists.txt b/src/box/CMakeLists.txt
index a7547c29fff7a5316b9d53f2896afd80f796e50a..19203f7708887f568f749d7eae2ac807b648dfd9 100644
--- a/src/box/CMakeLists.txt
+++ b/src/box/CMakeLists.txt
@@ -17,7 +17,6 @@ endif()
 lua_source(lua_sources lua/net_box.lua)
 lua_source(lua_sources lua/upgrade.lua)
 lua_source(lua_sources lua/console.lua)
-lua_source(lua_sources lua/serpent.lua)
 lua_source(lua_sources lua/xlog.lua)
 lua_source(lua_sources lua/key_def.lua)
 lua_source(lua_sources lua/merger.lua)
diff --git a/src/box/lua/console.c b/src/box/lua/console.c
index ea5385c7435a04e345b2dac84d448a2a8d5dc6bc..2e8204db60e968ab9bd423e129ab3c202c32c722 100644
--- a/src/box/lua/console.c
+++ b/src/box/lua/console.c
@@ -48,8 +48,6 @@
 #include <stdlib.h>
 #include <ctype.h>
 
-extern char serpent_lua[];
-
 static struct luaL_serializer *serializer_yaml;
 static struct luaL_serializer *serializer_lua;
 
@@ -578,24 +576,6 @@ console_session_push(struct session *session, struct port *port)
 				     TIMEOUT_INFINITY);
 }
 
-static void
-lua_serpent_init(struct lua_State *L)
-{
-	static const char modname[] = "serpent";
-	const char *modfile;
-
-	lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
-	modfile = lua_pushfstring(L, "@builtin/%s.lua", modname);
-	if (luaL_loadbuffer(L, serpent_lua, strlen(serpent_lua), modfile)) {
-		panic("Error loading Lua module %s...: %s",
-		      modname, lua_tostring(L, -1));
-	}
-
-	lua_call(L, 0, 1);
-	lua_setfield(L, -3, modname);  /* _LOADED[modname] = new table */
-	lua_pop(L, 2);
-}
-
 void
 tarantool_lua_console_init(struct lua_State *L)
 {
@@ -663,12 +643,6 @@ tarantool_lua_console_init(struct lua_State *L)
 	};
 	session_vtab_registry[SESSION_TYPE_CONSOLE] = console_session_vtab;
 	session_vtab_registry[SESSION_TYPE_REPL] = console_session_vtab;
-
-	/*
-	 * Register serpent serializer as we
-	 * need it inside console REPL mode.
-	 */
-	lua_serpent_init(L);
 }
 
 /*
diff --git a/src/box/lua/serpent.lua b/src/box/lua/serpent.lua
deleted file mode 120000
index 816be087510bc546cc8ed932c0d740153618e111..0000000000000000000000000000000000000000
--- a/src/box/lua/serpent.lua
+++ /dev/null
@@ -1 +0,0 @@
-../../../third_party/serpent/src/serpent.lua
\ No newline at end of file
diff --git a/third_party/serpent b/third_party/serpent
deleted file mode 160000
index 879580fb21933f63eb23ece7d60ba2349a8d2848..0000000000000000000000000000000000000000
--- a/third_party/serpent
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 879580fb21933f63eb23ece7d60ba2349a8d2848