diff --git a/configure.ac b/configure.ac
index 4e643b5cef23aba75d9df39884109043dbfb0371..637e3ae8817959ac275b6a7943c362fd95c84a3a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -87,10 +87,8 @@ AC_CHECK_LIB([dl], [dlopen], [LIBADD_DLOPEN="-ldl"], [])
 AC_SUBST([LIBADD_DLOPEN])
 
 # Check for libmatio, needed by Dynare++
-AC_CHECK_HEADER([matio.h])
-AC_CHECK_LIB([matio], [Mat_Open], [LIBADD_MATIO="-lmatio"])
-AC_SUBST([LIBADD_MATIO])
-AM_CONDITIONAL([HAVE_MATIO], [test "x$ac_cv_header_matio_h" = "xyes" -a "x$ac_cv_lib_matio_Mat_Open" = "xyes"])
+AX_MATIO
+AM_CONDITIONAL([HAVE_MATIO], [test "x$has_matio" = "xyes"])
 
 AC_CHECK_PROG([MAKEINFO], [makeinfo], [makeinfo])
 
@@ -238,7 +236,7 @@ AM_CONDITIONAL([ENABLE_ORG_EXPORT], [test "x$enable_org_export" != "x"])
 
 BUILD_PREPROCESSOR="yes"
 
-if test "x$ax_blas_ok" = "xyes" -a "x$ax_lapack_ok" = "xyes" -a "x$ac_cv_header_matio_h" = "xyes" -a "x$ac_cv_lib_matio_Mat_Open" = "xyes"; then
+if test "x$ax_blas_ok" = "xyes" -a "x$ax_lapack_ok" = "xyes" -a "x$has_matio" = "xyes"; then
   if test x"$ax_pthread_ok" = "xyes"; then
      BUILD_DYNAREPLUSPLUS="yes"
   else
diff --git a/dynare++/src/Makefile.am b/dynare++/src/Makefile.am
index f5429ff845ba4d0de987f7712cd052d48a9e83ce..8bf57d62079bc98c083ef5b4f86d6ee48ab7e43e 100644
--- a/dynare++/src/Makefile.am
+++ b/dynare++/src/Makefile.am
@@ -21,9 +21,9 @@ dynare___SOURCES = \
 	nlsolve.h \
 	$(GENERATED_FILES)
 
-dynare___CPPFLAGS = -I../sylv/cc -I../tl/cc -I../kord -I../integ/cc -I.. -I$(top_srcdir)/mex/sources -DDYNVERSION=\"$(PACKAGE_VERSION)\" $(BOOST_CPPFLAGS)
-dynare___LDFLAGS = $(BOOST_LDFLAGS)
-dynare___LDADD = ../kord/libkord.a ../integ/cc/libinteg.a ../tl/cc/libtl.a ../parser/cc/libparser.a ../utils/cc/libutils.a ../sylv/cc/libsylv.a $(noinst_LIBRARIES) $(LAPACK_LIBS) $(BLAS_LIBS) $(LIBS) $(FLIBS) $(PTHREAD_LIBS) $(LIBADD_MATIO)
+dynare___CPPFLAGS = -I../sylv/cc -I../tl/cc -I../kord -I../integ/cc -I.. -I$(top_srcdir)/mex/sources -DDYNVERSION=\"$(PACKAGE_VERSION)\" $(BOOST_CPPFLAGS) $(MATIO_CFLAGS)
+dynare___LDFLAGS = $(LDFLAGS_MATIO) $(BOOST_LDFLAGS)
+dynare___LDADD = ../kord/libkord.a ../integ/cc/libinteg.a ../tl/cc/libtl.a ../parser/cc/libparser.a ../utils/cc/libutils.a ../sylv/cc/libsylv.a $(LIBADD_MATIO) $(noinst_LIBRARIES) $(LAPACK_LIBS) $(BLAS_LIBS) $(LIBS) $(FLIBS) $(PTHREAD_LIBS)
 dynare___CXXFLAGS = $(PTHREAD_CFLAGS)
 
 BUILT_SOURCES = $(GENERATED_FILES)
