diff --git a/src/math/lp/emonics.cpp b/src/math/lp/emonics.cpp
index a8ac63689..f051a8f2e 100644
--- a/src/math/lp/emonics.cpp
+++ b/src/math/lp/emonics.cpp
@@ -595,4 +595,20 @@ bool emonics::invariant() const {
     return true;
 }
 
+
+void emonics::set_propagated(monic& m) {
+    struct set_unpropagated : public trail {
+        emonics& em;
+        unsigned var;
+    public:
+        set_unpropagated(emonics& em, unsigned var): em(em), var(var) {}
+        void undo() override {
+            em[var].set_propagated(false);
+        }
+    };
+    SASSERT(!m.is_propagated());
+    m.set_propagated(true);
+    m_u_f_stack.push(set_unpropagated(*this, m.var()));
+}
+
 }
diff --git a/src/math/lp/emonics.h b/src/math/lp/emonics.h
index e4f4f4848..051e1d6f0 100644
--- a/src/math/lp/emonics.h
+++ b/src/math/lp/emonics.h
@@ -142,6 +142,8 @@ public:
     void merge_eh(unsigned r2, unsigned r1, unsigned v2, unsigned v1) {}
     void after_merge_eh(unsigned r2, unsigned r1, unsigned v2, unsigned v1) {}
 
+    void set_propagated(monic& m);
+
     // this method is required by union_find
     trail_stack & get_trail_stack() { return m_u_f_stack; }
 
diff --git a/src/math/lp/monic.h b/src/math/lp/monic.h
index 884adaaf8..d981b2042 100644
--- a/src/math/lp/monic.h
+++ b/src/math/lp/monic.h
@@ -58,6 +58,7 @@ class monic: public mon_eq {
     svector<lpvar>   m_rvars;
     bool             m_rsign;
     mutable unsigned m_visited;
+    bool             m_propagated = false;
 public:
     // constructors
     monic(lpvar v, unsigned sz, lpvar const* vs, unsigned idx):  
@@ -74,6 +75,8 @@ public:
     void reset_rfields() { m_rsign = false; m_rvars.reset(); SASSERT(m_rvars.size() == 0); }
     void push_rvar(signed_var sv) { m_rsign ^= sv.sign(); m_rvars.push_back(sv.var()); }
     void sort_rvars() { std::sort(m_rvars.begin(), m_rvars.end()); }
+    void set_propagated(bool p) { m_propagated = p; }
+    bool is_propagated() const { return m_propagated; }
     
     svector<lpvar>::const_iterator begin() const { return vars().begin(); }
     svector<lpvar>::const_iterator end() const { return vars().end(); }