diff --git a/preprocessor/DynamicModel.cc b/preprocessor/DynamicModel.cc
index a4f81a0c49180eea889a463263373c683f6d49a5..f072fd959aa3b2f138a3ada3e9108be8a70b7d1b 100644
--- a/preprocessor/DynamicModel.cc
+++ b/preprocessor/DynamicModel.cc
@@ -5544,6 +5544,76 @@ DynamicModel::writeJsonOriginalModelOutput(ostream &output) const
   writeJsonModelEquations(output, false);
 }
 
+void
+DynamicModel::writeJsonDynamicModelInfo(ostream &output) const
+{
+  output << "\"model_info\": {"
+         << "\"lead_lag_incidence\": [";
+  // Loop on endogenous variables
+  int nstatic = 0,
+    nfwrd   = 0,
+    npred   = 0,
+    nboth   = 0;
+  for (int endoID = 0; endoID < symbol_table.endo_nbr(); endoID++)
+    {
+      if (endoID != 0)
+        output << ",";
+      output << "[";
+      int sstatic = 1,
+        sfwrd   = 0,
+        spred   = 0,
+        sboth   = 0;
+      // Loop on periods
+      for (int lag = -max_endo_lag; lag <= max_endo_lead; lag++)
+        {
+          // Print variableID if exists with current period, otherwise print 0
+          try
+            {
+              if (lag != -max_endo_lag)
+                output << ",";
+              int varID = getDerivID(symbol_table.getID(eEndogenous, endoID), lag);
+              output << " " << getDynJacobianCol(varID) + 1;
+              if (lag == -1)
+                {
+                  sstatic = 0;
+                  spred = 1;
+                }
+              else if (lag == 1)
+                {
+                  if (spred == 1)
+                    {
+                      sboth = 1;
+                      spred = 0;
+                    }
+                  else
+                    {
+                      sstatic = 0;
+                      sfwrd = 1;
+                    }
+                }
+            }
+          catch (UnknownDerivIDException &e)
+            {
+              output << " 0";
+            }
+        }
+      nstatic += sstatic;
+      nfwrd   += sfwrd;
+      npred   += spred;
+      nboth   += sboth;
+      output << "]";
+    }
+  output << "], "
+         << "\"nstatic\": " << nstatic << ", "
+         << "\"nfwrd\": " << nfwrd << ", "
+         << "\"npred\": " << npred << ", "
+         << "\"nboth\": " << nboth << ", "
+         << "\"nsfwrd\": " << nfwrd+nboth << ", "
+         << "\"nspred\": " << npred+nboth << ", "
+         << "\"ndynamic\": " << npred+nboth+nfwrd << endl;
+  output << "}";
+}
+
 void
 DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) const
 {
diff --git a/preprocessor/DynamicModel.hh b/preprocessor/DynamicModel.hh
index b0ebd7fa50fc91a6441aa00c1be797c32acc2b06..1fb14bc2020836ff896abd1d099f173fe43f07d7 100644
--- a/preprocessor/DynamicModel.hh
+++ b/preprocessor/DynamicModel.hh
@@ -242,6 +242,9 @@ public:
   //! Write JSON Output representation of original dynamic model
   void writeJsonOriginalModelOutput(ostream &output) const;
 
+  //! Write JSON Output representation of model info (useful stuff from M_)
+  void writeJsonDynamicModelInfo(ostream &output) const;
+
   //! Write JSON Output representation of dynamic model after computing pass
   void writeJsonComputingPassOutput(ostream &output, bool writeDetails) const;
 
diff --git a/preprocessor/ModFile.cc b/preprocessor/ModFile.cc
index 0ad63d2b3b7796d40a59aa22e008f58d7ee345ad..ba7a38c742aa1754856fbea6edec8e846a8652f2 100644
--- a/preprocessor/ModFile.cc
+++ b/preprocessor/ModFile.cc
@@ -1270,7 +1270,7 @@ ModFile::writeJsonOutput(const string &basename, JsonOutputPointType json, JsonF
   if (json == parsing || json == checkpass)
     symbol_table.freeze();
 
-  writeJsonOutputParsingCheck(basename, json_output_mode, json == transformpass);
+  writeJsonOutputParsingCheck(basename, json_output_mode, json == transformpass, json == computingpass);
 
   if (json == parsing || json == checkpass)
     symbol_table.unfreeze();
@@ -1302,7 +1302,7 @@ ModFile::writeJsonOutput(const string &basename, JsonOutputPointType json, JsonF
 }
 
 void
-ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType json_output_mode, bool transformpass) const
+ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType json_output_mode, bool transformpass, bool computingpass) const
 {
   ostringstream output;
   output << "{" << endl;
@@ -1323,6 +1323,12 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType
         }
       output << "]" << endl;
     }
+
+  if (computingpass)
+    {
+      output << ",";
+      dynamic_model.writeJsonDynamicModelInfo(output);
+    }
   output << "}" << endl;
 
   ostringstream original_model_output;
@@ -1338,7 +1344,7 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType
     {
       cout << output.str();
       if (!original_model_output.str().empty())
-        cout << original_model_output.str();
+        cout << "," << original_model_output.str();
     }
   else
     {
diff --git a/preprocessor/ModFile.hh b/preprocessor/ModFile.hh
index 1b763f636c87192a0fcbf3e09f2641c8ee6a2042..985a15a795eed77b3aef3481ac6ecaa06fc89ede 100644
--- a/preprocessor/ModFile.hh
+++ b/preprocessor/ModFile.hh
@@ -118,7 +118,7 @@ private:
   //! Warnings Encountered
   WarningConsolidation &warnings;
   //! Functions used in writing of JSON outut. See writeJsonOutput
-  void writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType json_output_mode, bool transformpass) const;
+  void writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType json_output_mode, bool transformpass, bool computingpass) const;
   void writeJsonComputingPassOutput(const string &basename, JsonFileOutputType json_output_mode, bool jsonprintderivdetail) const;
   void writeJsonFileHelper(string &fname, ostringstream &output) const;
 public: