diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc
index 496afc70e5e7a99e52ea5ed61e03f2c6c0f6dbcb..56b6d52b593bf08005f9dc09eaf0a9110bf14d4e 100644
--- a/src/ComputingTasks.cc
+++ b/src/ComputingTasks.cc
@@ -593,6 +593,25 @@ DetCondForecastStatement::writeOutput(ostream &output, const string &basename, b
   output << ");" << endl;
 }
 
+void
+DetCondForecastStatement::writeJsonOutput(ostream &output) const
+{
+  output << R"({"statementName": "det_cond_forecast")";
+  if (options_list.getNumberOfOptions())
+    {
+      output << ", ";
+      options_list.writeJsonOutput(output);
+    }
+  if (!symbol_list.empty())
+    {
+      output << ", ";
+      symbol_list.writeJsonOutput(output);
+    }
+  output << R"(, "linear_decomposition": )"
+         << (linear_decomposition ? "true" : "false")
+         << "}";
+}
+
 RamseyModelStatement::RamseyModelStatement(OptionsList options_list_arg) :
   options_list{move(options_list_arg)}
 {
diff --git a/src/ComputingTasks.hh b/src/ComputingTasks.hh
index c186c2680e9a1a80b3fbfa578308709d5b7b305f..6bc0d05072b73f390c43d011a189f1d1dd5b75f2 100644
--- a/src/ComputingTasks.hh
+++ b/src/ComputingTasks.hh
@@ -106,6 +106,7 @@ public:
                            OptionsList options_list_arg,
                            const bool linear_decompositiontion_arg);
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
+  void writeJsonOutput(ostream &output) const override;
 };
 
 class ModelInfoStatement : public Statement
diff --git a/src/Shocks.cc b/src/Shocks.cc
index 451abc343cacbf92b616a75da0130cf0017d6382..d10f012826d14bcc2ab5dfcf9336aa14b62e0a2f 100644
--- a/src/Shocks.cc
+++ b/src/Shocks.cc
@@ -151,11 +151,7 @@ void
 ShocksStatement::writeJsonOutput(ostream &output) const
 {
   output << R"({"statementName": "shocks")"
-         << R"(, "overwrite": )";
-  if (overwrite)
-    output << "true";
-  else
-    output << "false";
+         << R"(, "overwrite": )" << (overwrite ? "true" : "false");
   if (!det_shocks.empty())
     {
       output << ", ";
@@ -422,6 +418,19 @@ MShocksStatement::writeOutput(ostream &output, const string &basename, bool mini
   writeDetShocks(output);
 }
 
+void
+MShocksStatement::writeJsonOutput(ostream &output) const
+{
+  output << R"({"statementName": "mshocks")"
+         << R"(, "overwrite": )" << (overwrite ? "true" : "false");
+  if (!det_shocks.empty())
+    {
+      output << ", ";
+      writeJsonDetShocks(output);
+    }
+  output << "}";
+}
+
 ConditionalForecastPathsStatement::ConditionalForecastPathsStatement(AbstractShocksStatement::det_shocks_t paths_arg,
                                                                      const SymbolTable &symbol_table_arg) :
   paths{move(paths_arg)},
diff --git a/src/Shocks.hh b/src/Shocks.hh
index bcc7c3018ff62b1c15b666250eb84d8e91a6d3ad..8d17a7b730d897acc583172136c6cdf13b01c0aa 100644
--- a/src/Shocks.hh
+++ b/src/Shocks.hh
@@ -90,6 +90,7 @@ public:
                    const det_shocks_t &det_shocks_arg,
                    const SymbolTable &symbol_table_arg);
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
+  void writeJsonOutput(ostream &output) const override;
 };
 
 class ConditionalForecastPathsStatement : public Statement
diff --git a/src/SigmaeInitialization.cc b/src/SigmaeInitialization.cc
index 9fbcf3cc1846c33034ae17c7a9c56ead737b9db3..62fa00907fd91e1b691072da57972c295bd38dd5 100644
--- a/src/SigmaeInitialization.cc
+++ b/src/SigmaeInitialization.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2003-2019 Dynare Team
+ * Copyright © 2003-2020 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -83,7 +83,7 @@ SigmaeStatement::writeOutput(ostream &output, const string &basename, bool minim
               ic1 = ir;
               ir1 = ic;
             }
-          else // ic <= ir && matrix_form == eLower
+          else // ic <= ir && matrix_form == MatrixForm::lower
             {
               ic1 = ic;
               ir1 = ir;
@@ -96,3 +96,25 @@ SigmaeStatement::writeOutput(ostream &output, const string &basename, bool minim
     }
   output << "];" << endl;
 }
+
+void
+SigmaeStatement::writeJsonOutput(ostream &output) const
+{
+  output << R"({"statementName": "Sigma_e", "value": [)";
+  for (auto it = matrix.begin(); it != matrix.end(); ++it)
+    {
+      if (it != matrix.begin())
+        output << ", ";
+      output << "[";
+      for (auto it2 = it->begin(); it2 != it->end(); ++it2)
+        {
+          if (it2 != it->begin())
+            output << ", ";
+          output << '"';
+          (*it2)->writeJsonOutput(output, {}, {});
+          output << '"';
+        }
+      output << "]";
+    }
+  output << "] }";
+}
diff --git a/src/SigmaeInitialization.hh b/src/SigmaeInitialization.hh
index 39d53a9c14780b68d7b72631bd501d513d293888..14f717238329e44ecb2e447aa0d9637670a91914 100644
--- a/src/SigmaeInitialization.hh
+++ b/src/SigmaeInitialization.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2003-2015 Dynare Team
+ * Copyright © 2003-2020 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -58,6 +58,7 @@ private:
 public:
   explicit SigmaeStatement(matrix_t matrix_arg) noexcept(false);
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
+  void writeJsonOutput(ostream &output) const override;
 };
 
 #endif
diff --git a/src/Statement.cc b/src/Statement.cc
index 50f7e99ef276940374e77712060aecb72f074266..5a4be1c0af05db8f42411cbe7e63a1ffac954215 100644
--- a/src/Statement.cc
+++ b/src/Statement.cc
@@ -34,11 +34,6 @@ Statement::writeJuliaOutput(ostream &output, const string &basename)
 {
 }
 
-void
-Statement::writeJsonOutput(ostream &output) const
-{
-}
-
 void
 Statement::computingPass()
 {
diff --git a/src/Statement.hh b/src/Statement.hh
index e7febfd944fd86154a40cc175ac9b0469b9888be..fab30d99decc192dc851e157717da8482c4d1bcc 100644
--- a/src/Statement.hh
+++ b/src/Statement.hh
@@ -166,7 +166,7 @@ public:
   */
   virtual void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const = 0;
   virtual void writeJuliaOutput(ostream &output, const string &basename);
-  virtual void writeJsonOutput(ostream &output) const;
+  virtual void writeJsonOutput(ostream &output) const = 0;
 };
 
 class NativeStatement : public Statement