diff --git a/deps/RTKLIB b/deps/RTKLIB
index f37a58057ce5ca45d46c492dacd8105f6f9e4d70..0260d91932df0ca0691842aa99b39acde5d49c45 160000
--- a/deps/RTKLIB
+++ b/deps/RTKLIB
@@ -1 +1 @@
-Subproject commit f37a58057ce5ca45d46c492dacd8105f6f9e4d70
+Subproject commit 0260d91932df0ca0691842aa99b39acde5d49c45
diff --git a/include/gnss_utils/gnss_utils.h b/include/gnss_utils/gnss_utils.h
index 16dbcce589aa878705c44e452309beeefb96539e..ddfe20259ed47c88633a859f351b510ed1dcb9e2 100644
--- a/include/gnss_utils/gnss_utils.h
+++ b/include/gnss_utils/gnss_utils.h
@@ -113,15 +113,15 @@ struct TdcpOptions
 
 struct Options
 {
-    int sateph;     // satellite ephemeris option: EPHOPT_BRDC(0):broadcast ephemeris, EPHOPT_PREC(1): precise ephemeris, EPHOPT_SBAS(2): broadcast + SBAS, EPHOPT_SSRAPC(3): broadcast + SSR_APC, EPHOPT_SSRCOM(4): broadcast + SSR_COM, EPHOPT_LEX(5): QZSS LEX ephemeris
-    int ionoopt;    // ionosphere option: IONOOPT_OFF(0):correction off, IONOOPT_BRDC(1):broadcast mode, IONOOPT_SBAS(2):SBAS model, IONOOPT_IFLC(3):L1/L2 or L1/L5, IONOOPT_EST(4):estimation, IONOOPT_TEC(5):IONEX TEC model, IONOOPT_QZS(6):QZSS broadcast, IONOOPT_LEX(7):QZSS LEX ionosphere, IONOOPT_STEC(8):SLANT TEC mode
-    int tropopt;    // troposphere option: TROPOPT_OFF(0):correction off, TROPOPT_SAAS(1):Saastamoinen model, TROPOPT_SBAS(2):SBAS model, TROPOPT_EST(3):troposphere option: ZTD estimation, TROPOPT_ESTG(4):ZTD+grad estimation, TROPOPT_ZTD(5):ZTD correction,6:ZTD+grad correction
-    int sbascorr;   // SBAS correction options (can be added): SBSOPT_LCORR(1): long term correction, SBSOPT_FCORR(2): fast correction, SBSOPT_ICORR(4): ionosphere correction, SBSOPT_RANGE(8): ranging
-    int raim;       // RAIM removed sats
-    double elmin;   // min elevation (degrees)
-    double maxgdop; // maxgdop: reject threshold of gdop
+    int sateph;         // satellite ephemeris option: EPHOPT_BRDC(0):broadcast ephemeris, EPHOPT_PREC(1): precise ephemeris, EPHOPT_SBAS(2): broadcast + SBAS, EPHOPT_SSRAPC(3): broadcast + SSR_APC, EPHOPT_SSRCOM(4): broadcast + SSR_COM, EPHOPT_LEX(5): QZSS LEX ephemeris, EPHOPT_SBAS2(6):broadcast + SBAS(sats with SBAS corr and sats with BRDC eph), EPHOPT_SBAS3(7):broadcast + SBAS(2 if possible, otherwise 6), EPHOPT_SBAS4(8):broadcast + SBAS(2 if possible, otherwise 0)
+    int ionoopt;        // ionosphere option: IONOOPT_OFF(0):correction off, IONOOPT_BRDC(1):broadcast mode, IONOOPT_SBAS(2):SBAS model, IONOOPT_IFLC(3):L1/L2 or L1/L5, IONOOPT_EST(4):estimation, IONOOPT_TEC(5):IONEX TEC model, IONOOPT_QZS(6):QZSS broadcast, IONOOPT_LEX(7):QZSS LEX ionosphere, IONOOPT_STEC(8):SLANT TEC mode
+    int tropopt;        // troposphere option: TROPOPT_OFF(0):correction off, TROPOPT_SAAS(1):Saastamoinen model, TROPOPT_SBAS(2):SBAS model, TROPOPT_EST(3):troposphere option: ZTD estimation, TROPOPT_ESTG(4):ZTD+grad estimation, TROPOPT_ZTD(5):ZTD correction,6:ZTD+grad correction
+    int sbascorr;       // SBAS correction options (can be added): SBSOPT_LCORR(1): long term correction, SBSOPT_FCORR(2): fast correction, SBSOPT_ICORR(4): ionosphere correction, SBSOPT_RANGE(8): ranging
+    int raim;           // RAIM removed sats
+    double elmin;       // min elevation (degrees)
+    double maxgdop;     // maxgdop: reject threshold of gdop
     bool GPS,SBS,GLO,GAL,QZS,CMP,IRN,LEO; // constellations used
-    TdcpOptions tdcp; // TDCP options
+    TdcpOptions tdcp;   // TDCP options
 
     // compute navsys int
     int getNavSys() const
@@ -152,10 +152,10 @@ struct Options
 
 const Options default_options =
 {
-    EPHOPT_BRDC,    // satellite ephemeris option: EPHOPT_BRDC(0):broadcast ephemeris, EPHOPT_PREC(1): precise ephemeris, EPHOPT_SBAS(2): broadcast + SBAS, EPHOPT_SSRAPC(3): broadcast + SSR_APC, EPHOPT_SSRCOM(4): broadcast + SSR_COM, EPHOPT_LEX(5): QZSS LEX ephemeris
-    IONOOPT_BRDC,   // ionosphere option: IONOOPT_OFF(0):correction off, IONOOPT_BRDC(1):broadcast mode, IONOOPT_SBAS(2):SBAS model, IONOOPT_IFLC(3):L1/L2 or L1/L5, IONOOPT_EST(4):estimation, IONOOPT_TEC(5):IONEX TEC model, IONOOPT_QZS(6):QZSS broadcast, IONOOPT_LEX(7):QZSS LEX ionosphere, IONOOPT_STEC(8):SLANT TEC mode
+    EPHOPT_SBAS2,   // satellite ephemeris option: EPHOPT_BRDC(0):broadcast ephemeris, EPHOPT_PREC(1): precise ephemeris, EPHOPT_SBAS(2): broadcast + SBAS, EPHOPT_SSRAPC(3): broadcast + SSR_APC, EPHOPT_SSRCOM(4): broadcast + SSR_COM, EPHOPT_LEX(5): QZSS LEX ephemeris, EPHOPT_SBAS2(6):broadcast + SBAS(sats with SBAS corr and sats with BRDC eph), EPHOPT_SBAS3(7):broadcast + SBAS(EPHOPT_SBAS if possible, otherwise EPHOPT_SBAS2), EPHOPT_SBAS4(8):broadcast + SBAS(EPHOPT_SBAS if possible, otherwise EPHOPT_BRDC)
+    IONOOPT_SBAS2,  // ionosphere option: IONOOPT_OFF(0):correction off, IONOOPT_BRDC(1):broadcast mode, IONOOPT_SBAS(2):SBAS model, IONOOPT_IFLC(3):L1/L2 or L1/L5, IONOOPT_EST(4):estimation, IONOOPT_TEC(5):IONEX TEC model, IONOOPT_QZS(6):QZSS broadcast, IONOOPT_LEX(7):QZSS LEX ionosphere, IONOOPT_STEC(8):SLANT TEC mode, IONOOPT_SBAS2(9):broadcast + SBAS(sats with SBAS corr and sats with BRDC eph), IONOOPT_SBAS3(10):broadcast + SBAS(IONOOPT_SBAS if possible, otherwise IONOOPT_SBAS2), IONOOPT_SBAS4(8):broadcast + SBAS(IONOOPT_SBAS if possible, otherwise IONOOPT_BRDC)
     TROPOPT_SAAS,   // troposphere option: TROPOPT_OFF(0):correction off, TROPOPT_SAAS(1):Saastamoinen model, TROPOPT_SBAS(2):SBAS model, TROPOPT_EST(3):troposphere option: ZTD estimation, TROPOPT_ESTG(4):ZTD+grad estimation, TROPOPT_ZTD(5):ZTD correction,6:ZTD+grad correction
-    0,              // SBAS correction options (can be added): SBSOPT_LCORR(1): long term correction, SBSOPT_FCORR(2): fast correction, SBSOPT_ICORR(4): ionosphere correction, SBSOPT_RANGE(8): ranging
+    15,             // SBAS correction options (can be added): SBSOPT_LCORR(1): long term correction, SBSOPT_FCORR(2): fast correction, SBSOPT_ICORR(4): ionosphere correction, SBSOPT_RANGE(8): ranging
     1,              // RAIM enabled
     D2R*15.0,       // min elevation (degrees)
     30.0,           // maxgdop: reject threshold of gdop
diff --git a/include/gnss_utils/utils/satellite.h b/include/gnss_utils/utils/satellite.h
index 0b15acdb2f68ef1fa6e316888d31e54a0d8c5a3c..4cfda619d786bef11a5640ea73a950a1408ac70b 100644
--- a/include/gnss_utils/utils/satellite.h
+++ b/include/gnss_utils/utils/satellite.h
@@ -35,7 +35,6 @@ namespace GnssUtils
         double clock_bias;
         double clock_drift;
         int svh;
-        int eph_mode;
     };
 
 }  // namespace GnssUtils
