diff --git a/src/DynareMain2.cc b/src/DynareMain2.cc
index b5ae53a150395cb75b08e4dbf13f084f47f27600..819a90e38eb0510165bd39ce458d95fbfed7c6dd 100644
--- a/src/DynareMain2.cc
+++ b/src/DynareMain2.cc
@@ -19,6 +19,8 @@
 
 #include <iostream>
 
+#include <boost/filesystem.hpp>
+
 #include "ParsingDriver.hh"
 #include "ModFile.hh"
 #include "ConfigFile.hh"
@@ -40,6 +42,8 @@ main2(stringstream &in, string &basename, bool debug, bool clear_all, bool clear
 {
   ParsingDriver p(warnings, nostrict);
 
+  boost::filesystem::remove_all(basename + "/model/json");
+
   // Do parsing and construct internal representation of mod file
   ModFile *mod_file = p.parse(in, debug);
   if (json == parsing)
diff --git a/src/ModFile.cc b/src/ModFile.cc
index 3b7476d38df6ab842ff06a16ba93899f39b17e55..57cc6b786e9535bb9058b63e63f4093d503cd67e 100644
--- a/src/ModFile.cc
+++ b/src/ModFile.cc
@@ -753,7 +753,8 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool clear_glo
     {
       // Erase possible remnants of previous runs
       boost::filesystem::remove_all("+" + basename);
-      boost::filesystem::remove_all(basename + "/model");
+      boost::filesystem::remove_all(basename + "/model/src");
+      boost::filesystem::remove_all(basename + "/model/bytecode");
     }
 
   ofstream mOutputFile;
@@ -1512,8 +1513,8 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType
 
       if (basename.size())
         {
-          string fname(basename);
-          fname += ".json";
+          boost::filesystem::create_directories(basename + "/model/json");
+          string fname{basename + "/model/json/modfile.json"};
           jsonOutputFile.open(fname, ios::out | ios::binary);
           if (!jsonOutputFile.is_open())
             {
@@ -1534,8 +1535,7 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType
         {
           if (basename.size())
             {
-              string fname(basename);
-              fname += "_original.json";
+              string fname{basename + "/model/json/modfile-original.json"};
               jsonOutputFile.open(fname, ios::out | ios::binary);
               if (!jsonOutputFile.is_open())
                 {
@@ -1556,8 +1556,7 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType
         {
           if (basename.size())
             {
-              string fname(basename);
-              fname += "_steady_state_model.json";
+              string fname{basename + "/model/json/steady_state_model.json"};
               jsonOutputFile.open(fname, ios::out | ios::binary);
               if (!jsonOutputFile.is_open())
                 {
@@ -1621,31 +1620,21 @@ ModFile::writeJsonComputingPassOutput(const string &basename, JsonFileOutputType
     }
   else
     {
-      string fname_original, fname_static, fname_dynamic;
-      fname_static = basename + "_static.json";
-      fname_dynamic = basename + "_dynamic.json";
+      boost::filesystem::create_directories(basename + "/model/json");
 
-      writeJsonFileHelper(fname_static, static_output);
-      writeJsonFileHelper(fname_dynamic, dynamic_output);
+      writeJsonFileHelper(basename + "/model/json/static.json", static_output);
+      writeJsonFileHelper(basename + "/model/json/dynamic.json", dynamic_output);
 
       if (!static_paramsd_output.str().empty())
-        {
-          string fname_static_params;
-          fname_static_params = basename + "_static_params_derivs.json";
-          writeJsonFileHelper(fname_static_params, static_paramsd_output);
-        }
+        writeJsonFileHelper(basename + "/model/json/static_params_derivs.json", static_paramsd_output);
 
       if (!dynamic_paramsd_output.str().empty())
-        {
-          string fname_dynamic_params;
-          fname_dynamic_params = basename + "_params_derivs.json";
-          writeJsonFileHelper(fname_dynamic_params, dynamic_paramsd_output);
-        }
+        writeJsonFileHelper(basename + "/model/json/params_derivs.json", dynamic_paramsd_output);
     }
 }
 
 void
-ModFile::writeJsonFileHelper(string &fname, ostringstream &output) const
+ModFile::writeJsonFileHelper(const string &fname, ostringstream &output) const
 {
   ofstream jsonOutput;
   jsonOutput.open(fname, ios::out | ios::binary);
diff --git a/src/ModFile.hh b/src/ModFile.hh
index 6664c88b2d1185fef3868a756185879426e20b2b..5f76da3f8e20efb161936b7c7cce0ebe220b4990 100644
--- a/src/ModFile.hh
+++ b/src/ModFile.hh
@@ -122,7 +122,7 @@ private:
   //! Functions used in writing of JSON outut. See writeJsonOutput
   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;
+  void writeJsonFileHelper(const string &fname, ostringstream &output) const;
 public:
   //! Add a statement
   void addStatement(Statement *st);