diff --git a/src/ephemeris.c b/src/ephemeris.c
index 75a6d2ac8d6e66b8fb74ca38c8370ca209974150..7a6605fdc00cb2d3bc1517df54b0e2cb5e1628b9 100644
--- a/src/ephemeris.c
+++ b/src/ephemeris.c
@@ -412,7 +412,17 @@ static eph_t *seleph(gtime_t time, int sat, int iode, const nav_t *nav)
         default: tmax=MAXDTOE+1.0; break;
     }
     tmin=tmax+1.0;
-    
+
+    //DEBUG
+    /*if (iode != -1)
+    {
+        printf("- available iodes: ");
+        for (i=0;i<nav->n;i++)
+            if (nav->eph[i].sat==sat)
+                printf("%3d ",nav->eph[i].iode);
+    }//*/
+
+
     for (i=0;i<nav->n;i++) {
         if (nav->eph[i].sat!=sat) continue;
         if (iode>=0&&nav->eph[i].iode!=iode) continue;
@@ -552,25 +562,44 @@ static int satpos_sbas(gtime_t time, gtime_t teph, int sat, const nav_t *nav,
 {
     const sbssatp_t *sbs;
     int i;
-    
-    trace(4,"satpos_sbas: time=%s sat=%2d\n",time_str(time,3),sat);
+
+    trace(4,"satpos_sbas: time=%s sat=%3d\n",time_str(time,3),sat);
+    //DEBUG
+    /*if (satsys(sat,NULL)!=SYS_GAL && satsys(sat,NULL)!=SYS_SBS)
+        printf("satpos_sbas: sat=%3d ",sat);//*/
     
     /* search sbas satellite correciton */
     for (i=0;i<nav->sbssat.nsat;i++) {
         sbs=nav->sbssat.sat+i;
         if (sbs->sat==sat) break;
     }
-    if (i>=nav->sbssat.nsat) {
-        trace(2,"no sbas correction for orbit: %s sat=%2d\n",time_str(time,0),sat);
-        ephpos(time,teph,sat,nav,-1,rs,dts,var,svh);
-        *svh=-2;// JV: error code for detecting available ephemeris without sbas correction
+    if (i>=nav->sbssat.nsat || sbs->lcorr.iode < 0) {
+        trace(2,"no sbas correction for orbit: %s sat=%3d\n",time_str(time,0),sat);
+        //DEBUG
+        /*if (satsys(sat,NULL)!=SYS_GAL && satsys(sat,NULL)!=SYS_SBS)
+            printf("no sbas correction (i>=nav->sbssat.nsat || sbs->lcorr.iode < 0)\n");//*/
+        if (ephpos(time,teph,sat,nav,-1,rs,dts,var,svh))
+            *svh=-2;// JV: error code for detecting available ephemeris without sbas correction
+        else
+        {
+            *svh=-1;
+        //    printf("satpos_sbas: no broadcast eph for sat %2d\n",sat);
+        }
         return 0;
     }
     /* satellite postion and clock by broadcast ephemeris */
-    if (!ephpos(time,teph,sat,nav,sbs->lcorr.iode,rs,dts,var,svh)) return 0;
+    //printf("lcorr.iode=%3d ",sbs->lcorr.iode);
+    if (!ephpos(time,teph,sat,nav,sbs->lcorr.iode,rs,dts,var,svh)){
+        //printf("not found\n");
+        return 0;
+    }
     
     /* sbas satellite correction (long term and fast) */
-    if (sbssatcorr(time,sat,nav,rs,dts,var)) return 1;
+    if (sbssatcorr(time,sat,nav,rs,dts,var)){
+        //printf("OK!\n");
+        return 1;
+    }
+    //printf("no sbas correction (!sbssatcorr())\n");
     *svh=-1;
     return 0;
 }
@@ -739,8 +768,13 @@ extern void satposs(gtime_t teph, const obsd_t *obs, int n, const nav_t *nav,
     gtime_t time[2*MAXOBS]={{0}};
     double dt,pr;
     int i,j;
-    
+
     trace(3,"satposs : teph=%s n=%d ephopt=%d\n",time_str(teph,3),n,ephopt);
+    /*if (ephopt==2)
+    {
+        printf("====satposs : teph=%s n=%d ephopt=%d\n",time_str(teph,3),n,ephopt);
+        print_sbassat(&nav->sbssat);
+    }*/
     
     for (i=0;i<n&&i<2*MAXOBS;i++) {
         for (j=0;j<6;j++) rs [j+i*6]=0.0;
@@ -781,6 +815,9 @@ extern void satposs(gtime_t teph, const obsd_t *obs, int n, const nav_t *nav,
         trace(4,"%s sat=%2d rs=%13.3f %13.3f %13.3f dts=%12.3f var=%7.3f svh=%02X\n",
               time_str(time[i],6),obs[i].sat,rs[i*6],rs[1+i*6],rs[2+i*6],
               dts[i*2]*1E9,var[i],svh[i]);
+        //printf("%s sat=%2d rs=%13.3f %13.3f %13.3f dts=%12.3f var=%7.3f svh=%02X\n",
+        //      time_str(time[i],6),obs[i].sat,rs[i*6],rs[1+i*6],rs[2+i*6],
+        //      dts[i*2]*1E9,var[i],svh[i]);
     }
 }
 /* select satellite ephemeris --------------------------------------------------
diff --git a/src/pntpos.c b/src/pntpos.c
index 60e0bf165c06c26239935c0cc08385ad8d0af978..ddaf284c4d16c1812e28a87c2af21299c23760ad 100644
--- a/src/pntpos.c
+++ b/src/pntpos.c
@@ -114,7 +114,20 @@ extern double prange(const obsd_t *obs, const nav_t *nav, const double *azel,
     }
     if (opt->ionoopt==IONOOPT_IFLC) { /* dual-frequency */
         
-        if (P1==0.0||P2==0.0) return 0.0;
+//        if (sys&SYS_GPS)
+//            printf("prange iono-free GPS : ");
+//        else if (sys&SYS_GAL)
+//            printf("prange iono-free GAL : ");
+//        else if (sys&SYS_GLO)
+//            printf("prange iono-free GLO : ");
+//        else
+//            printf("prange iono-free %i : ", sys);
+
+        if (P1==0.0||P2==0.0){
+            //printf("0 pseudorange! P1 = %f P2 = %f\n", P1, P2);
+            return 0.0;
+        }
+        //printf("P1_P2 = %f, P1_C1=%f, P2_C2=%f\n", sys, P1_P2, P1_C1, P2_C2);
         if (obs->code[i]==CODE_L1C) P1+=P1_C1; /* C1->P1 */
         if (obs->code[j]==CODE_L2C) P2+=P2_C2; /* C2->P2 */
         
@@ -232,9 +245,13 @@ static int rescode(int iter, const obsd_t *obs, int n, const double *rs,
     
     ecef2pos(rr,pos);
     
+    //printf("////////// rescode iter=%i\n",iter);
+
     for (i=*ns=0;i<n&&i<MAXOBS;i++) {
         vsat[i]=0; azel[i*2]=azel[1+i*2]=resp[i]=0.0;
         
+        //printf("\tsat %3d - ", obs[i].sat);
+
         if (!(sys=satsys(obs[i].sat,NULL)))
             continue;
         
@@ -248,20 +265,31 @@ static int rescode(int iter, const obsd_t *obs, int n, const double *rs,
         /* geometric distance/azimuth/elevation angle */
         if ((r=geodist(rs+i*6,rr,e))<=0.0||
             satazel(pos,e,azel+i*2)<opt->elmin)
+        {
+            //printf("discarding because of distance r = %f / elevation = %f\n", r, satazel(pos,e,azel+i*2)*R2D);
             continue;
-        
+        }
         /* psudorange with code bias correction */
         if ((P=prange(obs+i,nav,azel+i*2,iter,opt,&vmeas))==0.0)
+        {
+            //printf("discarding because of null prange\n");
             continue;
+        }
         
         /* excluded satellite? */
         if (satexclude(obs[i].sat,vare[i],svh[i],opt))
+        {
+            //printf("excluded\n");
             continue;
+        }
         
         /* ionospheric corrections */
         if (!ionocorr(obs[i].time,nav,obs[i].sat,pos,azel+i*2,
                       iter>0?opt->ionoopt:IONOOPT_BRDC,&dion,&vion))
+        {
+            //printf("discarding because error in iono corr\n");
             continue;
+        }
         
         /* GPS-L1 -> L1/B1 */
         if ((lam_L1=nav->lam[obs[i].sat-1][0])>0.0) {
@@ -270,8 +298,12 @@ static int rescode(int iter, const obsd_t *obs, int n, const double *rs,
         /* tropospheric corrections */
         if (!tropcorr(obs[i].time,nav,pos,azel+i*2,
                       iter>0?opt->tropopt:TROPOPT_SAAS,&dtrp,&vtrp))
+        {
+            //printf("discarding because error in tropo corr\n");
             continue;
+        }
 
+        //printf(" OK!\n");
         /* pseudorange residual */
         v[nv]=P-(r+dtr-CLIGHT*dts[i*2]+dion+dtrp);
         
@@ -330,6 +362,20 @@ static int rescode(int iter, const obsd_t *obs, int n, const double *rs,
         for (j=0;j<NX;j++) H[j+nv*NX]=j==i+3?1.0:0.0;
         var[nv++]=0.01;
     }
+    // DEBUGGING ================
+    /*{
+        printf("H:\n");
+        for (int row = 0; row < nv; row++)
+            printf("\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n", H[row*NX],
+                                                     H[row*NX+1],
+                                                     H[row*NX+2],
+                                                     H[row*NX+3],
+                                                     H[row*NX+4],
+                                                     H[row*NX+5],
+                                                     H[row*NX+6]);
+        printf("\n");
+
+    }//*/
     return nv;
 }
 /* validate solution ---------------------------------------------------------*/
@@ -385,7 +431,8 @@ static int estpos(const obsd_t *obs, int n, const double *rs, const double *dts,
                    &ns);
         
         if (nv<NX) {
-            sprintf(msg,"lack of valid sats ns=%d",nv);
+            //sprintf(msg,"lack of valid sats ns=%d",nv);
+            sprintf(msg,"lack of valid sats ns=%d, nv=%2d",ns, nv);//JV
             break;
         }
         /* weight by variance */
@@ -397,7 +444,6 @@ static int estpos(const obsd_t *obs, int n, const double *rs, const double *dts,
         /* least square estimation */
         if ((info=lsq(H,v,NX,nv,dx,Q))) {
             sprintf(msg,"lsq error info=%d",info);
-            break;
         }
         for (j=0;j<NX;j++) x[j]+=dx[j];
         
diff --git a/src/rcv/ublox.c b/src/rcv/ublox.c
index 1fe6734180985e4680a79ee3685ad5b1f9f6188c..1e07b25a68d4b3841b27196c2344244a873f0aa2 100644
--- a/src/rcv/ublox.c
+++ b/src/rcv/ublox.c
@@ -210,8 +210,8 @@ static int sig_idx(int sys, int code)
     else if (sys == SYS_GAL) {
         if (code==CODE_L1C) return 1;
         if (code==CODE_L1B) return 1;
-        if (code==CODE_L7I) return 2; /* E5bI */
-        if (code==CODE_L7Q) return 2; /* E5bQ */
+        if (code==CODE_L7I) return 3; /* E5bI */
+        if (code==CODE_L7Q) return 3; /* E5bQ */
     }
     else if (sys == SYS_QZS) {
         if (code==CODE_L1C) return 1;
@@ -262,7 +262,7 @@ static int decode_rxmraw(raw_t *raw)
     char *q;
     
     trace(4,"decode_rxmraw: len=%d\n",raw->len);
-    //printf("decode_rxmraw: len=%d\n",raw->len);
+    //printf("\tdecode_rxmraw: len=%d\n",raw->len);
     
     if (raw->outtype) {
         sprintf(raw->msgtype,"UBX RXM-RAW   (%4d): nsat=%d",raw->len,U1(p+6));
@@ -340,7 +340,7 @@ static int decode_rxmrawx(raw_t *raw)
     int week,nmeas,ver,gnss,svid,sigid,frqid,lockt,cn0,cpstd,prstd,tstat;
 
     trace(4,"decode_rxmrawx: len=%d\n",raw->len);
-    //printf("decode_rxmrawx: len=%d\n",raw->len);
+    //printf("\tdecode_rxmrawx: len=%d\n",raw->len);
     
     if (raw->len<24) {
         trace(2,"ubx rxmrawx length error: len=%d\n",raw->len);
@@ -399,8 +399,14 @@ static int decode_rxmrawx(raw_t *raw)
         cpstd=U1(p+28)&15; /* cpStdev (m) */
         prstd=1<<(prstd>=5?prstd-5:0); /* prstd=2^(x-5) */
         tstat=U1(p+30);    /* trkStat */
-        if (!(tstat&1)) P=0.0;
-        if (!(tstat&2)||L==-0.5||cpstd>cpstd_valid) L=0.0; /* invalid phase */
+        if (!(tstat&1)){
+            //printf("tstat&1 invalid psedorange setting P=0.0\n");
+            P=0.0;
+        }
+        if (!(tstat&2)||L==-0.5||cpstd>cpstd_valid){
+            //printf("tstat&2 invalid phase setting L=0.0\n");
+            L=0.0; /* invalid phase */
+        }
 
         if (!(sys=ubx_sys(gnss))) {
             trace(2,"ubx rxmrawx: system error gnss=%d\n", gnss);
@@ -517,6 +523,7 @@ static int decode_ephem(int sat, raw_t *raw)
     eph.sat=sat;
     raw->nav.eph[sat-1]=eph;
     raw->ephsat=sat;
+    //printf("\tdecode_ephem sat %3d eph.iode = %d\n", sat, eph.iode);
     return 2;
 }
 /* decode almanac and ion/utc ------------------------------------------------*/
@@ -563,7 +570,7 @@ static int decode_rxmsfrb(raw_t *raw)
     unsigned char *p=raw->buff+6;
 
     trace(4,"decode_rxmsfrb: len=%d\n",raw->len);
-    //printf("decode_rxmsfrb: len=%d\n",raw->len);
+    //printf("\tdecode_rxmsfrb: len=%d\n",raw->len);
     
     if (raw->outtype) {
         sprintf(raw->msgtype,"UBX RXM-SFRB  (%4d): prn=%2d",raw->len,U1(p+1));
@@ -599,7 +606,7 @@ static int decode_navsol(raw_t *raw)
     unsigned char *p=raw->buff+6;
 
     trace(4,"decode_navsol: len=%d\n",raw->len);
-    //printf("decode_navsol: len=%d\n",raw->len);
+    //printf("\tdecode_navsol: len=%d\n",raw->len);
     
     if (raw->outtype) {
         sprintf(raw->msgtype,"UBX NAV-SOL   (%4d):",raw->len);
@@ -619,7 +626,7 @@ static int decode_navtime(raw_t *raw)
     unsigned char *p=raw->buff+6;
 
     trace(4,"decode_navtime: len=%d\n",raw->len);
-    //printf("decode_navtime: len=%d\n",raw->len);
+    //printf("\tdecode_navtime: len=%d\n",raw->len);
     
     if (raw->outtype) {
         sprintf(raw->msgtype,"UBX NAV-TIME  (%4d):",raw->len);
@@ -647,7 +654,7 @@ static int decode_trkmeas(raw_t *raw)
     const char P_adj_fw3[]={11,13,13,14,14,13,12,10, 8, 6, 5, 5, 5, 7, 0};  /* fw 3.01 */
 
     trace(4,"decode_trkmeas: len=%d\n",raw->len);
-    //printf("decode_trkmeas: len=%d\n",raw->len);
+    //printf("\tdecode_trkmeas: len=%d\n",raw->len);
     
     if (raw->outtype) {
         sprintf(raw->msgtype,"UBX TRK-MEAS  (%4d):",raw->len);
@@ -780,7 +787,7 @@ static int decode_trkd5(raw_t *raw)
     unsigned char *p=raw->buff+6;
 
     trace(4,"decode_trkd5: len=%d\n",raw->len);
-    //printf("decode_trkd5: len=%d\n",raw->len);
+    //printf("\tdecode_trkd5: len=%d\n",raw->len);
     
     if (raw->outtype) {
         sprintf(raw->msgtype,"UBX TRK-D5    (%4d):",raw->len);
@@ -897,24 +904,24 @@ static int decode_nav(raw_t *raw, int sat, int off)
         //printf("ubx rawsfrbx length error: sat=%d len=%d\n",sat,raw->len);
         return -1;
     }
-    //printf("decode_nav: p   = %hhx\n", *p);
-    //printf("decode_nav: p+1 = %hhx\n", *(p+1));
-    //printf("decode_nav: p+2 = %hhx\n", *(p+2));
-    //printf("decode_nav: p+3 = %hhx\n", *(p+3));
-    //printf("decode_nav: U4(p)      = %lu\n",U4(p));
-    //printf("decode_nav: U4(p)>>24  = %lu\n",U4(p)>>24);
-//    printf("decode_nav: U4(p+4)      = %lu\n",U4(p+4));
-//    printf("decode_nav: U4(p+4)>>24  = %lu\n",U4(p+4)>>24);
-//    printf("decode_nav: U4(p+8)      = %lu\n",U4(p+8));
-//    printf("decode_nav: U4(p+8)>>24  = %lu\n",U4(p+8)>>24);
-//    printf("decode_nav: U4(p+12)     = %lu\n",U4(p+12));
-//    printf("decode_nav: U4(p+12)>>24 = %lu\n",U4(p+12)>>24);
-//    printf("decode_nav: U4(p+16)     = %lu\n",U4(p+16));
-//    printf("decode_nav: U4(p+16)>>24 = %lu\n",U4(p+16)>>24);
-//    printf("decode_nav: U4(p+20)     = %lu\n",U4(p+20));
-//    printf("decode_nav: U4(p+20)>>24 = %lu\n",U4(p+20)>>24);
-//    printf("decode_nav: U4(p+24)     = %lu\n",U4(p+24));
-//    printf("decode_nav: U4(p+24)>>24 = %lu\n",U4(p+24)>>24);
+    //printf("\tdecode_nav: p   = %hhx\n", *p);
+    //printf("\tdecode_nav: p+1 = %hhx\n", *(p+1));
+    //printf("\tdecode_nav: p+2 = %hhx\n", *(p+2));
+    //printf("\tdecode_nav: p+3 = %hhx\n", *(p+3));
+    //printf("\tdecode_nav: U4(p)      = %lu\n",U4(p));
+    //printf("\tdecode_nav: U4(p)>>24  = %lu\n",U4(p)>>24);
+//    printf("\tdecode_nav: U4(p+4)      = %lu\n",U4(p+4));
+//    printf("\tdecode_nav: U4(p+4)>>24  = %lu\n",U4(p+4)>>24);
+//    printf("\tdecode_nav: U4(p+8)      = %lu\n",U4(p+8));
+//    printf("\tdecode_nav: U4(p+8)>>24  = %lu\n",U4(p+8)>>24);
+//    printf("\tdecode_nav: U4(p+12)     = %lu\n",U4(p+12));
+//    printf("\tdecode_nav: U4(p+12)>>24 = %lu\n",U4(p+12)>>24);
+//    printf("\tdecode_nav: U4(p+16)     = %lu\n",U4(p+16));
+//    printf("\tdecode_nav: U4(p+16)>>24 = %lu\n",U4(p+16)>>24);
+//    printf("\tdecode_nav: U4(p+20)     = %lu\n",U4(p+20));
+//    printf("\tdecode_nav: U4(p+20)>>24 = %lu\n",U4(p+20)>>24);
+//    printf("\tdecode_nav: U4(p+24)     = %lu\n",U4(p+24));
+//    printf("\tdecode_nav: U4(p+24)>>24 = %lu\n",U4(p+24)>>24);
     if ((U4(p)>>24)==PREAMB_CNAV) {
         trace(3,"ubx rawsfrbx cnav not supported sat=%d prn=%d\n",sat,
               (U4(p)>>18)&0x3F);
@@ -924,7 +931,7 @@ static int decode_nav(raw_t *raw, int sat, int off)
     for (i=0;i<10;i++,p+=4) words[i]=U4(p)>>6; /* 24 bits without parity */
     
     id=(words[1]>>2)&7;
-    //printf("decode_nav: sat=%2d id=%d len=%d\n",sat,id,raw->len);
+    //printf("\tdecode_nav: sat=%2d id=%d len=%d\n",sat,id,raw->len);
     if (id<1||5<id) {
         trace(2,"ubx rawsfrbx subfrm id error: sat=%2d id=%d len=%d\n",sat,id,
               raw->len);
@@ -942,7 +949,7 @@ static int decode_nav(raw_t *raw, int sat, int off)
 /* decode galileo navigation data --------------------------------------------*/
 static int decode_enav(raw_t *raw, int sat, int off)
 {
-    //printf("decode_enav\n");
+    //printf("\tdecode_enav\n");
     eph_t eph={0};
     unsigned char *p=raw->buff+6+off,buff[32],crc_buff[26]={0};
     int i,j,k,part1,page1,part2,page2,type;
@@ -1015,12 +1022,13 @@ static int decode_enav(raw_t *raw, int sat, int off)
     eph.sat=sat;
     raw->nav.eph[sat-1]=eph;
     raw->ephsat=sat;
+    //printf("\tdecode_enav sat %3d eph.iode = %d\n", sat, eph.iode);
     return 2;
 }
 /* decode beidou navigation data ---------------------------------------------*/
 static int decode_cnav(raw_t *raw, int sat, int off)
 {
-    //printf("decode_cnav\n");
+    //printf("\tdecode_cnav\n");
     eph_t eph={0};
     unsigned int words[10];
     int i,id,pgn,prn;
@@ -1081,7 +1089,7 @@ static int decode_cnav(raw_t *raw, int sat, int off)
 /* decode glonass navigation data --------------------------------------------*/
 static int decode_gnav(raw_t *raw, int sat, int off, int frq)
 {
-    //printf("decode_gnav\n");
+    //printf("\tdecode_gnav\n");
     geph_t geph={0};
     int i,j,k,m,prn;
     unsigned char *p=raw->buff+6+off,buff[64],*fid;
@@ -1128,12 +1136,13 @@ static int decode_gnav(raw_t *raw, int sat, int off, int frq)
     }
     raw->nav.geph[prn-1]=geph;
     raw->ephsat=sat;
+    //printf("\tdecode_gnav geph.iode = %d\n", geph.iode);
     return 2;
 }
 /* decode sbas navigation data -----------------------------------------------*/
 static int decode_snav(raw_t *raw, int sat, int off)
 {
-    //printf("decode_snav\n");
+    //printf("\tdecode_snav\n");
     int i,j,k,prn,tow,week;
     unsigned char *p=raw->buff+6+off,buff[64];
     
@@ -1161,7 +1170,7 @@ static int decode_rxmsfrbx(raw_t *raw)
     unsigned char *p=raw->buff+6;
 
     trace(4,"decode_rxmsfrbx: len=%d\n",raw->len);
-    //printf("decode_rxmsfrbx: len=%d\n",raw->len);
+    //printf("\tdecode_rxmsfrbx: len=%d\n",raw->len);
     
     if (raw->outtype) {
         sprintf(raw->msgtype,"UBX RXM-SFRBX (%4d): sys=%d prn=%3d",raw->len,
@@ -1175,7 +1184,7 @@ static int decode_rxmsfrbx(raw_t *raw)
     prn=U1(p+1)+(sys==SYS_QZS?192:0);
     if (!(sat=satno(sys,prn))) {
         if (sys==SYS_GLO&&prn==255) {
-            //printf("decode_rxmsfrbx: GLO and prn 255\n",sys,prn);
+            //printf("\tdecode_rxmsfrbx: GLO and prn 255\n",sys,prn);
             return 0; /* suppress error for unknown glo satellite */
         }
         trace(2,"ubx rxmsfrbx sat number error: sys=%d prn=%d\n",sys,prn);
@@ -1199,7 +1208,7 @@ static int decode_trksfrbx(raw_t *raw)
     unsigned char *p=raw->buff+6;
 
     trace(4,"decode_trksfrbx: len=%d\n",raw->len);
-    //printf("decode_trksfrbx: len=%d\n",raw->len);
+    //printf("\tdecode_trksfrbx: len=%d\n",raw->len);
     
     if (raw->outtype) {
         sprintf(raw->msgtype,"UBX TRK-SFRBX (%4d): sys=%d prn=%3d",raw->len,
@@ -1236,7 +1245,7 @@ static int decode_timtm2(raw_t *raw)
     double tr[6],tf[6];
 
     trace(4, "decode_timtm2: len=%d\n", raw->len);
-    //printf("decode_timtm2: len=%d\n", raw->len);
+    //printf("\tdecode_timtm2: len=%d\n", raw->len);
 
     if (raw->outtype) {
         sprintf(raw->msgtype, "UBX TIM-TM2 (%4d)", raw->len);
@@ -1496,7 +1505,9 @@ extern int gen_ubx(const char *msg, unsigned char *buff)
         {FU1,FU1},                                /* RINV */
         {FU1,FU1,FU2,FU2,FU1,FU1,FU2,FU2,FU2,FU2,FU4}, /* SMGR */
         {FU1,FU1,FU2,FI4,FI4,FI4,FU4,FU4,FU4},    /* TMODE2 */
-        {FU1,FU1,FU2,FI4,FI4,FI4,FU4,FU4,FU4},    /* TMODE3 */
+        //{FU1,FU1,FU2,FI4,FI4,FI4,FU4,FU4,FU4},    /* TMODE3 */ changed according to RTKLIB pull request 334: https://github.com/tomojitakasu/RTKLIB/pull/334
+        {FU1,FU1,FU2,FI4,FI4,FI4,FI1,FI1,FI1,FU1,FU4,FU4,FU4,FU1,FU1,FU1,FU1,FU1,
+         FU1,FU1,FU1},                              /* TMODE3 */
         {FU1,FU1,FU1,FU1,FI2,FI2,FU4,FU4,FU4,FU4,FI4,FU4}, /* TPS */
         {FU1,FU1,FU1,FU1,FU4,FU4,FU4,FU4,FU4},     /* TXSLOT */
         {FU1,FU1,FU1,FU1}                          /* VALSET */ /* Skip configuration for now */
diff --git a/src/rtkcmn.c b/src/rtkcmn.c
index f8565bdf7d18dba6abbd6e9c235cb8227c94ec8a..419a8a50449a957d112f281ea994e54b8a5f7349 100644
--- a/src/rtkcmn.c
+++ b/src/rtkcmn.c
@@ -535,19 +535,33 @@ extern int satexclude(int sat, double var, int svh, const prcopt_t *opt)
 {
     int sys=satsys(sat,NULL);
     
-    if (svh<0) return 1; /* ephemeris unavailable */
+    if (svh<0)
+    {
+        //printf("svh < 0 (eph unavailable) ");
+        return 1; /* ephemeris unavailable */
+    }
     
     if (opt) {
-        if (opt->exsats[sat-1]==1) return 1; /* excluded satellite */
+        if (opt->exsats[sat-1]==1)
+        {
+            //printf("in exsats list! ");
+            return 1; /* excluded satellite */
+        }
         if (opt->exsats[sat-1]==2) return 0; /* included satellite */
-        if (!(sys&opt->navsys)) return 1; /* unselected sat sys */
+        if (!(sys&opt->navsys))
+        {
+            //printf("constellation not used! ");
+            return 1; /* unselected sat sys */
+        }
     }
     if (sys==SYS_QZS) svh&=0xFE; /* mask QZSS LEX health */
     if (svh) {
+        //printf("unhealthy satellite! ");
         trace(3,"unhealthy satellite: sat=%3d svh=%02X\n",sat,svh);
         return 1;
     }
     if (var>MAX_VAR_EPH) {
+        //printf("invalid ura satellite! ");
         trace(3,"invalid ura satellite: sat=%3d ura=%.2f\n",sat,sqrt(var));
         return 1;
     }
@@ -2697,6 +2711,14 @@ extern void uniqnav(nav_t *nav)
         nav->lam[i][j]=satwavelen(i+1,j,nav);
     }
 }
+/* update navigation data ----------------------------------------------------*/
+extern void updatenav(nav_t *nav)
+{
+    int i,j;
+    for (i=0;i<MAXSAT;i++) for (j=0;j<NFREQ;j++) {
+        nav->lam[i][j]=satwavelen(i+1,j,nav);
+    }
+}
 /* compare observation data -------------------------------------------------*/
 static int cmpobs(const void *p1, const void *p2)
 {
diff --git a/src/rtklib.h b/src/rtklib.h
index d7bf3a162b8b8bf0cff291e6958ec3078380b4c8..e28fdac31028e939f79e108ae3b012d48964a63b 100644
--- a/src/rtklib.h
+++ b/src/rtklib.h
@@ -1821,6 +1821,7 @@ EXPORT int sbsioncorr(gtime_t time, const nav_t *nav, const double *pos,
                       const double *azel, double *delay, double *var);
 EXPORT double sbstropcorr(gtime_t time, const double *pos, const double *azel,
                           double *var);
+EXPORT void print_sbassat(const sbssat_t *sbssat);
 
 /* options functions ---------------------------------------------------------*/
 EXPORT opt_t *searchopt(const char *name, const opt_t *opts);
diff --git a/src/rtksvr.c b/src/rtksvr.c
index 34a33607185a67c118e2e119cd70b1f0788e0093..c2954ac48cfef14faf57aa596356aeb4fa71ca79 100644
--- a/src/rtksvr.c
+++ b/src/rtksvr.c
@@ -112,16 +112,16 @@ static void writesol(rtksvr_t *svr, int index)
 static void updatefcn(rtksvr_t *svr)
 {
     int i,j,sat,frq;
-    
+
     for (i=0;i<MAXPRNGLO;i++) {
         sat=satno(SYS_GLO,i+1);
-        
+
         for (j=0,frq=-999;j<3;j++) {
             if (svr->raw[j].nav.geph[i].sat!=sat) continue;
             frq=svr->raw[j].nav.geph[i].frq;
         }
         if (frq<-7||frq>6) continue;
-        
+
         for (j=0;j<3;j++) {
             if (svr->raw[j].nav.geph[i].sat==sat) continue;
             svr->raw[j].nav.geph[i].sat=sat;
diff --git a/src/sbas.c b/src/sbas.c
index 6920ffbc99a27e037b13f1285b0fe35b38daf70d..b36c8c2b8c6b4182ceb97e87377dc1d9247e058a 100644
--- a/src/sbas.c
+++ b/src/sbas.c
@@ -123,14 +123,79 @@ static double degfcorr(int ai)
     };
     return 0<ai&&ai<=15?degf[ai]:0.0058;
 }
+/* print sbsfcorr_t (JV) -------------------------------------------------------*/
+static void print_sbsfcorr(const sbsfcorr_t *sbsfcorr)
+{
+    printf("iodf: %3d, udre: %2d, [%f, %f, %f, %d]\n",
+           sbsfcorr->iodf,
+           sbsfcorr->udre-1,//udre = UDRE+1
+           sbsfcorr->prc,
+           sbsfcorr->rrc,
+           sbsfcorr->dt,
+           sbsfcorr->ai);
+}
+/* print sbslcorr_t (JV) -------------------------------------------------------*/
+static void print_sbslcorr(const sbslcorr_t *sbslcorr)
+{
+    printf("iode: %3d,           [%f, %f, %f | %f, %f, %f | %f, %f]\n",
+           sbslcorr->iode,
+           sbslcorr->dpos[0],sbslcorr->dpos[1],sbslcorr->dpos[2],
+           sbslcorr->dvel[0],sbslcorr->dvel[1],sbslcorr->dvel[2],
+           sbslcorr->daf0,sbslcorr->daf1);
+}
+/* print sbssatp_t (JV) -------------------------------------------------------*/
+static void print_sbssatp(const sbssatp_t *sbssatp)
+{
+    printf("  sat %3d:", sbssatp->sat); /* satellite number */
+    printf("  fcorr:  ");
+    print_sbsfcorr(&sbssatp->fcorr);/* fast correction */
+    if (sbssatp->lcorr.iode > 0)
+    {
+        printf("            lcorr:  ");
+        print_sbslcorr(&sbssatp->lcorr);/* long term correction */
+    }
+}
+/* print sbssat_t (JV) -------------------------------------------------------*/
+extern void print_sbassat(const sbssat_t *sbssat)
+{
+    printf("iodp: %d\n", sbssat->iodp); /* IODP (issue of date mask) */
+    printf("tlat: %d\n", sbssat->tlat); /* system latency (s) */
+    printf("nsat: %d\n", sbssat->nsat); /* number of satellites */
+    printf("sat[]:\n");
+    for (int i = 0; i < sbssat->nsat; i++)
+        print_sbssatp(&sbssat->sat[i]);
+}
 /* decode type 1: prn masks --------------------------------------------------*/
 static int decode_sbstype1(const sbsmsg_t *msg, sbssat_t *sbssat)
 {
-    int i,n,sat;
+    int i,i_new,i_old,new_n,n,sat;
+    sbssatp_t sbssat_zero = { 0 };
+    sbssat_zero.lcorr.iode = -1;
+    sbssat_zero.fcorr.udre = 15; // udre=UDRE+1: udre=15->UDRE=14 (not monitored)
     
     trace(4,"decode_sbstype1:\n");
-    
-    for (i=1,n=0;i<=210&&n<MAXSAT;i++) {
+    //printf("  decode_sbstype1: \n");
+    
+    // old_sat to store old data (to be used if changing IODP, prn mask)
+    sbssatp_t old_sat[MAXSAT];
+    sbssatp_t new_sat[MAXSAT];
+    int old_n = sbssat->nsat;
+    // store and remove old sat (if changing IODP)
+    //if (sbssat->iodp!=getbitu(msg->msg,224,2))
+    {
+        for (i=0; i<MAXSAT;i++)
+        {
+            // store old
+            old_sat[i] = sbssat->sat[i];
+            //printf("old_sat[%d].sat = %d\n", i, old_sat[i].sat);
+            // remove current
+            sbssat->sat[i] = sbssat_zero;
+            // initialize new
+            new_sat[i] = sbssat_zero;
+        }
+    }
+
+    for (i=1,new_n=0;i<=210&&new_n<MAXSAT;i++) {
         if (getbitu(msg->msg,13+i,1)) {
            if      (i<= 37) sat=satno(SYS_GPS,i);    /*   0- 37: gps */
            else if (i<= 61) sat=satno(SYS_GLO,i-37); /*  38- 61: glonass */
@@ -140,13 +205,75 @@ static int decode_sbstype1(const sbsmsg_t *msg, sbssat_t *sbssat)
            else if (i<=192) sat=satno(SYS_SBS,i+10); /* 183-192: qzss ref [2] */
            else if (i<=202) sat=satno(SYS_QZS,i);    /* 193-202: qzss ref [2] */
            else             sat=0;                   /* 203-   : reserved */
-           sbssat->sat[n++].sat=sat;
+           new_sat[new_n++].sat=sat;
+           //sbssat->sat[n++].sat=sat;
+           //printf("    sat: %d\n",sat);
+           //printf("new_sat[%d].sat = %d\n", new_n-1, new_sat[new_n-1].sat);
         }
     }
+
+    // DEBUG
+    /*if (sbssat->iodp==getbitu(msg->msg,224,2))
+    {
+        if (new_n != old_n)
+            printf("!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!\nnew_n != old_n!");
+        else
+            for (i=0; i<new_n;i++)
+                if (old_sat[i].sat != new_sat[i].sat)
+                    printf("!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!\n!!!!!!!!!!!!!!!!!!!!\ni=%d different sats!",i);
+    }
+    if (sbssat->iodp!=getbitu(msg->msg,224,2))
+        printf(">>>>>>>>>>>>>>>>>>>>>>>\n>>>>>>>>>>>>>>>>>>>>>>>\n>>>>>>>>>>>>>>>>>>>>>>>\nIODP CHANGED\n>>>>>>>>>>>>>>>>>>>>>>>\n>>>>>>>>>>>>>>>>>>>>>>>\n>>>>>>>>>>>>>>>>>>>>>>>\n");
+    //*/
+
+    // merge new and old data
+    //if (new_n != old_n || sbssat->iodp!=getbitu(msg->msg,224,2))
+    //{
+        for (n=0,i_new=0, i_old=0; n<MAXSAT;)
+        {
+            // no more new nor old
+            if (i_new==new_n && i_old==old_n)
+                break;
+            // no more new
+            else if (i_new==new_n)
+            {
+                sbssat->sat[n++] = old_sat[i_old];
+                i_old++;
+            }
+            // no more old
+            else if (i_old==old_n)
+            {
+                sbssat->sat[n++] = new_sat[i_new];
+                i_new++;
+            }
+            // more new and old
+            else
+            {
+                if (old_sat[i_old].sat == new_sat[i_new].sat)
+                {
+                    sbssat->sat[n++] = old_sat[i_old];
+                    i_new++;
+                    i_old++;
+                }
+                else if (old_sat[i_old].sat > new_sat[i_new].sat)
+                {
+                    sbssat->sat[n++] = new_sat[i_new];
+                    i_new++;
+                }
+                else
+                {
+                    sbssat->sat[n++] = old_sat[i_old];
+                    i_old++;
+                }
+            }
+            //printf("sat[%d].sat = %d\n", n-1, sbssat->sat[n-1].sat);
+        }
+    //}
     sbssat->iodp=getbitu(msg->msg,224,2);
     sbssat->nsat=n;
-    
+
     trace(5,"decode_sbstype1: nprn=%d iodp=%d\n",n,sbssat->iodp);
+    //printf("  decode_sbstype1: %d sats, iodp=%d\n",n,sbssat->iodp);
     return 1;
 }
 /* decode type 2-5,0: fast corrections ---------------------------------------*/
@@ -157,11 +284,15 @@ static int decode_sbstype2(const sbsmsg_t *msg, sbssat_t *sbssat)
     gtime_t t0;
     
     trace(4,"decode_sbstype2:\n");
-    
-    if (sbssat->iodp!=(int)getbitu(msg->msg,16,2)) return 0;
+
+    if (sbssat->iodp!=(int)getbitu(msg->msg,16,2)){
+        //printf("decode_sbstype24 wrong iodp %3d (current %3d)\n", (int)getbitu(msg->msg,16,2), sbssat->iodp);
+        return 0;
+    }
     
     type=getbitu(msg->msg, 8,6);
     iodf=getbitu(msg->msg,14,2);
+    //printf("  decode_sbstype2: type=%d iodf=%d\n",type,iodf);
     
     for (i=0;i<13;i++) {
         if ((j=13*((type==0?2:type)-2)+i)>=sbssat->nsat) break;
@@ -181,6 +312,7 @@ static int decode_sbstype2(const sbsmsg_t *msg, sbssat_t *sbssat)
             sbssat->sat[j].fcorr.dt=dt;
         }
         sbssat->sat[j].fcorr.iodf=iodf;
+        //printf("    sat %d\n",sbssat->sat[j].sat);
     }
     trace(5,"decode_sbstype2: type=%d iodf=%d\n",type,iodf);
     return 1;
@@ -201,6 +333,7 @@ static int decode_sbstype6(const sbsmsg_t *msg, sbssat_t *sbssat)
         sbssat->sat[i].fcorr.udre=udre+1;
     }
     trace(5,"decode_sbstype6: iodf=%d %d %d %d\n",iodf[0],iodf[1],iodf[2],iodf[3]);
+    //printf("  decode_sbstype6: iodf=%d %d %d %d\n",iodf[0],iodf[1],iodf[2],iodf[3]);
     return 1;
 }
 /* decode type 7: fast correction degradation factor -------------------------*/
@@ -210,8 +343,10 @@ static int decode_sbstype7(const sbsmsg_t *msg, sbssat_t *sbssat)
     
     trace(4,"decode_sbstype7\n");
     
-    if (sbssat->iodp!=(int)getbitu(msg->msg,18,2)) return 0;
-    
+    if (sbssat->iodp!=(int)getbitu(msg->msg,18,2)){
+        //printf("decode_sbstype24 wrong iodp %3d (current %3d)\n", (int)getbitu(msg->msg,18,2), sbssat->iodp);
+        return 0;
+    }
     sbssat->tlat=getbitu(msg->msg,14,4);
     
     for (i=0;i<sbssat->nsat&&i<MAXSAT;i++) {
@@ -301,6 +436,7 @@ static int decode_longcorr0(const sbsmsg_t *msg, int p, sbssat_t *sbssat)
     if (n==0||n>MAXSAT) return 0;
     
     sbssat->sat[n-1].lcorr.iode=getbitu(msg->msg,p+6,8);
+    //printf("  decode_longcorr0: sat=%d n=%d iode=%d\n",sbssat->sat[n-1].sat,n,sbssat->sat[n-1].lcorr.iode);
     
     for (i=0;i<3;i++) {
         sbssat->sat[n-1].lcorr.dpos[i]=getbits(msg->msg,p+14+9*i,9)*0.125;
@@ -309,7 +445,7 @@ static int decode_longcorr0(const sbsmsg_t *msg, int p, sbssat_t *sbssat)
     sbssat->sat[n-1].lcorr.daf0=getbits(msg->msg,p+41,10)*P2_31;
     sbssat->sat[n-1].lcorr.daf1=0.0;
     sbssat->sat[n-1].lcorr.t0=gpst2time(msg->week,msg->tow);
-    
+
     trace(5,"decode_longcorr0:sat=%2d\n",sbssat->sat[n-1].sat);
     return 1;
 }
@@ -323,6 +459,7 @@ static int decode_longcorr1(const sbsmsg_t *msg, int p, sbssat_t *sbssat)
     if (n==0||n>MAXSAT) return 0;
     
     sbssat->sat[n-1].lcorr.iode=getbitu(msg->msg,p+6,8);
+    //printf("  decode_longcorr1: sat=%d n=%d iode=%d\n",sbssat->sat[n-1].sat,n,sbssat->sat[n-1].lcorr.iode);
     
     for (i=0;i<3;i++) {
         sbssat->sat[n-1].lcorr.dpos[i]=getbits(msg->msg,p+14+i*11,11)*0.125;
@@ -334,7 +471,7 @@ static int decode_longcorr1(const sbsmsg_t *msg, int p, sbssat_t *sbssat)
     if      (t<=-43200) t+=86400;
     else if (t>  43200) t-=86400;
     sbssat->sat[n-1].lcorr.t0=gpst2time(msg->week,msg->tow+t);
-    
+
     trace(5,"decode_longcorr1: sat=%2d\n",sbssat->sat[n-1].sat);
     return 1;
 }
@@ -361,7 +498,10 @@ static int decode_sbstype24(const sbsmsg_t *msg, sbssat_t *sbssat)
     
     trace(4,"decode_sbstype24:\n");
     
-    if (sbssat->iodp!=(int)getbitu(msg->msg,110,2)) return 0; /* check IODP */
+    if (sbssat->iodp!=(int)getbitu(msg->msg,110,2)){
+        //printf("decode_sbstype24 wrong iodp %3d (current %3d)\n", (int)getbitu(msg->msg,110,2), sbssat->iodp);
+        return 0; /* check IODP */
+    }
     
     blk =getbitu(msg->msg,112,2);
     iodf=getbitu(msg->msg,114,2);
@@ -374,6 +514,7 @@ static int decode_sbstype24(const sbsmsg_t *msg, sbssat_t *sbssat)
         sbssat->sat[j].fcorr.prc =getbits(msg->msg,14+i*12,12)*0.125f;
         sbssat->sat[j].fcorr.udre=udre+1;
         sbssat->sat[j].fcorr.iodf=iodf;
+        //printf("  decode_sbstype24: sat=%2d fcorr.iodf=%2d\n",sbssat->sat[j].sat,iodf);
     }
     return decode_longcorrh(msg,120,sbssat);
 }
@@ -423,11 +564,14 @@ static int decode_sbstype26(const sbsmsg_t *msg, sbsion_t *sbsion)
 extern int sbsupdatecorr(const sbsmsg_t *msg, nav_t *nav)
 {
     int type=getbitu(msg->msg,8,6),stat=-1;
-    
     trace(3,"sbsupdatecorr: type=%d\n",type);
+    //printf("sbsupdatecorr: type=%d\n",type);
     
     if (msg->week==0) return -1;
     
+    //printf("============== sbsupdatecorr: PROCESSING PRN %3d type=%d...\n",msg->prn, type);
+    //print_sbassat(&nav->sbssat);
+
     switch (type) {
         case  0: stat=decode_sbstype2 (msg,&nav->sbssat); break;
         case  1: stat=decode_sbstype1 (msg,&nav->sbssat); break;
@@ -446,6 +590,8 @@ extern int sbsupdatecorr(const sbsmsg_t *msg, nav_t *nav)
         
         /*default: trace(2,"unsupported sbas message: type=%d\n",type); break;*/
     }
+    //printf("============== sbsupdatecorr: type=%d PROCESSED result = %d!\n",type, stat?type:-1);
+    //print_sbassat(&nav->sbssat);
     return stat?type:-1;
 }
 /* read sbas log file --------------------------------------------------------*/
@@ -788,6 +934,7 @@ static int sbslongcorr(gtime_t time, int sat, const sbssat_t *sbssat,
         if (fabs(t)>MAXSBSAGEL) {
             trace(2,"sbas long-term correction expired: %s sat=%2d t=%5.0f\n",
                   time_str(time,0),sat,t);
+            //printf("sbas long-term corr expired");
             return 0;
         }
         for (i=0;i<3;i++) drs[i]=p->lcorr.dpos[i]+p->lcorr.dvel[i]*t;
@@ -802,6 +949,7 @@ static int sbslongcorr(gtime_t time, int sat, const sbssat_t *sbssat,
     if (satsys(sat,NULL)==SYS_SBS) return 1;
     
     trace(2,"no sbas long-term correction: %s sat=%2d\n",time_str(time,0),sat);
+    //printf("no sbas long-term corr");
     return 0;
 }
 /* fast correction -----------------------------------------------------------*/
@@ -818,7 +966,7 @@ static int sbsfastcorr(gtime_t time, int sat, const sbssat_t *sbssat,
         if (p->fcorr.t0.time==0) break;
         t=timediff(time,p->fcorr.t0)+sbssat->tlat;
         
-        /* expire age of correction or UDRE==14 (not monitored) */
+        /* expire age of correction or UDRE==14 (not monitored) (udre=UDRE+1) */
         if (fabs(t)>MAXSBSAGEF||p->fcorr.udre>=15) continue;
         *prc=p->fcorr.prc;
 #ifdef RRCENA
@@ -833,6 +981,7 @@ static int sbsfastcorr(gtime_t time, int sat, const sbssat_t *sbssat,
         return 1;
     }
     trace(2,"no sbas fast correction: %s sat=%2d\n",time_str(time,0),sat);
+    //printf("no sbas fast corr");
     return 0;
 }
 /* sbas satellite ephemeris and clock correction -------------------------------