diff --git a/src/box/box.cc b/src/box/box.cc
index b1898ecc744567834ef750f9e203842c5ddaceca..bca73ed9a5782c37cd478035022876935a9a435a 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -546,27 +546,6 @@ box_snapshot_cb(struct xlog *l)
 	space_foreach(snapshot_space, l);
 }
 
-static inline void
-engine_start_snapshot(EngineFactory *f, void *udate)
-{
-	int64_t lsn = *(int64_t*)udate;
-	f->snapshot(SNAPSHOT_START, lsn);
-}
-
-static inline void
-engine_delete_snapshot(EngineFactory *f, void *udate)
-{
-	int64_t lsn = *(int64_t*)udate;
-	f->snapshot(SNAPSHOT_DELETE, lsn);
-}
-
-static inline void
-engine_wait_snapshot(EngineFactory *f, void *udate)
-{
-	int64_t lsn = *(int64_t*)udate;
-	f->snapshot(SNAPSHOT_WAIT, lsn);
-}
-
 static ssize_t
 box_snapshot_rename_cb(va_list ap)
 {
@@ -593,7 +572,10 @@ box_snapshot(void)
 	int64_t snap_lsn = vclock_signature(&recovery->vclock);
 
 	/* create engine snapshot */
-	engine_foreach(engine_start_snapshot, &snap_lsn);
+	EngineFactory *f;
+	engine_foreach(f) {
+		f->snapshot(SNAPSHOT_START, snap_lsn);
+	}
 
 	/*
 	 * Due to fork nature, no threads are recreated.
@@ -640,7 +622,9 @@ box_snapshot(void)
 	tuple_end_snapshot();
 
 	/* wait for engine snapshot completion */
-	engine_foreach(engine_wait_snapshot, &snap_lsn);
+	engine_foreach(f) {
+		f->snapshot(SNAPSHOT_WAIT, snap_lsn);
+	}
 
 	/* rename snapshot on completion */
 	rc = coeio_custom(box_snapshot_rename_cb,
@@ -649,7 +633,9 @@ box_snapshot(void)
 		goto error;
 
 	/* remove previous snapshot reference */
-	engine_foreach(engine_delete_snapshot, &snapshot_last_lsn);
+	engine_foreach(f) {
+		f->snapshot(SNAPSHOT_DELETE, snapshot_last_lsn);
+	}
 
 	snapshot_last_lsn = snap_lsn;
 	snapshot_pid = 0;
@@ -657,8 +643,11 @@ box_snapshot(void)
 
 error:
 	/* rollback snapshot creation */
-	if (snap_lsn != snapshot_last_lsn)
-		engine_foreach(engine_delete_snapshot, &snap_lsn);
+	if (snap_lsn != snapshot_last_lsn) {
+		engine_foreach(f) {
+			f->snapshot(SNAPSHOT_DELETE, snap_lsn);
+		}
+	}
 	tuple_end_snapshot();
 	snapshot_pid = 0;
 	return status;
@@ -672,8 +661,11 @@ engine_save_snapshot(struct recovery_state *r)
 
 	/* create engine snapshot and wait for completion */
 	uint64_t snap_lsn = vclock_signature(&r->vclock);
-	engine_foreach(engine_start_snapshot, &snap_lsn);
-	engine_foreach(engine_wait_snapshot, &snap_lsn);
+	EngineFactory *f;
+	engine_foreach(f)
+		f->snapshot(SNAPSHOT_START, snap_lsn);
+	engine_foreach(f)
+		f->snapshot(SNAPSHOT_WAIT, snap_lsn);
 }
 
 const char *
diff --git a/src/box/engine.cc b/src/box/engine.cc
index 6d3f896c0ea0792c282a3a427f5291b4dff0aaf1..c83909f8f1a4d602d9bcb5d48bf3f217cc64b017 100644
--- a/src/box/engine.cc
+++ b/src/box/engine.cc
@@ -34,7 +34,8 @@
 #include <stdlib.h>
 #include <string.h>
 
-static RLIST_HEAD(engines);
+RLIST_HEAD(engines);
+
 uint32_t engine_flags[BOX_ENGINE_MAX];
 int n_engines;
 
@@ -74,7 +75,7 @@ Engine::Engine(EngineFactory *f)
 /** Register engine factory instance. */
 void engine_register(EngineFactory *engine)
 {
-	rlist_add_entry(&engines, engine, link);
+	rlist_add_tail_entry(&engines, engine, link);
 	engine->id = ++n_engines;
 	engine_flags[engine->id] = engine->flags;
 }
@@ -91,15 +92,6 @@ engine_find(const char *name)
 	tnt_raise(LoggedError, ER_NO_SUCH_ENGINE, name);
 }
 
