Index: trunk/BNC/CHANGELOG.md
===================================================================
--- trunk/BNC/CHANGELOG.md	(revision 10582)
+++ trunk/BNC/CHANGELOG.md	(revision 10583)
@@ -1,4 +1,4 @@
 # Changelog
-## 2.13.1 (2024-10-??)
+## 2.13.1 (2024-10-??
 - FIXED: Bug in writing code biases into a SSR file
 - FIXED: Bug in GLO ephemeris RTCM3 encoder
@@ -12,4 +12,5 @@
 - CHANGED: According to the Galileo OS SDD v1.3 SHS=2 now leads to a newly-defined "EOM" status that means that the satellite signal may be used for PNT [(#185)](https://software.rtcm-ntrip.org/ticket/185)
 - CHANGED: Obsolete qt-class members are replaced
+- CHNAGED: from common receiver clock + ISBs to system specific receiver clocks in PPP mode
 
 ## 2.13.1 (2024-04-30)
Index: trunk/BNC/src/PPP/pppClient.cpp
===================================================================
--- trunk/BNC/src/PPP/pppClient.cpp	(revision 10582)
+++ trunk/BNC/src/PPP/pppClient.cpp	(revision 10583)
@@ -67,8 +67,4 @@
     }
   }
-  _offGps = 0.0;
-  _offGlo = 0.0;
-  _offGal = 0.0;
-  _offBds = 0.0;
   CLIENTS.setLocalData(this);  // CLIENTS takes ownership over "this"
 }
@@ -338,217 +334,4 @@
 }
 
