diff --git a/src/StaticModel.cc b/src/StaticModel.cc
index 1d485ac41dfc204f6db5e4c94c7f777059400ab1..a79a1aa9409a950d94ad50f4d1f4f3e9c23f1414 100644
--- a/src/StaticModel.cc
+++ b/src/StaticModel.cc
@@ -252,237 +252,6 @@ StaticModel::computingPass(int derivsOrder, int paramsDerivsOrder,
     }
 }
 
-void
-StaticModel::writeStaticMFile(const string& basename) const
-{
-  auto [d_output, tt_output] = writeModelFileHelper<ExprNodeOutputType::matlabStaticModel>();
-
-  ostringstream init_output, end_output;
-  init_output << "residual = zeros(" << equations.size() << ", 1);";
-  writeStaticMFileHelper(basename, "static_resid", "residual", "static_resid_tt",
-                         temporary_terms_derivatives[0].size(), "", init_output, end_output,
-                         d_output[0], tt_output[0]);
-
-  init_output.str("");
-  end_output.str("");
-  init_output << "g1 = zeros(" << equations.size() << ", " << symbol_table.endo_nbr() << ");";
-  writeStaticMFileHelper(basename, "static_g1", "g1", "static_g1_tt",
-                         temporary_terms_derivatives[0].size()
-                             + temporary_terms_derivatives[1].size(),
-                         "static_resid_tt", init_output, end_output, d_output[1], tt_output[1]);
-  writeStaticMWrapperFunction(basename, "g1");
-
-  // For order ≥ 2
-  int ncols {symbol_table.endo_nbr()};
-  int ntt {static_cast<int>(temporary_terms_derivatives[0].size()
-                            + temporary_terms_derivatives[1].size())};
-  for (size_t i {2}; i < derivatives.size(); i++)
-    {
-      ncols *= symbol_table.endo_nbr();
-      ntt += temporary_terms_derivatives[i].size();
-      string gname {"g" + to_string(i)};
-      string gprevname {"g" + to_string(i - 1)};
-
-      init_output.str("");
-      end_output.str("");
-      if (derivatives[i].size())
-        {
-          init_output << gname << "_i = zeros(" << NNZDerivatives[i] << ",1);" << endl
-                      << gname << "_j = zeros(" << NNZDerivatives[i] << ",1);" << endl
-                      << gname << "_v = zeros(" << NNZDerivatives[i] << ",1);" << endl;
-          end_output << gname << " = sparse(" << gname << "_i," << gname << "_j," << gname << "_v,"
-                     << equations.size() << "," << ncols << ");";
-        }
-      else
-        init_output << gname << " = sparse([],[],[]," << equations.size() << "," << ncols << ");";
-      writeStaticMFileHelper(basename, "static_" + gname, gname, "static_" + gname + "_tt", ntt,
-                             "static_" + gprevname + "_tt", init_output, end_output, d_output[i],
-                             tt_output[i]);
-      if (i <= 3)
-        writeStaticMWrapperFunction(basename, gname);
-    }
-
-  writeStaticMCompatFile(basename);
-}
-
-void
-StaticModel::writeStaticMWrapperFunction(const string& basename, const string& ending) const
-{
-  string name;
-  if (ending == "g1")
-    name = "static_resid_g1";
-  else if (ending == "g2")
-    name = "static_resid_g1_g2";
-  else if (ending == "g3")
-    name = "static_resid_g1_g2_g3";
-
-  filesystem::path filename {packageDir(basename) / (name + ".m")};
-  ofstream output {filename, ios::out | ios::binary};
-  if (!output.is_open())
-    {
-      cerr << "ERROR: Can't open file " << filename.string() << " for writing" << endl;
-      exit(EXIT_FAILURE);
-    }
-
-  if (ending == "g1")
-    output << "function [residual, g1] = " << name << "(T, y, x, params, T_flag)" << endl
-           << "% function [residual, g1] = " << name << "(T, y, x, params, T_flag)" << endl;
-  else if (ending == "g2")
-    output << "function [residual, g1, g2] = " << name << "(T, y, x, params, T_flag)" << endl
-           << "% function [residual, g1, g2] = " << name << "(T, y, x, params, T_flag)" << endl;
-  else if (ending == "g3")
-    output << "function [residual, g1, g2, g3] = " << name << "(T, y, x, params, T_flag)" << endl
-           << "% function [residual, g1, g2, g3] = " << name << "(T, y, x, params, T_flag)" << endl;
-
-  output << "%" << endl
-         << "% Wrapper function automatically created by Dynare" << endl
-         << "%" << endl
-         << endl
-         << "    if T_flag" << endl
-         << "        T = " << basename << ".static_" << ending << "_tt(T, y, x, params);" << endl
-         << "    end" << endl;
-
-  if (ending == "g1")
-    output << "    residual = " << basename << ".static_resid(T, y, x, params, false);" << endl
-           << "    g1       = " << basename << ".static_g1(T, y, x, params, false);" << endl;
-  else if (ending == "g2")
-    output << "    [residual, g1] = " << basename << ".static_resid_g1(T, y, x, params, false);"
-           << endl
-           << "    g2       = " << basename << ".static_g2(T, y, x, params, false);" << endl;
-  else if (ending == "g3")
-    output << "    [residual, g1, g2] = " << basename
-           << ".static_resid_g1_g2(T, y, x, params, false);" << endl
-           << "    g3       = " << basename << ".static_g3(T, y, x, params, false);" << endl;
-
-  output << endl << "end" << endl;
-  output.close();
-}
-
-void
-StaticModel::writeStaticMFileHelper(const string& basename, const string& name,
-                                    const string& retvalname, const string& name_tt, size_t ttlen,
-                                    const string& previous_tt_name, const ostringstream& init_s,
-                                    const ostringstream& end_s, const ostringstream& s,
-                                    const ostringstream& s_tt) const
-{
-  filesystem::path filename {packageDir(basename) / (name_tt + ".m")};
-  ofstream output {filename, ios::out | ios::binary};
-  if (!output.is_open())
-    {
-      cerr << "ERROR: Can't open file " << filename.string() << " for writing" << endl;
-      exit(EXIT_FAILURE);
-    }
-
-  output << "function T = " << name_tt << "(T, y, x, params)" << endl
-         << "% function T = " << name_tt << "(T, y, x, params)" << endl
-         << "%" << endl
-         << "% File created by Dynare Preprocessor from .mod file" << endl
-         << "%" << endl
-         << "% Inputs:" << endl
-         << "%   T         [#temp variables by 1]  double   vector of temporary terms to be filled "
-            "by function"
-         << endl
-         << "%   y         [M_.endo_nbr by 1]      double   vector of endogenous variables in "
-            "declaration order"
-         << endl
-         << "%   x         [M_.exo_nbr by 1]       double   vector of exogenous variables in "
-            "declaration order"
-         << endl
-         << "%   params    [M_.param_nbr by 1]     double   vector of parameter values in "
-            "declaration order"
-         << endl
-         << "%" << endl
-         << "% Output:" << endl
-         << "%   T         [#temp variables by 1]  double   vector of temporary terms" << endl
-         << "%" << endl
-         << endl
-         << "assert(length(T) >= " << ttlen << ");" << endl
-         << endl;
-
-  if (!previous_tt_name.empty())
-    output << "T = " << basename << "." << previous_tt_name << "(T, y, x, params);" << endl << endl;
-
-  output << s_tt.str() << endl << "end" << endl;
-  output.close();
-
-  filename = packageDir(basename) / (name + ".m");
-  output.open(filename, ios::out | ios::binary);
-  if (!output.is_open())
-    {
-      cerr << "ERROR: Can't open file " << filename.string() << " for writing" << endl;
-      exit(EXIT_FAILURE);
-    }
-
-  output << "function " << retvalname << " = " << name << "(T, y, x, params, T_flag)" << endl
-         << "% function " << retvalname << " = " << name << "(T, y, x, params, T_flag)" << endl
-         << "%" << endl
-         << "% File created by Dynare Preprocessor from .mod file" << endl
-         << "%" << endl
-         << "% Inputs:" << endl
-         << "%   T         [#temp variables by 1]  double   vector of temporary terms to be filled "
-            "by function"
-         << endl
-         << "%   y         [M_.endo_nbr by 1]      double   vector of endogenous variables in "
-            "declaration order"
-         << endl
-         << "%   x         [M_.exo_nbr by 1]       double   vector of exogenous variables in "
-            "declaration order"
-         << endl
-         << "%   params    [M_.param_nbr by 1]     double   vector of parameter values in "
-            "declaration order"
-         << endl
-         << "%                                              to evaluate the model" << endl
-         << "%   T_flag    boolean                 boolean  flag saying whether or not to "
-            "calculate temporary terms"
-         << endl
-         << "%" << endl
-         << "% Output:" << endl
-         << "%   " << retvalname << endl
-         << "%" << endl
-         << endl;
-
-  if (!name_tt.empty())
-    output << "if T_flag" << endl
-           << "    T = " << basename << "." << name_tt << "(T, y, x, params);" << endl
-           << "end" << endl;
-
-  output << init_s.str() << endl << s.str() << end_s.str() << endl << "end" << endl;
-  output.close();
-}
-
-void
-StaticModel::writeStaticMCompatFile(const string& basename) const
-{
-  filesystem::path filename {packageDir(basename) / "static.m"};
-  ofstream output {filename, ios::out | ios::binary};
-  if (!output.is_open())
-    {
-      cerr << "ERROR: Can't open file " << filename.string() << " for writing" << endl;
-      exit(EXIT_FAILURE);
-    }
-  int ntt {static_cast<int>(
-      temporary_terms_derivatives[0].size() + temporary_terms_derivatives[1].size()
-      + temporary_terms_derivatives[2].size() + temporary_terms_derivatives[3].size())};
-
-  output << "function [residual, g1, g2, g3] = static(y, x, params)" << endl
-         << "    T = NaN(" << ntt << ", 1);" << endl
-         << "    if nargout <= 1" << endl
-         << "        residual = " << basename << ".static_resid(T, y, x, params, true);" << endl
-         << "    elseif nargout == 2" << endl
-         << "        [residual, g1] = " << basename << ".static_resid_g1(T, y, x, params, true);"
-         << endl
-         << "    elseif nargout == 3" << endl
-         << "        [residual, g1, g2] = " << basename
-         << ".static_resid_g1_g2(T, y, x, params, true);" << endl
-         << "    else" << endl
-         << "        [residual, g1, g2, g3] = " << basename
-         << ".static_resid_g1_g2_g3(T, y, x, params, true);" << endl
-         << "    end" << endl
-         << "end" << endl;
-
-  output.close();
-}
-
 void
 StaticModel::writeStaticFile(const string& basename, bool use_dll, const string& mexext,
                              const filesystem::path& matlabroot, bool julia) const
