diff --git a/src/ephemeris.c b/src/ephemeris.c
index 19086d7794a53618ff925d909b24336057e48936..9b1fa034ed57ed78ace7d4d39dd3aad7c43a8aff 100644
--- a/src/ephemeris.c
+++ b/src/ephemeris.c
@@ -413,12 +413,18 @@ static eph_t *seleph(gtime_t time, int sat, int iode, const nav_t *nav)
     }
     tmin=tmax+1.0;
 
+    //DEBUG
     if (iode != -1)
-        printf("- available iode in eph: ");
+    {
+        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 != -1)
-            printf("%3d ",nav->eph[i].iode);
         if (iode>=0&&nav->eph[i].iode!=iode) continue;
         if (sys==SYS_GAL&&sel) {
             if (sel==1&&!(nav->eph[i].code&(1<<9))) continue; /* I/NAV */
@@ -558,7 +564,8 @@ static int satpos_sbas(gtime_t time, gtime_t teph, int sat, const nav_t *nav,
     int i;
 
     trace(4,"satpos_sbas: time=%s sat=%3d\n",time_str(time,3),sat);
-    printf("satpos_sbas: sat=%3d ",sat);
+    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++) {
@@ -567,7 +574,8 @@ static int satpos_sbas(gtime_t time, gtime_t teph, int sat, const nav_t *nav,
     }
     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);
-        printf("no sbas correction (i>=nav->sbssat.nsat || sbs->lcorr.iode < 0)\n");
+        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
diff --git a/src/sbas.c b/src/sbas.c
index e06504c4868188f702c416b26b354c308a5c9c6f..765432acbac174cc8a485edca8d6dd2d008fe6cd 100644
--- a/src/sbas.c
+++ b/src/sbas.c
@@ -168,27 +168,34 @@ extern void print_sbassat(const sbssat_t *sbssat)
 /* 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;
     
     trace(4,"decode_sbstype1:\n");
     //printf("\tdecode_sbstype1: \n");
     
     // old_sat to store old data (to be used if changing IODP, prn mask)
     sbssatp_t old_sat[MAXSAT];
-    int old_nsat = sbssat->nsat;
+    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))
+    //if (sbssat->iodp!=getbitu(msg->msg,224,2))
     {
-        sbssatp_t sbssat_zero = { 0 };
-        for (int i=0; i<MAXSAT;i++)
+        for (i=0; i<MAXSAT;i++)
         {
+            // store
             old_sat[i] = sbssat->sat[i];
+            //printf("old_sat[%d].sat = %d\n", i, old_sat[i].sat);
+            // remove
             sbssat->sat[i] = sbssat_zero;
-            sbssat->sat[i].lcorr.iode = -1;
+            // initialize
+            new_sat[i] = sbssat_zero;
         }
     }
 
-    for (i=1,n=0;i<=210&&n<MAXSAT;i++) {
+    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 */
@@ -198,30 +205,68 @@ 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("\t\tsat: %d\n",sat);
+           //printf("new_sat[%d].sat = %d\n", new_n-1, new_sat[new_n-1].sat);
         }
     }
 
-    // copy from old data (if changing IODP)
-    if (sbssat->iodp!=getbitu(msg->msg,224,2))
+    // DEBUG
+    if (sbssat->iodp==getbitu(msg->msg,224,2))
     {
-        printf("IODP CHANGED!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n!\n");
-        sbssat_t sbssat_zero = { 0 };
-        for (int i=0, i_old=0; i<n&&i_old<old_nsat;)
+        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;)
         {
-            if (old_sat[i_old].sat == sbssat->sat[i].sat)
+            // 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[i] = old_sat[i_old];
-                i++;
+                sbssat->sat[n++] = old_sat[i_old];
                 i_old++;
             }
-            else if (old_sat[i_old].sat > sbssat->sat[i].sat)
-                i++;
+            // no more old
+            else if (i_old==old_n)
+            {
+                sbssat->sat[n++] = new_sat[i_new];
+                i_new++;
+            }
+            // more new and old
             else
-                i_old++;
+            {
+                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;