-// Compute A Priori Gps Clock Offset
-//////////////////////////////////////////////////////////////////////////////
-double t_pppClient::cmpOffGps(vector<t_pppSatObs*>& obsVector) {
-
-  t_lc::type tLC   = t_lc::dummy;
-  double     offGps = 0.0;
-
-  if (_opt->useSystem('G')) {
-    while (obsVector.size() > 0) {
-      offGps = 0.0;
-      double   maxRes      = 0.0;
-      int      maxResIndex = -1;
-      unsigned nObs        = 0;
-      t_prn    maxResPrn;
-      for (unsigned ii = 0; ii < obsVector.size(); ii++) {
-        const t_pppSatObs* satObs = obsVector.at(ii);
-        if (satObs->prn().system() == 'G') {
-          if (tLC == t_lc::dummy) {
-            tLC = satObs->isValid(t_lc::cIF) ? t_lc::cIF : t_lc::c1;
-          }
-          if (satObs->isValid(tLC) && (!satObs->modelSet() || satObs->eleSat() >= _opt->_minEle)) {
-            double ll = satObs->obsValue(tLC) - satObs->cmpValue(tLC);
-            ++nObs;
-            offGps += ll;
-            if (fabs(ll) > fabs(maxRes)) {
-              maxRes      = ll;
-              maxResIndex = ii;
-              maxResPrn   = satObs->prn();
-            }
-          }
-        }
-      }
-
-      if (nObs > 0) {
-        offGps = offGps / nObs;
-      }
-      else {
-        offGps = 0.0;
-      }
-
-      if (fabs(maxRes) > 150.0) {
-        LOG << "t_pppClient::cmpOffGps outlier " << maxResPrn.toString() << " " << maxRes << endl;
-        delete obsVector.at(maxResIndex);
-        obsVector.erase(obsVector.begin() + maxResIndex);
-      }
-      else {
-        break;
-      }
-    }
-  }
-  return offGps;
-}
-
-
-// Compute A Priori Glonass Clock Offset
-//////////////////////////////////////////////////////////////////////////////
-double t_pppClient::cmpOffGlo(vector<t_pppSatObs*>& obsVector) {
-
-  t_lc::type tLC   = t_lc::dummy;
-  double offGlo = 0.0;
-
-  if (_opt->useSystem('R')) {
-    while (obsVector.size() > 0) {
-      offGlo = 0.0;
-      double   maxRes      = 0.0;
-      int      maxResIndex = -1;
-      unsigned nObs        = 0;
-      t_prn    maxResPrn;
-      for (unsigned ii = 0; ii < obsVector.size(); ii++) {
-        const t_pppSatObs* satObs = obsVector.at(ii);
-        if (satObs->prn().system() == 'R') {
-          if (tLC == t_lc::dummy) {
-            tLC = satObs->isValid(t_lc::cIF) ? t_lc::cIF : t_lc::c1;
-          }
-          if (satObs->isValid(tLC) &&
-              (!satObs->modelSet() || satObs->eleSat() >= _opt->_minEle)) {
-            double ll = satObs->obsValue(tLC) - satObs->cmpValue(tLC);
-            ++nObs;
-            offGlo += ll;
-            if (fabs(ll) > fabs(maxRes)) {
-              maxRes      = ll;
-              maxResIndex = ii;
-              maxResPrn   = satObs->prn();
-            }
-          }
-        }
-      }
-
-      if (nObs > 0) {
-        offGlo = offGlo / nObs;
-      }
-      else {
-        offGlo = 0.0;
-      }
-      if (fabs(maxRes) > 150.0) {
-        LOG << "t_pppClient::cmpOffGlo outlier " << maxResPrn.toString() << " " << maxRes << endl;
-        delete obsVector.at(maxResIndex);
-        obsVector.erase(obsVector.begin() + maxResIndex);
-      }
-      else {
-        break;
-      }
-    }
-  }
-  return offGlo;
-}
-
-// Compute A Priori Galileo Clock Offset
-//////////////////////////////////////////////////////////////////////////////
-double t_pppClient::cmpOffGal(vector<t_pppSatObs*>& obsVector) {
-
-  t_lc::type tLC   = t_lc::dummy;
-  double     offGal = 0.0;
-
-  if (_opt->useSystem('E')) {
-    while (obsVector.size() > 0) {
-      offGal = 0.0;
-      double   maxRes      = 0.0;
-      int      maxResIndex = -1;
-      unsigned nObs        = 0;
-      t_prn    maxResPrn;
-      for (unsigned ii = 0; ii < obsVector.size(); ii++) {
-        const t_pppSatObs* satObs = obsVector.at(ii);
-        if (satObs->prn().system() == 'E') {
-          if (tLC == t_lc::dummy) {
-            tLC = satObs->isValid(t_lc::cIF) ? t_lc::cIF : t_lc::c1;
-          }
-          if (satObs->isValid(tLC) && (!satObs->modelSet() || satObs->eleSat() >= _opt->_minEle)) {
-            double ll = satObs->obsValue(tLC) - satObs->cmpValue(tLC);
-            ++nObs;
-            offGal += ll;
-            if (fabs(ll) > fabs(maxRes)) {
-              maxRes      = ll;
-              maxResIndex = ii;
-              maxResPrn   = satObs->prn();
-            }
-          }
-        }
-      }
-
-      if (nObs > 0) {
-        offGal = offGal / nObs;
-      }
-      else {
-        offGal = 0.0;
-      }
-
-      if (fabs(maxRes) > 150.0) {
-        LOG << "t_pppClient::cmpOffGal outlier " << maxResPrn.toString() << " " << maxRes << endl;
-        delete obsVector.at(maxResIndex);
-        obsVector.erase(obsVector.begin() + maxResIndex);
-      }
-      else {
-        break;
-      }
-    }
-  }
-  return offGal;
-}
-// Compute A Priori BDS Clock Offset
-//////////////////////////////////////////////////////////////////////////////
-double t_pppClient::cmpOffBds(vector<t_pppSatObs*>& obsVector) {
-
-  t_lc::type tLC   = t_lc::dummy;
-  double offBds = 0.0;
-
-  if (_opt->useSystem('C')) {
-    while (obsVector.size() > 0) {
-      offBds = 0.0;
-      double   maxRes      = 0.0;
-      int      maxResIndex = -1;
-      unsigned nObs        = 0;
-      t_prn    maxResPrn;
-      for (unsigned ii = 0; ii < obsVector.size(); ii++) {
-        const t_pppSatObs* satObs = obsVector.at(ii);
-        if (satObs->prn().system() == 'C') {
-          if (tLC == t_lc::dummy) {
-            tLC = satObs->isValid(t_lc::cIF) ? t_lc::cIF : t_lc::c1;
-          }
-          if (satObs->isValid(tLC) &&
-              (!satObs->modelSet() || satObs->eleSat() >= _opt->_minEle)) {
-            double ll = satObs->obsValue(tLC) - satObs->cmpValue(tLC);
-            ++nObs;
-            offBds += ll;
-            if (fabs(ll) > fabs(maxRes)) {
-              maxRes      = ll;
-              maxResIndex = ii;
-              maxResPrn   = satObs->prn();
-            }
-          }
-        }
-      }
-
-      if (nObs > 0) {
-        offBds = offBds / nObs;
-      }
-      else {
-        offBds = 0.0;
-      }
-
-      if (fabs(maxRes) > 150.0) {
-        LOG << "t_pppClient::cmpOffBDS outlier " << maxResPrn.toString() << " " << maxRes << endl;
-        delete obsVector.at(maxResIndex);
-        obsVector.erase(obsVector.begin() + maxResIndex);
-      }
-      else {
-        break;
-      }
-    }
-  }
-  return offBds;
-}
-
 //
 //////////////////////////////////////////////////////////////////////////////
