diff --git a/doc/sphinx/reference/socket.rst b/doc/sphinx/reference/socket.rst
index 9ad7f28849959233df2b3b048b6e982dd3b4d47f..6d7ce57a5747f9e36e90123c0690ab2f37284065 100644
--- a/doc/sphinx/reference/socket.rst
+++ b/doc/sphinx/reference/socket.rst
@@ -336,7 +336,6 @@ the function invocations will look like ``sock:function_name(...)``.
             * SO_ACCEPTCONN
             * SO_BINDTODEVICE
             * SO_BROADCAST
-            * SO_BSDCOMPAT
             * SO_DEBUG
             * SO_DOMAIN
             * SO_ERROR
diff --git a/src/lua/bsdsocket.cc b/src/lua/bsdsocket.cc
index 75c9fa4b7b56af7050263dd95040e2595c62bae3..db5a6866e390ab1a1838952e57d05ad352b02010 100644
--- a/src/lua/bsdsocket.cc
+++ b/src/lua/bsdsocket.cc
@@ -186,9 +186,6 @@ static const struct { char name[32]; int value, type, rw; } so_opts[] = {
 #ifdef SO_BROADCAST
 	{"SO_BROADCAST",	SO_BROADCAST,		1,	1, },
 #endif
-#ifdef SO_BSDCOMPAT
-	{"SO_BSDCOMPAT",	SO_BSDCOMPAT,		1,	1, },
-#endif
 #ifdef SO_DEBUG
 	{"SO_DEBUG",		SO_DEBUG,		1,	1, },
 #endif
@@ -254,15 +251,9 @@ static const struct { char name[32]; int value, type, rw; } so_opts[] = {
 #endif
 #ifdef SO_PROTOCOL
 	{"SO_PROTOCOL",		SO_PROTOCOL,		1,	0, },
-#else
-#define SO_PROTOCOL	38
 #endif
 
-#ifdef SO_TYPE
 	{"SO_TYPE",		SO_TYPE,		1,	0, },
-#else
-#define SO_TYPE		3
-#endif
 
 	{"",			0,			0,	0, }
 };
@@ -721,68 +712,66 @@ lbox_bsdsocket_getaddrinfo(struct lua_State *L)
 	return 1;
 }
 
-static void
-lbox_bsdsocket_update_proto_type(struct lua_State *L, int fh)
-{
-	if (lua_isnil(L, -1))
-		return;
-
-	int save_errno = errno;
-
-	int value;
-	socklen_t len = sizeof(value);
-
-	if (getsockopt(fh, SOL_SOCKET, SO_PROTOCOL, &value, &len) == 0) {
-		lua_pushliteral(L, "protocol");
-		lbox_bsdsocket_push_protocol(L, value);
-		lua_rawset(L, -3);
-	}
-
-	len = sizeof(value);
-	if (getsockopt(fh, SOL_SOCKET, SO_TYPE, &value, &len) == 0) {
-		lua_pushliteral(L, "type");
-		lbox_bsdsocket_push_sotype(L, value);
-		lua_rawset(L, -3);
-	}
-	errno = save_errno;
-
-}
-
 static int
