diff --git a/ExprNode.cc b/ExprNode.cc
index b9c4405528ed4f596f0f159f00d71199d57e251e..0121a991a60892bca391b1d6fd9f695092a53c2f 100644
--- a/ExprNode.cc
+++ b/ExprNode.cc
@@ -660,6 +660,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
           output <<  "y" << LEFT_ARRAY_SUBSCRIPT(output_type) << i << RIGHT_ARRAY_SUBSCRIPT(output_type);
           break;
         case oCStaticModel:
+        case oJuliaStaticModel:
         case oMatlabStaticModel:
         case oMatlabStaticModelSparse:
           i = tsid + ARRAY_SUBSCRIPT_OFFSET(output_type);
@@ -718,6 +719,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
             output <<  "x[it_" << lag << "+" << i << "*nb_row_x]";
           break;
         case oCStaticModel:
+        case oJuliaStaticModel:
         case oMatlabStaticModel:
         case oMatlabStaticModelSparse:
           output << "x" << LEFT_ARRAY_SUBSCRIPT(output_type) << i << RIGHT_ARRAY_SUBSCRIPT(output_type);
@@ -763,6 +765,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
             output <<  "x[it_" << lag << "+" << i << "*nb_row_x]";
           break;
         case oCStaticModel:
+        case oJuliaStaticModel:
         case oMatlabStaticModel:
         case oMatlabStaticModelSparse:
           output << "x" << LEFT_ARRAY_SUBSCRIPT(output_type) << i << RIGHT_ARRAY_SUBSCRIPT(output_type);
diff --git a/ExprNode.hh b/ExprNode.hh
index 0500ff6d501edf45b2bf713884520c38fffc8f6d..ae9fcd46d58b009610715476d8cd8690c7976c0d 100644
--- a/ExprNode.hh
+++ b/ExprNode.hh
@@ -66,6 +66,7 @@ enum ExprNodeOutputType
     oMatlabDynamicModelSparse,                    //!< Matlab code, dynamic block decomposed model
     oCDynamicModel,                               //!< C code, dynamic model
     oCStaticModel,                                //!< C code, static model
+    oJuliaStaticModel,                            //!< Julia code, static model
     oMatlabOutsideModel,                          //!< Matlab code, outside model block (for example in initval)
     oLatexStaticModel,                            //!< LaTeX code, static model
     oLatexDynamicModel,                           //!< LaTeX code, dynamic model
diff --git a/ModFile.cc b/ModFile.cc
index fb2ab8860f733aee53613be9e21f7513dd8336d8..c371c5a390f63153beac4261368b4742ae7e624d 100644
--- a/ModFile.cc
+++ b/ModFile.cc
@@ -1113,6 +1113,11 @@ ModFile::writeExternalFilesJulia(const string &basename, FileOutputType output)
   cout << "Processing outputs ..." << endl;
   symbol_table.writeJuliaOutput(jlOutputFile);
 
+  if (dynamic_model.equation_number() > 0)
+    if (!no_static)
+      static_model.writeStaticFile(basename, false, false, false, &jlOutputFile);
+
   jlOutputFile << "end" << endl;
   jlOutputFile.close();
+  cout << "done" << endl;
 }
diff --git a/StaticModel.cc b/StaticModel.cc
index 523c0ab93dadeb32037ebad04c84b75bb6cf07b0..b39ca991b6d69430809fbb43d84587f3a56fab92 100644
--- a/StaticModel.cc
+++ b/StaticModel.cc
@@ -1175,19 +1175,20 @@ StaticModel::writeStaticMFile(const string &func_name) const
          << "% Warning : this file is generated automatically by Dynare" << endl
          << "%           from model file (.mod)" << endl << endl;
 
-  writeStaticModel(output, false);
+  writeStaticModel(output, false, false);
   output << "end" << endl;
   output.close();
 }
 
 void
-StaticModel::writeStaticModel(ostream &StaticOutput, bool use_dll) const
+StaticModel::writeStaticModel(ostream &StaticOutput, bool use_dll, bool julia) const
 {
   ostringstream model_output;    // Used for storing model equations
   ostringstream jacobian_output; // Used for storing jacobian equations
   ostringstream hessian_output;  // Used for storing Hessian equations
   ostringstream third_derivatives_output;  // Used for storing third order derivatives equations
-  ExprNodeOutputType output_type = (use_dll ? oCStaticModel : oMatlabStaticModel);
+  ExprNodeOutputType output_type = (use_dll ? oCStaticModel :
+                                    julia ? oJuliaStaticModel : oMatlabStaticModel);
 
   deriv_node_temp_terms_t tef_terms;
   writeModelLocalVariables(model_output, output_type, tef_terms);
@@ -1320,7 +1321,7 @@ StaticModel::writeStaticModel(ostream &StaticOutput, bool use_dll) const
       k += k2;
     }
 
