diff --git a/DynamicModel.cc b/DynamicModel.cc
index 5abfc057088cc66438e23ae369938435e90a312d..4bb388ada230a2d5360874dfa383543f8ff552b0 100644
--- a/DynamicModel.cc
+++ b/DynamicModel.cc
@@ -510,7 +510,7 @@ DynamicModel::writeModelEquationsOrdered_M(const string &dynamic_basename) const
                 }
               else
                 {
-                  cerr << "Type missmatch for equation " << equation_ID+1  << "\n";
+                  cerr << "Type mismatch for equation " << equation_ID+1  << "\n";
                   exit(EXIT_FAILURE);
                 }
               output << ";\n";
@@ -5647,6 +5647,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
 {
@@ -5691,13 +5761,17 @@ DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) c
       expr_t d1 = it->second;
 
       if (writeDetails)
-        jacobian_output << "{\"eq\": " << eq + 1
-                        << ", \"var\": \"" << symbol_table.getName(getSymbIDByDerivID(var)) << "\""
-                        << ", \"lag\": " << getLagByDerivID(var);
+        jacobian_output << "{\"eq\": " << eq + 1;
       else
         jacobian_output << "{\"row\": " << eq + 1;
-      jacobian_output << ", \"col\": " << col + 1
-                      << ", \"val\": \"";
+
+      jacobian_output << ", \"col\": " << col + 1;
+
+      if (writeDetails)
+        jacobian_output << ", \"var\": \"" << symbol_table.getName(getSymbIDByDerivID(var)) << "\""
+                        << ", \"shift\": " << getLagByDerivID(var);
+
+      jacobian_output << ", \"val\": \"";
       d1->writeJsonOutput(jacobian_output, temp_term_union, tef_terms);
       jacobian_output << "\"}" << endl;
     }
@@ -5728,19 +5802,22 @@ DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) c
       int col_nb_sym = id2 * dynJacobianColsNbr + id1;
 
       if (writeDetails)
-        hessian_output << "{\"eq\": " << eq + 1
-                       << ", \"var1\": \"" << symbol_table.getName(getSymbIDByDerivID(var1)) << "\""
-                       << ", \"lag1\": " << getLagByDerivID(var1)
-                       << ", \"var2\": \"" << symbol_table.getName(getSymbIDByDerivID(var2)) << "\""
-                       << ", \"lag2\": " << getLagByDerivID(var2);
+        hessian_output << "{\"eq\": " << eq + 1;
       else
         hessian_output << "{\"row\": " << eq + 1;
 
       hessian_output << ", \"col\": [" << col_nb + 1;
       if (id1 != id2)
         hessian_output << ", " << col_nb_sym + 1;
-      hessian_output << "]"
-                     << ", \"val\": \"";
+      hessian_output << "]";
+
+      if (writeDetails)
+        hessian_output << ", \"var1\": \"" << symbol_table.getName(getSymbIDByDerivID(var1)) << "\""
+                       << ", \"shift1\": " << getLagByDerivID(var1)
+                       << ", \"var2\": \"" << symbol_table.getName(getSymbIDByDerivID(var2)) << "\""
+                       << ", \"shift2\": " << getLagByDerivID(var2);
+
+      hessian_output << ", \"val\": \"";
       d2->writeJsonOutput(hessian_output, temp_term_union, tef_terms);
       hessian_output << "\"}" << endl;
     }
@@ -5768,13 +5845,7 @@ DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) c
       expr_t d3 = it->second;
 
       if (writeDetails)
-        third_derivatives_output << "{\"eq\": " << eq + 1
-                                 << ", \"var1\": \"" << symbol_table.getName(getSymbIDByDerivID(var1)) << "\""
-                                 << ", \"lag1\": " << getLagByDerivID(var1)
-                                 << ", \"var2\": \"" << symbol_table.getName(getSymbIDByDerivID(var2)) << "\""
-                                 << ", \"lag2\": " << getLagByDerivID(var2)
-                                 << ", \"var3\": \"" << symbol_table.getName(getSymbIDByDerivID(var3)) << "\""
-                                 << ", \"lag3\": " << getLagByDerivID(var3);
+        third_derivatives_output << "{\"eq\": " << eq + 1;
       else
         third_derivatives_output << "{\"row\": " << eq + 1;
 
@@ -5796,17 +5867,26 @@ DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) c
             third_derivatives_output << ", ";
           third_derivatives_output << *it2 + 1;
         }
-      third_derivatives_output << "]"
-                               << ", \"val\": \"";
+      third_derivatives_output << "]";
+
+      if (writeDetails)
+        third_derivatives_output << ", \"var1\": \"" << symbol_table.getName(getSymbIDByDerivID(var1)) << "\""
+                                 << ", \"shift1\": " << getLagByDerivID(var1)
+                                 << ", \"var2\": \"" << symbol_table.getName(getSymbIDByDerivID(var2)) << "\""
+                                 << ", \"shift2\": " << getLagByDerivID(var2)
+                                 << ", \"var3\": \"" << symbol_table.getName(getSymbIDByDerivID(var3)) << "\""
+                                 << ", \"shift3\": " << getLagByDerivID(var3);
+
+      third_derivatives_output << ", \"val\": \"";
       d3->writeJsonOutput(third_derivatives_output, temp_term_union, tef_terms);
       third_derivatives_output << "\"}" << endl;
     }
   third_derivatives_output << "]}";
 
   if (writeDetails)
