diff --git a/ExprNode.cc b/ExprNode.cc
index 0f540c0c9415c044058d4e577bb915cb68c2f060..964dd6534be1005421fcbebbf3c23c14069c3052 100644
--- a/ExprNode.cc
+++ b/ExprNode.cc
@@ -182,6 +182,13 @@ VariableNode::VariableNode(DataTree &datatree_arg, int symb_id_arg, Type type_ar
   else
     var_id = -1;
 
+  // It makes sense to allow a lead/lag on parameters: during steady state calibration, endogenous and parameters can be swapped
+  if ((type == eModelLocalVariable || type == eModFileLocalVariable || type == eUnknownFunction) && lag != 0)
+    {
+      cerr << "Attempt to construct a VariableNode for local variable or unknown function with non-zero lead/lag" << endl;
+      exit(-1);
+    }
+
   // Fill in non_null_derivatives
   switch(type)
     {
diff --git a/ParsingDriver.cc b/ParsingDriver.cc
index a6afab0a86215b54a860f6b12ffacedeb1e33234..341b9b303bd3c50da18e101d83fbabdb9a78e300 100644
--- a/ParsingDriver.cc
+++ b/ParsingDriver.cc
@@ -155,22 +155,7 @@ ParsingDriver::add_constant(string *constant)
 NodeID
 ParsingDriver::add_model_variable(string *name)
 {
-  check_symbol_existence(*name);
-  NodeID id = model_tree->AddVariable(*name);
-
-  Type type = mod_file->symbol_table.getType(*name);
-
-  if (type == eModFileLocalVariable)
-    error("Variable " + *name + " not allowed inside model declaration. Its scope is only outside model.");
-
-  if ((type == eEndogenous) && (model_tree->mode == eSparseDLLMode || model_tree->mode == eSparseMode))
-    {
-      int ID = mod_file->symbol_table.getID(*name);
-      model_tree->block_triangular.fill_IM(model_tree->equation_number(), ID, 0);
-    }
-
-  delete name;
-  return id;
+  return add_model_variable(name, new string("0"));
 }
 
 NodeID
@@ -183,12 +168,16 @@ ParsingDriver::add_model_variable(string *name, string *olag)
   if (type == eModFileLocalVariable)
     error("Variable " + *name + " not allowed inside model declaration. Its scope is only outside model.");
 
-  if ((type == eExogenous) && lag != 0)
-    {
-      ostringstream ost;
-      ost << "Exogenous variable " << *name << " has lag " << lag;
-      warning(ost.str());
-    }
+  if (type == eUnknownFunction)
+    error("Symbol " + *name + " is a function name unknown to Dynare. It cannot be used inside model.");
+
+  if (type == eExogenous && lag != 0)
+    warning("Exogenous variable " + *name + " has lead/lag " + *olag);
+
+  if (type == eModelLocalVariable && lag != 0)
+    error("Model local variable " + *name + " cannot be given a lead or a lag.");
+
+  // It makes sense to allow a lead/lag on parameters: during steady state calibration, endogenous and parameters can be swapped
 
   NodeID id = model_tree->AddVariable(*name, lag);