diff --git a/m4/ax_matio.m4 b/m4/ax_matio.m4
new file mode 100644
index 0000000000000000000000000000000000000000..905a1d3096f2ae1cedf34c18f410aae1343931e6
--- /dev/null
+++ b/m4/ax_matio.m4
@@ -0,0 +1,54 @@
+dnl Detect the MATIO Library.
+dnl We don't use the official M4 macro since it relies on the script gsl-config,
+dnl which does not work when cross-compiling.
+dnl
+dnl Copyright (C) 2012 Dynare Team
+dnl
+dnl This file is part of Dynare.
+dnl
+dnl Dynare is free software: you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation, either version 3 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl Dynare is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
+
+AC_DEFUN([AX_MATIO],
+[
+AC_ARG_WITH(matio, AC_HELP_STRING([--with-matio=DIR], [prefix to MATIO installation]),
+            matio_prefix="$withval", matio_prefix="")
+
+  has_matio=yes
+
+  if test "x$matio_prefix" != "x"; then
+    CFLAGS_MATIO="-I$withval/include"
+    LDFLAGS_MATIO="-L$withval/lib"
+  else
+    CFLAGS_MATIO=""
+    LDFLAGS_MATIO=""
+  fi
+
+  ac_save_CFLAGS="$CFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+
+  LIBADD_MATIO=""
+  CFLAGS="$CFLAGS_MATIO $CFLAGS"
+  LDFLAGS="$LDFLAGS_MATIO $LDFLAGS"
+
+  AC_CHECK_HEADER([matio.h], [], [has_matio=no])
+  AC_CHECK_LIB([matio], [Mat_Open], [LIBADD_MATIO="-lmatio"], [has_matio=no])
+
+  CFLAGS="$ac_save_CFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+  LIBS="$ac_save_LIBS"
+
+  AC_SUBST(CFLAGS_MATIO)
+  AC_SUBST(LIBADD_MATIO)
+  AC_SUBST(LDFLAGS_MATIO)
+])
diff --git a/mex/build/dynare_simul_.am b/mex/build/dynare_simul_.am
index f9c504c0b800d4bbc70d03ac064cae5bd10a5e12..bd9ce7c2e527b380464257657d72ce1ca0a8d836 100644
--- a/mex/build/dynare_simul_.am
+++ b/mex/build/dynare_simul_.am
@@ -1,10 +1,11 @@
 noinst_PROGRAMS = dynare_simul_
 
-dynare_simul__CPPFLAGS = -I$(top_srcdir)/../../../dynare++/sylv/cc -I$(top_srcdir)/../../../dynare++/tl/cc -I$(top_srcdir)/../../../dynare++/kord -I$(top_srcdir)/../../sources
+dynare_simul__CPPFLAGS = -I$(top_srcdir)/../../../dynare++/sylv/cc -I$(top_srcdir)/../../../dynare++/tl/cc -I$(top_srcdir)/../../../dynare++/kord -I$(top_srcdir)/../../sources $(CFLAGS_MATIO)
 
 dynare_simul__CXXFLAGS = $(PTHREAD_CFLAGS)
 
 # libdynare++ must come before pthread
+dynare_simul__LDFLAGS = $(LDFLAGS_MATIO)
 dynare_simul__LDADD = ../libdynare++/libdynare++.a $(PTHREAD_LIBS) $(LIBADD_MATIO)
 
 nodist_dynare_simul__SOURCES = $(top_srcdir)/../../../dynare++/extern/matlab/dynare_simul.cpp
diff --git a/mex/build/estimation.am b/mex/build/estimation.am
index b2a92a32680fb9d82cb744b82f9f0eb4624ffba2..7482568e696063afbf6d58e1439eb7058efddd3f 100644
--- a/mex/build/estimation.am
+++ b/mex/build/estimation.am
@@ -1,9 +1,9 @@
 noinst_PROGRAMS = logposterior logMHMCMCposterior
 
 # We use shared flags so that automake does not compile things two times