-    output << "\"dynamic_model_derivative_details\": {";
+    output << "\"dynamic_model\": {";
   else
-    output << "\"dynamic_model_derivatives\": {";
+    output << "\"dynamic_model_simple\": {";
   output << model_local_vars_output.str()
          << ", " << model_output.str()
          << ", " << jacobian_output.str()
@@ -5856,12 +5936,16 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1;
 
       if (writeDetails)
-        jacobian_output << "{\"eq\": " << eq + 1
-                        << ", \"param\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+        jacobian_output << "{\"eq\": " << eq + 1;
       else
         jacobian_output << "{\"row\": " << eq + 1;
-      jacobian_output << ", \"param_col\": " << param_col + 1
-                      << ", \"val\": \"";
+
+      jacobian_output << ", \"param_col\": " << param_col + 1;
+
+      if (writeDetails)
+        jacobian_output << ", \"param\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+
+      jacobian_output << ", \"val\": \"";
       d1->writeJsonOutput(jacobian_output, params_derivs_temporary_terms, tef_terms);
       jacobian_output << "\"}" << endl;
     }
@@ -5886,15 +5970,19 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1;
 
       if (writeDetails)
-        hessian_output << "{\"eq\": " << eq + 1
-                       << ", \"var\": \"" << symbol_table.getName(getSymbIDByDerivID(var)) << "\""
-                       << ", \"lag\": " << getLagByDerivID(var)
-                       << ", \"param\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+        hessian_output << "{\"eq\": " << eq + 1;
       else
         hessian_output << "{\"row\": " << eq + 1;
+
       hessian_output << ", \"var_col\": " << var_col + 1
-                     << ", \"param_col\": " << param_col + 1
-                     << ", \"val\": \"";
+                     << ", \"param_col\": " << param_col + 1;
+
+      if (writeDetails)
+      hessian_output << ", \"var\": \"" << symbol_table.getName(getSymbIDByDerivID(var)) << "\""
+                     << ", \"lag\": " << getLagByDerivID(var)
+                     << ", \"param\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+
+      hessian_output << ", \"val\": \"";
       d2->writeJsonOutput(hessian_output, params_derivs_temporary_terms, tef_terms);
       hessian_output << "\"}" << endl;
     }
@@ -5920,14 +6008,17 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       int param2_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param2)) + 1;
 
       if (writeDetails)
-        hessian1_output << "{\"eq\": " << eq + 1
-                        << ", \"param1\": \"" << symbol_table.getName(getSymbIDByDerivID(param1)) << "\""
-                        << ", \"param2\": \"" << symbol_table.getName(getSymbIDByDerivID(param2)) << "\"";
+        hessian1_output << "{\"eq\": " << eq + 1;
       else
         hessian1_output << "{\"row\": " << eq + 1;
       hessian1_output << ", \"param1_col\": " << param1_col + 1
-                      << ", \"param2_col\": " << param2_col + 1
-                      << ", \"val\": \"";
+                      << ", \"param2_col\": " << param2_col + 1;
+
+      if (writeDetails)
+        hessian1_output << ", \"param1\": \"" << symbol_table.getName(getSymbIDByDerivID(param1)) << "\""
+                        << ", \"param2\": \"" << symbol_table.getName(getSymbIDByDerivID(param2)) << "\"";
+
+      hessian1_output << ", \"val\": \"";
       d2->writeJsonOutput(hessian1_output, params_derivs_temporary_terms, tef_terms);
       hessian1_output << "\"}" << endl;
     }
@@ -5955,17 +6046,21 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       int param2_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param2)) + 1;
 
       if (writeDetails)
-        third_derivs_output << "{\"eq\": " << eq + 1
-                            << ", \"var\": \"" << symbol_table.getName(var) << "\""
-                            << ", \"lag\": " << getLagByDerivID(var)
-                            << ", \"param1\": \"" << symbol_table.getName(getSymbIDByDerivID(param1)) << "\""
-                            << ", \"param2\": \"" << symbol_table.getName(getSymbIDByDerivID(param2)) << "\"";
+        third_derivs_output << "{\"eq\": " << eq + 1;
       else
         third_derivs_output << "{\"row\": " << eq + 1;
+
       third_derivs_output << ", \"var_col\": " << var_col + 1
                           << ", \"param1_col\": " << param1_col + 1
-                          << ", \"param2_col\": " << param2_col + 1
-                          << ", \"val\": \"";
+                          << ", \"param2_col\": " << param2_col + 1;
+
+      if (writeDetails)
+        third_derivs_output << ", \"var\": \"" << symbol_table.getName(var) << "\""
+                            << ", \"lag\": " << getLagByDerivID(var)
+                            << ", \"param1\": \"" << symbol_table.getName(getSymbIDByDerivID(param1)) << "\""
+                            << ", \"param2\": \"" << symbol_table.getName(getSymbIDByDerivID(param2)) << "\"";
+
+      third_derivs_output << ", \"val\": \"";
       d2->writeJsonOutput(third_derivs_output, params_derivs_temporary_terms, tef_terms);
       third_derivs_output << "\"}" << endl;
     }