-  if (!use_dll)
+  if (!use_dll && !julia)
     {
       StaticOutput << "residual = zeros( " << equations.size() << ", 1);" << endl << endl
                    << "%" << endl
@@ -1366,9 +1367,53 @@ StaticModel::writeStaticModel(ostream &StaticOutput, bool use_dll) const
                       << "  g3 = sparse(v3(:,1),v3(:,2),v3(:,3)," << nrows << "," << ncols << ");" << endl;
       else // Either 3rd derivatives is all zero, or we didn't compute it
         StaticOutput << "  g3 = sparse([],[],[]," << nrows << "," << ncols << ");" << endl;
+    }
+  else if (julia)
+    {
+      StaticOutput << "residual = zeros( " << equations.size() << ", 1)" << endl << endl
+                   << "#" << endl
+                   << "# Model equations" << endl
+                   << "#" << endl << endl
+                   << model_output.str()
+                   << "if ~isreal(residual)" << endl
+                   << "  residual = real(residual)+imag(residual).^2;" << endl
+                   << "end" << endl
+                   << "g1 = zeros(" << equations.size() << ", " << symbol_table.endo_nbr() << ");"
+                   << endl << endl
+                   << "#" << endl
+                   << "# Jacobian matrix" << endl
+                   << "#" << endl << endl
+                   << jacobian_output.str()
+                   << "if ~isreal(g1)" << endl
+                   << "  g1 = real(g1)+2*imag(g1);" << endl
+                   << "end" << endl
+                   << "#" << endl
+                   << "# Hessian matrix" << endl
+                   << "#" << endl;
+
+      if (second_derivatives.size())
+        StaticOutput << "v2 = zeros(" << NNZDerivatives[1] << ",3);" << endl
+                     << hessian_output.str()
+                     << "g2 = sparse(v2(:,1),v2(:,2),v2(:,3)," << equations.size() << ","
+                     << g2ncols << ");" << endl;
+      else
+        StaticOutput << "g2 = sparse([],[],[]," << equations.size() << "," << g2ncols << ");" << endl;
+
+      // Initialize g3 matrix
+      StaticOutput << "#" << endl
+                   << "# Third order derivatives" << endl
+                   << "#" << endl;
 
+      int ncols = hessianColsNbr * JacobianColsNbr;
+      if (third_derivatives.size())
+        StaticOutput << "v3 = zeros(" << NNZDerivatives[2] << ",3);" << endl
+                     << third_derivatives_output.str()
+                     << "g3 = sparse(v3(:,1),v3(:,2),v3(:,3)," << nrows << "," << ncols << ");"
+                     << endl;
+      else // Either 3rd derivatives is all zero, or we didn't compute it
+        StaticOutput << "g3 = sparse([],[],[]," << nrows << "," << ncols << ");" << endl;
     }
-  else
+  else if (use_dll)
     {
       StaticOutput << "void Static(double *y, double *x, int nb_row_x, double *params, double *residual, double *g1, double *v2)" << endl
                    << "{" << endl
@@ -1440,7 +1485,7 @@ StaticModel::writeStaticCFile(const string &func_name) const
   writePowerDerivCHeader(output);
 
   // Writing the function body
-  writeStaticModel(output, true);
+  writeStaticModel(output, true, false);
   output << "}" << endl << endl;
 
   writePowerDeriv(output, true);
@@ -1515,7 +1560,16 @@ StaticModel::writeStaticCFile(const string &func_name) const
 }
 
 void
-StaticModel::writeStaticFile(const string &basename, bool block, bool bytecode, bool use_dll) const
+StaticModel::writeStaticJuliaFile(ofstream &jlOutputFile) const
+{
+  jlOutputFile << "model__.static = function static(y, x, params)" << endl;
+  writeStaticModel(jlOutputFile, false, true);
+  jlOutputFile << "(residual, g1, g2, g3)" << endl
+               << "end" << endl;
+}
+
+void
+StaticModel::writeStaticFile(const string &basename, bool block, bool bytecode, bool use_dll, ofstream *jlOutputFile) const
 {
   int r;
 
@@ -1544,6 +1598,8 @@ StaticModel::writeStaticFile(const string &basename, bool block, bool bytecode,
     }
   else if(use_dll)
     writeStaticCFile(basename);
+  else if (jlOutputFile != NULL)
+    writeStaticJuliaFile(*jlOutputFile);
   else
     writeStaticMFile(basename);
   writeAuxVarRecursiveDefinitions(basename);
diff --git a/StaticModel.hh b/StaticModel.hh
index e76a5f0fe3d1a0c1ac4a0b1c7ae9775c54c50f98..7c1178668091778f9227af98cbb161050c276b85 100644
--- a/StaticModel.hh
+++ b/StaticModel.hh
@@ -50,8 +50,11 @@ private:
   //! Writes static model file (C version)
   void writeStaticCFile(const string &func_name) const;
 
+  //! Writes static model file (Julia version)
+  void writeStaticJuliaFile(ofstream &jlOutputFile) const;
+
   //! Writes the static model equations and its derivatives
-  void writeStaticModel(ostream &StaticOutput, bool use_dll) const;
+  void writeStaticModel(ostream &StaticOutput, bool use_dll, bool julia) const;
 
   //! Writes the static function calling the block to solve (Matlab version)
   void writeStaticBlockMFSFile(const string &basename) const;
@@ -168,7 +171,7 @@ public:
                                    int &u_count_int, bool &file_open) const;
 
   //! Writes static model file
-  void writeStaticFile(const string &basename, bool block, bool bytecode, bool use_dll) const;
+  void writeStaticFile(const string &basename, bool block, bool bytecode, bool use_dll, ofstream *jlOutputFile = NULL) const;
 
   //! Writes file containing static parameters derivatives
   void writeParamsDerivativesFile(const string &basename) const;