diff --git a/src/StaticModel.cc b/src/StaticModel.cc
index bfaf0bdaf1fd6ff1b5e9da469bd555df3735fe5a..83bdb1ee0ce2fe548efd94e706939ea5f31c3f2e 100644
--- a/src/StaticModel.cc
+++ b/src/StaticModel.cc
@@ -36,9 +36,23 @@ StaticModel::StaticModel(SymbolTable &symbol_table_arg,
 {
 }
 
+void
+StaticModel::copyHelper(const StaticModel &m)
+{
+  auto f = [this](const ExprNode *e) { return e->clone(*this); };
+
+  for (const auto &it : m.ramsey_multipliers_derivatives_temporary_terms)
+    ramsey_multipliers_derivatives_temporary_terms.insert(f(it));
+  for (const auto &it : m.ramsey_multipliers_derivatives_temporary_terms_idxs)
+    ramsey_multipliers_derivatives_temporary_terms_idxs.emplace(f(it.first), it.second);
+}
+
 StaticModel::StaticModel(const StaticModel &m) :
-  ModelTree{m}
+  ModelTree{m},
+  ramsey_multipliers_derivatives{m.ramsey_multipliers_derivatives},
+  ramsey_multipliers_derivatives_sparse_colptr{m.ramsey_multipliers_derivatives_sparse_colptr}
 {
+  copyHelper(m);
 }
 
 StaticModel &
@@ -46,6 +60,11 @@ StaticModel::operator=(const StaticModel &m)
 {
   ModelTree::operator=(m);
 
+  ramsey_multipliers_derivatives = m.ramsey_multipliers_derivatives;
+  ramsey_multipliers_derivatives_sparse_colptr = m.ramsey_multipliers_derivatives_sparse_colptr;
+
+  copyHelper(m);
+
   return *this;
 }
 
diff --git a/src/StaticModel.hh b/src/StaticModel.hh
index f940c50b2856babc24492e34302f25ac08e7ad9a..67e24815a9d592834ac6686317b59fdead7f0d53 100644
--- a/src/StaticModel.hh
+++ b/src/StaticModel.hh
@@ -117,6 +117,11 @@ private:
   template<ExprNodeOutputType output_type>
   void writeRamseyMultipliersDerivativesHelper(ostream &output) const;
 
+  //! Internal helper for the copy constructor and assignment operator
+  /*! Copies all the structures that contain ExprNode*, by the converting the
+      pointers into their equivalent in the new tree */
+  void copyHelper(const StaticModel &m);
+
 protected:
   string
   modelClassName() const override