@@ -5994,27 +6089,31 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1;
 
       if (writeDetails)
-        third_derivs1_output << "{\"eq\": " << eq + 1
-                             << ", \"var1\": \"" << symbol_table.getName(getSymbIDByDerivID(var1)) << "\""
-                             << ", \"lag1\": " << getLagByDerivID(var1)
-                             << ", \"var2\": \"" << symbol_table.getName(getSymbIDByDerivID(var2)) << "\""
-                             << ", \"lag2\": " << getLagByDerivID(var2)
-                             << ", \"param\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+        third_derivs1_output << "{\"eq\": " << eq + 1;
       else
         third_derivs1_output << "{\"row\": " << eq + 1;
+
       third_derivs1_output << ", \"var1_col\": " << var1_col + 1
                            << ", \"var2_col\": " << var2_col + 1
-                           << ", \"param_col\": " << param_col + 1
-                           << ", \"val\": \"";
+                           << ", \"param_col\": " << param_col + 1;
+
+      if (writeDetails)
+        third_derivs1_output << ", \"var1\": \"" << symbol_table.getName(getSymbIDByDerivID(var1)) << "\""
+                             << ", \"lag1\": " << getLagByDerivID(var1)
+                             << ", \"var2\": \"" << symbol_table.getName(getSymbIDByDerivID(var2)) << "\""
+                             << ", \"lag2\": " << getLagByDerivID(var2)
+                             << ", \"param\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+
+      third_derivs1_output << ", \"val\": \"";
       d2->writeJsonOutput(third_derivs1_output, params_derivs_temporary_terms, tef_terms);
       third_derivs1_output << "\"}" << endl;
     }
   third_derivs1_output << "]}" << endl;
 
   if (writeDetails)
-    output << "\"dynamic_model_params_derivative_details\": {";
+    output << "\"dynamic_model_params_derivative\": {";
   else
-    output << "\"dynamic_model_params_derivatives\": {";
+    output << "\"dynamic_model_params_derivatives_simple\": {";
   output << model_local_vars_output.str()
          << ", " << model_output.str()
          << ", " << jacobian_output.str()
diff --git a/DynamicModel.hh b/DynamicModel.hh
index 961faa2b984743740dcf912925825fa6f8de9556..f51d3ac89777192a86988797e180e93853fe7779 100644
--- a/DynamicModel.hh
+++ b/DynamicModel.hh
@@ -247,6 +247,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/DynareMain.cc b/DynareMain.cc
index 14d594c49757b644263369beedb198c0c4fd2aa2..49c26025202f3012e5ddb8566fff164bffd62316 100644
--- a/DynareMain.cc
+++ b/DynareMain.cc
@@ -45,7 +45,7 @@ void main2(stringstream &in, string &basename, bool debug, bool clear_all, bool
 #if defined(_WIN32) || defined(__CYGWIN32__) || defined(__MINGW32__)
            , bool cygwin, bool msvc, bool mingw
 #endif
-           , JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonprintderivdetail
+           , JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonderivsimple
            );
 
 void main1(char *modfile, string &basename, bool debug, bool save_macro, string &save_macro_file,
@@ -62,7 +62,7 @@ usage()
 #if defined(_WIN32) || defined(__CYGWIN32__) || defined(__MINGW32__)
        << " [cygwin] [msvc] [mingw]"
 #endif
-       << "[json=parse|check|transform|compute] [jsonstdout] [onlyjson] [jsonprintderivdetail]"
+       << "[json=parse|check|transform|compute] [jsonstdout] [onlyjson] [jsonderivsimple]"
        << endl;
   exit(EXIT_FAILURE);
 }
@@ -118,7 +118,7 @@ main(int argc, char **argv)
   JsonOutputPointType json = nojson;
   JsonFileOutputType json_output_mode = file;
   bool onlyjson = false;
-  bool jsonprintderivdetail = false;
+  bool jsonderivsimple = false;
   LanguageOutputType language = matlab;
 
   // Parse options
@@ -251,7 +251,7 @@ main(int argc, char **argv)
         {
           if (strlen(argv[arg]) <= 7 || argv[arg][6] != '=')
             {
-              cerr << "Incorrect syntax for ouput option" << endl;
+              cerr << "Incorrect syntax for output option" << endl;
               usage();
             }
           if (strlen(argv[arg]) == 14 && !strncmp(argv[arg] + 7, "dynamic", 7))
@@ -264,7 +264,7 @@ main(int argc, char **argv)
             output_mode = third;
           else
             {
-              cerr << "Incorrect syntax for ouput option" << endl;
+              cerr << "Incorrect syntax for output option" << endl;
               usage();
             }
         }
@@ -301,8 +301,8 @@ main(int argc, char **argv)
         json_output_mode = standardout;
       else if (!strcmp(argv[arg], "onlyjson"))
         onlyjson = true;
