diff --git a/DataTree.cc b/DataTree.cc
index fdb9b748e3578faf985fe763a55126547b6aacda..ff761c7f57ecd88297a418d42bff2149f954a982 100644
--- a/DataTree.cc
+++ b/DataTree.cc
@@ -491,9 +491,9 @@ DataTree::AddExpectation(int iArg1, expr_t iArg2)
 }
 
 expr_t
-DataTree::AddVarExpectation(expr_t iArg1, const string &iArg2)
+DataTree::AddVarExpectation(expr_t iArg1, const int iArg2, const string &iArg3)
 {
-  return AddUnaryOp(oVarExpectation, iArg1, 0, 0, 0, iArg2);
+  return AddUnaryOp(oVarExpectation, iArg1, 0, 0, 0, make_pair(iArg2, iArg3));
 }
 
 expr_t
diff --git a/DataTree.hh b/DataTree.hh
index 9617e24d92b90cd816d7418638bc1abe61efb1ec..53391017fd8290b8f9a384df62776c651124b8f2 100644
--- a/DataTree.hh
+++ b/DataTree.hh
@@ -62,7 +62,7 @@ protected:
   typedef map<pair<int, int>, VariableNode *> variable_node_map_t;
   variable_node_map_t variable_node_map;
   //! Pair( Pair(arg1, UnaryOpCode), Pair( Expectation Info Set, Pair(param1_symb_id, param2_symb_id)) ))
-  typedef map<pair<pair<expr_t, UnaryOpcode>, pair<pair<int, pair<int, int> >, string> >, UnaryOpNode *> unary_op_node_map_t;
+  typedef map<pair<pair<expr_t, UnaryOpcode>, pair<pair<int, pair<int, int> >, pair<int, string > > >, UnaryOpNode *> unary_op_node_map_t;
   unary_op_node_map_t unary_op_node_map;
   //! Pair( Pair( Pair(arg1, arg2), order of Power Derivative), opCode)
   typedef map<pair<pair<pair<expr_t, expr_t>, int>, BinaryOpcode>, BinaryOpNode *> binary_op_node_map_t;
@@ -98,7 +98,7 @@ private:
   int node_counter;
 
   inline expr_t AddPossiblyNegativeConstant(double val);
-  inline expr_t AddUnaryOp(UnaryOpcode op_code, expr_t arg, int arg_exp_info_set = 0, int param1_symb_id = 0, int param2_symb_id = 0, const string &var_expectation_model_name = string());
+  inline expr_t AddUnaryOp(UnaryOpcode op_code, expr_t arg, int arg_exp_info_set = 0, int param1_symb_id = 0, int param2_symb_id = 0, const pair<const int, const string &> &var_expectation_pair = make_pair(0,string()));
   inline expr_t AddBinaryOp(expr_t arg1, BinaryOpcode op_code, expr_t arg2, int powerDerivOrder = 0);
   inline expr_t AddTrinaryOp(expr_t arg1, TrinaryOpcode op_code, expr_t arg2, expr_t arg3);
 
@@ -156,8 +156,8 @@ public:
   expr_t AddPowerDeriv(expr_t iArg1, expr_t iArg2, int powerDerivOrder);
   //! Adds "E(arg1)(arg2)" to model tree
   expr_t AddExpectation(int iArg1, expr_t iArg2);
-  //! Adds "E(arg1)(arg2)" to model tree
-  expr_t AddVarExpectation(expr_t iArg1, const string &iArg2);
+  //! Adds "var_expectation(arg1, arg2, model_name=arg3)" to model tree
+  expr_t AddVarExpectation(expr_t iArg1, const int iArg2, const string &iArg3);
   //! Adds "exp(arg)" to model tree
   expr_t AddExp(expr_t iArg1);
   //! Adds "log(arg)" to model tree
@@ -306,10 +306,10 @@ DataTree::AddPossiblyNegativeConstant(double v)
 }
 
 inline expr_t
