diff --git a/src/polymesh/impl/impl_low_level_api_mutable.hh b/src/polymesh/impl/impl_low_level_api_mutable.hh
index 01b0fdb8a388b0a55f33995d8a7f3f6029424856..6fd7896ec4351c951f76e590b325ecda9e76deeb 100644
--- a/src/polymesh/impl/impl_low_level_api_mutable.hh
+++ b/src/polymesh/impl/impl_low_level_api_mutable.hh
@@ -249,10 +249,6 @@ inline void low_level_api_mutable::remove_face(face_index f_idx) const
     // mark removed
     // (at the end!)
     set_removed(f_idx);
-
-    // bookkeeping
-    m.mRemovedFaces++;
-    m.mCompact = false;
 }
 
 inline void low_level_api_mutable::remove_edge(edge_index e_idx) const
@@ -307,11 +303,6 @@ inline void low_level_api_mutable::remove_edge(edge_index e_idx) const
 
     // remove half-edges
     set_removed(e_idx);
-
-    // bookkeeping
-    m.mRemovedHalfedges++;
-    m.mRemovedHalfedges++;
-    m.mCompact = false;
 }
 
 inline void low_level_api_mutable::remove_vertex(vertex_index v_idx) const
@@ -324,10 +315,6 @@ inline void low_level_api_mutable::remove_vertex(vertex_index v_idx) const
 
     // mark removed
     set_removed(v_idx);
-
-    // bookkeeping
-    m.mRemovedVertices++;
-    m.mCompact = false;
 }
 
 inline void low_level_api_mutable::fix_boundary_state_of(vertex_index v_idx) const
@@ -381,12 +368,45 @@ inline void low_level_api_mutable::fix_boundary_state_of_vertices(face_index f_i
         he = next_halfedge_of(he);
     } while (he != he_begin);
 }
-inline void low_level_api_mutable::set_removed(vertex_index idx) const { outgoing_halfedge_of(idx) = halfedge_index::invalid(); }
-inline void low_level_api_mutable::set_removed(face_index idx) const { halfedge_of(idx) = halfedge_index::invalid(); }
+
+inline void low_level_api_mutable::set_removed(vertex_index idx) const
+{
+    assert(!is_removed(idx) && "cannot remove an already removed entry");
+    outgoing_halfedge_of(idx) = halfedge_index::invalid();
+
+    // bookkeeping
+    m.mRemovedVertices++;
+    m.mCompact = false;
+}
+
+inline void low_level_api_mutable::set_removed(face_index idx) const
+{
+    assert(!is_removed(idx) && "cannot remove an already removed entry");
+    halfedge_of(idx) = halfedge_index::invalid();
+
+    // bookkeeping
+    m.mRemovedFaces++;
+    m.mCompact = false;
+}
+
 inline void low_level_api_mutable::set_removed(edge_index idx) const
 {
+    assert(!is_removed(idx) && "cannot remove an already removed entry");
     to_vertex_of(halfedge_of(idx, 0)) = vertex_index::invalid();
     to_vertex_of(halfedge_of(idx, 1)) = vertex_index::invalid();
+
+    // bookkeeping
+    m.mRemovedHalfedges++;
+    m.mRemovedHalfedges++;
+    m.mCompact = false;
+}
+
+inline void low_level_api_mutable::set_removed_counts(int r_vertices, int r_faces, int r_edges)
+{
+    m.mRemovedVertices = r_vertices;
+    m.mRemovedFaces = r_faces;
+    m.mRemovedHalfedges = r_edges * 2;
+    m.mCompact = r_vertices == 0 && r_faces == 0 && r_edges == 0;
 }
 
 inline void low_level_api_mutable::connect_prev_next(halfedge_index prev, halfedge_index next) const
@@ -493,8 +513,6 @@ inline vertex_index low_level_api_mutable::edge_split(edge_index e) const
 
     // remove edge
     set_removed(e);
-    m.mRemovedHalfedges += 2;
-    m.mCompact = false;
 
     return v;
 }
diff --git a/src/polymesh/low_level_api.hh b/src/polymesh/low_level_api.hh
index c300c5efd8cb3475ec1ce4738f6e405efd228862..aedb618820502b962a67a6fe4801361ce7ae48fd 100644
--- a/src/polymesh/low_level_api.hh
+++ b/src/polymesh/low_level_api.hh
@@ -182,10 +182,13 @@ public:
     // removing primitives
 public:
     /// Marks this vertex as removed
+    /// (Also updates remove counts and compact status)
     void set_removed(vertex_index idx) const;
     /// Marks this face as removed
+    /// (Also updates remove counts and compact status)
     void set_removed(face_index idx) const;
     /// Marks this edge as removed
+    /// (Also updates remove counts and compact status)
     void set_removed(edge_index idx) const;
 
     /// removes a face (actually sets the removed status)
@@ -196,6 +199,10 @@ public:
     /// removes all adjacent edges, then the vertex
     void remove_vertex(vertex_index v_idx) const;
 
+    /// Overrides the saved number of removed primitives
+    /// CAUTION: only use if you know what you do!
+    void set_removed_counts(int r_vertices, int r_faces, int r_edges);
+
     // reordering
 public:
     /// applies an index remapping to all face indices (p[curr_idx] = new_idx)
@@ -278,4 +285,5 @@ inline low_level_api_const low_level_api(Mesh const& m) { return {m}; }
 inline low_level_api_const low_level_api(Mesh const* m) { return {*m}; }
 inline low_level_api_mutable low_level_api(Mesh& m) { return {m}; }
 inline low_level_api_mutable low_level_api(Mesh* m) { return {*m}; }
+
 }