-      else if (!strcmp(argv[arg], "jsonprintderivdetail"))
-        jsonprintderivdetail = true;
+      else if (!strcmp(argv[arg], "jsonderivsimple"))
+        jsonderivsimple = true;
       else if (strlen(argv[arg]) >= 4 && !strncmp(argv[arg], "json", 4))
         {
           if (strlen(argv[arg]) <= 5 || argv[arg][4] != '=')
@@ -370,7 +370,7 @@ main(int argc, char **argv)
 #if defined(_WIN32) || defined(__CYGWIN32__) || defined(__MINGW32__)
         , cygwin, msvc, mingw
 #endif
-        , json, json_output_mode, onlyjson, jsonprintderivdetail
+        , json, json_output_mode, onlyjson, jsonderivsimple
         );
 
   return EXIT_SUCCESS;
diff --git a/DynareMain2.cc b/DynareMain2.cc
index 758b278fa280ef3a1a9c8573d34d7419df9644c1..e0a9e5392912400927aed3d722131639b7e808d1 100644
--- a/DynareMain2.cc
+++ b/DynareMain2.cc
@@ -34,7 +34,7 @@ main2(stringstream &in, string &basename, bool debug, bool clear_all, bool clear
 #if defined(_WIN32) || defined(__CYGWIN32__) || defined(__MINGW32__)
       , bool cygwin, bool msvc, bool mingw
 #endif
-      , JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonprintderivdetail
+      , JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonderivsimple
       )
 {
   ParsingDriver p(warnings, nostrict);
@@ -60,7 +60,7 @@ main2(stringstream &in, string &basename, bool debug, bool clear_all, bool clear
   // Do computations
   mod_file->computingPass(no_tmp_terms, output_mode, params_derivs_order);
   if (json == computingpass)
-    mod_file->writeJsonOutput(basename, json, json_output_mode, onlyjson, jsonprintderivdetail);
+    mod_file->writeJsonOutput(basename, json, json_output_mode, onlyjson, jsonderivsimple);
 
   // Write outputs
   if (output_mode != none)
diff --git a/Makefile.am b/Makefile.am
index 892b2b17813a09a2341cf3d3fb805afffc845745..5a8ac507e889c3d5067cf4a7b95029bf3d91a537 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -86,7 +86,7 @@ html-local:
 endif
 
 clean-local:
-	rm -rf ../matlab/preprocessor*
+	rm -rf ../matlab/preprocessor* ../julia/preprocessor*
 	rm -rf doc/html/
 
 EXTRA_DIST = $(BUILT_SOURCES) Doxyfile
diff --git a/ModFile.cc b/ModFile.cc
index a38949a0fb5a553bfdf4203400cbda2556e3d52d..8ca4cd0ad09dd4239fc4b33c89fe8e75219a1c20 100644
--- a/ModFile.cc
+++ b/ModFile.cc
@@ -232,7 +232,7 @@ ModFile::checkPass(bool nostrict)
 
       if (mod_file_struct.dsge_prior_weight_initialized && mod_file_struct.dsge_prior_weight_in_estimated_params)
         {
-          cerr << "ERROR: dsge_prior_weight cannot be both initalized and estimated." << endl;
+          cerr << "ERROR: dsge_prior_weight cannot be both initialized and estimated." << endl;
           exit(EXIT_FAILURE);
         }
     }
@@ -1290,7 +1290,7 @@ ModFile::writeExternalFilesJulia(const string &basename, FileOutputType output)
 }
 
 void
