diff --git a/BlockTriangular.hh b/BlockTriangular.hh
index 7ff24e1cd58106df192222f963a76255e4880438..51df43211e0ebf7398ae9c0483e884a5843c51a8 100644
--- a/BlockTriangular.hh
+++ b/BlockTriangular.hh
@@ -42,6 +42,49 @@ typedef vector<pair<EquationType, NodeID > > t_etype;
 //! Vector describing variables: max_lag in the block, max_lead in the block
 typedef vector<pair< int, int> > t_vtype;
 
+typedef set<int> temporary_terms_inuse_type;
+
+//! For one lead/lag of one block, stores mapping of information between original model and block-decomposed model
+struct IM_compact
+{
+  int size, u_init, u_finish, nb_endo, nb_other_endo, size_exo, size_other_endo;
+  int *u, *us, *Var, *Equ, *Var_Index, *Equ_Index, *Exogenous, *Exogenous_Index, *Equ_X, *Equ_X_Index;
+  int *u_other_endo, *Var_other_endo, *Equ_other_endo, *Var_Index_other_endo, *Equ_Index_other_endo;
+};
+
+//! One block of the model
+struct Block
+{
+  int Size, Sized, nb_exo, nb_exo_det, nb_other_endo, Nb_Recursives;
+  BlockType Type;
+  BlockSimulationType Simulation_Type;
+  int Max_Lead, Max_Lag, Nb_Lead_Lag_Endo;
+  int Max_Lag_Endo, Max_Lead_Endo;
+  int Max_Lag_Other_Endo, Max_Lead_Other_Endo;
+  int Max_Lag_Exo, Max_Lead_Exo;
+  bool is_linear;
+  int *Equation, *Own_Derivative;
+  EquationType *Equation_Type;
+  NodeID *Equation_Normalized;
+  int *Variable, *Other_Endogenous, *Exogenous;
+  temporary_terms_type **Temporary_Terms_in_Equation;
+  //temporary_terms_type *Temporary_terms;
+  temporary_terms_inuse_type *Temporary_InUse;
+  IM_compact *IM_lead_lag;
+  int Code_Start, Code_Length;
+};
+
+
+
+//! The set of all blocks of the model
+struct Model_Block
+{
+  int Size, Periods;
+  Block* Block_List;
+  //int *in_Block_Equ, *in_Block_Var, *in_Equ_of_Block, *in_Var_of_Block;
+};
+
+
 //! Creates the incidence matrix, computes prologue & epilogue, normalizes the model and computes the block decomposition
 class BlockTriangular
 {
diff --git a/DynamicModel.cc b/DynamicModel.cc
index c328d0d8cfd8149cbe13457fa2b97bbe7ea07b1f..f266f8be521aa6122023dcb16dd4d001a5b39640 100644
--- a/DynamicModel.cc
+++ b/DynamicModel.cc
@@ -17,11 +17,11 @@
  * along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <iostream>
 #include <cmath>
 #include <cstdlib>
 #include <cassert>
 
-
 #include "DynamicModel.hh"
 
 // For mkdir() and chdir()
diff --git a/DynamicModel.hh b/DynamicModel.hh
index 82dd691c8e98824594c470eaad0bda978b3f12a3..2d7f30a03a5352ff342f4e96f508840ea8b91f50 100644
--- a/DynamicModel.hh
+++ b/DynamicModel.hh
@@ -22,6 +22,8 @@
 
 using namespace std;
 
+#include <fstream>
+
 #include "StaticModel.hh"
 #include "BlockTriangular.hh"
 
diff --git a/ExprNode.cc b/ExprNode.cc
index 952965143d063fc9a5d5cb67f517925872b8dafc..d8b2df1af4ec8ac7d2ffdcfa2dbd1f9dd46b34c1 100644
--- a/ExprNode.cc
+++ b/ExprNode.cc
@@ -26,6 +26,7 @@
 
 #include "ExprNode.hh"
 #include "DataTree.hh"
+#include "BlockTriangular.hh"
 
 ExprNode::ExprNode(DataTree &datatree_arg) : datatree(datatree_arg)
 {
@@ -94,13 +95,6 @@ ExprNode::computeTemporaryTerms(map<NodeID, int> &reference_count,
     // Nothing to do for a terminal node
   }
 
-void
-ExprNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
-                      const temporary_terms_type &temporary_terms) const
-  {
-    //writeOutput(output, oMatlabOutsideModel, temporary_terms_type());
-  }
-
 
 void
 ExprNode::writeOutput(ostream &output)
@@ -108,11 +102,6 @@ ExprNode::writeOutput(ostream &output)
   writeOutput(output, oMatlabOutsideModel, temporary_terms_type());
 }
 
