diff --git a/RTKLib.pri b/RTKLib.pri
index f41bcf6ed644be8f121912911720b4b8d12d3318..7952b911d9e998bc553f133a58f7eea51f6808a9 100644
--- a/RTKLib.pri
+++ b/RTKLib.pri
@@ -1,5 +1,5 @@
 
-DEFINES += _RTLDLL NO_STRICT TRACE ENAGLO ENAQZS ENAGAL ENACMP ENAIRN NFREQ=3 NEXOBS=3 EXTLEX
+DEFINES += _RTLDLL NO_STRICT TRACE ENAGLO ENAQZS ENAGAL ENACMP ENAIRN NFREQ=4 NEXOBS=3 EXTLEX
 
 win32{
 DEFINES += WIN32
diff --git a/app/rnx2rtkp/gcc/makefile b/app/rnx2rtkp/gcc/makefile
index 0a0a31e7ba8596df2faada2d6586ad79b9c3c232..c82380b5a2ceab808376bd8739c714b24a1fa2e7 100644
--- a/app/rnx2rtkp/gcc/makefile
+++ b/app/rnx2rtkp/gcc/makefile
@@ -3,9 +3,7 @@
 BINDIR  = /usr/local/bin
 SRC     = ../../../src
 
-#OPTS    = -DTRACE -DENAGLO -DENAQZS -DENAGAL -DENACMP -DENAIRN -DNFREQ=3
-OPTS    = -DTRACE -DENAGLO  -DENAGAL -DENACMP  -DNFREQ=4   -DNEXOBS=3
-#OPTS    = -DENAGLO -DENAQZS -DENAGAL -DENACMP -DNFREQ=2
+OPTS    = -DTRACE -DENAGLO  -DENAQZS -DENAGAL -DENACMP  -DNFREQ=4   -DNEXOBS=3
 
 # for no lapack
 CFLAGS  = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) $(OPTS) -g
diff --git a/app/rtkconv/rtkconv.cbproj b/app/rtkconv/rtkconv.cbproj
index c3c5ef13bbd2af94b8f6401d45ce6a56513ab24f..add20ff00fa5fcccb81f0faaab5e1f7b6fa1c2d8 100644
--- a/app/rtkconv/rtkconv.cbproj
+++ b/app/rtkconv/rtkconv.cbproj
@@ -89,9 +89,9 @@
         <VerInfo_Locale>1033</VerInfo_Locale>
         <Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
         <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
-        <BCC_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;ENACMP;NEXOBS=3;NFREQ=3;$(BCC_Defines)</BCC_Defines>
-        <BRCC_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;NEXOBS=3;NFREQ=3;$(BRCC_Defines)</BRCC_Defines>
-        <TASM_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;NEXOBS=3;NFREQ=3;$(TASM_Defines)</TASM_Defines>
+        <BCC_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;ENACMP;NEXOBS=3;NFREQ=4;$(BCC_Defines)</BCC_Defines>
+        <BRCC_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;NEXOBS=3;NFREQ=4;$(BRCC_Defines)</BRCC_Defines>
+        <TASM_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;NEXOBS=3;NFREQ=4;$(TASM_Defines)</TASM_Defines>
         <BCC_UserSuppliedOptions> -tWM</BCC_UserSuppliedOptions>
         <OutputExt>exe</OutputExt>
         <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