-ModFile::writeJsonOutput(const string &basename, JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonprintderivdetail)
+ModFile::writeJsonOutput(const string &basename, JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonderivsimple)
 {
   if (json == nojson)
     return;
@@ -1298,13 +1298,21 @@ ModFile::writeJsonOutput(const string &basename, JsonOutputPointType json, JsonF
   if (json == parsing || json == checkpass)
     symbol_table.freeze();
 
-  writeJsonOutputParsingCheck(basename, json_output_mode, json == transformpass);
+  if (json_output_mode == standardout)
+    cout << "//-- BEGIN JSON --// " << endl
+         << "{" << endl;
+
+  writeJsonOutputParsingCheck(basename, json_output_mode, json == transformpass, json == computingpass);
 
   if (json == parsing || json == checkpass)
     symbol_table.unfreeze();
 
   if (json == computingpass)
-    writeJsonComputingPassOutput(basename, json_output_mode, jsonprintderivdetail);
+    writeJsonComputingPassOutput(basename, json_output_mode, jsonderivsimple);
+
+  if (json_output_mode == standardout)
+    cout << "}" << endl
+         << "//-- END JSON --// " << endl;
 
   switch (json)
     {
@@ -1330,7 +1338,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;
@@ -1351,11 +1359,17 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType
         }
       output << "]" << endl;
     }
+
+  if (computingpass)
+    {
+      output << ",";
+      dynamic_model.writeJsonDynamicModelInfo(output);
+    }
   output << "}" << endl;
 
   ostringstream original_model_output;
   original_model_output << "";
-  if (transformpass)
+  if (transformpass || computingpass)
     {
       original_model_output << "{";
       original_model.writeJsonOriginalModelOutput(original_model_output);
@@ -1364,9 +1378,13 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType
 
   if (json_output_mode == standardout)
     {
+      if (transformpass || computingpass)
+        cout << "\"transformed_model\": ";
+      else
+        cout << "\"model\": ";
       cout << output.str();
       if (!original_model_output.str().empty())
-        cout << original_model_output.str();
+        cout << ", \"original_model\": " << original_model_output.str();
     }
   else
     {
@@ -1418,83 +1436,77 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType
 }
 
 void
-ModFile::writeJsonComputingPassOutput(const string &basename, JsonFileOutputType json_output_mode, bool jsonprintderivdetail) const
+ModFile::writeJsonComputingPassOutput(const string &basename, JsonFileOutputType json_output_mode, bool jsonderivsimple) const
 {
-  ostringstream static_output, static_detail_output;
+  ostringstream static_output, static_simple_output;
   static_output << "{";
-  static_model.writeJsonComputingPassOutput(static_output, false);
+  static_model.writeJsonComputingPassOutput(static_output, true);
   static_output << "}" << endl;
 
-  ostringstream dynamic_output, dynamic_detail_output;
+  ostringstream dynamic_output, dynamic_simple_output;
   dynamic_output << "{";
-  dynamic_model.writeJsonComputingPassOutput(dynamic_output, false);
+  dynamic_model.writeJsonComputingPassOutput(dynamic_output, true);
   dynamic_output << "}" << endl;
 
-  ostringstream original_model_output;
-  original_model_output << "{";
-  original_model.writeJsonOriginalModelOutput(original_model_output);
-  original_model_output << "}" << endl;
-
-  ostringstream tmp_out, static_paramsd_output, static_paramsd_detail_output;
+  ostringstream tmp_out, static_paramsd_output, static_paramsd_simple_output;
   tmp_out << "";
   static_paramsd_output << "";
-  static_paramsd_detail_output << "";
-  static_model.writeJsonParamsDerivativesFile(tmp_out, false);
+  static_paramsd_simple_output << "";
+  static_model.writeJsonParamsDerivativesFile(tmp_out, true);
   if (!tmp_out.str().empty())
     static_paramsd_output << "{" << tmp_out.str() << "}" << endl;
 
-  ostringstream tmp1_out, dynamic_paramsd_output, dynamic_paramsd_detail_output;
+  ostringstream tmp1_out, dynamic_paramsd_output, dynamic_paramsd_simple_output;
   tmp1_out << "";
   dynamic_paramsd_output << "";
-  dynamic_paramsd_detail_output << "";
-  dynamic_model.writeJsonParamsDerivativesFile(tmp1_out, false);
+  dynamic_paramsd_simple_output << "";
+  dynamic_model.writeJsonParamsDerivativesFile(tmp1_out, true);
   if (!tmp1_out.str().empty())
     dynamic_paramsd_output << "{" << tmp1_out.str() << "}" << endl;
 
-  if (jsonprintderivdetail)
+  if (jsonderivsimple)
     {
-      static_detail_output << "{";
-      static_model.writeJsonComputingPassOutput(static_detail_output, true);
-      static_detail_output << "}";
+      static_simple_output << "{";
+      static_model.writeJsonComputingPassOutput(static_simple_output, false);
+      static_simple_output << "}";
 
-      dynamic_detail_output << "{";
-      dynamic_model.writeJsonComputingPassOutput(dynamic_detail_output, true);
-      dynamic_detail_output << "}";
+      dynamic_simple_output << "{";
+      dynamic_model.writeJsonComputingPassOutput(dynamic_simple_output, false);
+      dynamic_simple_output << "}";
 
       ostringstream tmpd_out, tmpd1_out;
       tmpd_out << "";
       tmpd1_out << "";
       static_model.writeJsonParamsDerivativesFile(tmpd_out, true);
       if (!tmpd_out.str().empty())
-        static_paramsd_detail_output << "{" << tmpd_out.str() << "}" << endl;
+        static_paramsd_simple_output << "{" << tmpd_out.str() << "}" << endl;
 
       dynamic_model.writeJsonParamsDerivativesFile(tmpd1_out, true);
       if (!tmpd1_out.str().empty())
-        dynamic_paramsd_detail_output << "{" << tmpd1_out.str() << "}" << endl;
+        dynamic_paramsd_simple_output << "{" << tmpd1_out.str() << "}" << endl;
     }
 
   if (json_output_mode == standardout)
     {
-      cout << original_model_output.str() << endl
-           << static_output.str() << endl
-           << dynamic_output.str() << endl;
+      cout << ", \"static_model\": " << static_output.str() << endl
+           << ", \"dynamic_model\": " << dynamic_output.str() << endl;
 
       if (!static_paramsd_output.str().empty())
-        cout << static_paramsd_output.str() << endl;
+        cout << ", \"static_params_deriv\": " << static_paramsd_output.str() << endl;
 
       if (!dynamic_paramsd_output.str().empty())
-        cout << dynamic_paramsd_output.str() << endl;
+        cout << ", \"dynamic_params_deriv\":" << dynamic_paramsd_output.str() << endl;
 
-      if (jsonprintderivdetail)
+      if (jsonderivsimple)
         {
-          cout << static_detail_output.str() << endl
-               << dynamic_detail_output.str() << endl;
+          cout << ", \"static_model_simple\": " << static_simple_output.str() << endl
+               << ", \"dynamic_model_simple\": " << dynamic_simple_output.str() << endl;
 
-          if (!static_paramsd_detail_output.str().empty())
-            cout << static_paramsd_detail_output.str() << endl;
+          if (!static_paramsd_simple_output.str().empty())
+            cout << "," << static_paramsd_simple_output.str() << endl;
 
-          if (!dynamic_paramsd_detail_output.str().empty())
-            cout << dynamic_paramsd_detail_output.str() << endl;
+          if (!dynamic_paramsd_simple_output.str().empty())
+            cout << "," << dynamic_paramsd_simple_output.str() << endl;
         }
     }
   else
@@ -1506,40 +1518,38 @@ ModFile::writeJsonComputingPassOutput(const string &basename, JsonFileOutputType
         }
 
       string fname_original, fname_static, fname_dynamic;
-      fname_original = basename + "_original.json";
       fname_static = basename + "_static.json";
       fname_dynamic = basename + "_dynamic.json";
 
-      writeJsonFileHelper(fname_original, original_model_output);
       writeJsonFileHelper(fname_static, static_output);
       writeJsonFileHelper(fname_dynamic, dynamic_output);
 
-      if (jsonprintderivdetail)
+      if (jsonderivsimple)
         {
-          string fname_static_details, fname_dynamic_details;
-          fname_static_details = basename + "_static_details.json";
-          fname_dynamic_details = basename + "_dynamic_details.json";
+          string fname_static_simple, fname_dynamic_simple;
+          fname_static_simple = basename + "_static_simple.json";
+          fname_dynamic_simple = basename + "_dynamic_simple.json";
 
-          writeJsonFileHelper(fname_static_details, static_detail_output);
-          writeJsonFileHelper(fname_dynamic_details, dynamic_detail_output);
+          writeJsonFileHelper(fname_static_simple, static_simple_output);
+          writeJsonFileHelper(fname_dynamic_simple, dynamic_simple_output);
         }
 
       if (!static_paramsd_output.str().empty())
         {
-          string fname_static_params, fname_static_params_details;
+          string fname_static_params, fname_static_params_simple;
           fname_static_params = basename + "_static_params_derivs.json";
-          fname_static_params_details = basename + "_static_params_derivs_details.json";
+          fname_static_params_simple = basename + "_static_params_derivs_simple.json";
           writeJsonFileHelper(fname_static_params, static_paramsd_output);
-          writeJsonFileHelper(fname_static_params_details, static_paramsd_detail_output);
+          writeJsonFileHelper(fname_static_params_simple, static_paramsd_simple_output);
         }
 
       if (!dynamic_paramsd_output.str().empty())
         {
-          string fname_dynamic_params, fname_dynamic_params_details;
+          string fname_dynamic_params, fname_dynamic_params_simple;
           fname_dynamic_params = basename + "_params_derivs.json";
-          fname_dynamic_params_details = basename + "_params_derivs_details.json";
+          fname_dynamic_params_simple = basename + "_params_derivs_simple.json";
           writeJsonFileHelper(fname_dynamic_params, dynamic_paramsd_output);
-          writeJsonFileHelper(fname_dynamic_params_details, dynamic_paramsd_detail_output);
+          writeJsonFileHelper(fname_dynamic_params_simple, dynamic_paramsd_simple_output);
         }
     }
 }
diff --git a/ModFile.hh b/ModFile.hh
index 1b763f636c87192a0fcbf3e09f2641c8ee6a2042..7744d92815196d9aefa75a267f707391a5b21ccf 100644
--- a/ModFile.hh
+++ b/ModFile.hh
@@ -118,8 +118,8 @@ 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 writeJsonComputingPassOutput(const string &basename, JsonFileOutputType json_output_mode, bool jsonprintderivdetail) 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 jsonderivsimple) const;
   void writeJsonFileHelper(string &fname, ostringstream &output) const;
 public:
   //! Add a statement