-pair<bool, NodeID>
-ExprNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) const
-  {
-    return(make_pair(true, (NodeID)NULL));
-  }
 
 NumConstNode::NumConstNode(DataTree &datatree_arg, int id_arg) :
     ExprNode(datatree_arg),
@@ -160,7 +149,7 @@ NumConstNode::eval(const eval_context_type &eval_context) const throw (EvalExcep
 }
 
 void
-NumConstNode::compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
+NumConstNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
   {
     CompileCode.write(&FLDC, sizeof(FLDC));
     double vard = datatree.num_constants.getDouble(id);
@@ -448,7 +437,7 @@ VariableNode::eval(const eval_context_type &eval_context) const throw (EvalExcep
 }
 
 void
-VariableNode::compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
+VariableNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
   {
     int i, lagl;
 #ifdef DEBUGC
@@ -543,7 +532,7 @@ VariableNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) con
   {
     if (type ==eEndogenous)
       {
-        if (datatree.symbol_table.getTypeSpecificID(symb_id)==var_endo and lag==0)
+        if (datatree.symbol_table.getTypeSpecificID(symb_id)==var_endo && lag==0)
           return(make_pair(true, (NodeID)NULL));
         else
           return(make_pair(false, datatree.AddVariableInternal(datatree.symbol_table.getName(symb_id), lag)));
@@ -557,19 +546,6 @@ VariableNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) con
       }
   }
 
-template<class InputIterator, class T>
-pair<InputIterator, int> find_r ( InputIterator first, InputIterator last, const T& value )
-{
-  int i=0;
-  for (; first!=last; first++)
-    {
-      if ( *first==value ) break;
-      i++;
-    }
-  return make_pair(first, i);
-}
-
-
 NodeID
 VariableNode::getChainRuleDerivative(int deriv_id_arg, const map<int, NodeID> &recursive_variables)
 {
@@ -1003,7 +979,7 @@ UnaryOpNode::eval(const eval_context_type &eval_context) const throw (EvalExcept
 }
 
 void
-UnaryOpNode::compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
+UnaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
   {
     temporary_terms_type::const_iterator it = temporary_terms.find(const_cast<UnaryOpNode *>(this));
     if (it != temporary_terms.end())
@@ -1037,7 +1013,7 @@ UnaryOpNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) cons
     pair<bool, NodeID> res = arg->normalizeLinearInEndoEquation(var_endo, Derivative);
     bool is_endogenous_present = res.first;
     NodeID New_NodeID = res.second;
-    if (not is_endogenous_present)
+    if (!is_endogenous_present)
       {
         switch (op_code)
           {
@@ -1447,7 +1423,7 @@ BinaryOpNode::eval(const eval_context_type &eval_context) const throw (EvalExcep
 }
 
 void
-BinaryOpNode::compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
+BinaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
   {
     // If current node is a temporary term
     temporary_terms_type::const_iterator it = temporary_terms.find(const_cast<BinaryOpNode *>(this));
@@ -1667,63 +1643,63 @@ BinaryOpNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) con
     switch (op_code)
       {
       case oPlus:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, /*tmp_*/datatree.AddPlus(NodeID_1, NodeID_2)));
-        else if (is_endogenous_present_1 and is_endogenous_present_2)
+        else if (is_endogenous_present_1 && is_endogenous_present_2)
           return(make_pair(true, (NodeID)NULL));
-        else if (not is_endogenous_present_1 and is_endogenous_present_2)
+        else if (!is_endogenous_present_1 && is_endogenous_present_2)
           return(make_pair(false, NodeID_1));
-        else if (is_endogenous_present_1 and not is_endogenous_present_2)
+        else if (is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, NodeID_2));
         break;
       case oMinus:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, /*tmp_*/datatree.AddMinus(NodeID_1, NodeID_2)));