-DataTree::AddUnaryOp(UnaryOpcode op_code, expr_t arg, int arg_exp_info_set, int param1_symb_id, int param2_symb_id, const string &var_expectation_model_name)
+DataTree::AddUnaryOp(UnaryOpcode op_code, expr_t arg, int arg_exp_info_set, int param1_symb_id, int param2_symb_id, const pair<const int, const string &> &var_expectation_pair)
 {
   // If the node already exists in tree, share it
-  unary_op_node_map_t::iterator it = unary_op_node_map.find(make_pair(make_pair(arg, op_code), make_pair(make_pair(arg_exp_info_set, make_pair(param1_symb_id, param2_symb_id)), var_expectation_model_name)));
+  unary_op_node_map_t::iterator it = unary_op_node_map.find(make_pair(make_pair(arg, op_code), make_pair(make_pair(arg_exp_info_set, make_pair(param1_symb_id, param2_symb_id)), var_expectation_pair)));
   if (it != unary_op_node_map.end())
     return it->second;
 
@@ -328,7 +328,7 @@ DataTree::AddUnaryOp(UnaryOpcode op_code, expr_t arg, int arg_exp_info_set, int
         {
         }
     }
-  return new UnaryOpNode(*this, op_code, arg, arg_exp_info_set, param1_symb_id, param2_symb_id, var_expectation_model_name);
+  return new UnaryOpNode(*this, op_code, arg, arg_exp_info_set, param1_symb_id, param2_symb_id, var_expectation_pair);
 }
 
 inline expr_t
diff --git a/DynareBison.yy b/DynareBison.yy
index 55c058554fabb1d444d734e970e25de575fc3758..926037d7f569d97831a49245c6744ae55de4517e 100644
--- a/DynareBison.yy
+++ b/DynareBison.yy
@@ -772,7 +772,9 @@ hand_side : '(' hand_side ')'
           | EXPECTATION '(' signed_integer ')''(' hand_side ')'
 	    { $$ = driver.add_expectation($3, $6); }
           | VAR_EXPECTATION '(' symbol COMMA MODEL_NAME EQUAL NAME ')'
-            { $$ = driver.add_var_expectation($3, $7); }
+            { $$ = driver.add_var_expectation($3, new string("1"), $7); }
+          | VAR_EXPECTATION '(' symbol COMMA INT_NUMBER COMMA MODEL_NAME EQUAL NAME ')'
+            { $$ = driver.add_var_expectation($3, $5, $9); }
           | MINUS hand_side %prec UMINUS
             { $$ = driver.add_uminus($2); }
           | PLUS hand_side
diff --git a/ExprNode.cc b/ExprNode.cc
index 97be9eb183af142f76f5193d7ef8b8575d3a75c0..0b9f60c1b773571e7b0934ff0fd4c3b266288dc8 100644
--- a/ExprNode.cc
+++ b/ExprNode.cc
@@ -1518,20 +1518,21 @@ VariableNode::isInStaticForm() const
   return lag == 0;
 }
 
-UnaryOpNode::UnaryOpNode(DataTree &datatree_arg, UnaryOpcode op_code_arg, const expr_t arg_arg, int expectation_information_set_arg, int param1_symb_id_arg, int param2_symb_id_arg, const string &var_expectation_model_name_arg) :
+UnaryOpNode::UnaryOpNode(DataTree &datatree_arg, UnaryOpcode op_code_arg, const expr_t arg_arg, int expectation_information_set_arg, int param1_symb_id_arg, int param2_symb_id_arg, const pair<const int, const string &> &var_expectation_arg) :
   ExprNode(datatree_arg),
   arg(arg_arg),
   expectation_information_set(expectation_information_set_arg),
   param1_symb_id(param1_symb_id_arg),
   param2_symb_id(param2_symb_id_arg),
-  var_expectation_model_name(var_expectation_model_name_arg),
+  var_expectation_horizon(var_expectation_arg.first),
+  var_expectation_model_name(var_expectation_arg.second),
   op_code(op_code_arg)
 {
   // Add myself to the unary op map
   datatree.unary_op_node_map[make_pair(make_pair(arg, op_code),
                                        make_pair(make_pair(expectation_information_set,
                                                            make_pair(param1_symb_id, param2_symb_id)),
-                                                 var_expectation_model_name))] = this;
+                                                 var_expectation_arg))] = this;
 }
 
 void
@@ -1688,11 +1689,8 @@ void
 UnaryOpNode::writeVarExpectationFunction(ostream &output, const string &var_model_name) const
 {
   if (op_code == oVarExpectation && var_model_name == var_expectation_model_name)
-    {
-      VariableNode *varg = dynamic_cast<VariableNode *>(arg);
-      output << "writeVarExpectationFunction('" << var_expectation_model_name << "', '"
-             << datatree.symbol_table.getName(varg->symb_id) << "');" << endl;
-    }
+    output << "writeVarExpectationFunction('" << var_expectation_model_name << "', '"
+           << datatree.symbol_table.getName((dynamic_cast<VariableNode *>(arg))->symb_id) << "');" << endl;
 }
 
 expr_t
@@ -2047,10 +2045,10 @@ UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
       if (IS_LATEX(output_type))
         output << "VAR" << LEFT_PAR(output_type)
                << datatree.symbol_table.getTeXName(varg->symb_id)
