diff --git a/src/box/txn_limbo.c b/src/box/txn_limbo.c
index 5ed3394d353d696aa03f718303e44c4bfce5d8fc..8fc953e250bbe02adfca64588558c34b99715cc3 100644
--- a/src/box/txn_limbo.c
+++ b/src/box/txn_limbo.c
@@ -536,14 +536,19 @@ txn_limbo_write_promote(struct txn_limbo *limbo, int64_t lsn, uint64_t term)
  */
 static void
 txn_limbo_read_promote(struct txn_limbo *limbo, uint32_t replica_id,
-		       int64_t lsn)
+		       uint32_t prev_id, int64_t lsn)
 {
 	txn_limbo_read_confirm(limbo, lsn);
 	txn_limbo_read_rollback(limbo, lsn + 1);
 	assert(txn_limbo_is_empty(limbo));
 	limbo->owner_id = replica_id;
 	box_update_ro_summary();
-	limbo->confirmed_lsn = 0;
+	/*
+	 * Only nullify confirmed_lsn when the new value is unknown. I.e. when
+	 * prev_id != replica_id.
+	 */
+	if (replica_id != prev_id)
+		limbo->confirmed_lsn = 0;
 }
 
 void
@@ -571,9 +576,9 @@ txn_limbo_write_demote(struct txn_limbo *limbo, int64_t lsn, uint64_t term)
  * @sa txn_limbo_read_promote.
  */
 static void
-txn_limbo_read_demote(struct txn_limbo *limbo, int64_t lsn)
+txn_limbo_read_demote(struct txn_limbo *limbo, uint32_t prev_id, int64_t lsn)
 {
-	return txn_limbo_read_promote(limbo, REPLICA_ID_NIL, lsn);
+	return txn_limbo_read_promote(limbo, REPLICA_ID_NIL, prev_id, lsn);
 }
 
 void
@@ -889,10 +894,11 @@ txn_limbo_req_commit(struct txn_limbo *limbo, const struct synchro_request *req)
 		txn_limbo_read_rollback(limbo, lsn);
 		break;
 	case IPROTO_RAFT_PROMOTE:
-		txn_limbo_read_promote(limbo, req->origin_id, lsn);
+		txn_limbo_read_promote(limbo, req->origin_id, req->replica_id,
+				       lsn);
 		break;
 	case IPROTO_RAFT_DEMOTE:
-		txn_limbo_read_demote(limbo, lsn);
+		txn_limbo_read_demote(limbo, req->replica_id, lsn);
 		break;
 	default:
 		unreachable();