-        else if (is_endogenous_present_1 and is_endogenous_present_2)
+        else if (is_endogenous_present_1 && is_endogenous_present_2)
           return(make_pair(true, (NodeID)NULL));
-        else if (not is_endogenous_present_1 and is_endogenous_present_2)
+        else if (!is_endogenous_present_1 && is_endogenous_present_2)
           return(make_pair(false, NodeID_1));
-        else if (is_endogenous_present_1 and not is_endogenous_present_2)
+        else if (is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, /*tmp_*/datatree.AddUMinus(NodeID_2)));
         break;
       case oTimes:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, /*tmp_*/datatree.AddTimes(NodeID_1, NodeID_2)));
         else
           return(make_pair(true, (NodeID)NULL));
         break;
       case oDivide:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, datatree.AddDivide(NodeID_1, NodeID_2)));
         else
           return(make_pair(true, (NodeID)NULL));
         break;
       case oPower:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, datatree.AddPower(NodeID_1, NodeID_2)));
         else
           return(make_pair(true, (NodeID)NULL));
         break;
       case oEqual:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           {
             if (Derivative!=datatree.One)
               return( make_pair(false, datatree.AddEqual(datatree.AddVariable(datatree.symbol_table.getName(datatree.symbol_table.getID(eEndogenous, var_endo)), 0), datatree.AddDivide(datatree.AddMinus(NodeID_2, NodeID_1), Derivative))) );
             else
               return( make_pair(false, datatree.AddEqual(datatree.AddVariable(datatree.symbol_table.getName(datatree.symbol_table.getID(eEndogenous, var_endo)), 0), datatree.AddMinus(NodeID_2, NodeID_1))) );
           }
-        else if (is_endogenous_present_1 and is_endogenous_present_2)
+        else if (is_endogenous_present_1 && is_endogenous_present_2)
           {
             return(make_pair(false, datatree.AddEqual(datatree.AddVariable(datatree.symbol_table.getName(datatree.symbol_table.getID(eEndogenous, var_endo)), 0), datatree.Zero)));
           }
-        else if (not is_endogenous_present_1 and is_endogenous_present_2)
+        else if (!is_endogenous_present_1 && is_endogenous_present_2)
           {
             if (Derivative!=datatree.One)
               return(make_pair(false, datatree.AddEqual(datatree.AddVariable(datatree.symbol_table.getName(datatree.symbol_table.getID(eEndogenous, var_endo)), 0), datatree.AddDivide(datatree.AddUMinus(NodeID_1), Derivative))));
             else
               return(make_pair(false, datatree.AddEqual(datatree.AddVariable(datatree.symbol_table.getName(datatree.symbol_table.getID(eEndogenous, var_endo)), 0), datatree.AddUMinus(NodeID_1))));
           }
