diff --git a/matlab/dynare.m b/matlab/dynare.m
index a8323cffab032aba1ad167a7fb9e4f2bc0fd538a..85151e2ed1affef6ca7bbf0de31c1ccb4274bdc5 100644
--- a/matlab/dynare.m
+++ b/matlab/dynare.m
@@ -70,6 +70,11 @@ dynareroot = dynare_config('', preprocessoroutput);
 
 warning_config()
 
+% For OpenMP on Mac
+if ismac
+    setenv('KMP_DUPLICATE_LIB_OK', 'TRUE');
+end
+
 if isoctave
     % The supported_octave_version.m file is not in git nor in the source
     % package, it is manually added in binary packages distributed on dynare.org
diff --git a/mex/build/block_kalman_filter.am b/mex/build/block_kalman_filter.am
index 9379db00603697d5957b613be3d874d1bf9b485d..e827f04e44eacc103e3048cda6fecbccf46e557a 100644
--- a/mex/build/block_kalman_filter.am
+++ b/mex/build/block_kalman_filter.am
@@ -3,7 +3,13 @@ mex_PROGRAMS = block_kalman_filter
 TOPDIR = $(top_srcdir)/../../sources/block_kalman_filter
 
 block_kalman_filter_CPPFLAGS = $(AM_CPPFLAGS) -I$(TOPDIR)
+
+if MACOS
+block_kalman_filter_CXXFLAGS = $(AM_CXXFLAGS) -Xpreprocessor -fopenmp
+block_kalman_filter_LDADD = -lomp
+else
 block_kalman_filter_CXXFLAGS = $(AM_CXXFLAGS) -fopenmp
+endif
 
 nodist_block_kalman_filter_SOURCES = block_kalman_filter.cc
 
diff --git a/mex/build/kronecker.am b/mex/build/kronecker.am
index bb2c138bfd8fcca1be01ab9581bc7c16408ceec1..78bff8047c5317142836a6def972e7015e363ab2 100644
--- a/mex/build/kronecker.am
+++ b/mex/build/kronecker.am
@@ -3,7 +3,12 @@ mex_PROGRAMS = sparse_hessian_times_B_kronecker_C A_times_B_kronecker_C
 nodist_sparse_hessian_times_B_kronecker_C_SOURCES = sparse_hessian_times_B_kronecker_C.cc
 nodist_A_times_B_kronecker_C_SOURCES = A_times_B_kronecker_C.cc
 
+if MACOS
+sparse_hessian_times_B_kronecker_C_CXXFLAGS = $(AM_CXXFLAGS) -Xpreprocessor -fopenmp
+sparse_hessian_times_B_kronecker_C_LDADD = -lomp
+else
 sparse_hessian_times_B_kronecker_C_CXXFLAGS = $(AM_CXXFLAGS) -fopenmp
+endif
 
 BUILT_SOURCES = $(nodist_sparse_hessian_times_B_kronecker_C_SOURCES) $(nodist_A_times_B_kronecker_C_SOURCES)
 CLEANFILES = $(nodist_sparse_hessian_times_B_kronecker_C_SOURCES) $(nodist_A_times_B_kronecker_C_SOURCES)
diff --git a/mex/build/local_state_space_iterations.am b/mex/build/local_state_space_iterations.am
index 59054b76d71a3b275fd0f8626739f4b39f461f01..5d4ecc658e55372adc7eb369e80d7be761a19bba 100644
--- a/mex/build/local_state_space_iterations.am
+++ b/mex/build/local_state_space_iterations.am
@@ -2,7 +2,12 @@ mex_PROGRAMS = local_state_space_iteration_2
 
 nodist_local_state_space_iteration_2_SOURCES = local_state_space_iteration_2.cc
 
+if MACOS
+local_state_space_iteration_2_CXXFLAGS = $(AM_CXXFLAGS) -Xpreprocessor -fopenmp
+local_state_space_iteration_2_LDADD = -lomp
+else
 local_state_space_iteration_2_CXXFLAGS = $(AM_CXXFLAGS) -fopenmp
+endif
 
 BUILT_SOURCES = $(nodist_local_state_space_iteration_2_SOURCES)
 CLEANFILES = $(nodist_local_state_space_iteration_2_SOURCES)
diff --git a/mex/build/matlab/configure.ac b/mex/build/matlab/configure.ac
index 2cf2d0f69ec5c3b6a75e44db45dd4109e381e022..6daa2ee8dac0d913ca509885881bbbb62a17bb11 100644
--- a/mex/build/matlab/configure.ac
+++ b/mex/build/matlab/configure.ac
@@ -64,8 +64,10 @@ AX_PROG_LN_S
 AC_PROG_MKDIR_P
 AM_PROG_AR
 
