diff --git a/doc/dynare.texi b/doc/dynare.texi
index c2bd98616b155d68708c5943d82f9aea0c33f5f5..d55844abbe86d3b0b4e1689f3aee373cc2239530 100644
--- a/doc/dynare.texi
+++ b/doc/dynare.texi
@@ -6087,7 +6087,10 @@ This command declares the policy maker objective, for use with
 
 You need to give the one-period objective, not the discounted lifetime
 objective. The discount factor is given by the @code{planner_discount}
-option of @code{ramsey_policy} and @code{discretionary_policy}.
+option of @code{ramsey_policy} and @code{discretionary_policy}. The
+objective function can only contain current endogenous variables and no
+exogenous ones. This limitation is easily circumvented by defining an
+appropriate auxiliary variable in the model.
 
 With @code{ramsey_policy}, you are not limited to quadratic
 objectives: you can give any arbitrary nonlinear expression.
diff --git a/matlab/evaluate_planner_objective.m b/matlab/evaluate_planner_objective.m
index 3067414af2e8c206f46688a56d7f4e2bb4f461e4..32db62625a24b864182b722003d718e0fd13077f 100644
--- a/matlab/evaluate_planner_objective.m
+++ b/matlab/evaluate_planner_objective.m
@@ -42,27 +42,12 @@ else
 end
 ipred = find(lead_lag_incidence(M.maximum_lag,:))';
 order_var = dr.order_var;
-LQ = true;
-
+    
 Gy = dr.ghx(nstatic+(1:nspred),:);
 Gu = dr.ghu(nstatic+(1:nspred),:);
 gy(dr.order_var,:) = dr.ghx;
 gu(dr.order_var,:) = dr.ghu;
 
-if options.ramsey_policy && options.order == 1 && ~options.linear
-    options.order = 2;
-    options.qz_criterium = 1+1e-6;
-    [dr,info] = stochastic_solvers(oo.dr,0,M,options,oo);
-    Gyy = dr.ghxx(nstatic+(1:nspred),:);
-    Guu = dr.ghuu(nstatic+(1:nspred),:);
-    Gyu = dr.ghxu(nstatic+(1:nspred),:);
-    Gss = dr.ghs2(nstatic+(1:nspred),:);
-    gyy(dr.order_var,:) = dr.ghxx;
-    guu(dr.order_var,:) = dr.ghuu;
-    gyu(dr.order_var,:) = dr.ghxu;
-    gss(dr.order_var,:) = dr.ghs2;
-    LQ = false;
-end
 
 ys = oo.dr.ys;
 
@@ -83,24 +68,15 @@ mexErrCheck('A_times_B_kronecker_C', err);
 Wbar =U/(1-beta);
 Wy = Uy*gy/(eye(nspred)-beta*Gy);
 Wu = Uy*gu+beta*Wy*Gu;
-if LQ
-    Wyy = Uyygygy/(eye(nspred*nspred)-beta*kron(Gy,Gy));
-else
-    Wyy = (Uy*gyy+Uyygygy+beta*Wy*Gyy)/(eye(nspred*nspred)-beta*kron(Gy,Gy));
-end
+Wyy = Uyygygy/(eye(nspred*nspred)-beta*kron(Gy,Gy));
 [Wyygugu, err] = A_times_B_kronecker_C(Wyy,Gu,Gu,options.threads.kronecker.A_times_B_kronecker_C);
 mexErrCheck('A_times_B_kronecker_C', err);
 [Wyygygu,err] = A_times_B_kronecker_C(Wyy,Gy,Gu,options.threads.kronecker.A_times_B_kronecker_C);
 mexErrCheck('A_times_B_kronecker_C', err);
-if LQ
-    Wuu = Uyygugu+beta*Wyygugu;
-    Wyu = Uyygygu+beta*Wyygygu;
-    Wss = beta*Wuu*M.Sigma_e(:)/(1-beta);
-else
-    Wuu = Uy*guu+Uyygugu+beta*(Wy*Guu+Wyygugu);
-    Wyu = Uy*gyu+Uyygygu+beta*(Wy*Gyu+Wyygygu);
-    Wss = (Uy*gss+beta*(Wuu*M.Sigma_e(:)+Wy*Gss))/(1-beta);
-end
+Wuu = Uyygugu+beta*Wyygugu;
+Wyu = Uyygygu+beta*Wyygygu;
+Wss = beta*Wuu*M.Sigma_e(:)/(1-beta);
+
 % initialize yhat1 at the steady state
 yhat1 = oo.steady_state;
 if options.ramsey_policy