diff --git a/src/lua/trigger.cc b/src/lua/trigger.cc
index a3bd8303ed135dfbb6d432f978c647a0402bb26a..8cae6a8a7f2846c78263af1fdd2c17bf8a31793e 100644
--- a/src/lua/trigger.cc
+++ b/src/lua/trigger.cc
@@ -58,6 +58,19 @@ lbox_trigger_find(struct lua_State *L, int index,
 	return NULL;
 }
 
+void
+lbox_trigger_table(struct lua_State *L, struct rlist *list)
+{
+	struct trigger *trigger;
+	uint32_t count = 1;
+	lua_newtable(L);
+	rlist_foreach_entry_reverse(trigger, list, link) {
+		lua_rawgeti(L, LUA_REGISTRYINDEX, (intptr_t) trigger->data);
+		lua_rawseti(L, -2, count);
+		count++;
+	}
+}
+
 void
 lbox_trigger_check_input(struct lua_State *L, int top)
 {
@@ -68,9 +81,11 @@ lbox_trigger_check_input(struct lua_State *L, int top)
 	/* (nil, function) is OK,
 	 * (function, nil), is OK,
 	 * (function, function) is OK,
+	 * no arguments is OK,
 	 * anything else is error.
 	 */
-	if ((lua_isfunction(L, top) && lua_isnil(L, top - 1)) ||
+	if ((lua_isnil(L, top) && lua_isnil(L, top - 1)) ||
+	    (lua_isfunction(L, top) && lua_isnil(L, top - 1)) ||
 	    (lua_isnil(L, top) && lua_isfunction(L, top - 1)) ||
 	    (lua_isfunction(L, top) && lua_isfunction(L, top - 1)))
 		return;
@@ -83,6 +98,11 @@ lbox_trigger_reset(struct lua_State *L, int top,
 		   struct rlist *list, trigger_f run)
 {
 	lbox_trigger_check_input(L, top);
+	// if no args - return triggers table
+	if(lua_isnil(L, top) && lua_isnil(L, top - 1)){
+		lbox_trigger_table(L, list);
+		return 1;
+	}
 
 	struct trigger *trg = lbox_trigger_find(L, top, list, run);
 
@@ -113,6 +133,8 @@ lbox_trigger_reset(struct lua_State *L, int top,
 		/* Reference. */
 		trg->data = (void *) (intptr_t)
 			luaL_ref(L, LUA_REGISTRYINDEX);
+		lua_rawgeti(L, LUA_REGISTRYINDEX, (intptr_t) trg->data);
+		return 1;
 
 	} else {
 		trigger_clear(trg);
diff --git a/test/box/bad_trigger.result b/test/box/bad_trigger.result
index 5740f76833df897d234d482b85063b3b325d19f3..f31568c9bc53ffaebf17434c3b8cd7aa1e1c1d0a 100644
--- a/test/box/bad_trigger.result
+++ b/test/box/bad_trigger.result
@@ -6,8 +6,9 @@
 function f1() nosuchfunction() end
 ---
 ...
-box.session.on_connect(f1)
+type(box.session.on_connect(f1))
 ---
+- function
 ...
 greeting:  True
 fixheader:  True
diff --git a/test/box/bad_trigger.test.py b/test/box/bad_trigger.test.py
index 6fc55982725404b70f2d6cd77e7984c8d718250d..3615ccb9dfdff7ace242a331f6a5b5673f1d3c8d 100644
--- a/test/box/bad_trigger.test.py
+++ b/test/box/bad_trigger.test.py
@@ -13,7 +13,7 @@ print """
  """
 
 server.admin("function f1() nosuchfunction() end")
-server.admin("box.session.on_connect(f1)")
+server.admin("type(box.session.on_connect(f1))")
 
 unpacker = msgpack.Unpacker(use_list = False)
 
diff --git a/test/box/on_replace.result b/test/box/on_replace.result
index 35daaceb3337486b8423ada116855fabb470f577..8b7b5d33311cf8aed8a7a84ccef53bc5a5bbb91b 100644
--- a/test/box/on_replace.result
+++ b/test/box/on_replace.result
@@ -14,7 +14,7 @@ ts.on_replace()
 ...
 ts:on_replace()
 ---
-- error: 'trigger reset: incorrect arguments'
+- []
 ...
 ts:on_replace(123)
 ---
@@ -23,8 +23,9 @@ ts:on_replace(123)
 function fail(old_tuple, new_tuple) error('test') end
 ---
 ...
-ts:on_replace(fail)
+type(ts:on_replace(fail))
 ---
+- function
 ...
 ts:insert{1, 'b', 'c'}
 ---
@@ -47,8 +48,9 @@ ts:get{1}
 function fail(old_tuple, new_tuple) error('abc') end
 ---
 ...
-ts:on_replace(fail)
+type(ts:on_replace(fail))
 ---
+- function
 ...
 ts:insert{2, 'b', 'c'}
 ---
@@ -60,8 +62,9 @@ ts:get{2}
 function save_out(told, tnew) o = told n = tnew end
 ---
 ...
-ts:on_replace(save_out, fail)
+type(ts:on_replace(save_out, fail))
 ---
+- function
 ...
 ts:insert{2, 'a', 'b', 'c'}
 ---
@@ -87,6 +90,14 @@ n
 ---
 - [2, 'd', 'e', 'f']
 ...
+type(ts:on_replace(function() test = 1 end))
+---
+- function
+...
+#ts:on_replace()
+---
+- 2
+...
 ts:drop()
 ---
 ...
diff --git a/test/box/on_replace.test.lua b/test/box/on_replace.test.lua
index 2ec3138c2dc18ee666171bc9e487fb60bef3a83a..c67c86928748303ff98867463ea6e6b0813222a0 100644
--- a/test/box/on_replace.test.lua
+++ b/test/box/on_replace.test.lua
@@ -7,7 +7,7 @@ ts:on_replace()
 ts:on_replace(123)
 
 function fail(old_tuple, new_tuple) error('test') end
-ts:on_replace(fail)
+type(ts:on_replace(fail))
 
 ts:insert{1, 'b', 'c'}
 ts:get{1}
@@ -18,13 +18,13 @@ ts:insert{1, 'b', 'c'}
 ts:get{1}
 
 function fail(old_tuple, new_tuple) error('abc') end
-ts:on_replace(fail)
+type(ts:on_replace(fail))
 
 ts:insert{2, 'b', 'c'}
 ts:get{2}
 
 function save_out(told, tnew) o = told n = tnew end
-ts:on_replace(save_out, fail)
+type(ts:on_replace(save_out, fail))
 
 ts:insert{2, 'a', 'b', 'c'}
 o
@@ -34,4 +34,6 @@ ts:replace{2, 'd', 'e', 'f'}
 o
 n
 
+type(ts:on_replace(function() test = 1 end))
+#ts:on_replace()
 ts:drop()
diff --git a/test/box/session.result b/test/box/session.result
index dead886005596ab1d45d415b5849938099a761b8..edffc0a900c531f26410d7a848775044f5c7a4c4 100644
--- a/test/box/session.result
+++ b/test/box/session.result
@@ -53,30 +53,34 @@ session.peer() == session.peer(session.id())
 function noop() end
 ---
 ...
-session.on_connect(noop)
+type(session.on_connect(noop))
 ---
+- function
 ...
-session.on_disconnect(noop)
+type(session.on_disconnect(noop))
 ---
+- function
 ...
 -- check it's possible to reset these triggers
 function fail() error('hear') end
 ---
 ...
-session.on_connect(fail, noop)
+type(session.on_connect(fail, noop))
 ---
+- function
 ...
-session.on_disconnect(fail, noop)
+type(session.on_disconnect(fail, noop))
 ---
+- function
 ...
 -- check on_connect/on_disconnect argument count and type
-session.on_connect()
+type(session.on_connect())
 ---
-- error: 'trigger reset: incorrect arguments'
+- table
 ...
-session.on_disconnect()
+type(session.on_disconnect())
 ---
-- error: 'trigger reset: incorrect arguments'
+- table
 ...
 session.on_connect(function() end, function() end)
 ---
@@ -119,11 +123,13 @@ function dec() active_connections = active_connections - 1 end
 net = { box = require('net.box') }
 ---
 ...
-session.on_connect(inc)
+type(session.on_connect(inc))
 ---
+- function
 ...
-session.on_disconnect(dec)
+type(session.on_disconnect(dec))
 ---
+- function
 ...
 active_connections = 0
 ---
@@ -177,11 +183,13 @@ function audit_connect() box.space['tweedledum']:insert{session.id()} end
 function audit_disconnect() box.space['tweedledum']:delete{session.id()} end
 ---
 ...
-session.on_connect(audit_connect)
+type(session.on_connect(audit_connect))
 ---
+- function
 ...
-session.on_disconnect(audit_disconnect)
+type(session.on_disconnect(audit_disconnect))
 ---
+- function
 ...
 box.schema.user.grant('guest', 'read,write,execute', 'universe')
 ---
diff --git a/test/box/session.test.lua b/test/box/session.test.lua
index 56e5a0c35016c45117d2066664115a646b18ef90..fe68b7edc8ecd280baadf45cd3773c96c573aac5 100644
--- a/test/box/session.test.lua
+++ b/test/box/session.test.lua
@@ -19,17 +19,17 @@ session.peer() == session.peer(session.id())
 
 -- check on_connect/on_disconnect triggers
 function noop() end
-session.on_connect(noop)
-session.on_disconnect(noop)
+type(session.on_connect(noop))
+type(session.on_disconnect(noop))
 
 -- check it's possible to reset these triggers
 function fail() error('hear') end
-session.on_connect(fail, noop)
-session.on_disconnect(fail, noop)
+type(session.on_connect(fail, noop))
+type(session.on_disconnect(fail, noop))
 
 -- check on_connect/on_disconnect argument count and type
-session.on_connect()
-session.on_disconnect()
+type(session.on_connect())
+type(session.on_disconnect())
 
 session.on_connect(function() end, function() end)
 session.on_disconnect(function() end, function() end)
@@ -48,8 +48,8 @@ session.on_disconnect(nil, fail)
 function inc() active_connections = active_connections + 1 end
 function dec() active_connections = active_connections - 1 end
 net = { box = require('net.box') }
-session.on_connect(inc)
-session.on_disconnect(dec)
+type(session.on_connect(inc))
+type(session.on_disconnect(dec))
 active_connections = 0
 LISTEN = require('uri').parse(box.cfg.listen)
 c = net.box:new(LISTEN.host, LISTEN.service)
@@ -69,8 +69,8 @@ session.on_disconnect(nil, dec)
 -- write audit trail of connect/disconnect into a space
 function audit_connect() box.space['tweedledum']:insert{session.id()} end
 function audit_disconnect() box.space['tweedledum']:delete{session.id()} end
-session.on_connect(audit_connect)
-session.on_disconnect(audit_disconnect)
+type(session.on_connect(audit_connect))
+type(session.on_disconnect(audit_disconnect))
 
 box.schema.user.grant('guest', 'read,write,execute', 'universe')
 a = net.box:new(LISTEN.host, LISTEN.service)