-        else if (is_endogenous_present_1 and not is_endogenous_present_2)
+        else if (is_endogenous_present_1 && !is_endogenous_present_2)
           {
             if (Derivative!=datatree.One)
               return(make_pair(false, datatree.AddEqual(datatree.AddVariable(datatree.symbol_table.getName(datatree.symbol_table.getID(eEndogenous, var_endo)), 0), datatree.AddDivide(NodeID_2, Derivative))));
@@ -1732,49 +1708,49 @@ BinaryOpNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) con
           }
         break;
       case oMax:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, datatree.AddMax(NodeID_1, NodeID_2)));
         else
           return(make_pair(true, (NodeID)NULL));
         break;
       case oMin:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, datatree.AddMin(NodeID_1, NodeID_2)));
         else
           return(make_pair(true, (NodeID)NULL));
         break;
       case oLess:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, /*tmp_*/datatree.AddLess(NodeID_1, NodeID_2)));
         else
           return(make_pair(true, (NodeID)NULL));
         break;
       case oGreater:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, /*tmp_*/datatree.AddGreater(NodeID_1, NodeID_2)));
         else
           return(make_pair(true, (NodeID)NULL));
         break;
       case oLessEqual:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, /*tmp_*/datatree.AddLessEqual(NodeID_1, NodeID_2)));
         else
           return(make_pair(true, (NodeID)NULL));
         break;
       case oGreaterEqual:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, /*tmp_*/datatree.AddGreaterEqual(NodeID_1, NodeID_2)));
         else
           return(make_pair(true, (NodeID)NULL));
         break;
       case oEqualEqual:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, /*tmp_*/datatree.AddEqualEqual(NodeID_1, NodeID_2)));
         else
           return(make_pair(true, (NodeID)NULL));
         break;
       case oDifferent:
-        if (not is_endogenous_present_1 and not is_endogenous_present_2)
+        if (!is_endogenous_present_1 && !is_endogenous_present_2)
           return(make_pair(false, /*tmp_*/datatree.AddDifferent(NodeID_1, NodeID_2)));
         else
           return(make_pair(true, (NodeID)NULL));
@@ -2042,7 +2018,7 @@ TrinaryOpNode::eval(const eval_context_type &eval_context) const throw (EvalExce
 }
 
 void
-TrinaryOpNode::compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
+TrinaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
   {
     // If current node is a temporary term
     temporary_terms_type::const_iterator it = temporary_terms.find(const_cast<TrinaryOpNode *>(this));
@@ -2133,7 +2109,7 @@ TrinaryOpNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) co
     res = arg3->normalizeLinearInEndoEquation(var_endo, Derivative);
     bool is_endogenous_present_3 = res.first;
     NodeID NodeID_3 = res.second;
-    if (not is_endogenous_present_1 and not is_endogenous_present_2 and not is_endogenous_present_3)
+    if (!is_endogenous_present_1 && !is_endogenous_present_2 && !is_endogenous_present_3)
       return(make_pair(false, /*tmp_*/datatree.AddNormcdf(NodeID_1, NodeID_2, NodeID_3)));
     else
       return(make_pair(true, (NodeID)NULL));
@@ -2261,7 +2237,7 @@ UnknownFunctionNode::eval(const eval_context_type &eval_context) const throw (Ev
 }
 
 void
-UnknownFunctionNode::compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
+UnknownFunctionNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const
   {
     cerr << "UnknownFunctionNode::compile: operation impossible!" << endl;
     exit(EXIT_FAILURE);
@@ -2277,10 +2253,10 @@ UnknownFunctionNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivati
          it != arguments.end(); it++)
       {
         V_arguments.push_back((*it)->normalizeLinearInEndoEquation(var_endo, Derivative));
-        present = present or V_arguments[V_arguments.size()-1].first;
+        present = present || V_arguments[V_arguments.size()-1].first;
         V_NodeID.push_back(V_arguments[V_arguments.size()-1].second);
       }
-    if (not present)
+    if (!present)
       return(make_pair(false, datatree.AddUnknownFunction(datatree.symbol_table.getName(symb_id), V_NodeID)));
     else
       return(make_pair(true, (NodeID)NULL));
diff --git a/ExprNode.hh b/ExprNode.hh
index caff75ee755819351e66eff49d1c90b5590aa35a..e8233439780e6b7cd3017e53b39b73fe344e5470 100644
--- a/ExprNode.hh
+++ b/ExprNode.hh
@@ -25,8 +25,7 @@ using namespace std;
 #include <set>
 #include <map>
 #include <vector>
-#include <iostream>
-#include <fstream>
+#include <ostream>
 
 #include "SymbolTable.hh"
 #include "CodeInterpreter.hh"