+build_mac=no
 case ${host_os} in
   *darwin*)
+    build_mac=yes
     string=$($CXX --version)
     if test "${string#*clang}" != "$string"; then
       CXXFLAGS="$CXXFLAGS -stdlib=libc++"
@@ -79,6 +81,8 @@ esac
 
 AX_CXX11_THREAD
 
+AM_CONDITIONAL([MACOS], [test "$build_mac" = "yes"])
+
 # Check for dlopen(), needed by k_order_perturbation DLL
 AC_CHECK_LIB([dl], [dlopen], [LIBADD_DLOPEN="-ldl"], [])
 AC_SUBST([LIBADD_DLOPEN])
diff --git a/mex/build/octave/configure.ac b/mex/build/octave/configure.ac
index fc12ba4e0d45724740d4c76c86c7bc14881bc6f7..a02ece5f9b48c9be8a556a745a66377bdad6b2df 100644
--- a/mex/build/octave/configure.ac
+++ b/mex/build/octave/configure.ac
@@ -70,13 +70,17 @@ AM_CONDITIONAL([HAVE_SLICOT], [test "$has_slicot" = yes])
 AC_CHECK_LIB([umfpack], [umfpack_dl_defaults], [LIBADD_UMFPACK="-lumfpack"], [AC_MSG_ERROR([Can't find UMFPACK])])
 # For OS X, explicitly add libraries that libumfpack depends on as Homebrew
 # doesn't support the creation of shared libraries for suite-sparse 3.7.0
+build_mac=no
 case ${host_os} in
   darwin*)
+    build_mac=yes
     LIBADD_UMFPACK="-lumfpack -lcholmod -lcolamd -lamd"
     ;;
 esac
 AC_SUBST([LIBADD_UMFPACK])
 
+AM_CONDITIONAL([MACOS], [test "$build_mac" = "yes"])
+
 AM_CONDITIONAL([DO_SOMETHING], [test -n "$MKOCTFILE"])
 
 if test -n "$MKOCTFILE"; then
diff --git a/mex/build/perfect_foresight_problem.am b/mex/build/perfect_foresight_problem.am
index e295c7e25257115040eca56a1c8541512a57d522..087f694e86baa6f9ffb9f7698aa557f8811e2344 100644
--- a/mex/build/perfect_foresight_problem.am
+++ b/mex/build/perfect_foresight_problem.am
@@ -5,8 +5,13 @@ TOPDIR = $(top_srcdir)/../../sources/perfect_foresight_problem
 nodist_perfect_foresight_problem_SOURCES = perfect_foresight_problem.cc DynamicModelCaller.cc
 
 perfect_foresight_problem_CPPFLAGS = $(AM_CPPFLAGS) -I$(TOPDIR)
+if MACOS
+perfect_foresight_problem_CXXFLAGS = $(AM_CXXFLAGS) -Xpreprocessor -fopenmp
+perfect_foresight_problem_LDADD = $(LIBADD_DLOPEN) -lomp
+else
 perfect_foresight_problem_CXXFLAGS = $(AM_CXXFLAGS) -fopenmp
 perfect_foresight_problem_LDADD = $(LIBADD_DLOPEN)
+endif
 
 BUILT_SOURCES = $(nodist_perfect_foresight_problem_SOURCES)
 CLEANFILES = $(nodist_perfect_foresight_problem_SOURCES)
diff --git a/mex/build/qmc_sequence.am b/mex/build/qmc_sequence.am
index 05084ec4d071ac76d045ab106ce4bf27cd4858ba..c8b7fac11ed806c4105966d115836e221babaf73 100644
--- a/mex/build/qmc_sequence.am
+++ b/mex/build/qmc_sequence.am
@@ -3,7 +3,12 @@ mex_PROGRAMS = qmc_sequence
 TOPDIR = $(top_srcdir)/../../sources/sobol
 
 qmc_sequence_CPPFLAGS = $(AM_CPPFLAGS) -I$(TOPDIR)
+if MACOS
+qmc_sequence_CXXFLAGS = $(AM_CXXFLAGS) -Xpreprocessor -fopenmp
+qmc_sequence_LDADD = -lomp
+else
 qmc_sequence_CXXFLAGS = $(AM_CXXFLAGS) -fopenmp
+endif
 
 nodist_qmc_sequence_SOURCES = qmc_sequence.cc