diff --git a/src/utils/satellite.cpp b/src/utils/satellite.cpp
index 8abc4af4d1c7df8a6a403fbd0e3ffe628697db37..15e0666dc850edc5ee7fbf3371a1f9d8edd59482 100644
--- a/src/utils/satellite.cpp
+++ b/src/utils/satellite.cpp
@@ -39,9 +39,7 @@ Satellites computeSatellites(const Observations&             obs,
                              const int&                      eph_opt)
 {
     double rs[6 * obs.size()], dts[2 * obs.size()], var[obs.size()];
-    double rs_brdc[6 * obs.size()], dts_brdc[2 * obs.size()], var_brdc[obs.size()];
     int    svh[obs.size()];
-    int    svh_brdc[obs.size()];
 
     //   std::cout << "computing position of sats: ";
     //   for (auto&& obs_ref : obs.getObservations())
@@ -49,68 +47,30 @@ Satellites computeSatellites(const Observations&             obs,
     //   std::cout << std::endl;
 
     // compute positions
-    // first compute all broadcasted ephemeris
     satposs(obs.getObservations().front().time,
             obs.data(),
             obs.size(),
             &nav.getNavigation(),
-            0,
-            rs_brdc,
-            dts_brdc,
-            var_brdc,
-            svh_brdc);
-    /* DEBUG
-    std::cout << "Sats positions with broadcasted ephemeris: \n";
-    for (int i = 0; i < obs.size(); i++)
-    {
-        if (rs_brdc[6*i] == 0 and rs_brdc[6*i+1] == 0 and rs_brdc[6*i+2] == 0)
-            std::cout << "\tsat: " << (int)obs.getObservationByIdx(i).sat << " ephemeris not available" << std::endl;
-        else
-        {
-            std::cout << "\tsat: " << (int)obs.getObservationByIdx(i).sat << std::endl
-                      << "\t\tpos: " << rs_brdc[6*i] << " " << rs_brdc[6*i+1] << " " << rs_brdc[6*i+2] << std::endl
-                      << "\t\tvel: " << rs_brdc[6*i+3] << " " << rs_brdc[6*i+4] << " " << rs_brdc[6*i+5] << std::endl
-                      << "\t\tvar: " << var_brdc[i] << std::endl
-                      << "\t\tclock bias: " << dts_brdc[2*i] << std::endl
-                      << "\t\tclock drift: " << dts_brdc[2*i+1] << std::endl
-                      << "\t\tsvh: " << svh_brdc[i] << std::endl;
-        }
-    }
-    //*/
-
-    // compute SBAS ephemeris
-    if (eph_opt != 0)
-        satposs(obs.getObservations().front().time,
-                obs.data(),
-                obs.size(),
-                &nav.getNavigation(),
-                eph_opt,
-                rs,
-                dts,
-                var,
-                svh);
+            eph_opt,
+            rs,
+            dts,
+            var,
+            svh);
 
     // fill Satellites
     Satellites sats;
     //std::cout << "computeSatellites: filling satellites: \n";
     for (int i = 0; i < obs.size(); i++)
     {
-        bool brdc_eph = eph_opt == 0 or (rs[6*i] == 0 and rs[6*i+1] == 0 and rs[6*i+2] == 0);
-
         auto sat_pair = sats.emplace(obs.getObservationByIdx(i).sat, // Key
                                      Satellite({satsys(obs.getObservationByIdx(i).sat,NULL),
                                                 obs.getObservationByIdx(i).sat, // Constructor...
-                                                brdc_eph ?
-                                                        (Eigen::Vector3d() << rs_brdc[6*i],rs_brdc[6*i+1],rs_brdc[6*i+2]).finished() :
                                                         (Eigen::Vector3d() << rs[6*i],rs[6*i+1],rs[6*i+2]).finished(),
-                                                brdc_eph ?
-                                                        (Eigen::Vector3d() << rs_brdc[6*i+3], rs_brdc[6*i+4], rs_brdc[6*i+5]).finished() :
                                                         (Eigen::Vector3d() << rs[6*i+3], rs[6*i+4], rs[6*i+5]).finished() ,
-                                                brdc_eph ? var_brdc[i]      : var[i],
-                                                brdc_eph ? dts_brdc[2*i]    : dts[2*i],
-                                                brdc_eph ? dts_brdc[2*i+1]  : dts[2*i+1],
-                                                brdc_eph ? svh_brdc[i]      : svh[i],
-                                                brdc_eph ? 0 : 2}));
+                                                var[i],
+                                                dts[2*i],
+                                                dts[2*i+1],
+                                                svh[i]}));
 
         assert(sat_pair.second && "satellite already computed");