@@ -690,9 +473,4 @@
       return finish(failure, 4);
     }
-
-    _offGps = cmpOffGps(_obsRover);
-    _offGlo = cmpOffGlo(_obsRover);
-    _offGal = cmpOffGal(_obsRover);
-    _offBds = cmpOffBds(_obsRover);
 
     // Prepare Pseudo Observations of the Rover
Index: trunk/BNC/src/PPP/pppClient.h
===================================================================
--- trunk/BNC/src/PPP/pppClient.h	(revision 10582)
+++ trunk/BNC/src/PPP/pppClient.h	(revision 10583)
@@ -36,13 +36,4 @@
   const bncAntex*     antex() const {return _antex;}
   const t_pppStation* staRover() const {return _staRover;}
-  double              offGps() const {return _offGps;}
-  double              offGlo() const {return _offGlo;}
-  double              offGal() const {return _offGal;}
-  double              offBds() const {return _offBds;}
-  void                resetOffGps() {_offGps = 0.0;}
-  void                resetOffGlo() {_offGlo = 0.0;}
-  void                resetOffGal() {_offGal = 0.0;}
-  void                resetOffBds() {_offBds = 0.0;}
-
 
   std::ostringstream& log() {return *_log;}
Index: trunk/BNC/src/PPP/pppFilter.cpp
===================================================================
--- trunk/BNC/src/PPP/pppFilter.cpp	(revision 10582)
+++ trunk/BNC/src/PPP/pppFilter.cpp	(revision 10583)
@@ -299,5 +299,5 @@
                                     const vector<t_pppSatObs*> &obsVector) {
 
-  double SLIP = 150.0;
+  double SLIP = 20.0;
   double fac = 1.0;
   if (_lastEpoTimeOK.valid()) {
@@ -386,5 +386,5 @@
         firstObsTime = lastObsTime : firstObsTime = par->firstObsTime();
       t_lc::type tLC = par->tLC();
-      if (tLC != lc) {continue;}
+//   if (tLC != lc) {continue;}
       LOG << string(_epoTime) << " RESET " << par->toString() << endl;
       delete par; par = new t_pppParam(t_pppParam::amb, prn, tLC, &obsVector);
Index: trunk/BNC/src/PPP/pppParlist.cpp
===================================================================
--- trunk/BNC/src/PPP/pppParlist.cpp	(revision 10582)
+++ trunk/BNC/src/PPP/pppParlist.cpp	(revision 10583)
@@ -62,5 +62,17 @@
      _noise   = OPT->_noiseCrd[2];
      break;
-   case rClk:
+   case rClkG:
+     _epoSpec = true;
+     _sigma0  = OPT->_aprSigClk;
+     break;
+   case rClkR:
+     _epoSpec = true;
+     _sigma0  = OPT->_aprSigClk;
+     break;
+   case rClkE:
+     _epoSpec = true;
+     _sigma0  = OPT->_aprSigClk;
+     break;
+   case rClkC:
      _epoSpec = true;
      _sigma0  = OPT->_aprSigClk;
@@ -73,45 +85,9 @@
          const t_pppSatObs* obs = obsVector->at(ii);
          if (obs->prn() == _prn) {
-           double offGps = 0.0;
-           if (_prn.system() == 'G' && tLC != t_lc::MW) {
-             offGps = PPP_CLIENT->offGps();
-           }
-           double offGlo = 0.0;
-           if (_prn.system() == 'R' && tLC != t_lc::MW) {
-             offGlo = PPP_CLIENT->offGlo();
-           }
-           double offGal = 0.0;
-           if (_prn.system() == 'E' && tLC != t_lc::MW) {
-             offGal = PPP_CLIENT->offGal();
-           }
-           double offBds = 0.0;
-           if (_prn.system() == 'C' && tLC != t_lc::MW) {
-             offBds = PPP_CLIENT->offBds();
-           }
-           _x0 = floor((obs->obsValue(tLC) - offGps - offGlo - offGal - offBds - obs->cmpValue(tLC)) / obs->lambda(tLC) + 0.5);
+           _x0 = floor((obs->obsValue(tLC) - obs->cmpValue(tLC)) / obs->lambda(tLC) + 0.5);
            break;
          }
        }
      }