-CPPFLAGS += -I$(top_srcdir)/../../sources/estimation/libmat -I$(top_srcdir)/../../sources/estimation/utils $(BOOST_CPPFLAGS)
-LDFLAGS += $(BOOST_LDFLAGS)
-LDADD = $(LIBADD_DLOPEN)
+CPPFLAGS += -I$(top_srcdir)/../../sources/estimation/libmat -I$(top_srcdir)/../../sources/estimation/utils $(CFLAGS_MATIO) $(BOOST_CPPFLAGS)
+LDFLAGS += $(LDFLAGS_MATIO) $(BOOST_LDFLAGS)
+LDADD = $(LIBADD_DLOPEN) $(LIBADD_MATIO)
 
 TOPDIR = $(top_srcdir)/../../sources/estimation
 
diff --git a/mex/build/k_order_perturbation.am b/mex/build/k_order_perturbation.am
index 8175e4dac02a46710356e3d2a478827951d48912..c5c323929fd9bdc3711445bf09ca3429cece5cd4 100644
--- a/mex/build/k_order_perturbation.am
+++ b/mex/build/k_order_perturbation.am
@@ -2,9 +2,10 @@ noinst_PROGRAMS = k_order_perturbation
 
 k_order_perturbation_CPPFLAGS = -I$(top_srcdir)/../../../dynare++/src -I$(top_srcdir)/../../../dynare++/kord -I$(top_srcdir)/../../../dynare++/tl/cc -I$(top_srcdir)/../../../dynare++/utils/cc -I$(top_srcdir)/../../../dynare++/sylv/cc -I$(top_srcdir)/../../../dynare++/integ/cc -I$(top_srcdir)/../../sources
 
-k_order_perturbation_CXXFLAGS = $(PTHREAD_CFLAGS)
+k_order_perturbation_CXXFLAGS = $(CFLAGS_MATIO) $(PTHREAD_CFLAGS)
 
 # libdynare++ must come before pthread
+k_order_perturbation_LDFLAGS = $(LDFLAGS_MATIO)
 k_order_perturbation_LDADD = ../libdynare++/libdynare++.a $(PTHREAD_LIBS) $(LIBADD_DLOPEN) $(LIBADD_MATIO)
 
 TOPDIR = $(top_srcdir)/../../sources/k_order_perturbation
diff --git a/mex/build/matlab/configure.ac b/mex/build/matlab/configure.ac
index 4cbdbd1bade684a5051a9567efa989c6fe8438c9..838f951223917b83aec75acb6216a26faee54555 100644
--- a/mex/build/matlab/configure.ac
+++ b/mex/build/matlab/configure.ac
@@ -77,10 +77,8 @@ AX_GSL
 AM_CONDITIONAL([HAVE_GSL], [test "x$has_gsl" = "xyes"])
 
 # Check for libmatio, needed by MEX files using Dynare++ code
-AC_CHECK_HEADER([matio.h])
-AC_CHECK_LIB([matio], [Mat_Open], [LIBADD_MATIO="-lmatio"])
-AC_SUBST([LIBADD_MATIO])
-AM_CONDITIONAL([HAVE_MATIO], [test "x$ac_cv_header_matio_h" = "xyes" -a "x$ac_cv_lib_matio_Mat_Open" = "xyes"])
+AX_MATIO
+AM_CONDITIONAL([HAVE_MATIO], [test "x$has_matio" = "xyes"])
 
 # Check for libslicot, needed by kalman_steady_state
 AX_SLICOT([matlab])
@@ -98,7 +96,7 @@ else
   BUILD_MEX_MATLAB="no (missing MATLAB, or unknown version, or unknown architecture)"
 fi
 
-if test "x$ax_enable_matlab" = "xyes" -a "x$ac_cv_header_matio_h" = "xyes" -a "x$ac_cv_lib_matio_Mat_Open" = "xyes"; then
+if test "x$ax_enable_matlab" = "xyes" -a "x$has_matio" = "xyes"; then
    BUILD_KORDER_DYNSIMUL_MEX_MATLAB="yes"
 else
    BUILD_KORDER_DYNSIMUL_MEX_MATLAB="no (missing MatIO library)"
