diff --git a/matlab/dsge_likelihood.m b/matlab/dsge_likelihood.m
index 694c1655e934c2262c6beedcff9eee3841dfba85..b7b8d38cfb8fca37a9755d09309aacfa07632d19 100644
--- a/matlab/dsge_likelihood.m
+++ b/matlab/dsge_likelihood.m
@@ -146,6 +146,7 @@ if DynareOptions.estimation_dll
     [fval,exit_flag,ys,trend_coeff,info,params,H,Q] ...
         = logposterior(xparam1,DynareDataset, DynareOptions,Model, ...
                           EstimatedParameters,BayesInfo,DynareResults);
+    mexErrCheck('logposterior', exit_flag);
     Model.params = params;
     if ~isequal(Model.H,0)
         Model.H = H;
diff --git a/mex/sources/estimation/SteadyStateSolver.cc b/mex/sources/estimation/SteadyStateSolver.cc
index 8f9fbf12cf64a3146e4dbb4c3ca8cf98e332a3ab..a9eaf6221708562fb3d99df4ba06541f65e0584c 100644
--- a/mex/sources/estimation/SteadyStateSolver.cc
+++ b/mex/sources/estimation/SteadyStateSolver.cc
@@ -19,8 +19,8 @@
 
 #include "SteadyStateSolver.hh"
 
-SteadyStateSolver::SteadyStateSolver(const std::string &basename, size_t n_endo)
-  : static_dll(basename), residual(n_endo), g1(n_endo)
+SteadyStateSolver::SteadyStateSolver(const std::string &basename, size_t n_endo_arg)
+  : static_dll(basename), n_endo(n_endo_arg), residual(n_endo), g1(n_endo)
 {
 }
 
diff --git a/mex/sources/estimation/SteadyStateSolver.hh b/mex/sources/estimation/SteadyStateSolver.hh
index c3127aa3aa6a75d5f821b3a970470e4794ead1d2..826f5d0e0eb2626e935a01f66aae6783dc039729 100644
--- a/mex/sources/estimation/SteadyStateSolver.hh
+++ b/mex/sources/estimation/SteadyStateSolver.hh
@@ -17,6 +17,8 @@
  * along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <string>
+
 #include "Vector.hh"
 #include "static_dll.hh"
 
@@ -27,6 +29,7 @@ class SteadyStateSolver
 {
 private:
   StaticModelDLL static_dll;
+  size_t n_endo;
   Vector residual; // Will be discarded, only used by df()
   Matrix g1; // Temporary buffer for computing transpose
 
@@ -45,32 +48,39 @@ private:
   static int static_df(const gsl_vector *yy, void *p, gsl_matrix *J);
   static int static_fdf(const gsl_vector *yy, void *p, gsl_vector *F, gsl_matrix *J);
 
-  const static double tolerance = 1e-5;
+  const static double tolerance = 1e-7;
   const static size_t max_iterations = 1000;
 public:
   class SteadyStateException
   {
+  public:
+    std::string message;
+    SteadyStateException(const std::string &message_arg) : message(message_arg) 
+    {
+    }
   };
 
-  SteadyStateSolver(const std::string &basename, size_t n_endo);
+  SteadyStateSolver(const std::string &basename, size_t n_endo_arg);
 
   template <class Vec1, class Mat, class Vec2>
-  void compute(Vec1 &steadyState, const Mat Mx, const Vec2 &deepParams) throw (SteadyStateException)
+  void compute(Vec1 &steadyState, const Mat &Mx, const Vec2 &deepParams) throw (SteadyStateException)
   {
     assert(steadyState.getStride() == 1);
     assert(deepParams.getStride() == 1);
 
-    const size_t n = steadyState.getSize();
+    assert(steadyState.getSize() == n_endo);
+
+    std::cout << "In:  " << steadyState << std::endl;
     
-    gsl_vector_view ss = gsl_vector_view_array(steadyState.getData(), n);
+    gsl_vector_view ss = gsl_vector_view_array(steadyState.getData(), n_endo);
 
     params p = { &static_dll, deepParams.getData(), deepParams.getSize(), Mx.getData(), Mx.getCols(), &residual, &g1 };
 
     gsl_multiroot_function_fdf f = {&static_f, &static_df, &static_fdf,
-                                    n, &p};
+                                    n_endo, &p};
 
-    const gsl_multiroot_fdfsolver_type *T = gsl_multiroot_fdfsolver_gnewton;
-    gsl_multiroot_fdfsolver *s = gsl_multiroot_fdfsolver_alloc(T, n);
+    const gsl_multiroot_fdfsolver_type *T = gsl_multiroot_fdfsolver_hybridsj;
+    gsl_multiroot_fdfsolver *s = gsl_multiroot_fdfsolver_alloc(T, n_endo);
 
     gsl_multiroot_fdfsolver_set(s, &f, &ss.vector);
 
@@ -91,11 +101,13 @@ public:
     while(status == GSL_CONTINUE && iter < max_iterations);
 
     if (status != GSL_SUCCESS)
-      throw SteadyStateException();
+      throw SteadyStateException(std::string(gsl_strerror(status)));
 
     gsl_vector_memcpy(&ss.vector, gsl_multiroot_fdfsolver_root(s));
 
     gsl_multiroot_fdfsolver_free(s);
+
+    std::cout << "Out: " << steadyState << std::endl;
   }
 };
 
diff --git a/mex/sources/estimation/logposterior.cc b/mex/sources/estimation/logposterior.cc
index 04cff9ae65e5a240a5fcacef5d58f697e1fa4b34..f6f87973698ee6fafa97ecf987b6f33e6d6ff305 100644
--- a/mex/sources/estimation/logposterior.cc
+++ b/mex/sources/estimation/logposterior.cc
@@ -280,4 +280,8 @@ mexFunction(int nlhs, mxArray *plhs[],
     {
       DYN_MEX_FUNC_ERR_MSG_TXT(e.getErrMsg());
     }
+  catch (SteadyStateSolver::SteadyStateException e)
+    {
+      DYN_MEX_FUNC_ERR_MSG_TXT(e.message.c_str());
+    }
 }