@@ -44,7 +43,6 @@ struct ExprNodeLess;
 typedef set<NodeID, ExprNodeLess> temporary_terms_type;
 
 typedef map<int,int> map_idx_type;
-typedef set<int> temporary_terms_inuse_type;
 
 //! Type for evaluation contexts
 /*! The key is a symbol id. Lags are assumed to be null */
@@ -152,7 +150,7 @@ public:
   virtual void computeTemporaryTerms(map<NodeID, int> &reference_count, temporary_terms_type &temporary_terms, bool is_matlab) const;
 
   //! Writes output of node, using a Txxx notation for nodes in temporary_terms
-  virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_type &temporary_terms) const /*= 0*/;
+  virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_type &temporary_terms) const = 0;
 
   //! Writes output of node (with no temporary terms and with "outside model" output type)
   void writeOutput(ostream &output);
@@ -186,7 +184,7 @@ public:
   };
 
   virtual double eval(const eval_context_type &eval_context) const throw (EvalException) = 0;
-  virtual void compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const = 0;
+  virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const = 0;
   //! Creates a static version of this node
   /*!
     This method duplicates the current node by creating a similar node from which all leads/lags have been stripped,
@@ -194,7 +192,7 @@ public:
   */
   virtual NodeID toStatic(DataTree &static_datatree) const = 0;
   //! Try to normalize an equation linear in its endogenous variable
-  virtual pair<bool, NodeID> normalizeLinearInEndoEquation(int symb_id_endo, NodeID Derivative) const;
+  virtual pair<bool, NodeID> normalizeLinearInEndoEquation(int symb_id_endo, NodeID Derivative) const = 0;
 };
 
 //! Object used to compare two nodes (using their indexes)
@@ -221,7 +219,7 @@ public:
   virtual void collectExogenous(set<pair<int, int> > &result) const;
   virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
   virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
-  virtual void compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
+  virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
   virtual NodeID toStatic(DataTree &static_datatree) const;
   virtual pair<bool, NodeID> normalizeLinearInEndoEquation(int symb_id_endo, NodeID Derivative) const;
   virtual NodeID getChainRuleDerivative(int deriv_id, const map<int, NodeID> &recursive_variables);
@@ -240,7 +238,7 @@ private:
   virtual NodeID computeDerivative(int deriv_id_arg);
 public:
   VariableNode(DataTree &datatree_arg, int symb_id_arg, int lag_arg, int deriv_id_arg);
-  virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_type &temporary_terms = temporary_terms_type()) const;
+  virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_type &temporary_terms) const;
   virtual void collectEndogenous(set<pair<int, int> > &result) const;
   virtual void collectExogenous(set<pair<int, int> > &result) const;
   virtual void computeTemporaryTerms(map<NodeID, int> &reference_count,
@@ -252,7 +250,7 @@ public:
                                      map_idx_type &map_idx) const;
   virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
   virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
-  virtual void compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
+  virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
   virtual NodeID toStatic(DataTree &static_datatree) const;
   int get_symb_id() const { return symb_id; };
   virtual pair<bool, NodeID> normalizeLinearInEndoEquation(int symb_id_endo, NodeID Derivative) const;
@@ -285,7 +283,7 @@ public:
   virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
   static double eval_opcode(UnaryOpcode op_code, double v) throw (EvalException);
   virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
-  virtual void compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
+  virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
   //! Returns operand
   NodeID get_arg() const { return(arg); };
   //! Returns op code
@@ -323,7 +321,7 @@ public:
   virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
   static double eval_opcode(double v1, BinaryOpcode op_code, double v2) throw (EvalException);
   virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
-  virtual void compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
+  virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
   //! Returns first operand
   NodeID get_arg1() const { return(arg1); };
   //! Returns second operand
@@ -364,7 +362,7 @@ public:
   virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
   static double eval_opcode(double v1, TrinaryOpcode op_code, double v2, double v3) throw (EvalException);
   virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
