diff --git a/src/traft/topology.rs b/src/traft/topology.rs
index d4e009771838af6d3dc4d52eef25fe6d0a3b112f..bd96f784c945042d35ac11688b46120d1b53ff58 100644
--- a/src/traft/topology.rs
+++ b/src/traft/topology.rs
@@ -11,8 +11,8 @@ use raft::INVALID_INDEX;
 
 pub struct Topology {
     peers: BTreeMap<RaftId, Peer>,
-    diff: BTreeMap<RaftId, Peer>,
-    to_replace: BTreeMap<RaftId, (RaftId, Peer)>,
+    diff: BTreeSet<RaftId>,
+    to_replace: BTreeMap<RaftId, RaftId>,
     replication_factor: u8,
 
     max_raft_id: RaftId,
@@ -100,13 +100,12 @@ impl Topology {
             peer.voter = req.voter;
 
             if req.voter {
-                self.diff.insert(peer.raft_id, peer.clone());
+                self.diff.insert(peer.raft_id);
             } else {
                 let old_raft_id = peer.raft_id;
                 peer.raft_id = self.max_raft_id + 1;
 
-                self.to_replace
-                    .insert(peer.raft_id, (old_raft_id, peer.clone()));
+                self.to_replace.insert(peer.raft_id, old_raft_id);
             }
             self.put_peer(peer);
 
@@ -130,7 +129,7 @@ impl Topology {
                 voter: req.voter,
             };
 
-            self.diff.insert(raft_id, peer.clone());
+            self.diff.insert(raft_id);
             self.put_peer(peer);
         }
 
@@ -138,11 +137,25 @@ impl Topology {
     }
 
     pub fn diff(&self) -> Vec<Peer> {
-        self.diff.values().cloned().collect()
+        self.diff
+            .iter()
+            .map(|id| self.peers.get(id).expect("peers must contain all peers"))
+            .cloned()
+            .collect()
     }
 
     pub fn to_replace(&self) -> Vec<(RaftId, Peer)> {
-        self.to_replace.values().cloned().collect()
+        self.to_replace
+            .iter()
+            .map(|(new_id, &old_id)| {
+                let peer = self
+                    .peers
+                    .get(new_id)
+                    .expect("peers must contain all peers")
+                    .clone();
+                (old_id, peer)
+            })
+            .collect()
     }
 }