diff --git a/app/convbin/convbin.c b/app/convbin/convbin.c
index d3c7e704f3c19a506809e7c4877e5d1a9b274172..3ae74109124c3d9319f3c0395fd297492e986c05 100644
--- a/app/convbin/convbin.c
+++ b/app/convbin/convbin.c
@@ -561,7 +561,7 @@ int main(int argc, char **argv)
         fprintf(stderr,"input format can not be recognized\n");
         return -1;
     }
-    sprintf(opt.prog,"%s %s",PRGNAME,VER_RTKLIB);
+    sprintf(opt.prog,"%s %s %s",PRGNAME,VER_RTKLIB,PATCH_LEVEL);
     sprintf(opt.comment[0],"log: %-55.55s",ifile);
     sprintf(opt.comment[1],"format: %s",formatstrs[format]);
     if (*opt.rcvopt) {
diff --git a/app/rtkconv/convmain.cpp b/app/rtkconv/convmain.cpp
index eede251f31934ca912efcfbd28d3e48ad10d7d5f..369f9af1e656343c2b9914cf0836ca00c04fe451 100644
--- a/app/rtkconv/convmain.cpp
+++ b/app/rtkconv/convmain.cpp
@@ -38,7 +38,6 @@ TMainWindow *MainWindow;
 #define PRGNAME		"RTKCONV"  // program name
 #define MAXHIST		20		   // max number of histories
 #define TSTARTMARGIN 60.0	   // time margin for file name replacement
-#define TRACEFILE	"rtkconv.trace" // trace file
 
 static int abortf=0;
 
@@ -788,7 +787,7 @@ void __fastcall TMainWindow::ConvertFile(void)
 	AnsiString OutFile9_Text=OutFile9->Text;
 	int i,format,sat;
 	char file[1024]="",*ofile[9],ofile_[9][1024]={""},msg[256],*p;
-	char buff[256],tstr[32];
+	char buff[256],tstr[32],tracefile[1024];
 	double RNXVER[]={2.10,2.11,2.12,3.00,3.01,3.02,3.03};
 	FILE *fp;
 	
@@ -927,7 +926,9 @@ void __fastcall TMainWindow::ConvertFile(void)
 	Message		->Caption="";
 	
 	if (TraceLevel>0) {
-		traceopen(TRACEFILE);
+		strcpy(tracefile,ofile[0]);
+		strcat(tracefile,".trace");
+		traceopen(tracefile);
 		tracelevel(TraceLevel);
 	}
 	// convert to rinex
diff --git a/app/rtkconv/convmain.dfm b/app/rtkconv/convmain.dfm
index 2014eaa50577a7d5dec2f5e9cc538cb58c4e6fd6..96a5f160616c083279e88cc59837221722d1d602 100644
Binary files a/app/rtkconv/convmain.dfm and b/app/rtkconv/convmain.dfm differ
diff --git a/src/pntpos.c b/src/pntpos.c
index 630cee04a8153c133a56170d6a2e56895f8ccc26..274e4bc62ea5b4f93b56dbf57a691f18c259dc13 100644
--- a/src/pntpos.c
+++ b/src/pntpos.c
@@ -309,7 +309,7 @@ static int valsol(const double *azel, const int *vsat, int n,
     /* chi-square validation of residuals */
     vv=dot(v,v,nv);
     if (nv>nx&&vv>chisqr[nv-nx-1]) {
-        sprintf(msg,"chi-square error nv=%d vv=%.1f cs=%.1f",nv,vv,chisqr[nv-nx-1]);
+        sprintf(msg,"Warning: large chi-square error nv=%d vv=%.1f cs=%.1f",nv,vv,chisqr[nv-nx-1]);
         /* return 0; */ /* threshold too strict for all use cases, report error but continue on */
     }
     /* large gdop check */
diff --git a/src/rinex.c b/src/rinex.c
index a55abc5b8ce56883306816cc777e70b0e0b01c06..9761b3be3393989c42a93e1fdfcb55bb8bc6d8e9 100644
--- a/src/rinex.c
+++ b/src/rinex.c
@@ -2200,6 +2200,17 @@ extern int outrnxobsb(FILE *fp, const rnxopt_t *opt, const obsd_t *obs, int n,
                 case 'S': outrnxobsf(fp,obs[ind[i]].SNR[k]*0.25,-1,-1); break;
             }
         }
+
+        /* set trace level to 1 generate CSV file of raw observations   */
+        if (gettracelevel()==1) {
+            trace(1,",%16.2f,%3d,%13.2f,%13.2f,%9.2f,%2.0f,%1d,%1d,%13.2f,%13.2f,%9.2f,%2.0f,%1d,%1d\n",
+                obs[0].time.time + obs[0].time.sec, obs[ind[i]].sat,
+                obs[ind[i]].P[0], obs[ind[i]].L[0], obs[ind[i]].D[0],
+                obs[ind[i]].SNR[0]*0.25, obs[ind[i]].LLI[0], obs[ind[i]].qualL[0],
+                obs[ind[i]].P[1], obs[ind[i]].L[1], obs[ind[i]].D[1],
+                obs[ind[i]].SNR[1]*0.25, obs[ind[i]].LLI[1], obs[ind[i]].qualL[1]);
+        }
+
         if (opt->rnxver>2.99&&fprintf(fp,"\n")==EOF) return 0;
     }
 
