diff --git a/matlab/dynare_m.exe b/matlab/dynare_m.exe
index 7ecb3d89c46d92f3b351c23aeb6f8e52ef47584b..ba3518c77bec5bb508b9f5703169aa9190c2c489 100755
Binary files a/matlab/dynare_m.exe and b/matlab/dynare_m.exe differ
diff --git a/matlab/forecast.m b/matlab/forecast.m
index e2a79c00f43bff488c9a4241fcc9ce400b8146e7..df54ad19bf36b93c88f7f68d6f7314df4f7054fa 100644
--- a/matlab/forecast.m
+++ b/matlab/forecast.m
@@ -130,7 +130,7 @@ function info = forecast(var_list,task)
     end
 
     for i=1:M_.exo_det_nbr
-        eval(['oo_.forecast.Exogenous.' lgx_det_(i,:) '= M_.exo_det_simul(:,' int2str(i) ');']);
+        eval(['oo_.forecast.Exogenous.' M_.exo_det_names(i,:) '= oo_.exo_det_simul(:,' int2str(i) ');']);
     end
     
     if options_.nograph == 0
diff --git a/matlab/simultxdet.m b/matlab/simultxdet.m
new file mode 100644
index 0000000000000000000000000000000000000000..da7da40255c89bbc02ce625c125ce51a6300ac00
--- /dev/null
+++ b/matlab/simultxdet.m
@@ -0,0 +1,163 @@
+function [y_,int_width]=simultxdet(y0,ex,ex_det, iorder,var_list,M_,oo_,options_)
+%function [y_,int_width]=simultxdet(y0,ex,ex_det, iorder,var_list,M_,oo_,options_)
+
+% Copyright (C) 2008 Dynare Team
+%
+% This file is part of Dynare.
+%
+% Dynare is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Dynare is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
+
+%  global endo_nbr ykmin_ xkmin_ it_ options_ iy_ M_ exe_det_ Sigma_e_ lgy_
+
+  dr = oo_.dr;
+  ykmin = M_.maximum_lag;
+  endo_nbr = M_.endo_nbr;
+  exo_det_steady_state = oo_.exo_det_steady_state;
+  nstatic = dr.nstatic;
+  npred =dr.npred;
+  nc = size(dr.ghx,2);
+  iter = size(ex,1);
+  nx = size(dr.ghu,2);
+  y_ = zeros(size(y0,1),iter+ykmin);
+  y_(:,1:ykmin) = y0;
+  k1 = [ykmin:-1:1];
+  k2 = dr.kstate(find(dr.kstate(:,2) <= ykmin+1),[1 2]);
+  k2 = k2(:,1)+(ykmin+1-k2(:,2))*endo_nbr;
+  k3 = M_.lead_lag_incidence(1:ykmin,:)';
+  k3 = find(k3(:));
+  k4 = dr.kstate(find(dr.kstate(:,2) < ykmin+1),[1 2]);
+  k4 = k4(:,1)+(ykmin+1-k4(:,2))*endo_nbr;
+  
+  if options_.simul_algo == 1
+    o1 = dr.nstatic+1;
+    o2 = dr.nstatic+dr.npred;
+    o3 = o2-dr.nboth+1;
+    [junk, k5] = sort(dr.order_var(o1:o2));
+    [junk, k6] = sort(dr.order_var(o3:end));
+  end
+  
+  nvar = size(var_list,1);
+  if nvar == 0
+    nvar = endo_nbr;
+    ivar = [1:nvar];
+  else
+    ivar=zeros(nvar,1);
+    for i=1:nvar
+      i_tmp = strmatch(var_list(i,:),M_.endo_names,'exact');
+      if isempty(i_tmp)
+	disp(var_list(i,:));
+	error (['One of the variable specified does not exist']) ;
+      else
+	ivar(i) = i_tmp;
+      end
+    end
+  end
+
+  if iorder == 1
+    for i = ykmin+1: iter+ykmin
+      tempx1 = y_(dr.order_var,k1);
+      tempx2 = tempx1-repmat(dr.ys(dr.order_var),1,ykmin);
+      tempx = tempx2(k2);
+      if options_.simul_algo == 0
+	y_(dr.order_var,i) = dr.ys(dr.order_var)+dr.ghx*tempx+dr.ghu* ...
+	    ex(i,:)';
+	for j=1:min(ykmin+M_.exo_det_length+1-i,M_.exo_det_length)
+	  y_(dr.order_var,i) = y_(dr.order_var,i) + dr.ghud{j}*(ex_det(i+j-1,:)'-exo_det_steady_state');
+	end
+      elseif options_.simul_algo == 1
+	it_ = i;
+	m = dr.ys(dr.order_var);
+	[y_(:,i), check] = dynare_solve('ff_simul1',y_(:,i-1),tempx1(k3), ...
+					m(o3:end),tempx(k4),o1,o2,o3,k6);
+      end
+	
+      k1 = k1+1;
+    end
+  elseif iorder == 2
+    for i = ykmin+1: iter+ykmin
+      tempx1 = y_(dr.order_var,k1);
+      tempx2 = tempx1-repmat(dr.ys(dr.order_var),1,ykmin);
+      tempx = tempx2(k2);
+      tempu = ex(i-ykmin,:)';
+      tempuu = kron(tempu,tempu);
+      if options_.simul_algo == 0
+	tempxx = kron(tempx,tempx);
+	tempxu = kron(tempx,tempu);
+	y_(dr.order_var,i) = dr.ys(dr.order_var)+dr.ghs2/2+dr.ghx*tempx+ ...
+	    dr.ghu*tempu+0.5*(dr.ghxx*tempxx+dr.ghuu*tempuu)+dr.ghxu* ...
+	    tempxu;
+	for j=1:min(ykmin+M_.exo_det_length+1-i,M_.exo_det_length)
+	  tempud = ex_det(i+j-1,:)'-exo_det_steady_state;
+	  tempudud = kron(tempud,tempud);
+	  tempxud = kron(tempx,tempud);
+	  tempuud = kron(tempu,tempud);
+	  y_(dr.order_var,i) = y_(dr.order_var,i) + dr.ghud{j}*tempud + ...
+	      dr.ghxud{j}*tempxud + dr.ghuud{j}*tempuud + ...
+	      0.5*dr.ghudud{j,j}*tempudud;
+	  for k=1:j-1
+	    tempudk = ex_det(i+k-1,:)'-exo_det_steady_state;
+	    tempududk = kron(tempudk,tempud);
+	    y_(dr.order_var,i) = y_(dr.order_var,i) + ...
+		dr.ghudud{k,j}*tempududk;
+	  end
+	end
+      elseif options_.simul_algo == 1
+	it_ = i;
+	m = dr.ys(dr.order_var)+dr.ghs2/2;
+	tempx1 = y_(:,k1);
+	[y_(:,i), check] = dynare_solve('ff_simul2',y_(:,i-1),tempx1(k3), ...
+					m(o3:end),tempx(k4),o1,o2,o3,k6);
+      end
+      k1 = k1+1;
+    end
+  end
+
+  [A,B] = kalman_transition_matrix(dr,nstatic+(1:npred),1:nc,dr.transition_auxiliary_variables,M_.exo_nbr);
+
+  inv_order_var = dr.inv_order_var;
+  ghx1 = dr.ghx(inv_order_var(ivar),:);
+  ghu1 = dr.ghu(inv_order_var(ivar),:);
+
+  sigma_u = B*M_.Sigma_e*B';
+  sigma_u1 = ghu1*M_.Sigma_e*ghu1';
+  sigma_y = 0;
+  
+  for i=1:iter
+      sigma_y1 = ghx1*sigma_y*ghx1'+sigma_u1;
+      var_yf(i,:) = diag(sigma_y1)';
+      if i == iter
+          break
+      end
+      sigma_u = A*sigma_u*A';
+      sigma_y = sigma_y+sigma_u;
+  end
+
+  fact = norminv((1-options_.conf_sig)/2,0,1);
+
+  int_width = zeros(iter,endo_nbr);
+  for i=1:endo_nbr
+    int_width(:,i) = fact*sqrt(var_yf(:,i));
+  end
+  
+  for i=1:nvar
+    my_subplot(i,nvar,2,3,'Forecasts');
+    
+    plot([-ykmin+1:0],y0(ivar(i),1:ykmin),'b-',...
+	 [1:iter],y_(ivar(i),ykmin+1:end),'g-',...
+	 [1:iter],y_(ivar(i),ykmin+1:end)'+int_width(:,ivar(i)),'g:',...
+	 [1:iter],y_(ivar(i),ykmin+1:end)'-int_width(:,ivar(i)),'g:',...
+	 [1 iter],repmat(dr.ys(ivar(i)),1,2),'r-');
+    title(M_.endo_names(ivar(i),:));
+  end
+
diff --git a/preprocessor/SymbolTable.cc b/preprocessor/SymbolTable.cc
index 849050a29ae070c9297e4dd2157aca87c5ef85f9..bd3190c06d93b415ce14ecbc3a53d415ee1acdd2 100644
--- a/preprocessor/SymbolTable.cc
+++ b/preprocessor/SymbolTable.cc
@@ -90,12 +90,12 @@ SymbolTable::writeOutput(ostream &output) const
     }
   if (exo_det_nbr > 0)
     {
-      output << "lgxdet_ = '" << getNameByID(eExogenousDet, 0) << "';" << endl;
-      output << "lgxdet_tex_ = '" << getTeXNameByID(eExogenousDet, 0) << "';" << endl;
+      output << "M_.exo_det_names = '" << getNameByID(eExogenousDet, 0) << "';" << endl;
+      output << "M_.exo_det_names_tex = '" << getTeXNameByID(eExogenousDet, 0) << "';" << endl;
       for (int id = 1; id < exo_det_nbr; id++)
         {
-          output << "lgxdet_ = srtvcat(lgxdet_, '" << getNameByID(eExogenousDet, id) << "');" << endl
-                 << "lgxdet_tex_ = strvcat(lgxdet_tex_, '" << getTeXNameByID(eExogenousDet, id) << "');" << endl;
+          output << "M_.exo_det_names = srtvcat(M_.exo_det_names, '" << getNameByID(eExogenousDet, id) << "');" << endl
+                 << "M_.exo_det_names_tex = strvcat(M_.exo_det_names_tex, '" << getTeXNameByID(eExogenousDet, id) << "');" << endl;
         }
     }
   if (endo_nbr > 0)