diff --git a/src/box/engine.cc b/src/box/engine.cc
index c83909f8f1a4d602d9bcb5d48bf3f217cc64b017..64fc0bcee98d11c3fdf6d8af792c68bf77128172 100644
--- a/src/box/engine.cc
+++ b/src/box/engine.cc
@@ -85,7 +85,7 @@ EngineFactory *
 engine_find(const char *name)
 {
 	EngineFactory *e;
-	rlist_foreach_entry(e, &engines, link) {
+	engine_foreach(e) {
 		if (strcmp(e->name, name) == 0)
 			return e;
 	}
@@ -108,7 +108,7 @@ engine_begin_recover_snapshot(int64_t snapshot_lsn)
 	/* recover engine snapshot */
 	EngineFactory *f;
 	engine_foreach(f) {
-		f->snapshot(SNAPSHOT_RECOVER, snapshot_lsn);
+		f->set_snapshot_lsn(snapshot_lsn);
 	}
 }
 
diff --git a/src/box/engine.h b/src/box/engine.h
index ed063f3b53a731c62f3a8617c6bd5b1dd6fd04b7..71340c4f2f38ce00c9a2f164dd1d1a206e766255 100644
--- a/src/box/engine.h
+++ b/src/box/engine.h
@@ -79,10 +79,15 @@ enum engine_recovery_event {
  * Engine specific snapshot event.
  */
 enum engine_snapshot_event {
+	/** Begin two-face snapshot creation in this engine. */
 	SNAPSHOT_START,
-	SNAPSHOT_RECOVER,
+	/** Wait for completion of the two-phase snapshot creation */
+	SNAPSHOT_WAIT,
+	/**
+	 * On success, delete previous snapshot, on failure,
+	 * delete the last snapshot (passed in as lsn.
+	 */
 	SNAPSHOT_DELETE,
-	SNAPSHOT_WAIT
 };
 
 typedef void (*engine_recover_f)(struct space*);
@@ -138,6 +143,7 @@ class EngineFactory: public Object {
 	virtual void begin(struct txn*, struct space*);
 	virtual void commit(struct txn*);
 	virtual void rollback(struct txn*);
+	virtual void set_snapshot_lsn(int64_t lsn) = 0;
 	/**
 	 * Engine snapshotting support.
 	 */
diff --git a/src/box/memtx_engine.cc b/src/box/memtx_engine.cc
index eb956a725de3bc92141280ab8200dc929735ddec..c2447e0026c0a0f919532e5024a46f38d06c4616 100644
--- a/src/box/memtx_engine.cc
+++ b/src/box/memtx_engine.cc
@@ -200,7 +200,8 @@ MemtxFactory::keydefCheck(struct key_def *key_def)
 	}
 }
 
-void MemtxFactory::rollback(struct txn *txn)
+void
+MemtxFactory::rollback(struct txn *txn)
 {
 	struct txn_stmt *stmt;
 	rlist_foreach_entry_reverse(stmt, &txn->stmts, next) {
@@ -211,7 +212,18 @@ void MemtxFactory::rollback(struct txn *txn)
 	}
 }
 
-void MemtxFactory::snapshot(enum engine_snapshot_event, int64_t /* lsn */)
+/** Called at start to tell memtx to recover to a given LSN. */
+void
+MemtxFactory::set_snapshot_lsn(int64_t /* lsn */)
+{
+	/*
+	 * memtx snapshotting supported directly by box.
+	 * do nothing here.
+	 */
+}
+
+void
+MemtxFactory::snapshot(enum engine_snapshot_event, int64_t /* lsn */)
 {
 	/*
 	 * memtx snapshotting supported directly by box.
diff --git a/src/box/memtx_engine.h b/src/box/memtx_engine.h
index c3c6681258d3e59ef66df0536de49aca9c0b8aa3..0d9fb3b5d3863548466e8d9ca050572aede32eb7 100644
--- a/src/box/memtx_engine.h
+++ b/src/box/memtx_engine.h
@@ -38,6 +38,7 @@ struct MemtxFactory: public EngineFactory {
 	virtual void keydefCheck(struct key_def *key_def);
 	virtual void recoveryEvent(enum engine_recovery_event event);
 	virtual void rollback(struct txn*);
+	virtual void set_snapshot_lsn(int64_t lsn);
 	virtual void snapshot(enum engine_snapshot_event, int64_t);
 };
 
diff --git a/src/box/sophia_engine.cc b/src/box/sophia_engine.cc
index 98fece2ff4ccef0261476165755b5896ad676057..79f8a1cba2d35ccedbe7a7de1b2a522521e06b2b 100644
--- a/src/box/sophia_engine.cc
+++ b/src/box/sophia_engine.cc
@@ -391,21 +391,25 @@ sophia_snapshot_delete(void *env, int64_t lsn)
 		sophia_raise(env);
 }
 
-void SophiaFactory::snapshot(enum engine_snapshot_event e, int64_t lsn)
+void
+SophiaFactory::set_snapshot_lsn(int64_t lsn)
+{
+	sophia_snapshot_recover(env, lsn);
+}
+
+void
+SophiaFactory::snapshot(enum engine_snapshot_event e, int64_t lsn)
 {
 	switch (e) {
 	case SNAPSHOT_START:
 		sophia_snapshot(env, lsn);
 		break;
-	case SNAPSHOT_RECOVER:
-		sophia_snapshot_recover(env, lsn);
-		break;
-	case SNAPSHOT_DELETE:
-		sophia_snapshot_delete(env, lsn);
-		break;
 	case SNAPSHOT_WAIT:
 		while (! sophia_snapshot_ready(env, lsn))
 			fiber_yield_timeout(.020);
 		break;
+	case SNAPSHOT_DELETE:
+		sophia_snapshot_delete(env, lsn);
+		break;
 	}
 }
diff --git a/src/box/sophia_engine.h b/src/box/sophia_engine.h
index a9c1bc4a74254ca335368218215cae813bd3dcfd..2b3cac646b9f957dcee860b31d68850fb9b0a70a 100644
--- a/src/box/sophia_engine.h
+++ b/src/box/sophia_engine.h
@@ -40,6 +40,7 @@ struct SophiaFactory: public EngineFactory {
 	virtual void commit(struct txn*);
 	virtual void rollback(struct txn*);
 	virtual void recoveryEvent(enum engine_recovery_event);
+	virtual void set_snapshot_lsn(int64_t);
 	virtual void snapshot(enum engine_snapshot_event, int64_t);
 	void *env;
 	void *tx;