diff --git a/CodeInterpreter.hh b/CodeInterpreter.hh
index ed695fc27761b477cb410b414fcb7ab3eeb9736f..43577a49810d755d42f8d055e4cc628d0c40dcff 100644
--- a/CodeInterpreter.hh
+++ b/CodeInterpreter.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2016 Dynare Team
+ * Copyright (C) 2007-2017 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -152,7 +152,8 @@ enum SymbolType
     eTrend = 13,                    //!< Trend variable
     eStatementDeclaredVariable = 14, //!< Local variable assigned within a Statement (see subsample statement for example)
     eLogTrend = 15,                 //!< Log-trend variable
-    eUnusedEndogenous = 16
+    eUnusedEndogenous = 16,
+    eEndogenousVAR = 17             //!< Variables declared in a var_model statement
   };
 
 enum ExpressionType
diff --git a/ComputingTasks.cc b/ComputingTasks.cc
index 15b3a9825cf0e91d1e7305907e94753fe51be653..c51a29edcc8e0d4c705f35504d2f2077033744b7 100644
--- a/ComputingTasks.cc
+++ b/ComputingTasks.cc
@@ -173,12 +173,10 @@ PriorPosteriorFunctionStatement::writeOutput(ostream &output, const string &base
 
 VarModelStatement::VarModelStatement(const SymbolList &symbol_list_arg,
                                      const OptionsList &options_list_arg,
-                                     const string &name_arg,
-                                     const SymbolTable &symbol_table_arg) :
+                                     const string &name_arg) :
   symbol_list(symbol_list_arg),
   options_list(options_list_arg),
-  name(name_arg),
-  symbol_table(symbol_table_arg)
+  name(name_arg)
 {
 }
 
@@ -191,14 +189,6 @@ VarModelStatement::getVarModelNameAndVarList(map<string, pair<SymbolList, int> >
 void
 VarModelStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
-  vector<string> symbols = symbol_list.get_symbols();
-  for (vector<string>::const_iterator it = symbols.begin(); it != symbols.end(); it++)
-    if (symbol_table.getType(*it) != eEndogenous)
-      {
-        cerr << "ERROR: You can only run VARs on endogenous variables." << endl;
-        exit(EXIT_FAILURE);
-      }
-
   OptionsList::num_options_t::const_iterator it = options_list.num_options.find("var.order");
   if (it == options_list.num_options.end())
     {
diff --git a/ComputingTasks.hh b/ComputingTasks.hh
index 118eed491802c790f7b9cc662c96d114bdc25979..1cbbafaa6b2351abfc24638edcddeb1bd49b84e1 100644
--- a/ComputingTasks.hh
+++ b/ComputingTasks.hh
@@ -116,12 +116,10 @@ private:
   const SymbolList symbol_list;
   const OptionsList options_list;
   const string &name;
-  const SymbolTable &symbol_table;
 public:
   VarModelStatement(const SymbolList &symbol_list_arg,
                     const OptionsList &options_list_arg,
-                    const string &name_arg,
-                    const SymbolTable &symbol_table_arg);
+                    const string &name_arg);
   void getVarModelNameAndVarList(map<string, pair<SymbolList, int> > &var_model_info);
   virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const;
diff --git a/DynamicModel.cc b/DynamicModel.cc
index c44dd26d9fb02a2f749c225209edc150a536371c..d63692c8700cc079537e1c2bb3698586e06ca2f6 100644
--- a/DynamicModel.cc
+++ b/DynamicModel.cc
@@ -3240,8 +3240,8 @@ DynamicModel::addEquationsForVar(map<string, pair<SymbolList, int> > var_model_i
       map<string, int>::const_iterator it1 = model_endos_and_lags.find(it->first);
       if (it1 == model_endos_and_lags.end())
         {
-          cerr << "ERROR: Variable used in var that is not used in the model: " << it->first << endl;
-          exit(EXIT_FAILURE);
+          cerr << "WARNING: Variable used in var that is not used in the model: " << it->first << endl;
+          //          exit(EXIT_FAILURE);
         }
       else
         if (it->second < it1->second)
diff --git a/DynareBison.yy b/DynareBison.yy
index 39cff55ba7fe630a09845710a421d764f1607459..6eb1207f14b4d5dfff2ff5c583096f2c606c6ac5 100644
--- a/DynareBison.yy
+++ b/DynareBison.yy
@@ -349,7 +349,15 @@ var : VAR var_list ';'
       { driver.end_nonstationary_var(true, $6); }
     ;
 
-var_model : VAR_MODEL '(' var_model_options_list ')' symbol_list ';' { driver.var_model(); } ;
+var_model : VAR_MODEL '(' var_model_options_list ')' var_symbol_list ';' { driver.var_model(); } ;
+
+var_symbol_list : var_symbol_list symbol
+                  { driver.declare_var_endogenous($2); }
+                | var_symbol_list COMMA symbol
+                  { driver.declare_var_endogenous($3); }
+                | symbol
+                  { driver.declare_var_endogenous($1); }
+                ;
 
 var_model_options_list : var_model_options_list COMMA var_model_options
                          | var_model_options
diff --git a/ExprNode.cc b/ExprNode.cc
index cda13bcf147641e727601e3149f7f42f5504d188..c6194ead5214bd2bd93ec022a641a76fd94dc476 100644
--- a/ExprNode.cc
+++ b/ExprNode.cc
@@ -581,6 +581,7 @@ VariableNode::prepareForDerivation()
       // Such a variable is never derived
       break;
     case eExternalFunction:
+    case eEndogenousVAR:
       cerr << "VariableNode::prepareForDerivation: impossible case" << endl;
       exit(EXIT_FAILURE);
     }
@@ -613,6 +614,7 @@ VariableNode::computeDerivative(int deriv_id)
       cerr << "eUnusedEndogenous is not derivable" << endl;
       exit(EXIT_FAILURE);
     case eExternalFunction:
+    case eEndogenousVAR:
       cerr << "Impossible case!" << endl;
       exit(EXIT_FAILURE);
     }