@@ -517,9 +286,6 @@ StaticModel::writeStaticFile(const string& basename, bool use_dll, const string&
   // Legacy representation
   if (use_dll)
     writeModelCFile<false>(basename, mexext, matlabroot);
-  else if (!julia) // M-files
-    writeStaticMFile(basename);
-  // The legacy representation is no longer produced for Julia
 
   /* PlannerObjective subclass or discretionary optimal policy models don’t
      have as many variables as equations; bytecode does not support that
diff --git a/src/StaticModel.hh b/src/StaticModel.hh
index 288c6e4725f9485cece581d2d7d081bf0390b547..acadbb56b362daef521cc258bf8bc13e9f8c83ab 100644
--- a/src/StaticModel.hh
+++ b/src/StaticModel.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2003-2023 Dynare Team
+ * Copyright © 2003-2024 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -60,9 +60,6 @@ private:
      block. See the DynamicModel class for the default value in that case. */
   int static_mfs {0};
 
-  // Writes static model file (MATLAB/Octave version, legacy representation)
-  void writeStaticMFile(const string& basename) const;
-
   //! Writes the code of the block-decomposed model in virtual machine bytecode
   void writeStaticBlockBytecode(const string& basename) const;
 
@@ -95,20 +92,6 @@ private:
 
   void computeChainRuleJacobian() override;
 
-  /* Helper for writing MATLAB/Octave functions for residuals/derivatives and
-     their temporary terms (legacy representation) */
-  void writeStaticMFileHelper(const string& basename, const string& name, const string& retvalname,
-                              const string& name_tt, size_t ttlen, const string& previous_tt_name,
-                              const ostringstream& init_s, const ostringstream& end_s,
-                              const ostringstream& s, const ostringstream& s_tt) const;
-  /* Writes MATLAB/Octave wrapper function for computing residuals and
-     derivatives at the same time (legacy representation) */
-  void writeStaticMWrapperFunction(const string& basename, const string& ending) const;
-
-  /* Create the compatibility static.m file for MATLAB/Octave not yet using the
-     temporary terms array interface (legacy representation) */
-  void writeStaticMCompatFile(const string& name) const;
-
   int
   getBlockJacobianEndoCol([[maybe_unused]] int blk, int var,
                           [[maybe_unused]] int lag) const override