diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index cc5d7987fbc9368c00b453e3c0ad6aebf1f2a89b..4f884b8b852c04a958f3be7bc82e80469198b928 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -1123,7 +1123,7 @@ DynamicModel::writeDriverOutput(ostream& output, bool compute_xrefs) const
     output << (i > computed_derivs_order ? -1 : NNZDerivatives[i]) << "; ";
   output << "];" << endl;
 
-  writeDriverSparseIndicesHelper<true>(output);
+  writeDriverSparseIndicesHelper<true, false>(output);
 
   // Write LHS of each equation in text form
   output << "M_.lhs = {" << endl;
diff --git a/src/ModelEquationBlock.cc b/src/ModelEquationBlock.cc
index 6667992b4300e13479ca666351b81cb8a16980f4..d25e9221a95439b12407d10a072c965707e30b79 100644
--- a/src/ModelEquationBlock.cc
+++ b/src/ModelEquationBlock.cc
@@ -41,6 +41,7 @@ PlannerObjective::writeDriverOutput(ostream& output) const
   for (const auto& it : temporary_terms_derivatives)
     output << it.size() << "; ";
   output << "];" << endl;
+  writeDriverSparseIndicesHelper<false, true>(output);
 }
 
 void
diff --git a/src/ModelTree.hh b/src/ModelTree.hh
index d3f87199f069b79f191833803b9d0e35d4640ed1..4a5566860d39e6716b7c0c468a9d6e4e44a81e30 100644
--- a/src/ModelTree.hh
+++ b/src/ModelTree.hh
@@ -351,8 +351,9 @@ protected:
   void writeBlockBytecodeHelper(Bytecode::Writer& code_file, int block,
                                 temporary_terms_t& temporary_terms_union) const;
 
-  // Helper for writing sparse derivatives indices in MATLAB/Octave driver file
-  template<bool dynamic>
+  /* Helper for writing sparse derivatives indices in MATLAB/Octave driver file.
+     Also supports the planner objective through the corresponding boolean. */
+  template<bool dynamic, bool objective>
   void writeDriverSparseIndicesHelper(ostream& output) const;
 
   // Helper for writing sparse derivatives indices in JSON
@@ -2246,12 +2247,13 @@ ModelTree::writeJsonParamsDerivativesHelper(bool writeDetails) const
           move(rpp_output), move(gpp_output), move(hp_output), move(g3p_output)};
 }
 
-template<bool dynamic>
+template<bool dynamic, bool objective>
 void
 ModelTree::writeDriverSparseIndicesHelper(ostream& output) const
 {
+  static_assert(!(objective && dynamic), "There is no such thing as a dynamic planner objective");
   // TODO: when C++20 support is complete, mark this constexpr
-  const string model_name {dynamic ? "dynamic" : "static"};
+  const string model_name {objective ? "objective" : (dynamic ? "dynamic" : "static")};
 
   // Write indices for the sparse Jacobian (both naive and CSC storage)
   output << "M_." << model_name << "_g1_sparse_rowval = int32([";
diff --git a/src/StaticModel.cc b/src/StaticModel.cc
index d4eb9814dd71036ec1b3e70dacd5ee0b8cc3007f..1d485ac41dfc204f6db5e4c94c7f777059400ab1 100644
--- a/src/StaticModel.cc
+++ b/src/StaticModel.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2003-2023 Dynare Team
+ * Copyright © 2003-2024 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -564,7 +564,7 @@ StaticModel::writeDriverOutput(ostream& output) const
   if (block_decomposed)
     writeBlockDriverOutput(output);
 
-  writeDriverSparseIndicesHelper<false>(output);
+  writeDriverSparseIndicesHelper<false, false>(output);
 }
 
 void