@@ -865,6 +867,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
     case eLogTrend:
     case eStatementDeclaredVariable:
     case eUnusedEndogenous:
+    case eEndogenousVAR:
       cerr << "Impossible case" << endl;
       exit(EXIT_FAILURE);
     }
@@ -1071,6 +1074,7 @@ VariableNode::getChainRuleDerivative(int deriv_id, const map<int, expr_t> &recur
       cerr << "eUnusedEndogenous is not derivable" << endl;
       exit(EXIT_FAILURE);
     case eExternalFunction:
+    case eEndogenousVAR:
       cerr << "Impossible case!" << endl;
       exit(EXIT_FAILURE);
     }
@@ -1108,6 +1112,7 @@ VariableNode::computeXrefs(EquationInfo &ei) const
     case eStatementDeclaredVariable:
     case eUnusedEndogenous:
     case eExternalFunction:
+    case eEndogenousVAR:
       break;
     }
 }
diff --git a/ParsingDriver.cc b/ParsingDriver.cc
index 7c6c02b06c0f374c2fc2bb0316f4ba335ffe9f93..6665bb358468b2516693ca9fa40ed718e2deaf96 100644
--- a/ParsingDriver.cc
+++ b/ParsingDriver.cc
@@ -195,6 +195,23 @@ ParsingDriver::declare_endogenous(string *name, string *tex_name, vector<pair<st
     }
 }
 
+void
+ParsingDriver::declare_var_endogenous(string *name)
+{
+  if (mod_file->symbol_table.exists(*name))
+    {
+      SymbolType type = mod_file->symbol_table.getType(*name);
+      if (type != eEndogenous && type != eExogenous && type != eExogenousDet)
+        error("Symbol " + *name + " used in a VAR must be either endogenous or " +
+              "exogenous if it is also used elsewhere in the .mod file");
+      add_in_symbol_list(name);
+      return;
+    }
+
+  declare_symbol(name, eEndogenousVAR, NULL, NULL);
+  add_in_symbol_list(name);
+}
+
 void
 ParsingDriver::declare_exogenous(string *name, string *tex_name, vector<pair<string *, string *> *> *partition_value)
 {
@@ -1286,7 +1303,7 @@ ParsingDriver::var_model()
   if (it == options_list.string_options.end())
     error("You must pass the model_name option to the var_model statement.");
   const string *name = new string(it->second);
-  mod_file->addStatement(new VarModelStatement(symbol_list, options_list, *name, mod_file->symbol_table));
+  mod_file->addStatement(new VarModelStatement(symbol_list, options_list, *name));
   symbol_list.clear();
   options_list.clear();
 }
diff --git a/ParsingDriver.hh b/ParsingDriver.hh
index dd4cae6cf9e661bd40fb5cdc6f057cd534d8dd5e..1d090da4797306be33dab9c5ed7e7e57f5b52e4f 100644
--- a/ParsingDriver.hh
+++ b/ParsingDriver.hh
@@ -301,6 +301,8 @@ public:
   void declare_exogenous_det(string *name, string *tex_name = NULL, vector<pair<string *, string *> *> *partition_value = NULL);
   //! Declares a parameter
   void declare_parameter(string *name, string *tex_name = NULL, vector<pair<string *, string *> *> *partition_value = NULL);
+  //! Declares a VAR variable and adds to symbol_list
+  void declare_var_endogenous(string *name);
   //! Declares a statement local variable
   void declare_statement_local_variable(string *name);
   //! Completes a subsample statement