diff --git a/extra/schema_fill.lua b/extra/schema_fill.lua
index 4259202028f01a34f9d9588a41699d4d90f0f975..493d5a68af7ffa67cfb45744cc778305996c5e6d 100644
--- a/extra/schema_fill.lua
+++ b/extra/schema_fill.lua
@@ -62,3 +62,4 @@ _index:insert{_cluster.id, 1, 'uuid', 'tree', 1, 1, 1, 'str'}
 _user:insert{GUEST, ADMIN, 'guest', 'user'}
 _user:insert{ADMIN, ADMIN, 'admin', 'user'}
 _user:insert{PUBLIC, ADMIN, 'public', 'role'}
+_priv:insert{1, 1, 'universe', 0, 7}
diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap
index 0e85981f082463a70aa44cc06a8dc07805130292..b429bfee3548f5bf6563426246cbce7b6a7302b2 100644
Binary files a/src/box/bootstrap.snap and b/src/box/bootstrap.snap differ
diff --git a/src/box/lua/call.cc b/src/box/lua/call.cc
index 7fed303683ba76dee760ce2407def2cc189d7487..9b2513f65195e76036f5c18d943afff86c8aaf9b 100644
--- a/src/box/lua/call.cc
+++ b/src/box/lua/call.cc
@@ -408,7 +408,7 @@ box_lua_find(lua_State *L, const char *name, const char *name_end)
 
 	lua_pushlstring(L, start, name_end - start);
 	lua_gettable(L, index);