-     break;
-   case offGps:
-     _epoSpec = true;
-     _sigma0  = OPT->_aprSigClkOff;
-     _x0      = PPP_CLIENT->offGps();
-     break;
-   case offGlo:
-     _epoSpec = true;
-     _sigma0  = OPT->_aprSigClkOff;
-     _x0      = PPP_CLIENT->offGlo();
-     break;
-   case offGal:
-     _epoSpec = true;
-     _sigma0  = OPT->_aprSigClkOff;
-     _x0      = PPP_CLIENT->offGal();
-     break;
-   case offBds:
-     _epoSpec = true;
-     _sigma0  = OPT->_aprSigClkOff;
-     _x0      = PPP_CLIENT->offBds();
      break;
    case trp:
@@ -174,17 +150,14 @@
     if (tLC == t_lc::GIM) {return 0.0;}
     return (sta->xyzApr()[2] - obs->xc()[2]) / rhoV.NormFrobenius();
-  case rClk:
-    if (tLC == t_lc::GIM) {return 0.0;}
-    return 1.0;
-  case offGps:
+  case rClkG:
     if (tLC == t_lc::GIM) {return 0.0;}
     return (obs->prn().system() == 'G') ? 1.0 : 0.0;
-  case offGlo:
+  case rClkR:
     if (tLC == t_lc::GIM) {return 0.0;}
     return (obs->prn().system() == 'R') ? 1.0 : 0.0;
-  case offGal:
+  case rClkE:
     if (tLC == t_lc::GIM) {return 0.0;}
     return (obs->prn().system() == 'E') ? 1.0 : 0.0;
-  case offBds:
+  case rClkC:
     if (tLC == t_lc::GIM) {return 0.0;}
     return (obs->prn().system() == 'C') ? 1.0 : 0.0;
@@ -305,18 +278,15 @@
     ss << "CRD_Z";
     break;