@@ -174,7 +174,7 @@ public:
   //! Initially created to enable Julia to work with .mod files
   //! Potentially outputs ModFile after the various parts of processing (parsing, checkPass, transformPass, computingPass)
   //! Allows user of other host language platforms (python, fortran, etc) to provide support for dynare .mod files
-  void writeJsonOutput(const string &basename, JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonprintderivdetail = false);
+  void writeJsonOutput(const string &basename, JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonderivsimple = false);
 };
 
 #endif // ! MOD_FILE_HH
diff --git a/StaticModel.cc b/StaticModel.cc
index ecc50640d9a83100ab34624804c8d28347b7fdf6..a398d1c4f6c03d686c34ec8c65067ab4ffaf3839 100644
--- a/StaticModel.cc
+++ b/StaticModel.cc
@@ -341,7 +341,7 @@ StaticModel::writeModelEquationsOrdered_M(const string &static_basename) const
                 }
               else
                 {
-                  cerr << "Type missmatch for equation " << equation_ID+1  << "\n";
+                  cerr << "Type mismatch for equation " << equation_ID+1  << "\n";
                   exit(EXIT_FAILURE);
                 }
               output << ";\n";
@@ -2467,12 +2467,16 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
       expr_t d1 = it->second;
 
       if (writeDetails)