-               << "_{t+1}" << RIGHT_PAR(output_type);
+               << "_{t+" << var_expectation_horizon << "}" << RIGHT_PAR(output_type);
       else
         output << "var_forecast_" << var_expectation_model_name << "_"
-               << datatree.symbol_table.getName(varg->symb_id) << "(y)";
+               << datatree.symbol_table.getName(varg->symb_id) << "(y, " << var_expectation_horizon << ")";
       return;
     }
 
@@ -2401,7 +2399,7 @@ UnaryOpNode::buildSimilarUnaryOpNode(expr_t alt_arg, DataTree &alt_datatree) con
     case oErf:
       return alt_datatree.AddErf(alt_arg);
     case oVarExpectation:
-      return alt_datatree.AddVarExpectation(alt_arg, var_expectation_model_name);
+      return alt_datatree.AddVarExpectation(alt_arg, var_expectation_horizon, var_expectation_model_name);
     }
   // Suppress GCC warning
   exit(EXIT_FAILURE);
diff --git a/ExprNode.hh b/ExprNode.hh
index 19a2494b4e361c76a1daadc128cb28e25847f76f..f8f809f588a4f4fc18088639d8704c054aa28411 100644
--- a/ExprNode.hh
+++ b/ExprNode.hh
@@ -594,6 +594,7 @@ private:
   //! Only used for oSteadyStateParamDeriv and oSteadyStateParam2ndDeriv
   const int param1_symb_id, param2_symb_id;
   //! Only used for oVarExpectation
+  const int var_expectation_horizon;
   const string var_expectation_model_name;
   const UnaryOpcode op_code;
   virtual expr_t computeDerivative(int deriv_id);
@@ -603,7 +604,7 @@ private:
   //! Returns the derivative of this node if darg is the derivative of the argument
   expr_t composeDerivatives(expr_t darg, int deriv_id);
 public:
-  UnaryOpNode(DataTree &datatree_arg, UnaryOpcode op_code_arg, const expr_t arg_arg, int expectation_information_set_arg, int param1_symb_id_arg, int param2_symb_id_arg, const string &var_expectation_model_name_arg);
+  UnaryOpNode(DataTree &datatree_arg, UnaryOpcode op_code_arg, const expr_t arg_arg, int expectation_information_set_arg, int param1_symb_id_arg, int param2_symb_id_arg, const pair<const int, const string &> &var_expectation_arg);
   virtual void prepareForDerivation();
   virtual void computeTemporaryTerms(map<expr_t, pair<int, NodeTreeReference> > &reference_count,
                                      map<NodeTreeReference, temporary_terms_t> &temp_terms_map,
diff --git a/ParsingDriver.cc b/ParsingDriver.cc
index 250c328bb7dc52ea7802f86d2e5e7729cbaf4f85..1e27fdd0a76a9028e46ce1e0db8a98cf8767a735 100644
--- a/ParsingDriver.cc
+++ b/ParsingDriver.cc
@@ -2396,10 +2396,11 @@ ParsingDriver::add_expectation(string *arg1, expr_t arg2)
 }
 
 expr_t
-ParsingDriver::add_var_expectation(string *arg1, string *arg2)
+ParsingDriver::add_var_expectation(string *arg1, string *arg2, string *arg3)
 {
   check_symbol_is_endogenous(arg1);
-  expr_t varExpectationNode = data_tree->AddVarExpectation(add_model_variable(arg1), *arg2);
+  expr_t varExpectationNode = data_tree->AddVarExpectation(add_model_variable(arg1), stoi(*arg2), *arg3);
+  delete arg2;
   return varExpectationNode;
 }
 
diff --git a/ParsingDriver.hh b/ParsingDriver.hh
index a66d2d3332d16890a9fcd69da3b8ebaa894a4fe9..423b22b0e82b7a71336e22f6a6ddd1108caba274 100644
--- a/ParsingDriver.hh
+++ b/ParsingDriver.hh
@@ -641,8 +641,8 @@ public:
   expr_t add_power(expr_t arg1,  expr_t arg2);
   //! Writes token "E(arg1)(arg2)" to model tree
   expr_t add_expectation(string *arg1,  expr_t arg2);
-  //! Writes token "VAR_EXPECTATION(arg1,arg2)" to model tree
-  expr_t add_var_expectation(string *arg1,  string *arg2);
+  //! Writes token "VAR_EXPECTATION(arg1, arg2, arg3)" to model tree
+  expr_t add_var_expectation(string *arg1,  string *arg2, string *arg3);
   //! Writes token "exp(arg1)" to model tree
   expr_t add_exp(expr_t arg1);
   //! Writes token "log(arg1)" to model tree