-  virtual void compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
+  virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
   virtual NodeID toStatic(DataTree &static_datatree) const;
   virtual pair<bool, NodeID> normalizeLinearInEndoEquation(int symb_id_endo, NodeID Derivative) const;
   virtual NodeID getChainRuleDerivative(int deriv_id, const map<int, NodeID> &recursive_variables);
@@ -393,50 +391,10 @@ public:
   virtual void collectExogenous(set<pair<int, int> > &result) const;
   virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
   virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
-  virtual void compile(ofstream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
+  virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const;
   virtual NodeID toStatic(DataTree &static_datatree) const;
   virtual pair<bool, NodeID> normalizeLinearInEndoEquation(int symb_id_endo, NodeID Derivative) const;
   virtual NodeID getChainRuleDerivative(int deriv_id, const map<int, NodeID> &recursive_variables);
 };
 
-//! For one lead/lag of one block, stores mapping of information between original model and block-decomposed model
-struct IM_compact
-{
-  int size, u_init, u_finish, nb_endo, nb_other_endo, size_exo, size_other_endo;
-  int *u, *us, *Var, *Equ, *Var_Index, *Equ_Index, *Exogenous, *Exogenous_Index, *Equ_X, *Equ_X_Index;
-  int *u_other_endo, *Var_other_endo, *Equ_other_endo, *Var_Index_other_endo, *Equ_Index_other_endo;
-};
-
-//! One block of the model
-struct Block
-{
-  int Size, Sized, nb_exo, nb_exo_det, nb_other_endo, Nb_Recursives;
-  BlockType Type;
-  BlockSimulationType Simulation_Type;
-  int Max_Lead, Max_Lag, Nb_Lead_Lag_Endo;
-  int Max_Lag_Endo, Max_Lead_Endo;
-  int Max_Lag_Other_Endo, Max_Lead_Other_Endo;
-  int Max_Lag_Exo, Max_Lead_Exo;
-  bool is_linear;
-  int *Equation, *Own_Derivative;
-  EquationType *Equation_Type;
-  NodeID *Equation_Normalized;
-  int *Variable, *Other_Endogenous, *Exogenous;
-  temporary_terms_type **Temporary_Terms_in_Equation;
-  //temporary_terms_type *Temporary_terms;
-  temporary_terms_inuse_type *Temporary_InUse;
-  IM_compact *IM_lead_lag;
-  int Code_Start, Code_Length;
-};
-
-
-
-//! The set of all blocks of the model
-struct Model_Block
-{
-  int Size, Periods;
-  Block* Block_List;
-  //int *in_Block_Equ, *in_Block_Var, *in_Equ_of_Block, *in_Var_of_Block;
-};
-
 #endif
diff --git a/IncidenceMatrix.cc b/IncidenceMatrix.cc
index 5d8de6efc4349a133419ec5325a5f65904abaf27..f9ce77577ef289fb83d3608f74abf2a32566f6c6 100644
--- a/IncidenceMatrix.cc
+++ b/IncidenceMatrix.cc
@@ -17,6 +17,7 @@
  * along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <iostream>
 #include <cstdlib>
 #include <cstring>
 
diff --git a/ModelTree.cc b/ModelTree.cc
index bcf80fd135139ea3422e1bc95331e6bac00ceecc..4d5e20097a52bc986a8882b51b4dcf49febbb191 100644
--- a/ModelTree.cc
+++ b/ModelTree.cc
@@ -20,6 +20,7 @@
 #include <cstdlib>
 #include <cassert>
 #include <iostream>
+#include <fstream>
 
 #include "ModelTree.hh"
 
diff --git a/NumericalInitialization.cc b/NumericalInitialization.cc
index 655f6003e0b8f0f7e5a3a8281ce107a5b0017f04..2557bb83579c8733c9359555bbcfe3b1d0b5a44e 100644
--- a/NumericalInitialization.cc
+++ b/NumericalInitialization.cc
@@ -17,6 +17,8 @@
  * along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <iostream>
+#include <fstream>
 #include <cstdlib>
 
 #include "NumericalInitialization.hh"