-/** Call a visitor function on every registered engine. */
-void engine_foreach(void (*func)(EngineFactory *engine, void *udata),
-                    void *udata)
-{
-	EngineFactory *e;
-	rlist_foreach_entry(e, &engines, link)
-		func(e, udata);
-}
-
 /** Shutdown all engine factories. */
 void engine_shutdown()
 {
@@ -110,18 +102,14 @@ void engine_shutdown()
 	}
 }
 
-static inline void
-engine_begin_recover_cb(EngineFactory *f, void *udate)
-{
-	int64_t lsn = *(int64_t*)udate;
-	f->snapshot(SNAPSHOT_RECOVER, lsn);
-}
-
 void
 engine_begin_recover_snapshot(int64_t snapshot_lsn)
 {
 	/* recover engine snapshot */
-	engine_foreach(engine_begin_recover_cb, &snapshot_lsn);
+	EngineFactory *f;
+	engine_foreach(f) {
+		f->snapshot(SNAPSHOT_RECOVER, snapshot_lsn);
+	}
 }
 
 static void
@@ -137,13 +125,6 @@ do_one_recover_step(struct space *space, void * /* param */)
 	}
 }
 
-static inline void
-engine_end_recover_snapshot_cb(EngineFactory *f, void *udate)
-{
-	(void)udate;
-	f->recoveryEvent(END_RECOVERY_SNAPSHOT);
-}
-
 void
 engine_end_recover_snapshot()
 {
@@ -151,17 +132,13 @@ engine_end_recover_snapshot()
 	 * For all new spaces created from now on, when the
 	 * PRIMARY key is added, enable it right away.
 	 */
-	engine_foreach(engine_end_recover_snapshot_cb, NULL);
+	EngineFactory *f;
+	engine_foreach(f) {
+		f->recoveryEvent(END_RECOVERY_SNAPSHOT);
+	}
 	space_foreach(do_one_recover_step, NULL);
 }
 
-static inline void
-engine_end_recover_cb(EngineFactory *f, void *udate)
-{
-	(void)udate;
-	f->recoveryEvent(END_RECOVERY);
-}
-
 void
 engine_end_recover()
 {
@@ -169,8 +146,10 @@ engine_end_recover()
 	 * For all new spaces created after recovery is complete,
 	 * when the primary key is added, enable all keys.
 	 */
-	engine_foreach(engine_end_recover_cb, NULL);
-
+	EngineFactory *f;
+	engine_foreach(f) {
+		f->recoveryEvent(END_RECOVERY);
+	}
 	space_foreach(do_one_recover_step, NULL);
 }
 
diff --git a/src/box/engine.h b/src/box/engine.h
index 276ef3c269bae54ebb385ee017dda818e30528f1..ed063f3b53a731c62f3a8617c6bd5b1dd6fd04b7 100644
--- a/src/box/engine.h
+++ b/src/box/engine.h
@@ -40,6 +40,7 @@ enum engine_flags {
 };
 
 extern uint32_t engine_flags[BOX_ENGINE_MAX];
+extern struct rlist engines;
 
 /** Reflects what space_replace() is supposed to do. */
 enum engine_recovery_state {
@@ -184,8 +185,7 @@ struct Engine: public Object {
 void engine_register(EngineFactory *engine);
 
 /** Call a visitor function on every registered engine. */
-void engine_foreach(void (*func)(EngineFactory *engine, void *udata),
-                    void *udata);
+#define engine_foreach(engine) rlist_foreach_entry(engine, &engines, link)
 
 /** Find engine factory by name. */
 EngineFactory *engine_find(const char *name);