-	if (! lua_isfunction(L, -1)) {
+	if (!lua_isfunction(L, -1) && !lua_istable(L, -1)) {
 		/* lua_call or lua_gettable would raise a type error
 		 * for us, but our own message is more verbose. */
 		tnt_raise(ClientError, ER_NO_SUCH_PROC,
@@ -452,11 +452,15 @@ static inline void
 access_check_func(const char *name, uint32_t name_len,
 		  struct user *user, uint8_t access)
 {
+	 /*
+	  * No special check for ADMIN user is necessary
+	  * since ADMIN has universal access.
+	  */
 	if (access == 0)
 		return;
 
 	struct func_def *func = func_by_name(name, name_len);
-	if (func == NULL || (func->uid != user->uid && user->uid != ADMIN &&
+	if (func == NULL || (func->uid != user->uid &&
 			     access & ~func->access[user->auth_token])) {
 		char name_buf[BOX_NAME_MAX + 1];
 		snprintf(name_buf, sizeof(name_buf), "%.*s", name_len, name);
diff --git a/src/box/space.cc b/src/box/space.cc
index 1247052a845a6438f8f9ebeb1c276e90499a5a29..5e722cd9941879e4f9f70713b66df2009e3c531d 100644
--- a/src/box/space.cc
+++ b/src/box/space.cc
@@ -43,9 +43,11 @@ space_check_access(struct space *space, uint8_t access)
 	 * If a user has a global permission, clear the respective
 	 * privilege from the list of privileges required
 	 * to execute the request.
+	 * No special check for ADMIN user is necessary
+	 * since ADMIN has universal access.
 	 */
 	access &= ~user->universal_access;
-	if (access && space->def.uid != user->uid && user->uid != ADMIN &&
+	if (access && space->def.uid != user->uid &&
 	    access & ~space->access[user->auth_token]) {
 		tnt_raise(ClientError, ER_SPACE_ACCESS_DENIED,
 			  priv_name(access), user->name, space->def.name);
diff --git a/test/box/access_bin.result b/test/box/access_bin.result
new file mode 100644
index 0000000000000000000000000000000000000000..9f7dd18865063d564d0a0393e92fb559bae4b281
--- /dev/null
+++ b/test/box/access_bin.result
@@ -0,0 +1,30 @@
+--
+-- Access control tests which require a binary protocol
+-- connection to the server
+--
+box.schema.user.grant('guest','read,write,execute','universe')
+---
+...
+session = require('session')
+---
+...
+net = { box = require('net.box') }
+---
+...
+c = net.box:new(0, box.cfg.listen)
+---
+...
+c:call("dostring", "session.su('admin')")
+---
+- []
+...
+c:call("dostring", "return session.user()")
+---
+- - ['admin']
+...
+c:close()
+---
+...
+box.schema.user.revoke('guest', 'read,write,execute', 'universe')
+---
+...
diff --git a/test/box/access_bin.test.lua b/test/box/access_bin.test.lua
new file mode 100644
index 0000000000000000000000000000000000000000..0a1b7c139a6460e338590cee0d0862fd790591dd
--- /dev/null
+++ b/test/box/access_bin.test.lua
@@ -0,0 +1,12 @@
+--
+-- Access control tests which require a binary protocol
+-- connection to the server
+--
+box.schema.user.grant('guest','read,write,execute','universe')
+session = require('session')
+net = { box = require('net.box') }
+c = net.box:new(0, box.cfg.listen)
+c:call("dostring", "session.su('admin')")
+c:call("dostring", "return session.user()")
+c:close()
+box.schema.user.revoke('guest', 'read,write,execute', 'universe')
diff --git a/test/replication/hot_standby.result b/test/replication/hot_standby.result
index 3756f45d96df68b83e651ea6b984313490a71389..85e0d55086e4b2422a2a1d95ab27602087f46aee 100644
--- a/test/replication/hot_standby.result
+++ b/test/replication/hot_standby.result
@@ -9,7 +9,12 @@ box.schema.user.grant('guest', 'read,write,execute', 'universe')
 --# set connection default
 --# setopt delimiter ';'
 --# set connection default, hot_standby, replica
-fiber = require('fiber')
+fiber = require('fiber');
+---
+...
+while box.info.node == nil do fiber.sleep(0.01) end;
+---
+...
 while box.space['_priv']:len() < 1 do fiber.sleep(0.001) end;
 ---
 ...
diff --git a/test/replication/hot_standby.test.lua b/test/replication/hot_standby.test.lua
index 911b1dd7719a56a20d3a22fa0dc5e23a45069aaf..05ce41a9f6e3dd0f333a19ab9b34671f68a05ae9 100644
--- a/test/replication/hot_standby.test.lua
+++ b/test/replication/hot_standby.test.lua
@@ -8,7 +8,8 @@ box.schema.user.grant('guest', 'read,write,execute', 'universe')
 
 --# setopt delimiter ';'
 --# set connection default, hot_standby, replica
-fiber = require('fiber')
+fiber = require('fiber');
+while box.info.node == nil do fiber.sleep(0.01) end;
 while box.space['_priv']:len() < 1 do fiber.sleep(0.001) end;
 do
     local pri_id = ''
diff --git a/test/replication/swap.result b/test/replication/swap.result
index 258b11a6c4734bde4bd0f79eb84ad0200ffb3d0e..4e493238af23f3c8f1a7af05edeba1edaeba343c 100644
--- a/test/replication/swap.result
+++ b/test/replication/swap.result
@@ -4,6 +4,9 @@ box.schema.user.create('test', { password = 'pass123456'})
 box.schema.user.grant('test', 'read,write,execute', 'universe')
 ---
 ...
+while box.info.node == nil do require('fiber').sleep(0.01) end
+---
+...
 while box.space['_priv']:len() < 1 do require('fiber').sleep(0.01) end
 ---
 ...
diff --git a/test/replication/swap.test.py b/test/replication/swap.test.py
index 9ab52906849697806133fde44f6633a9a9284ccc..2bf1ea58c9421f55f50734ca41f7898fddb27351 100644
--- a/test/replication/swap.test.py
+++ b/test/replication/swap.test.py
@@ -32,6 +32,7 @@ replica = TarantoolServer()
 replica.script = "replication/replica.lua"
 replica.vardir = os.path.join(server.vardir, 'replica')
 replica.deploy()
+replica.admin("while box.info.node == nil do require('fiber').sleep(0.01) end")
 replica.uri = '%s:%s@%s:%s' % (LOGIN, PASSWORD, HOST, replica.sql.port)
 replica.admin("while box.space['_priv']:len() < 1 do require('fiber').sleep(0.01) end")
 replica.sql.py_con.authenticate(LOGIN, PASSWORD)