diff --git a/doc/dynare.texi b/doc/dynare.texi
index c50d9f75acb47b65c831b265910023c57831ac9e..d1444b7409e09f2dd6d9ee1ba4d23b581a97a29c 100644
--- a/doc/dynare.texi
+++ b/doc/dynare.texi
@@ -1993,9 +1993,10 @@ variable, the file must contain a row vector of the same name.
 MAT-file (extension @file{.mat}): same as for M-files.
 
 @item
-Excel file (extension @file{.xls}): for each endogenous and exogenous,
-the file must contain a column of the same name (supported under Octave
-if the @uref{http://octave.sourceforge.net/io/,io} and
+Excel file (extension @file{.xls} or @file{.xlsx}): for each
+endogenous and exogenous, the file must contain a column of the same
+name (supported under Octave if the
+@uref{http://octave.sourceforge.net/io/,io} and
 @uref{http://octave.sourceforge.net/java/,java} packages from
 Octave-Forge are installed, along with a
 @uref{http://www.java.com/download,Java Runtime Environment}).
@@ -3891,7 +3892,7 @@ graphs of smoothed shocks, smoothed observation errors, smoothed and historical
 @item datafile = @var{FILENAME}
 @anchor{datafile}
 The datafile: a @file{.m} file, a @file{.mat} file or, a
-@file{.xls} file (the latter format is supported under Octave
+@file{.xls}/@file{.xlsx} file (the latter format is supported under Octave
 if the @uref{http://octave.sourceforge.net/io/,io} and
 @uref{http://octave.sourceforge.net/java/,java} packages from
 Octave-Forge are installed, along with a
diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m
index 371320c7f1516af9e437df1460d80412a49fc82e..82345b4d8183330afda5f8f235a82e1e401a2579 100644
--- a/matlab/global_initialization.m
+++ b/matlab/global_initialization.m
@@ -227,7 +227,7 @@ options_.particle = particle;
 options_.TeX = 0;
 
 % Exel
-options_.xls_sheet = '';
+options_.xls_sheet = 1; % Octave does not support the empty string, rather use first sheet
 options_.xls_range = '';
 
 % Prior draws
diff --git a/matlab/initvalf.m b/matlab/initvalf.m
index 72d340c4e23209632589e482124b5c4f248fd4cc..13e1005d7ba6fcbe5198c17da956802a46b028ad 100644
--- a/matlab/initvalf.m
+++ b/matlab/initvalf.m
@@ -13,7 +13,7 @@ function initvalf(fname_)
 %    All variables local to this function have an underscore appended to
 %    their name, to minimize clashes with model variables loaded by this function.
 
-% Copyright (C) 2003-2010 Dynare Team
+% Copyright (C) 2003-2012 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -33,13 +33,39 @@ function initvalf(fname_)
 global M_ oo_ options_
 
 series_ = 1;
-if exist(fname_) == 2
-    eval(fname_);
-elseif exist([fname_ '.xls']) == 2
-    [data_,names_v_]=xlsread([fname_ '.xls']);
-    series_ = 0;
-elseif exist([fname_ '.mat']) == 2
-    load(fname_);
+
+[directory,basename,extension] = fileparts(fname_);
+
+% Auto-detect extension if not provided
+if isempty(extension)
+    if exist([basename '.m'],'file')
+        extension = '.m';
+    elseif exist([basename '.mat'],'file')
+        extension = '.mat';
+    elseif exist([basename '.xls'],'file')
+        extension = '.xls';
+    elseif exist([basename '.xlsx'],'file')
+        extension = '.xlsx';
+    else
+        error(['Can''t find datafile: ' basename '.{m,mat,xls,xlsx}']);
+    end
+end
+
+fullname = [basename extension];
+
+if ~exist(fullname)
+    error(['Can''t find datafile: ' fullname ]);
+end
+
+switch (extension)
+    case '.m'
+        eval(basename);
+    case '.mat'
+        load(basename);
+    case { '.xls', '.xlsx' }
+        [data_,names_v_]=xlsread(fullname); % Octave needs the extension explicitly
+    otherwise
+        error(['Unsupported extension for datafile: ' extension])
 end
 
 options_.initval_file = 1;
diff --git a/matlab/read_variables.m b/matlab/read_variables.m
index c313a031e3e12b8a5c117e1999a439db6bbcbabd..280cfa20144a2951441e6a4683f8c7dfc4e9329e 100644
--- a/matlab/read_variables.m
+++ b/matlab/read_variables.m
@@ -17,7 +17,7 @@ function dyn_data_01=read_variables(file_name_01,var_names_01,dyn_data_01,xls_sh
 % all local variables have complicated names in order to avoid name
 % conflicts with possible user variable names
 
-% Copyright (C) 2005-2011 Dynare Team
+% Copyright (C) 2005-2012 Dynare Team
 %
 % This file is part of Dynare.
 %
@@ -36,53 +36,72 @@ function dyn_data_01=read_variables(file_name_01,var_names_01,dyn_data_01,xls_sh
 
 
 old_pwd = pwd;
-[path_name_02,file_name_02,ext_name_02] = fileparts(file_name_01);
-if ~isempty(path_name_02)
-    file_name_01 = [file_name_02, ext_name_02];
-    cd(path_name_02)
+[directory,basename,extension] = fileparts(file_name_01);
+if ~isempty(directory)
+    cd(directory)
 end
 
 dyn_size_01 = size(dyn_data_01,1);
 var_size_01 = size(var_names_01,1);
-if exist([file_name_01 '.m'],'file')
-    file_name_02 = [file_name_01 '.m'];
-    dyn_instr_01 = file_name_01;
-    eval(dyn_instr_01);
-    for dyn_i_01=1:var_size_01
-        dyn_tmp_01 = eval(var_names_01(dyn_i_01,:));
-        if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0
-            cd(old_pwd)
-            error('data size is too large')
-        end
-        dyn_data_01(:,dyn_i_01) = dyn_tmp_01;
+
+% Auto-detect extension if not provided
+if isempty(extension)
+    if exist([basename '.m'],'file')
+        extension = '.m';
+    elseif exist([basename '.mat'],'file')
+        extension = '.mat';
+    elseif exist([basename '.xls'],'file')
+        extension = '.xls';
+    elseif exist([basename '.xlsx'],'file')
+        extension = '.xlsx';
+    else
+        error(['Can''t find datafile: ' basename '.{m,mat,xls,xlsx}']);
     end
-elseif exist([file_name_01 '.mat'],'file')
-    file_name_02 = [file_name_01 '.mat'];
-    s = load(file_name_01);
-    for dyn_i_01=1:var_size_01
-        dyn_tmp_01 = s.(deblank(var_names_01(dyn_i_01,:)));
-        if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0
-            cd(old_pwd)
-            error('data size is too large')
+end
+
+fullname = [basename extension];
+
+if ~exist(fullname)
+    error(['Can''t find datafile: ' fullname ]);
+end 
+
+switch (extension)
+    case '.m'
+        eval(basename);
+        for dyn_i_01=1:var_size_01
+            dyn_tmp_01 = eval(var_names_01(dyn_i_01,:));
+            if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0
+                cd(old_pwd)
+                error('data size is too large')
+            end
+            dyn_data_01(:,dyn_i_01) = dyn_tmp_01;
         end
-        dyn_data_01(:,dyn_i_01) = dyn_tmp_01;
-    end
-elseif exist([file_name_01 '.xls'],'file')
-    file_name_02 = [file_name_01 '.xls'];
-    [num,txt,raw] = xlsread(file_name_01,xls_sheet,xls_range);
-    for dyn_i_01=1:var_size_01
-        iv = strmatch(var_names_01(dyn_i_01,:),raw(1,:),'exact');
-        dyn_tmp_01 = [raw{2:end,iv}]';
-        if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0
-            cd(old_pwd)
-            error('data size is too large')
+    case '.mat'
+        s = load(basename);
+        for dyn_i_01=1:var_size_01
+            dyn_tmp_01 = s.(deblank(var_names_01(dyn_i_01,:)));
+            if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0
+                cd(old_pwd)
+                error('data size is too large')
+            end
+            dyn_data_01(:,dyn_i_01) = dyn_tmp_01;
         end
-        dyn_data_01(:,dyn_i_01) = dyn_tmp_01;
-    end
-else
-    cd(old_pwd)
-    error(['Can''t find datafile: ' file_name_01 ]);
+    case { '.xls', '.xlsx' }
+        [num,txt,raw] = xlsread(fullname,xls_sheet,xls_range); % Octave needs the extension explicitly
+        for dyn_i_01=1:var_size_01
+            iv = strmatch(var_names_01(dyn_i_01,:),raw(1,:),'exact');
+            dyn_tmp_01 = [raw{2:end,iv}]';
+            if length(dyn_tmp_01) > dyn_size_01 && dyn_size_01 > 0
+                cd(old_pwd)
+                error('data size is too large')
+            end
+            dyn_data_01(:,dyn_i_01) = dyn_tmp_01;
+        end
+    otherwise
+        cd(old_pwd)
+        error(['Unsupported extension for datafile: ' extension])
 end
+
 cd(old_pwd)
 disp(sprintf('Loading %d observations from %s\n',...
-             size(dyn_data_01,1),file_name_02))
+             size(dyn_data_01,1),fullname))
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 36bd25f2b0a2709a53a799e7b560cfd42762f3c5..d88af255fce25bedbac35b1a8b7d37fcef976716 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -60,6 +60,7 @@ MODFILES = \
 	arima/mod2a.mod \
 	arima/mod2b.mod \
 	arima/mod2c.mod \
+	data/mod1a.mod \
 	fs2000/fs2000.mod \
 	fs2000/fs2000a.mod \
 	fs2000/fs2000c.mod \
@@ -168,6 +169,7 @@ EXTRA_DIST = \
 	external_function/extFunWithFirstAndSecondDerivs.m \
 	expectations/expectation_ss_old_steadystate.m \
 	steady_state/walsh1_old_ss_steadystate.m \
+	data/test.xls \
 	fs2000/fs2000a_steadystate.m \
 	fs2000/fsdat_simul.m \
 	k_order_perturbation/run_fs2000kplusplus.m \