-        jacobian_output << "{\"eq\": " << eq + 1
-                        << ", \"var\": \"" << symbol_table.getName(symb_id) << "\"";
+        jacobian_output << "{\"eq\": " << eq + 1;
       else
         jacobian_output << "{\"row\": " << eq + 1;
-      jacobian_output << ", \"col\": " << col + 1
-                      << ", \"val\": \"";
+
+      jacobian_output << ", \"col\": " << col + 1;
+
+      if (writeDetails)
+        jacobian_output << ", \"var\": \"" << symbol_table.getName(symb_id) << "\"";
+
+      jacobian_output << ", \"val\": \"";
       d1->writeJsonOutput(jacobian_output, temp_term_union, tef_terms);
       jacobian_output << "\"}" << endl;
     }
@@ -2506,13 +2510,16 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
       int col_sym = tsid2*symbol_table.endo_nbr()+tsid1;
 
       if (writeDetails)
-        hessian_output << "{\"eq\": " << eq + 1
-                       << ", \"var1\": \"" << symbol_table.getName(symb_id1) << "\""
-                       << ", \"var2\": \"" << symbol_table.getName(symb_id2) << "\"";
+        hessian_output << "{\"eq\": " << eq + 1;
       else
         hessian_output << "{\"row\": " << eq + 1;
 
       hessian_output << ", \"col\": [" << col + 1;
+
+      if (writeDetails)
+        hessian_output << ", \"var1\": \"" << symbol_table.getName(symb_id1) << "\""
+                       << ", \"var2\": \"" << symbol_table.getName(symb_id2) << "\"";
+
       if (symb_id1 != symb_id2)
         hessian_output << ", " <<  col_sym + 1;
       hessian_output << "]"
@@ -2544,10 +2551,7 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
       expr_t d3 = it->second;
 
       if (writeDetails)
-        third_derivatives_output << "{\"eq\": " << eq + 1
-                                 << ", \"var1\": \"" << symbol_table.getName(getSymbIDByDerivID(var1)) << "\""
-                                 << ", \"var2\": \"" << symbol_table.getName(getSymbIDByDerivID(var2)) << "\""
-                                 << ", \"var3\": \"" << symbol_table.getName(getSymbIDByDerivID(var3)) << "\"";
+        third_derivatives_output << "{\"eq\": " << eq + 1;
       else
         third_derivatives_output << "{\"row\": " << eq + 1;
 
@@ -2569,17 +2573,23 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
             third_derivatives_output << ", ";
           third_derivatives_output << *it2 + 1;
         }
-      third_derivatives_output << "]"
-                               << ", \"val\": \"";
+      third_derivatives_output << "]";
+
+      if (writeDetails)
+        third_derivatives_output << ", \"var1\": \"" << symbol_table.getName(getSymbIDByDerivID(var1)) << "\""
+                                 << ", \"var2\": \"" << symbol_table.getName(getSymbIDByDerivID(var2)) << "\""
+                                 << ", \"var3\": \"" << symbol_table.getName(getSymbIDByDerivID(var3)) << "\"";
+
+      third_derivatives_output << ", \"val\": \"";
       d3->writeJsonOutput(third_derivatives_output, temp_term_union, tef_terms);
       third_derivatives_output << "\"}" << endl;
     }
   third_derivatives_output << "]}";
 
   if (writeDetails)
-    output << "\"static_model_derivative_details\": {";
+    output << "\"static_model\": {";
   else
-    output << "\"static_model_derivatives\": {";
+    output << "\"static_model_simple\": {";
   output << model_local_vars_output.str()
          << ", " << model_output.str()
          << ", " << jacobian_output.str()
@@ -2629,12 +2639,16 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1;
 
       if (writeDetails)
-        jacobian_output << "{\"eq\": " << eq + 1
-                        << ", \"param\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+        jacobian_output << "{\"eq\": " << eq + 1;
       else
         jacobian_output << "{\"row\": " << eq + 1;
-      jacobian_output << ", \"param_col\": " << param_col
-                      << ", \"val\": \"";
+
+      if (writeDetails)
+        jacobian_output << ", \"param_col\": " << param_col;
+
+      jacobian_output << ", \"param\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+
+      jacobian_output << ", \"val\": \"";
       d1->writeJsonOutput(jacobian_output, params_derivs_temporary_terms, tef_terms);
       jacobian_output << "\"}" << endl;
     }
@@ -2659,11 +2673,14 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1;
 
       if (writeDetails)