-lbox_bsdsocket_soname(struct lua_State *L)
+lbox_bsdsocket_name(struct lua_State *L,
+                    int (*getname_func) (int, struct sockaddr *, socklen_t *))
 {
 	lua_pushvalue(L, 1);
 	int fh = lua_tointeger(L, -1);
 	lua_pop(L, 1);
 
-
 	struct sockaddr_storage addr;
 	socklen_t len = sizeof(addr);
-	if (getsockname(fh, (struct sockaddr *)&addr, &len) != 0) {
+	if (getname_func(fh, (struct sockaddr *)&addr, &len) != 0) {
 		lua_pushnil(L);
 		return 1;
 	}
 	lbox_bsdsocket_push_addr(L, (const struct sockaddr *)&addr, len);
-	lbox_bsdsocket_update_proto_type(L, fh);
+	if (lua_isnil(L, -1))
+		return 1;
+
+	int type;
+	len = sizeof(type);
+	if (getsockopt(fh, SOL_SOCKET, SO_TYPE, &type, &len) == 0) {
+		lua_pushliteral(L, "type");
+		lbox_bsdsocket_push_sotype(L, type);
+		lua_rawset(L, -3);
+	} else {
+		type = -1;
+	}
+
+	int protocol = 0;
+#ifdef SO_PROTOCOL
+    len = sizeof(protocol);
+	if (getsockopt(fh, SOL_SOCKET, SO_PROTOCOL, &protocol, &len) == 0) {
+		lua_pushliteral(L, "protocol");
+		lbox_bsdsocket_push_protocol(L, protocol);
+		lua_rawset(L, -3);
+	}
+#else
+	if (addr.ss_family == AF_INET || addr.ss_family == AF_INET6) {
+		if (type == SOCK_STREAM)
+			protocol = IPPROTO_TCP;
+		if (type == SOCK_DGRAM)
+			protocol = IPPROTO_UDP;
+	}
+	lua_pushliteral(L, "protocol");
+	lbox_bsdsocket_push_protocol(L, protocol);
+	lua_rawset(L, -3);
+#endif
 	return 1;
 }
 
 static int
-lbox_bsdsocket_peername(struct lua_State *L)
+lbox_bsdsocket_soname(struct lua_State *L)
 {
-	lua_pushvalue(L, 1);
-	int fh = lua_tointeger(L, -1);
-	lua_pop(L, 1);
+	return lbox_bsdsocket_name(L, getsockname);
+}
 
-	struct sockaddr_storage addr;
-	socklen_t len = sizeof(addr);
-	if (getpeername(fh, (struct sockaddr *)&addr, &len) != 0) {
-		lua_pushnil(L);
-		return 1;
-	}
-	lbox_bsdsocket_push_addr(L, (const struct sockaddr *)&addr, len);
-	lbox_bsdsocket_update_proto_type(L, fh);
-	return 1;
+static int
+lbox_bsdsocket_peername(struct lua_State *L)
+{
+	return lbox_bsdsocket_name(L, getpeername);
 }
 
 static int
diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result
index 9491d7b2a8d9acdce4ff3ebffd57b640ff51ee60..1e2f905354f43363164f67f8715e1deb50034bbc 100644
--- a/test/box/bsdsocket.result
+++ b/test/box/bsdsocket.result
@@ -39,22 +39,10 @@ socket('PF_INET', 'SOCK_STREAM', 'tcp121222');
 s = socket('PF_INET', 'SOCK_STREAM', 'tcp')
 ---
 ...
-s:wait(.01)
----
-- RW
-...
 type(s)
 ---
 - table
 ...
-s:errno()
----
-- 0
-...
-type(s:error())
----
-- nil
-...
 -- Invalid arguments
 --# setopt delimiter ';'
 for k in pairs(getmetatable(s).__index) do
@@ -270,10 +258,6 @@ s:error()
 ---
 - null
 ...
-s:setsockopt('SOL_SOCKET', 'SO_BSDCOMPAT', false)
----
-- true
-...
 s:setsockopt('SOL_SOCKET', 'SO_DEBUG', false)
 ---
 - true
@@ -319,10 +303,6 @@ s:linger()
 - false
 - 1
 ...
-s:shutdown('R')
----
-- true
-...
 s:close()
 ---
 - true
@@ -345,14 +325,6 @@ s:listen(128)
 sc = socket('PF_INET', 'SOCK_STREAM', 'tcp')
 ---
 ...
-sc:writable()
----
-- true
-...
-sc:readable()
----
-- true
-...
 sc:sysconnect('127.0.0.1', 3457) or errno() == errno.EINPROGRESS
 ---
 - true
@@ -631,10 +603,6 @@ sc:nonblock(true)
 ---
 - true
 ...
-sc:readable()
----
-- true
-...
 sc:sysconnect('127.0.0.1', 3458) or errno() == errno.EINPROGRESS
 ---
 - true
@@ -859,11 +827,6 @@ s:bind('127.0.0.1', port)
 ---
 - true
 ...
-socket.tcp_connect('127.0.0.1', port), errno() == errno.ECONNREFUSED
----
-- null
-- true
-...
 s:listen()
 ---
 - true
@@ -1484,14 +1447,6 @@ os.remove(path)
 s = socket('AF_UNIX', 'SOCK_STREAM', 0)
 ---
 ...
-x = s:wait()
----
-...
--- waiters is map
-s.waiters
----
-- {}
-...
 -- check __serialize hook
 json.decode(json.encode(s)).fd == s:fd()
 ---
diff --git a/test/box/bsdsocket.test.lua b/test/box/bsdsocket.test.lua
index 6fd56f1e99b7979434ab3f1f077eae93a51ac7e9..1a431295f0d67dc9bbcfaa495acf2de5f892e867 100644
--- a/test/box/bsdsocket.test.lua
+++ b/test/box/bsdsocket.test.lua
@@ -13,10 +13,7 @@ type(socket)
 socket('PF_INET', 'SOCK_STREAM', 'tcp121222');
 
 s = socket('PF_INET', 'SOCK_STREAM', 'tcp')
-s:wait(.01)
 type(s)
-s:errno()
-type(s:error())
 -- Invalid arguments
 --# setopt delimiter ';'
 for k in pairs(getmetatable(s).__index) do
@@ -89,7 +86,6 @@ sevres[1].host
 s:setsockopt('SOL_SOCKET', 'SO_BROADCAST', false)
 s:getsockopt('SOL_SOCKET', 'SO_TYPE')
 s:error()
-s:setsockopt('SOL_SOCKET', 'SO_BSDCOMPAT', false)
 s:setsockopt('SOL_SOCKET', 'SO_DEBUG', false)
 s:getsockopt('SOL_SOCKET', 'SO_DEBUG')
 s:setsockopt('SOL_SOCKET', 'SO_ACCEPTCONN', 1)
@@ -101,7 +97,6 @@ s:linger(true, 1)
 s:linger()
 s:linger(false, 1)
 s:linger()
-s:shutdown('R')
 s:close()
 
 s = socket('PF_INET', 'SOCK_STREAM', 'tcp')
@@ -111,8 +106,6 @@ s:listen(128)
 
 sc = socket('PF_INET', 'SOCK_STREAM', 'tcp')
 
-sc:writable()
-sc:readable()
 sc:sysconnect('127.0.0.1', 3457) or errno() == errno.EINPROGRESS
 sc:writable(10)
 sc:write('Hello, world')
@@ -208,7 +201,6 @@ sc = socket('PF_INET', 'SOCK_STREAM', 'tcp')
 sc ~= nil
 sc:getsockopt('SOL_SOCKET', 'SO_ERROR')
 sc:nonblock(true)
-sc:readable()
 sc:sysconnect('127.0.0.1', 3458) or errno() == errno.EINPROGRESS
 string.match(tostring(sc), ', peer') == nil
 sc:writable()
@@ -279,7 +271,6 @@ socket.tcp_connect('127.0.0.1', 80, 0.00000000001)
 port = 35490
 s = socket('AF_INET', 'SOCK_STREAM', 'tcp')
 s:bind('127.0.0.1', port)
-socket.tcp_connect('127.0.0.1', port), errno() == errno.ECONNREFUSED
 s:listen()
 sc, e = socket.tcp_connect('127.0.0.1', port), errno()
 sc ~= nil
@@ -503,9 +494,6 @@ os.remove(path)
 
 -- Test serializers with sockets
 s = socket('AF_UNIX', 'SOCK_STREAM', 0)
-x = s:wait()
--- waiters is map
-s.waiters
 -- check __serialize hook
 json.decode(json.encode(s)).fd == s:fd()
 yaml.decode(yaml.encode(s)).fd == s:fd()