diff --git a/DynamicModel.cc b/DynamicModel.cc
index a4c0e16223436487d94b0e4124ea342fee78f286..e2d28f79fd3a6159d31566a08f86800e9fca8dfb 100644
--- a/DynamicModel.cc
+++ b/DynamicModel.cc
@@ -3812,7 +3812,14 @@ DynamicModel::cloneDynamic(DynamicModel &dynamic_model) const
 
   // Convert equations
   for (size_t i = 0; i < equations.size(); i++)
-    dynamic_model.addEquation(equations[i]->cloneDynamic(dynamic_model), equations_lineno[i]);
+    {
+      vector<pair<string, string> > eq_tags;
+      for (vector<pair<int, pair<string, string> > >::const_iterator it = equation_tags.begin();
+           it != equation_tags.end(); ++it)
+        if (it->first == i)
+          eq_tags.push_back(it->second);
+      dynamic_model.addEquation(equations[i]->cloneDynamic(dynamic_model), equations_lineno[i], eq_tags);
+    }
 
   // Convert auxiliary equations
   for (deque<BinaryOpNode *>::const_iterator it = aux_equations.begin();
@@ -5634,6 +5641,12 @@ DynamicModel::writeJsonXrefs(ostream &output) const
   output << "]}" << endl;
 }
 
+void
+DynamicModel::writeJsonOriginalModelOutput(ostream &output) const
+{
+  writeJsonModelEquations(output, false);
+}
+
 void
 DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) const
 {
diff --git a/DynamicModel.hh b/DynamicModel.hh
index fa7e68c4f9617227c11199ab188c1ad446cd5cf2..961faa2b984743740dcf912925825fa6f8de9556 100644
--- a/DynamicModel.hh
+++ b/DynamicModel.hh
@@ -244,6 +244,9 @@ public:
   //! Write JSON Output
   void writeJsonOutput(ostream &output) const;
 
+  //! Write JSON Output representation of original dynamic model
+  void writeJsonOriginalModelOutput(ostream &output) const;
+
   //! Write JSON Output representation of dynamic model after computing pass
   void writeJsonComputingPassOutput(ostream &output, bool writeDetails) const;
 
diff --git a/ModFile.cc b/ModFile.cc
index 11e9bc54d23b123aac0abb189f5eca067de5d9b2..b011a195be632e69660ac91d84480c052548130a 100644
--- a/ModFile.cc
+++ b/ModFile.cc
@@ -1394,6 +1394,11 @@ ModFile::writeJsonComputingPassOutput(const string &basename, JsonFileOutputType
   dynamic_model.writeJsonComputingPassOutput(dynamic_output, false);
   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;
   tmp_out << "";
   static_paramsd_output << "";
@@ -1434,7 +1439,8 @@ ModFile::writeJsonComputingPassOutput(const string &basename, JsonFileOutputType
 
   if (json_output_mode == standardout)
     {
-      cout << static_output.str() << endl
+      cout << original_model_output.str() << endl
+           << static_output.str() << endl
            << dynamic_output.str() << endl;
 
       if (!static_paramsd_output.str().empty())
@@ -1463,10 +1469,12 @@ ModFile::writeJsonComputingPassOutput(const string &basename, JsonFileOutputType
           exit(EXIT_FAILURE);
         }
 
-      string fname_static, fname_dynamic;
+      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);