-        hessian_output << "{\"eq\": " << eq + 1
-                       << ", \"var\": \"" << symbol_table.getName(getSymbIDByDerivID(var)) << "\""
-                       << ", \"param\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+        hessian_output << "{\"eq\": " << eq + 1;
       else
         hessian_output << "{\"row\": " << eq + 1;
+
+      if (writeDetails)
+        hessian_output << ", \"var\": \"" << symbol_table.getName(getSymbIDByDerivID(var)) << "\""
+                       << ", \"param\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+
       hessian_output << ", \"var_col\": " << var_col
                      << ", \"param_col\": " << param_col
                      << ", \"val\": \"";
@@ -2692,14 +2709,18 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       int param2_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param2)) + 1;
 
       if (writeDetails)
-        hessian1_output << "{\"eq\": " << eq + 1
-                        << ", \"param1\": \"" << symbol_table.getName(getSymbIDByDerivID(param1)) << "\""
-                        << ", \"param2\": \"" << symbol_table.getName(getSymbIDByDerivID(param2)) << "\"";
+        hessian1_output << "{\"eq\": " << eq + 1;
       else
         hessian1_output << "{\"row\": " << eq + 1;
+
       hessian1_output << ", \"param1_col\": " << param1_col
-                      << ", \"param2_col\": " << param2_col
-                      << ", \"val\": \"";
+                      << ", \"param2_col\": " << param2_col;
+
+      if (writeDetails)
+        hessian1_output << ", \"param1\": \"" << symbol_table.getName(getSymbIDByDerivID(param1)) << "\""
+                        << ", \"param2\": \"" << symbol_table.getName(getSymbIDByDerivID(param2)) << "\"";
+
+      hessian1_output << ", \"val\": \"";
       d2->writeJsonOutput(hessian1_output, params_derivs_temporary_terms, tef_terms);
       hessian1_output << "\"}" << endl;
     }
@@ -2727,16 +2748,19 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       int param2_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param2)) + 1;
 
       if (writeDetails)
-        third_derivs_output << "{\"eq\": " << eq + 1
-                            << ", \"var\": \"" << symbol_table.getName(var) << "\""
-                            << ", \"param1\": \"" << symbol_table.getName(getSymbIDByDerivID(param1)) << "\""
-                            << ", \"param2\": \"" << symbol_table.getName(getSymbIDByDerivID(param2)) << "\"";
+        third_derivs_output << "{\"eq\": " << eq + 1;
       else
         third_derivs_output << "{\"row\": " << eq + 1;
       third_derivs_output << ", \"var_col\": " << var_col
                           << ", \"param1_col\": " << param1_col
-                          << ", \"param2_col\": " << param2_col
-                          << ", \"val\": \"";
+                          << ", \"param2_col\": " << param2_col;
+
+      if (writeDetails)
+        third_derivs_output << ", \"var\": \"" << symbol_table.getName(var) << "\""
+                            << ", \"param1\": \"" << symbol_table.getName(getSymbIDByDerivID(param1)) << "\""
+                            << ", \"param2\": \"" << symbol_table.getName(getSymbIDByDerivID(param2)) << "\"";
+
+      third_derivs_output << ", \"val\": \"";
       d2->writeJsonOutput(third_derivs_output, params_derivs_temporary_terms, tef_terms);
       third_derivs_output << "\"}" << endl;
     }
@@ -2765,25 +2789,29 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
       int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1;
 
       if (writeDetails)
-        third_derivs1_output << "{\"eq\": " << eq + 1
-                             << ", \"var1\": \"" << symbol_table.getName(getSymbIDByDerivID(var1)) << "\""
-                             << ", \"var2\": \"" << symbol_table.getName(getSymbIDByDerivID(var2)) << "\""
-                             << ", \"param1\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+        third_derivs1_output << "{\"eq\": " << eq + 1;
       else
         third_derivs1_output << "{\"row\": " << eq + 1;
+
       third_derivs1_output << ", \"var1_col\": " << var1_col
                            << ", \"var2_col\": " << var2_col
-                           << ", \"param_col\": " << param_col
-                           << ", \"val\": \"";
+                           << ", \"param_col\": " << param_col;
+
+      if (writeDetails)
+        third_derivs1_output << ", \"var1\": \"" << symbol_table.getName(getSymbIDByDerivID(var1)) << "\""
+                             << ", \"var2\": \"" << symbol_table.getName(getSymbIDByDerivID(var2)) << "\""
+                             << ", \"param1\": \"" << symbol_table.getName(getSymbIDByDerivID(param)) << "\"";
+
+      third_derivs1_output << ", \"val\": \"";
       d2->writeJsonOutput(third_derivs1_output, params_derivs_temporary_terms, tef_terms);
       third_derivs1_output << "\"}" << endl;
     }
   third_derivs1_output << "]}" << endl;
 
   if (writeDetails)
-    output << "\"static_model_params_derivative_details\": {";
+    output << "\"static_model_params_derivative\": {";
   else
-    output << "\"static_model_params_derivatives\": {";
+    output << "\"static_model_params_derivatives_simple\": {";
   output << model_local_vars_output.str()
          << ", " << model_output.str()
          << ", " << jacobian_output.str()