diff --git a/DataTree.cc b/DataTree.cc
index b970df20d2a7c82b434586139fd3057c5b734f01..69adc2e68536fa9421da4c22d399c7c6ada8b25e 100644
--- a/DataTree.cc
+++ b/DataTree.cc
@@ -441,3 +441,18 @@ DataTree::fillEvalContext(eval_context_type &eval_context) const
         }
     }
 }
+
+bool
+DataTree::isSymbolUsed(int symb_id) const
+{
+  for(variable_node_map_type::const_iterator it = variable_node_map.begin();
+      it != variable_node_map.end(); it++)
+    if (it->first.first == symb_id)
+      return true;
+
+  if (local_variables_table.find(symb_id) != local_variables_table.end())
+    return true;
+
+  return false;
+}
+
diff --git a/DynareBison.yy b/DynareBison.yy
index 282dde822cfa3dfe1f7737911fc4c8f256144b44..599b6a0f428007151fe1eae743f3c9d9cc1a2138 100644
--- a/DynareBison.yy
+++ b/DynareBison.yy
@@ -72,6 +72,8 @@ class ParsingDriver;
 {
   string *string_val;
   NodeID node_val;
+  SymbolType symbol_type_val;
+  vector<string *> *vector_string_val;
 };
 
 %{
@@ -90,7 +92,7 @@ class ParsingDriver;
 %token BVAR_PRIOR_DECAY BVAR_PRIOR_FLAT BVAR_PRIOR_LAMBDA
 %token BVAR_PRIOR_MU BVAR_PRIOR_OMEGA BVAR_PRIOR_TAU BVAR_PRIOR_TRAIN
 %token BVAR_REPLIC
-%token CALIB CALIB_VAR CHECK CONF_SIG CONSTANT CORR COVAR CUTOFF
+%token CALIB CALIB_VAR CHANGE_TYPE CHECK CONF_SIG CONSTANT CORR COVAR CUTOFF
 %token DATAFILE DR_ALGO DROP DSAMPLE DYNASAVE DYNATYPE
 %token END ENDVAL EQUAL ESTIMATION ESTIMATED_PARAMS ESTIMATED_PARAMS_BOUNDS ESTIMATED_PARAMS_INIT
 %token FILENAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS
@@ -147,6 +149,8 @@ class ParsingDriver;
 %type <string_val> value value1 vec_int_elem vec_int_1 vec_int
 %type <string_val> vec_value_1 vec_value
 %type <string_val> calib_arg2 range number
+%type <symbol_type_val> change_type_arg
+%type <vector_string_val> change_type_var_list
 
 %%
 
@@ -156,7 +160,11 @@ statement_list : statement
                | statement_list statement
                ;
 
-statement : declaration
+statement : parameters
+          | var
+          | varexo
+          | varexo_det
+          | change_type
           | periods
           | cutoff
           | markowitz
@@ -204,13 +212,6 @@ statement : declaration
           | save_params_and_steady_state
           ;
 
-declaration : parameters
-            | var
-            | varexo
-            | varexo_det
-            ;
-
-
 dsample : DSAMPLE INT_NUMBER ';'
           { driver.dsample($2); }
         | DSAMPLE INT_NUMBER INT_NUMBER ';'
@@ -283,6 +284,28 @@ parameter_list : parameter_list NAME
                  { driver.declare_parameter($1, $2); }
                ;
 
+change_type : CHANGE_TYPE '(' change_type_arg ')' change_type_var_list ';'
+              { driver.change_type($3, $5); }
+            ;
+
+change_type_arg : PARAMETERS
+                  { $$ = eParameter; }
+                | VAR
+                  { $$ = eEndogenous; }
+                | VAREXO
+                  { $$ = eExogenous; }
+                | VAREXO_DET
+                  { $$ = eExogenousDet; }
+                ;
+
+change_type_var_list : NAME
+                       { $$ = new vector<string *>(); $$->push_back($1); }
+                     | change_type_var_list NAME
+                       { $$ = $1; $1->push_back($2); }
+                     | change_type_var_list COMMA NAME
+                       { $$ = $1; $1->push_back($3); }
+                     ;
+
 periods : PERIODS INT_NUMBER ';'
           { driver.periods($2); }
         | PERIODS EQUAL INT_NUMBER ';'
diff --git a/DynareFlex.ll b/DynareFlex.ll
index df7c9bb0f107cb9ae5db5c8aa5906a36f94b30c1..7aedffccfaafbb118394327cf8c17305863d3674 100644
--- a/DynareFlex.ll
+++ b/DynareFlex.ll
@@ -113,7 +113,7 @@ int sigma_e = 0;
 <INITIAL>dynatype	{BEGIN DYNARE_STATEMENT; return token::DYNATYPE;}
 <INITIAL>dynasave 	{BEGIN DYNARE_STATEMENT; return token::DYNASAVE;}
 <INITIAL>model_comparison 	{BEGIN DYNARE_STATEMENT; return token::MODEL_COMPARISON;}
-
+<INITIAL>change_type  {BEGIN DYNARE_STATEMENT; return token::CHANGE_TYPE;}
 <INITIAL>load_params_and_steady_state  {BEGIN DYNARE_STATEMENT; return token::LOAD_PARAMS_AND_STEADY_STATE;}
 <INITIAL>save_params_and_steady_state  {BEGIN DYNARE_STATEMENT; return token::SAVE_PARAMS_AND_STEADY_STATE;}
 
@@ -214,6 +214,12 @@ int sigma_e = 0;
 <DYNARE_STATEMENT>diffuse_filter {return token::DIFFUSE_FILTER;}
 <DYNARE_STATEMENT>plot_priors   {return token::PLOT_PRIORS;}
 
+ /* These four (var, varexo, varexo_det, parameters) are for change_type */
+<DYNARE_STATEMENT>var { return token::VAR; }
+<DYNARE_STATEMENT>varexo { return token::VAREXO; }
+<DYNARE_STATEMENT>varexo_det { return token::VAREXO_DET; }
+<DYNARE_STATEMENT>parameters { return token::PARAMETERS; }
+
 <DYNARE_STATEMENT>bvar_prior_tau { return token::BVAR_PRIOR_TAU; }
 <DYNARE_STATEMENT>bvar_prior_decay { return token::BVAR_PRIOR_DECAY; }
 <DYNARE_STATEMENT>bvar_prior_lambda { return token::BVAR_PRIOR_LAMBDA; }
diff --git a/ParsingDriver.cc b/ParsingDriver.cc
index 81d095f52bc66ec5ad92c847e30fcd3ffb2644f9..159e9efcea186e4c0b85fa0a4ee8b8d759d22ad2 100644
--- a/ParsingDriver.cc
+++ b/ParsingDriver.cc
@@ -1102,6 +1102,34 @@ ParsingDriver::declare_and_init_model_local_variable(string *name, NodeID rhs)
   delete name;
 }
 