diff --git a/src/rtkcmn.c b/src/rtkcmn.c
index c94ef3bd23a6f8ec948a47ce13ce952465a83dc5..da621ba4f0746db2505f20832c1320ca36087d10 100644
--- a/src/rtkcmn.c
+++ b/src/rtkcmn.c
@@ -2946,6 +2946,10 @@ extern void tracelevel(int level)
 {
     level_trace=level;
 }
+extern int gettracelevel(void)
+{
+    return level_trace;
+}
 extern void trace(int level, const char *format, ...)
 {
     va_list ap;
diff --git a/src/rtklib.h b/src/rtklib.h
index f6c39a4baba4645c736e9c60ca4fb6c1b4bb5a61..2c6a4a007a08c89454e0e4943eb83fd5e330105b 100644
--- a/src/rtklib.h
+++ b/src/rtklib.h
@@ -80,21 +80,21 @@ extern "C" {
 
 #define MAXFREQ     6                   /* max NFREQ */
 
-#define FREQL1      1.57542E9           /* L1/E1/B1  frequency (Hz) */
+#define FREQL1      1.57542E9           /* L1/E1  frequency (Hz) */
 #define FREQL2      1.22760E9           /* L2     frequency (Hz) */
 #define FREQE5b     1.20714E9           /* E5b    frequency (Hz) */
 #define FREQL5      1.17645E9           /* L5/E5a frequency (Hz) */
 #define FREQE6      1.27875E9           /* E6/LEX frequency (Hz) */
-#define FREQE5ab    1.191795E9          /* E5a+b/B2  frequency (Hz) */
+#define FREQE5ab    1.191795E9          /* E5a+b  frequency (Hz) */
 #define FREQs       2.492028E9           /* S      frequency (Hz) */
+#define FREQ1_CMP   1.561098E9          /* BeiDou B1 frequency (Hz) */
+#define FREQ2_CMP   1.20714E9           /* BeiDou B2 frequency (Hz) */
+#define FREQ3_CMP   1.26852E9           /* BeiDou B3 frequency (Hz) */
 #define FREQ1_GLO   1.60200E9           /* GLONASS G1 base frequency (Hz) */
 #define DFRQ1_GLO   0.56250E6           /* GLONASS G1 bias frequency (Hz/n) */
 #define FREQ2_GLO   1.24600E9           /* GLONASS G2 base frequency (Hz) */
 #define DFRQ2_GLO   0.43750E6           /* GLONASS G2 bias frequency (Hz/n) */
 #define FREQ3_GLO   1.202025E9          /* GLONASS G3 frequency (Hz) */
-#define FREQ1_CMP   1.561098E9          /* BeiDou B1 frequency (Hz) */
-#define FREQ2_CMP   1.20714E9           /* BeiDou B2 frequency (Hz) */
-#define FREQ3_CMP   1.26852E9           /* BeiDou B3 frequency (Hz) */
 
 #define EFACT_GPS   1.0                 /* error factor: GPS */
 #define EFACT_GLO   1.5                 /* error factor: GLONASS */
@@ -1564,6 +1564,7 @@ EXPORT void tracehnav(int level, const nav_t *nav);
 EXPORT void tracepeph(int level, const nav_t *nav);
 EXPORT void tracepclk(int level, const nav_t *nav);
 EXPORT void traceb   (int level, const unsigned char *p, int n);
+EXPORT int gettracelevel(void);
 
 /* platform dependent functions ----------------------------------------------*/
 EXPORT int execcmd(const char *cmd);
diff --git a/src/rtkpos.c b/src/rtkpos.c
index 9ed662f6badd9fb8403b19cd24b7bf691746b03e..f1e8f2ca418a1d17049fde133c64a5a353bf476d 100644
--- a/src/rtkpos.c
+++ b/src/rtkpos.c
@@ -413,6 +413,7 @@ static double varerr(int sat, int sys, double el, double snr_rover, double snr_b
 
     frq=f%nf;code=f<nf?0:1;
 
+    /* extended error model, not currently used */
     switch (sys) {
         case SYS_GPS: i = 0; break;
         case SYS_GLO: i = 1; break;
@@ -420,7 +421,6 @@ static double varerr(int sat, int sys, double el, double snr_rover, double snr_b
         default:      i = 0; break;
     }
     
-    /* extended error model, not currently used */
     if (code && opt->exterr.ena[0]) { /* code */
         a = opt->exterr.cerr[i][  frq * 2];
         b = opt->exterr.cerr[i][1+frq * 2];
@@ -431,6 +431,7 @@ static double varerr(int sat, int sys, double el, double snr_rover, double snr_b
         b = opt->exterr.perr[i][1+frq * 2];
         if (sys == SYS_SBS) {a *= EFACT_SBS; b *= EFACT_SBS;}
     }
+
     else { /* normal error model */
         if (opt->rcvstds&& obs->qualL[frq]!='\0'&&obs->qualP[frq]!='\0') {
             /* include err ratio and measurement std (P or L) from receiver */
@@ -441,7 +442,11 @@ static double varerr(int sat, int sys, double el, double snr_rover, double snr_b
         switch (sys) {
             case SYS_GPS: fact *= EFACT_GPS; break;
             case SYS_GLO: fact *= EFACT_GLO; break;
+            case SYS_GAL: fact *= EFACT_GAL; break;
             case SYS_SBS: fact *= EFACT_SBS; break;
+            case SYS_QZS: fact *= EFACT_QZS; break;
+            case SYS_CMP: fact *= EFACT_CMP; break;
+            case SYS_IRN: fact *= EFACT_IRN; break;
             default:      fact *= EFACT_GPS; break;
         }
         
@@ -1684,6 +1689,7 @@ static int resamb_LAMBDA(rtk_t *rtk, double *bias, double *xa,int gps,int glo,in
     prcopt_t *opt=&rtk->opt;
     int i,j,ny,nb,info,nx=rtk->nx,na=rtk->na;
     double *D,*DP,*y,*Qy,*b,*db,*Qb,*Qab,*QQ,s[2],var=0;
+    double QQb[MAXSAT];
     
     trace(3,"resamb_LAMBDA : nx=%d\n",nx);
     
@@ -1722,10 +1728,16 @@ static int resamb_LAMBDA(rtk_t *rtk, double *bias, double *xa,int gps,int glo,in
     matmul("NN",ny,ny,nx,1.0,DP,D     ,0.0,Qy);   /* Qy=DP'*D */
     
     /* phase-bias covariance (Qb) and real-parameters to bias covariance (Qab) */
-    for (i=0;i<nb;i++) for (j=0;j<nb;j++) Qb [i+j*nb]=Qy[na+i+(na+j)*ny];
+    for (i=0;i<nb;i++) {
+        QQb[i]= Qy[na+i+(na+i)*ny];
+        for (j=0;j<nb;j++) {
+            Qb [i+j*nb]=Qy[na+i+(na+j)*ny];
+        }
+    }
     for (i=0;i<na;i++) for (j=0;j<nb;j++) Qab[i+j*na]=Qy[   i+(na+j)*ny];
     
     trace(3,"N(0)=     "); tracemat(3,y+na,1,nb,7,2);
+    trace(3,"Qb  =     "); tracemat(3,QQb,1,nb,7,5);
     
     /* lambda/mlambda integer least-square estimation */
     /* return best integer solutions */