diff --git a/app/rtkplot/plotinfo.cpp b/app/rtkplot/plotinfo.cpp
index c01e00f5f74d81de2c8d4e06c780fc16853cc519..9d849d9a762df622536a273d63265ce5fb94e44f 100644
--- a/app/rtkplot/plotinfo.cpp
+++ b/app/rtkplot/plotinfo.cpp
@@ -319,7 +319,7 @@ void __fastcall TPlot::UpdateObsType(void)
 {
     AnsiString s;
     char *codes[MAXCODE+1];
-    const char *freqs[]={"L1","L2","E5b","L5","E6","E5ab"};
+	const char *freqs[]={"L1","L2/E5b","L5","E6","E5ab"};
     int i,j,n=0,cmask[MAXCODE+1]={0},fmask[6]={0};
     
     trace(3,"UpdateObsType\n");
diff --git a/app/rtkplot/rtkplot.cbproj b/app/rtkplot/rtkplot.cbproj
index 9b6bcbf25af9f88bc504ef70060a6415366645c7..02a0bc87202f7118f7ded3f24295aab4e058acfc 100644
--- a/app/rtkplot/rtkplot.cbproj
+++ b/app/rtkplot/rtkplot.cbproj
@@ -82,9 +82,9 @@
     <PropertyGroup Condition="'$(Base_Win32)'!=''">
         <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
         <OutputExt>exe</OutputExt>
-        <TASM_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;NFREQ=3;NEXOBS=3;$(TASM_Defines)</TASM_Defines>
-        <BCC_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;ENACMP;ENAIRN;NFREQ=3;NEXOBS=3;$(BCC_Defines)</BCC_Defines>
-        <BRCC_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;NFREQ=3;NEXOBS=3;$(BRCC_Defines)</BRCC_Defines>
+        <TASM_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;NFREQ=4;NEXOBS=3;$(TASM_Defines)</TASM_Defines>
+        <BCC_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;ENACMP;ENAIRN;NFREQ=4;NEXOBS=3;$(BCC_Defines)</BCC_Defines>
+        <BRCC_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;NFREQ=4;NEXOBS=3;$(BRCC_Defines)</BRCC_Defines>
         <BCC_UserSuppliedOptions> -tWM</BCC_UserSuppliedOptions>
         <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
         <IncludePath>$(BDSINCLUDE)\windows\vcl;$(IncludePath)</IncludePath>
diff --git a/app/srctblbrows/srctblbrows.cbproj b/app/srctblbrows/srctblbrows.cbproj
index 3d412c20cdcddf4f61bdbc3c789587ebc1e6880e..ab0a261e7032156a464acabffc38464b10fc8bf8 100644
--- a/app/srctblbrows/srctblbrows.cbproj
+++ b/app/srctblbrows/srctblbrows.cbproj
@@ -101,7 +101,7 @@
         <TASM_Defines>_RTLDLL;WIN32;TRACE;$(TASM_Defines)</TASM_Defines>
         <BCC_UserSuppliedOptions> -tWM</BCC_UserSuppliedOptions>
         <BRCC_Defines>_RTLDLL;WIN32;TRACE;$(BRCC_Defines)</BRCC_Defines>
-        <BCC_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;NFREQ=3;$(BCC_Defines)</BCC_Defines>
+        <BCC_Defines>_RTLDLL;WIN32;TRACE;ENAGLO;ENAGAL;ENAQZS;NFREQ=4;$(BCC_Defines)</BCC_Defines>
         <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
         <IncludePath>$(BDSINCLUDE)\windows\vcl;$(IncludePath)</IncludePath>
         <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
diff --git a/src/options.c b/src/options.c
index b3737ba942fa81b8daccfa52b082976d39a3de84..1d18d4188e3651924d6fa9659c12e0ddfe054a15 100644
--- a/src/options.c
+++ b/src/options.c
@@ -136,6 +136,7 @@ EXPORT opt_t sysopts[]={
     {"stats-weightmode",3,  (void *)&prcopt_.weightmode, WEIGHTOPT},
     {"stats-eratio1",   1,  (void *)&prcopt_.eratio[0],  ""     },
     {"stats-eratio2",   1,  (void *)&prcopt_.eratio[1],  ""     },
+    {"stats-eratio5",   1,  (void *)&prcopt_.eratio[2],  ""     },
     {"stats-errphase",  1,  (void *)&prcopt_.err[1],     "m"    },
     {"stats-errphaseel",1,  (void *)&prcopt_.err[2],     "m"    },
     {"stats-errphasebl",1,  (void *)&prcopt_.err[3],     "m/10km"},
diff --git a/src/rtkcmn.c b/src/rtkcmn.c
index d2d0e9c975fb9bc5358272e484a07c642f3f17ab..5af0b14fdd9940862d4ed4c51f136af31d211fa1 100644
--- a/src/rtkcmn.c
+++ b/src/rtkcmn.c
@@ -184,7 +184,7 @@ const double chisqr[100]={      /* chi-sqr(n) (alpha=0.001) */
     138 ,139 ,140 ,142 ,143 ,144 ,145 ,147 ,148 ,149
 };
 const double lam_carr[MAXFREQ]={ /* carrier wave length (m) */
-    CLIGHT/FREQL1,CLIGHT/FREQL2,CLIGHT/FREQE5b,CLIGHT/FREQL5,CLIGHT/FREQE6,
+	CLIGHT/FREQL1,CLIGHT/FREQL2,CLIGHT/FREQL5,CLIGHT/FREQE6,
     CLIGHT/FREQE5ab,CLIGHT/FREQs
 };
 const prcopt_t prcopt_default={ /* defaults processing options */
@@ -273,13 +273,13 @@ static unsigned char obsfreqs_cmp[]={
 static char codepris[7][MAXFREQ][16]={  /* code priority table */
 
    /* L1/E1/B1   L2/B2      E5b/B3  L5/E5a/L3 E6/LEX     E5(a+b)  S */
-    {"CPYWMNSL","CLPYWMNDSX","IQX"   ,"IQX"   ,""        ,""      ,""    }, /* GPS */
-    {"PC"      ,"PC"        ,"IQX"   ,"IQX"   ,""        ,""      ,""    }, /* GLO */
-    {"CABXZ"   ,""          ,"IQX"   ,"IQX"   ,"ABCXZ"   ,"IQX"   ,""    }, /* GAL */
-    {"CSLXZ"   ,"SLX"       ,"IQX"   ,"IQX"   ,"SLX"     ,""      ,""    }, /* QZS */
-    {"C"       ,""          ,"IQX"   ,"IQX"   ,""        ,""      ,""    }, /* SBS */
-    {"IQX"     ,"IQX"       ,"IQX"   ,"IQX"   ,"IQX"     ,""      ,""    }, /* BDS */
-    {""        ,""          ,"ABCX"  ,"ABCX"  ,""        ,""      ,"ABCX"}  /* IRN */
+	{"CPYWMNSL","CLPYWMNDSX","IQX"   ,""        ,""      ,""    }, /* GPS */
+	{"PC"      ,"PC"        ,"IQX"   ,""        ,""      ,""    }, /* GLO */
+	{"CABXZ"   ,""          ,"IQX"   ,"ABCXZ"   ,"IQX"   ,""    }, /* GAL */
+	{"CSLXZ"   ,"SLX"       ,"IQX"   ,"SLX"     ,""      ,""    }, /* QZS */
+	{"C"       ,""          ,"IQX"   ,""        ,""      ,""    }, /* SBS */
+	{"IQX"     ,"IQX"       ,"IQX"   ,"IQX"     ,""      ,""    }, /* BDS */
+    {""        ,""          ,"ABCX"  ,""        ,""      ,"ABCX"}  /* IRN */
 };
 static fatalfunc_t *fatalfunc=NULL; /* fatal callback function */
 
@@ -647,7 +647,7 @@ extern void setcodepri(int sys, int freq, const char *pri)
     trace(3,"setcodepri:sys=%d freq=%d pri=%s\n",sys,freq,pri);
     
     if (freq<=0||MAXFREQ<freq) return;
-    if (sys&SYS_GPS) strcpy(codepris[0][freq-1],pri);
+	if (sys&SYS_GPS) strcpy(codepris[0][freq-1],pri);
     if (sys&SYS_GLO) strcpy(codepris[1][freq-1],pri);
     if (sys&SYS_GAL) strcpy(codepris[2][freq-1],pri);
     if (sys&SYS_QZS) strcpy(codepris[3][freq-1],pri);
diff --git a/src/rtklib.h b/src/rtklib.h
index 2abdfe5cd8078dba5bf19a700d1633d0f57e522b..f8cc401e4f6c21fb1606f45a991f2779d439b5fc 100644
--- a/src/rtklib.h
+++ b/src/rtklib.h
@@ -78,7 +78,7 @@ extern "C" {
 
 #define HION        350000.0            /* ionosphere height (m) */
 
-#define MAXFREQ     7                   /* max NFREQ */
+#define MAXFREQ     6                   /* max NFREQ */
 
 #define FREQL1      1.57542E9           /* L1/E1/B1  frequency (Hz) */
 #define FREQL2      1.22760E9           /* L2     frequency (Hz) */
diff --git a/src/rtkpos.c b/src/rtkpos.c
index bfd77e991e269f822afc33e55cde99a923c20d06..29ae04d4e38772449250c9b1f269a98ddb33a7a0 100644
--- a/src/rtkpos.c
+++ b/src/rtkpos.c
@@ -788,7 +788,7 @@ static void udbias(rtk_t *rtk, double tt, const obsd_t *obs, const int *sat,
                    const int *iu, const int *ir, int ns, const nav_t *nav)
 {
     double cp,pr,cp1,cp2,pr1,pr2,*bias,offset,lami,lam1,lam2,C1,C2;
-    int i,j,f,slip,reset,nf=NF(&rtk->opt),sysi;
+    int i,j,f,slip,rejc,reset,nf=NF(&rtk->opt),sysi;
     
     trace(3,"udbias  : tt=%.3f ns=%d\n",tt,ns);
     
@@ -832,14 +832,16 @@ static void udbias(rtk_t *rtk, double tt, const obsd_t *obs, const int *sat,
                 rtk->ssat[i-1].lock[f]=-rtk->opt.minlock;
             }
         }
-        /* reset phase-bias state if detecting cycle slip */
+        /* reset phase-bias state if detecting cycle slip or outlier */
         for (i=0;i<ns;i++) {
             j=IB(sat[i],f,&rtk->opt);
             rtk->P[j+j*rtk->nx]+=rtk->opt.prn[0]*rtk->opt.prn[0]*fabs(tt);
             slip=rtk->ssat[sat[i]-1].slip[f];
+            rejc=rtk->ssat[sat[i]-1].rejc[f];
             if (rtk->opt.ionoopt==IONOOPT_IFLC) slip|=rtk->ssat[sat[i]-1].slip[1];
-            if (rtk->opt.modear==ARMODE_INST||!(slip&1)) continue;
+            if (rtk->opt.modear==ARMODE_INST||(!(slip&1)&&rejc<2)) continue;
             rtk->x[j]=0.0;
+            rtk->ssat[sat[i]-1].rejc[f]=0;
             rtk->ssat[sat[i]-1].lock[f]=-rtk->opt.minlock;
             /* retain icbiases for GLONASS sats */
             if (rtk->ssat[sat[i]-1].sys!=SYS_GLO) rtk->ssat[sat[i]-1].icbias[f]=0;  
@@ -1212,7 +1214,7 @@ static int ddres(rtk_t *rtk, const nav_t *nav, const obsd_t *obs, double dt, con
                  double *H, double *R, int *vflg)
 {
     prcopt_t *opt=&rtk->opt;
-    double bl,dr[3],posu[3],posr[3],didxi=0.0,didxj=0.0,*im,icb;
+    double bl,dr[3],posu[3],posr[3],didxi=0.0,didxj=0.0,*im,icb,threshadj;
     double *tropr,*tropu,*dtdxr,*dtdxu,*Ri,*Rj,lami,lamj,fi,fj,df,*Hi=NULL;
     int i,j,k,m,f,frq,code,nv=0,nb[NFREQ*4*2+2]={0},b=0,sysi,sysj,nf=NF(opt);
     
@@ -1361,15 +1363,20 @@ static int ddres(rtk_t *rtk, const nav_t *nav, const obsd_t *obs, double dt, con
                 else      rtk->ssat[sat[j]-1].resc[frq]=v[nv];  /* carrier phase */
 
                 /* if residual too large, flag as outlier */
-                if (opt->maxinno>0.0&&fabs(v[nv])>opt->maxinno) {
-                    if (!code) {
-                        rtk->ssat[sat[i]-1].rejc[frq]++;
-                        rtk->ssat[sat[j]-1].rejc[frq]++;
+                k=IB(sat[j],frq,opt);
+				if (rtk->P[k+rtk->nx*k]<SQR(rtk->opt.std[0]/2)) {  /* skip check if bias just intialized */
+                    threshadj=code?1:opt->eratio[frq]; /* adjust threshold by error stdev ratio */
+                    if (opt->maxinno>0.0&&fabs(v[nv])>opt->maxinno/threshadj) {
+                        if (!code) {
+                            rtk->ssat[sat[j]-1].vsat[frq]=0;
+                            rtk->ssat[sat[j]-1].rejc[frq]++;
+                        }
+                        errmsg(rtk,"outlier rejected (sat=%3d-%3d %s%d v=%.3f)\n",
+                                sat[i],sat[j],code?"P":"L",frq+1,v[nv]);
+                        continue;
                     }
-                    errmsg(rtk,"outlier rejected (sat=%3d-%3d %s%d v=%.3f)\n",
-                            sat[i],sat[j],code?"P":"L",frq+1,v[nv]);
-                    continue;
                 }
+
                 /* single-differenced measurement error variances */
                 Ri[nv] = varerr(sat[i], sysi, azel[1+iu[i]*2], 
                                 0.25 * rtk->ssat[sat[i]-1].snr_rover[frq],