diff --git a/src/rtkpos.c b/src/rtkpos.c
index 451a4e6c68be763a8b31940a8f2fc9524e16b45e..9ed662f6badd9fb8403b19cd24b7bf691746b03e 100644
--- a/src/rtkpos.c
+++ b/src/rtkpos.c
@@ -1690,7 +1690,8 @@ static int resamb_LAMBDA(rtk_t *rtk, double *bias, double *xa,int gps,int glo,in
     rtk->sol.ratio=0.0;
     
     if (rtk->opt.mode<=PMODE_DGPS||rtk->opt.modear==ARMODE_OFF||
-        rtk->opt.thresar[0]<1.0) { 
+        rtk->opt.thresar[0]<1.0) {
+        rtk->nb_ar=0;
         return 0;
     }
     /* skip AR if position variance too high to avoid false fix */
@@ -1699,6 +1700,7 @@ static int resamb_LAMBDA(rtk_t *rtk, double *bias, double *xa,int gps,int glo,in
     trace(3,"posvar=%.6f\n",var);
     if (var>rtk->opt.thresar[1]) {
         errmsg(rtk,"position variance too large:  %.4f\n",var);
+        rtk->nb_ar=0;
         return 0;
     }
     /* Create single to double-difference transformation matrix (D')
@@ -1709,7 +1711,7 @@ static int resamb_LAMBDA(rtk_t *rtk, double *bias, double *xa,int gps,int glo,in
         free(D);
         return -1; /* flag abort */
     }
-    rtk->nb_ar = nb;
+    rtk->nb_ar=nb;
     /* nx=# of float states, na=# of fixed states, nb=# of double-diff phase biases */
     ny=na+nb; y=mat(ny,1); Qy=mat(ny,ny); DP=mat(ny,nx);
     b=mat(nb,2); db=mat(nb,1); Qb=mat(nb,nb); Qab=mat(na,nb); QQ=mat(na,nb);
@@ -1867,17 +1869,16 @@ static int manage_amb_LAMBDA(rtk_t *rtk, double *bias, double *xa, const int *sa
         if (glo1!=glo2||gps1!=gps2)
             nb=resamb_LAMBDA(rtk,bias,xa,gps2,glo2,glo2);
     }
-    
-    rtk->sol.prev_ratio1=ratio1>0?ratio1:rtk->sol.ratio;
-    rtk->sol.prev_ratio2=rtk->sol.ratio;
-
-    /* restore excluded sat if still no fix */
-    if (excflag&&rtk->sol.ratio<rtk->sol.thres && rtk->sol.ratio<1.5*rtk->sol.prev_ratio2) {
+    /* restore excluded sat if still no fix or significant increase in ar ratio */
+    if (excflag && (rtk->sol.ratio<rtk->sol.thres) && (rtk->sol.ratio<(1.5*rtk->sol.prev_ratio2))) {
         i=sat[arsats[rtk->excsat++]];
         for (f=0;f<nf;f++) rtk->ssat[i-1].lock[f]=lockc[f];
         trace(3,"AR: restore sat %d\n",i);
     }
 
+    rtk->sol.prev_ratio1=ratio1>0?ratio1:rtk->sol.ratio;
+    rtk->sol.prev_ratio2=rtk->sol.ratio;
+
     return nb;
 }
 
@@ -2221,6 +2222,7 @@ extern void rtkinit(rtk_t *rtk, const prcopt_t *opt)
     }
     rtk->holdamb=0;
     rtk->excsat=0;
+    rtk->nb_ar=0;
     for (i=0;i<MAXERRMSG;i++) rtk->errbuf[i]=0;
     rtk->opt=*opt;
     rtk->initial_mode=rtk->opt.mode;