diff --git a/mex/build/octave/configure.ac b/mex/build/octave/configure.ac
index 6fb570f8020f74ad09977148d7034d7586246000..88a9089d7ee684f26e9d4c5b9206ca0c4e56bd84 100644
--- a/mex/build/octave/configure.ac
+++ b/mex/build/octave/configure.ac
@@ -60,10 +60,8 @@ AX_GSL
 AM_CONDITIONAL([HAVE_GSL], [test "x$has_gsl" = "xyes"])
 
 # Check for libmatio, needed by estimation DLL (only under Octave, as an alternative to MATLAB's libmat)
-AC_CHECK_HEADER([matio.h])
-AC_CHECK_LIB([matio], [Mat_Open], [LIBADD_MATIO="-lmatio"])
-AC_SUBST([LIBADD_MATIO])
-AM_CONDITIONAL([HAVE_MATIO], [test "x$ac_cv_header_matio_h" = "xyes" -a "x$ac_cv_lib_matio_Mat_Open" = "xyes"])
+AX_MATIO
+AM_CONDITIONAL([HAVE_MATIO], [test "x$has_matio" = "xyes"])
 
 # Check for libslicot, needed by kalman_steady_state
 AX_SLICOT([octave])
@@ -81,7 +79,7 @@ else
   BUILD_MEX_OCTAVE="no (missing mkoctfile)"
 fi
 
-if test "x$MKOCTFILE" != "x" -a "x$ac_cv_header_matio_h" = "xyes" -a "x$ac_cv_lib_matio_Mat_Open" = "xyes"; then
+if test "x$MKOCTFILE" != "x" -a "x$has_matio" = "xyes"; then
   BUILD_ESTIMATION_KORDER_DYNSIMUL_MEX_OCTAVE="yes"
 else
   BUILD_ESTIMATION_KORDER_DYNSIMUL_MEX_OCTAVE="no (missing MatIO library)"
@@ -93,7 +91,7 @@ else
    BUILD_KALMAN_STEADY_STATE_OCTAVE="no (missing SLICOT)"
 fi
 
-if test "x$MKOCTFILE" != "x" -a "x$has_gsl" = "xyes" -a "x$ac_cv_header_matio_h" = "xyes" -a "x$ac_cv_lib_matio_Mat_Open" = "xyes"; then
+if test "x$MKOCTFILE" != "x" -a "x$has_gsl" = "xyes" -a "x$has_matio" = "xyes"; then
    BUILD_MS_SBVAR_MEX_OCTAVE="yes"
 else
    BUILD_MS_SBVAR_MEX_OCTAVE="no (missing GSL or MatIO library)"
diff --git a/mex/build/octave/ms_sbvar/Makefile.am b/mex/build/octave/ms_sbvar/Makefile.am
index 6a75caf5a74a334f9f64a5559f13b9a4c43949b8..30e2a99b095476029942654aba750165e90ebeb5 100644
--- a/mex/build/octave/ms_sbvar/Makefile.am
+++ b/mex/build/octave/ms_sbvar/Makefile.am
@@ -2,5 +2,11 @@ EXEEXT = .mex
 include ../mex.am
 include ../../ms_sbvar.am
 
+ms_sbvar_command_line_CPPLAGS = $(MATIO_CFLAGS)
+ms_sbvar_create_init_file_CPPLAGS = $(MATIO_CFLAGS)
+
+ms_sbvar_command_line_LDFLAGS = $(LDFLAGS_MATIO)
+ms_sbvar_create_init_file_LDFLAGS = $(LDFLAGS_MATIO)
+
 ms_sbvar_command_line_LDADD = $(LIBADD_MATIO)
-ms_sbvar_create_init_file_LDADD = $(LIBADD_MATIO)
\ No newline at end of file
+ms_sbvar_create_init_file_LDADD = $(LIBADD_MATIO)