+void
+ParsingDriver::change_type(SymbolType new_type, vector<string *> *var_list)
+{
+  for(vector<string *>::iterator it = var_list->begin();
+      it != var_list->end(); it++)
+    {
+      int id;
+      try
+        {
+          id = mod_file->symbol_table.getID(**it);
+        }
+      catch(SymbolTable::UnknownSymbolNameException &e)
+        {
+          error("Unknown variable " + **it);
+        }
+
+      // Check if symbol already used in a VariableNode
+      if (mod_file->expressions_tree.isSymbolUsed(id)
+          || mod_file->model_tree.isSymbolUsed(id))
+        error("You cannot modify the type of symbol " + **it + " after having used it in an expression");
+
+      mod_file->symbol_table.changeType(id, new_type);
+
+      delete *it;
+    }
+  delete var_list;
+}
+
 NodeID
 ParsingDriver::add_plus(NodeID arg1, NodeID arg2)
 {
diff --git a/include/DataTree.hh b/include/DataTree.hh
index 0b25a8924e15c30b6d4814e66df94a830bf14321..16195a40f832170db1e6ff9e8799f2af2166e0e8 100644
--- a/include/DataTree.hh
+++ b/include/DataTree.hh
@@ -164,6 +164,8 @@ public:
   NodeID AddUnknownFunction(const string &function_name, const vector<NodeID> &arguments);
   //! Fill eval context with values of local variables
   void fillEvalContext(eval_context_type &eval_context) const;
+  //! Checks if a given symbol is used somewhere in the data tree
+  bool isSymbolUsed(int symb_id) const;
 };
 
 inline NodeID
diff --git a/include/ParsingDriver.hh b/include/ParsingDriver.hh
index dcf2c2ed4989d156bf45360d6f607d0a90640676..9976a463191a59d18a0acf85ffffa3750d70af7b 100644
--- a/include/ParsingDriver.hh
+++ b/include/ParsingDriver.hh
@@ -187,6 +187,8 @@ public:
   void declare_parameter(string *name, string *tex_name = new string);
   //! Declares and initializes a local parameter
   void declare_and_init_model_local_variable(string *name, NodeID rhs);
+  //! Changes type of a symbol
+  void change_type(SymbolType new_type, vector<string *> *var_list);
   //! Adds a constant to DataTree
   NodeID add_constant(string *constant);
   //! Adds a NaN constant to DataTree