-  case rClk:
-    ss << "REC_CLK     ";
-    break;
-  case offGps:
-    ss << "OFF_GPS     ";
-    break;
-  case offGlo:
-    ss << "OFF_GLO     ";
-    break;
-  case offGal:
-    ss << "OFF_GAL     ";
-    break;
-  case offBds:
-    ss << "OFF_BDS     ";
+  case rClkG:
+    ss << "REC_CLK  G  ";
+    break;
+  case rClkR:
+    ss << "REC_CLK  R  ";
+    break;
+  case rClkE:
+    ss << "REC_CLK  E  ";
+    break;
+  case rClkC:
+    ss << "REC_CLK  C  ";
     break;
   case trp:
@@ -458,43 +428,19 @@
   // Receiver Clocks
   // ---------------
-  required.push_back(new t_pppParam(t_pppParam::rClk, t_prn(), t_lc::dummy));
-
-  // GLONASS Clock Offset
-  // --------------------
-  if ( _usedSystems.value('R')  &&
-      (_usedSystems.value('G') || _usedSystems.value('E') || _usedSystems.value('C'))) {
-    required.push_back(new t_pppParam(t_pppParam::offGlo, t_prn(), t_lc::dummy));
-  }
-  else {
-    PPP_CLIENT->resetOffGlo();
-  }
-
-  // Galileo Clock Offset
-  // --------------------
-  if (_usedSystems.value('E') && _usedSystems.value('G') && _usedSystems.value('G') >= OPT->_minObs) {
-    required.push_back(new t_pppParam(t_pppParam::offGal, t_prn(), t_lc::dummy));
-  }
-  else {
-    PPP_CLIENT->resetOffGal();
-  }
-
-  // GPS Clock Offset
-  // --------------------
-  if (_usedSystems.value('E') && _usedSystems.value('G') && _usedSystems.value('G') < OPT->_minObs) {
-    required.push_back(new t_pppParam(t_pppParam::offGps, t_prn(), t_lc::dummy));
-  }
-  else {
-    PPP_CLIENT->resetOffGps();
-  }
-
-  // BDS Clock Offset
-  // ----------------
-  if (_usedSystems.value('C')  &&
-      (_usedSystems.value('G') || _usedSystems.value('E'))) {
-    required.push_back(new t_pppParam(t_pppParam::offBds, t_prn(), t_lc::dummy));
-  }
-  else {
-    PPP_CLIENT->resetOffBds();
-  }
+   if (_usedSystems.contains('G')) {
+     required.push_back(new t_pppParam(t_pppParam::rClkG, t_prn(), t_lc::dummy));
+   }
+
+   if (_usedSystems.contains('R')) {
+     required.push_back(new t_pppParam(t_pppParam::rClkR, t_prn(), t_lc::dummy));
+   }
+
+   if (_usedSystems.contains('E')) {
+     required.push_back(new t_pppParam(t_pppParam::rClkE, t_prn(), t_lc::dummy));
+   }
+
+   if (_usedSystems.contains('C')) {
+     required.push_back(new t_pppParam(t_pppParam::rClkC, t_prn(), t_lc::dummy));
+   }
 
   // Troposphere
Index: trunk/BNC/src/PPP/pppParlist.h
===================================================================
--- trunk/BNC/src/PPP/pppParlist.h	(revision 10582)
+++ trunk/BNC/src/PPP/pppParlist.h	(revision 10583)
@@ -14,5 +14,5 @@
 class t_pppParam {
  public:
-  enum e_type {crdX, crdY, crdZ, rClk, offGps, offGlo, offGal, offBds, trp, ion, amb,
+  enum e_type {crdX, crdY, crdZ, rClkG, rClkR, rClkE, rClkC, trp, ion, amb,
                cBiasG1, cBiasR1, cBiasE1, cBiasC1, pBiasG1, pBiasR1, pBiasE1, pBiasC1,
                cBiasG2, cBiasR2, cBiasE2, cBiasC2, pBiasG2, pBiasR2, pBiasE2, pBiasC2};
