Index: trunk/BNC/src/PPP/pppClient.cpp
===================================================================
--- trunk/BNC/src/PPP/pppClient.cpp	(revision 9399)
+++ trunk/BNC/src/PPP/pppClient.cpp	(revision 9419)
@@ -73,4 +73,5 @@
     }
   }
+
   _offGR = 0.0;
   _offGE = 0.0;
@@ -596,11 +597,18 @@
     bool epochReProcessing = false;
     _numEpoProcessing = 0;
+    _historicalRefSats.clear();
+
     do {
       _numEpoProcessing++;
+#ifdef BNC_DEBUG_PPP
+      LOG << "_numEpoProcessing " << _numEpoProcessing  << endl;
+#endif
       if (_obsPool->refSatChanged()) {
         if(_filter->datumTransformation() != success) {
+          LOG << "_filter->datumTransformation() != success" << endl;
           return finish(failure);
         }
         else {
+          LOG << "_filter->datumTransformation() == success" << endl;
           _obsPool->saveLastEpoRefSats();
         }
@@ -631,9 +639,11 @@
       if (_opt->_refSatRequired) {
         if (handleRefSatellites(_obsRover) != success) {
-          _historicalRefSats.clear();
           return finish(failure);
         }
         if (_obsPool->refSatChanged() &&
-            _opt->_obsModelType  != t_pppOptions::UncombPPP) {
+            (_opt->_obsModelType == OPT->DCMcodeBias ||
+             _opt->_obsModelType == OPT->DCMphaseBias ||
+             _opt->_pseudoObsIono)) {
+          LOG << "refSatChanged()" << endl;
             epochReProcessing = true;
             continue;
@@ -674,5 +684,4 @@
       else {
         epochReProcessing = false;
-        _historicalRefSats.clear();
       }
     } while (epochReProcessing);
@@ -795,7 +804,4 @@
         refSatDefined = true;
         obsVector[ii]->setAsReference();
-#ifdef BNC_DEBUG_PPP
-        LOG << "=> unchanged refsatprn: "  <<  satObs->prn().toString() << endl;
-#endif
       }
       // reference satellite has changed
@@ -807,7 +813,4 @@
             obsVector[ii]->setAsReference();
             refSat->setPrn(satObs->prn());
-#ifdef BNC_DEBUG_PPP
-          LOG << "=> set refsatprn: "  <<  satObs->prn().toString() << endl;
-#endif
           }
           else if ( _historicalRefSats[sys].contains(satObs->prn())) {
@@ -841,7 +844,4 @@
           obsVector[ii]->setAsReference();
           refSat->setPrn(satObs->prn());
-#ifdef BNC_DEBUG_PPP
-          LOG << " => set refsatprn: "  <<  satObs->prn().toString() << endl;
-#endif
           if (OPT->_pseudoObsIono) {
             refSat->setStecValue(satObs->getIonoCodeDelay(t_frequency::G1));
@@ -858,5 +858,4 @@
       refSat->setPrn(t_prn());
     }
-
     _obsPool->setRefSatChangeRequired(sys, false); // done or impossible
   }
Index: trunk/BNC/src/PPP/pppFilter.cpp
===================================================================
--- trunk/BNC/src/PPP/pppFilter.cpp	(revision 9399)
+++ trunk/BNC/src/PPP/pppFilter.cpp	(revision 9419)
@@ -81,5 +81,7 @@
   // Set Parameters
   // --------------
-  _parlist->set(_epoTime, allObs, _obsPool->getRefSatMap());
+  if (_parlist->set(_epoTime, allObs, _obsPool->getRefSatMap()) != success) {
+    return failure;
+  }
   const vector<t_pppParam*>& params = _parlist->params();
 #ifdef BNC_DEBUG_PPP
@@ -88,4 +90,5 @@
   }
 #endif
+
   // Status Vector, Variance-Covariance Matrix
   // -----------------------------------------
@@ -127,4 +130,5 @@
       OPT->_obsModelType == OPT->DCMphaseBias) {
     preProcessing = true;
+    unsigned usableSys = 0;
     for (unsigned iSys = 0; iSys < OPT->systems().size(); iSys++) {
       char sys = OPT->systems()[iSys];
@@ -138,5 +142,13 @@
         }
       }
-      if (!obsVector.size()) {continue;}
+      if (!obsVector.size()) {
+        continue;
+      }
+      else {
+        ++usableSys;
+        if (usableSys == 1) {
+          _datumTrafo->setFirstSystem(sys);
+        }
+      }
       if (processSystem(OPT->LCs(sys), obsVector, _refPrn,
                         epoch->pseudoObsIono(), preProcessing) != success) {
@@ -154,5 +166,5 @@
     }
     else if (!_obsPool->refSatChangeRequired()) {
-      initDatumTransformation(allObs);
+      initDatumTransformation(allObs, epoch->pseudoObsIono());
     }
   }
@@ -162,20 +174,21 @@
   preProcessing = false;
   for (unsigned iSys = 0; iSys < OPT->systems().size(); iSys++) {
-    (iSys) ? _datumTrafo->setFirstSystem(false) : _datumTrafo->setFirstSystem(true);
-    char system = OPT->systems()[iSys];
+    char sys = OPT->systems()[iSys];
     if (OPT->_refSatRequired) {
-      _refPrn = (_obsPool->getRefSatMapElement(system))->prn();
+      _refPrn = (_obsPool->getRefSatMapElement(sys))->prn();
     }
     unsigned int num = 0;
     vector<t_pppSatObs*> obsVector;
     for (unsigned jj = 0; jj < allObs.size(); jj++) {
-      if (allObs[jj]->prn().system() == system) {
+      if (allObs[jj]->prn().system() == sys) {
         obsVector.push_back(allObs[jj]);
-        num++;
-      }
-    }
-    if (!num) {continue;}
-    LOG << epoTimeStr << " SATNUM " << system << ' ' << right << setw(2) << num << endl;
-    if (processSystem(OPT->LCs(system), obsVector, _refPrn,
+        ++num;
+      }
+    }
+    if (!num) {
+      continue;
+    }
+    LOG << epoTimeStr << " SATNUM " << sys << ' ' << right << setw(2) << num << endl;
+    if (processSystem(OPT->LCs(sys), obsVector, _refPrn,
                       epoch->pseudoObsIono(), preProcessing) != success) {
       return failure;
@@ -190,4 +203,5 @@
   if (OPT->_refSatRequired) {
     _obsPool->saveLastEpoRefSats();
+    _datumTrafo->setLastEpoParlist(_parlist);
   }
   return success;
@@ -219,5 +233,4 @@
 
   unsigned usedLCs     = LCs.size();
-  unsigned realUsedLCs = usedLCs;
   if (OPT->_pseudoObsIono && !pseudoObsIonoAvailable) {
       usedLCs -= 1;  // GIM not used
@@ -226,9 +239,8 @@
   if (OPT->_pseudoObsTropo) {
     hlpLCs = -1;
-    realUsedLCs -= 1;
   }
   // max Obs
   unsigned maxObs = obsVector.size() * (usedLCs + hlpLCs);
-  if (OPT->_pseudoObsTropo) {
+  if (OPT->_pseudoObsTropo && _datumTrafo->firstSystem(sys)) {
     maxObs += 1;
   }
@@ -260,4 +272,7 @@
     for (unsigned ii = 0; ii < obsVector.size(); ii++) {
       t_pppSatObs* obs = obsVector[ii];
+      if (iOutlier == 0 && !preProcessing) {
+        obs->resetOutlier();
+      }
       if (!obs->outlier()) {
         for (unsigned jj = 0; jj < usedLCs; jj++) {
@@ -280,5 +295,5 @@
     // pseudo Obs Tropo
     // ================
-    if (OPT->_pseudoObsTropo) {
+    if (OPT->_pseudoObsTropo && _datumTrafo->firstSystem(sys)) {
       for (unsigned ii = 0; ii < obsVector.size(); ii++) {
         t_pppSatObs* obs = obsVector[ii];
@@ -302,6 +317,7 @@
     if ((!iOutlier) &&
         (OPT->_obsModelType == OPT->DCMcodeBias ||
-         OPT->_obsModelType == OPT->DCMphaseBias  ) &&  (!preProcessing)) {
-      _datumTrafo->updateIndices(iObs+1);
+         OPT->_obsModelType == OPT->DCMphaseBias) &&
+        (!preProcessing)) {
+      _datumTrafo->updateIndices(sys, iObs+1);
       _datumTrafo->prepareAA(AA.SubMatrix(1, iObs+1 , 1, _parlist->nPar()), 1);
     }
@@ -499,4 +515,5 @@
         // -----------------------
         else {
+          if (refPrn != t_prn()) {return success;}
           ColumnVector AA(params.size());
           for (unsigned iPar = 0; iPar < params.size(); iPar++) {
@@ -666,6 +683,8 @@
 ////////////////////////////////////////////////////////////////////////////
 t_irc t_pppFilter::datumTransformation() {
+  // get last epoch
   t_pppObsPool::t_epoch* epoch = _obsPool->lastEpoch();
-  if (!epoch) {LOG << "!epoch" << endl;
+  if (!epoch) {
+    LOG << "!lastEpoch" << endl;
     return failure;
   }
@@ -674,28 +693,36 @@
     LOG << string(epoch->epoTime()) << " DATUM TRANSFORMATION " << endl;
   }
+
   vector<t_pppSatObs*>& allObs = epoch->obsVector();
 
-  // reset old and set new refSats in last epoch (ambiguities)
-  // ========================================================
+  // reset old and set new refSats in last epoch (ambiguities/GIM)
+  // =============================================================
   if (resetRefSatellitesLastEpoch(allObs) != true) {
+    LOG  << "resetRefSatellitesLastEpoch = failure" << endl;
     return failure;
+  }
+
+  if (OPT->_obsModelType == OPT->UncombPPP) {
+    return success;
   }
 
   // set AA2
   // =======
-  _parlist->set(epoch->epoTime(), allObs, _obsPool->getRefSatMap());
-  const vector<t_pppParam*>& params = _parlist->params();
+  t_pppParlist* parlist = _datumTrafo->lastEpoParlist();
+  if (parlist->set(epoch->epoTime(), allObs, _obsPool->getRefSatMap()) != success) {
+    return failure;
+  }
+  vector<t_pppParam*>& params = parlist->params();
 #ifdef BNC_DEBUG_PPP
+  LOG << " parameters of last epoch" << endl;
   for (unsigned iPar = 0; iPar < params.size(); iPar++) {
     LOG << params[iPar]->toString() << "\t\t" << endl;
   }
 #endif
+  unsigned nPar = parlist->nPar();
+  unsigned usableSys = 0;
   for (unsigned iSys = 0; iSys < OPT->systems().size(); iSys++) {
-    (iSys) ? _datumTrafo->setFirstSystem(false) : _datumTrafo->setFirstSystem(true);
     char sys = OPT->systems()[iSys];
     t_prn refPrn = (_obsPool->getRefSatMapElement(sys))->prn();
-#ifdef BNC_DEBUG_PPP
-    LOG << "refPrn: " << refPrn.toString() << endl;
-#endif
     vector<t_pppSatObs*> obsVector;
     for (unsigned jj = 0; jj < allObs.size(); jj++) {
@@ -704,8 +731,15 @@
       }
     }
-
+    if (!obsVector.size()) {
+      continue;
+    }
+    else {
+      ++usableSys;
+      if (usableSys == 1) {
+        _datumTrafo->setFirstSystem(sys);
+      }
+    }
     vector<t_lc::type> LCs = OPT->LCs(sys);
     unsigned usedLCs = LCs.size();
-    unsigned realUsedLCs = usedLCs;
     if (OPT->_pseudoObsIono && !epoch->pseudoObsIono()) {
         usedLCs -= 1;  // GIM not used
@@ -714,9 +748,9 @@
     if (OPT->_pseudoObsTropo) {
       hlpLCs = -1;
-      realUsedLCs -= 1;
     }
     // max Obs
     unsigned maxObs = obsVector.size() * (usedLCs + hlpLCs);
-    if (OPT->_pseudoObsTropo) {
+
+    if (OPT->_pseudoObsTropo && _datumTrafo->firstSystem(sys)) {
       maxObs += 1;
     }
@@ -724,6 +758,5 @@
       maxObs -= 1; // pseudo obs iono with respect to refSat
     }
-
-    Matrix  AA(maxObs, _parlist->nPar());
+    Matrix  AA(maxObs, nPar);
 
     // Real Observations
@@ -732,14 +765,12 @@
     for (unsigned ii = 0; ii < obsVector.size(); ii++) {
       t_pppSatObs* obs = obsVector[ii];
-      if (!obs->outlier()) {
-        for (unsigned jj = 0; jj < usedLCs; jj++) {
-          const t_lc::type tLC = LCs[jj];
-          if (tLC == t_lc::GIM) {continue;}
-          if (tLC == t_lc::Tz0) {continue;}
-          ++iObs;
-          for (unsigned iPar = 0; iPar < params.size(); iPar++) {
-            const t_pppParam* par = params[iPar];
-            AA[iObs][iPar] = par->partial(_epoTime, obs, tLC, refPrn);
-          }
+      for (unsigned jj = 0; jj < usedLCs; jj++) {
+        const t_lc::type tLC = LCs[jj];
+        if (tLC == t_lc::GIM) {continue;}
+        if (tLC == t_lc::Tz0) {continue;}
+        ++iObs;
+        for (unsigned iPar = 0; iPar < params.size(); iPar++) {
+          const t_pppParam* par = params[iPar];
+          AA[iObs][iPar] = par->partial(_epoTime, obs, tLC, refPrn);
         }
       }
@@ -747,5 +778,5 @@
     // pseudo Obs Tropo
     // ================
-    if (OPT->_pseudoObsTropo) {
+    if (OPT->_pseudoObsTropo && _datumTrafo->firstSystem(sys)) {
       for (unsigned ii = 0; ii < obsVector.size(); ii++) {
         t_pppSatObs* obs = obsVector[ii];
@@ -762,23 +793,29 @@
       }
     }
-    _datumTrafo->updateIndices(iObs+1);
-    _datumTrafo->prepareAA(AA.SubMatrix(1, iObs+1 , 1, _parlist->nPar()), 2);
-  }
+    if (!iObs) {
+      continue;
+    }
+    _datumTrafo->updateIndices(sys, iObs+1);
+    _datumTrafo->prepareAA(AA.SubMatrix(1, iObs+1 , 1, nPar), 2);
+  }
+  _datumTrafo->updateNumObs();
 
   // Datum Transformation
   // ====================
 #ifdef BNC_DEBUG_PPP
-      LOG << "AA1\n"; _datumTrafo->printMatrix(_datumTrafo->AA1(), _datumTrafo->obsNum(), _datumTrafo->parNum());
-      LOG << "AA2\n"; _datumTrafo->printMatrix(_datumTrafo->AA2(), _datumTrafo->obsNum(), _datumTrafo->parNum());
+      //LOG << "AA1\n"; _datumTrafo->printMatrix(_datumTrafo->AA1(), _datumTrafo->numObs(), _datumTrafo->numPar());
+      //LOG << "AA2\n"; _datumTrafo->printMatrix(_datumTrafo->AA2(), _datumTrafo->numObs(), _datumTrafo->numPar());
 #endif
-  Matrix D21 = _datumTrafo->computeTrafoMatrix();
+  if(_datumTrafo->computeTrafoMatrix() != success) {
+    return failure;
+  }
 #ifdef BNC_DEBUG_PPP
-      LOG << "D21" << endl; _datumTrafo->printMatrix(D21, _datumTrafo->parNum(), _datumTrafo->parNum());
+      //LOG << "D21" << endl; _datumTrafo->printMatrix(_datumTrafo->D21(), _datumTrafo->numObs(), _datumTrafo->numPar());
 #endif
   ColumnVector    xFltOld = _xFlt;
   SymmetricMatrix QFltOld = _QFlt;
 
-  _QFlt << D21 * QFltOld * D21.t();
-  _xFlt =  D21 * xFltOld;
+  _QFlt << _datumTrafo->D21() * QFltOld * _datumTrafo->D21().t();
+  _xFlt =  _datumTrafo->D21() * xFltOld;
 
 #ifdef BNC_DEBUG_PPP
@@ -791,8 +828,13 @@
   for (unsigned iSys = 0; iSys < OPT->systems().size(); iSys++) {
     char sys = OPT->systems()[iSys];
-    t_irc irc = resetAmb(_obsPool->getRefSatMapElementLastEpoch(sys), allObs);
-    if (OPT->_obsModelType == OPT->DCMcodeBias) {
-      if (irc == success) {
-        addNoiseToIono(sys);}
+    t_prn refPrnOld = _obsPool->getRefSatMapElementLastEpoch(sys);
+    t_prn refPrnNew = (_obsPool->getRefSatMapElement(sys))->prn();
+    if (refPrnNew != refPrnOld) {
+      t_irc irc = resetAmb(_obsPool->getRefSatMapElementLastEpoch(sys), allObs);
+      if (OPT->_obsModelType == OPT->DCMcodeBias) {
+        if (irc == success) {
+          addNoiseToIono(sys);
+        }
+      }
     }
   }
@@ -802,4 +844,7 @@
   _datumTrafo->switchAA();
 
+  // save parameter list
+  // ====================
+  _datumTrafo->setLastEpoParlist(_parlist);
   return success;
 }
@@ -807,18 +852,22 @@
 // Init datum transformation
 ////////////////////////////////////////////////////////////////////////////
-void t_pppFilter::initDatumTransformation(const std::vector<t_pppSatObs*>& allObs) {
+void t_pppFilter::initDatumTransformation(const std::vector<t_pppSatObs*>& allObs,
+                                          bool pseudoObsIono) {
   unsigned trafoObs = 0;
   for (unsigned iSys = 0; iSys < OPT->systems().size(); iSys++) {
-    char system = OPT->systems()[iSys];
+    char sys = OPT->systems()[iSys];
     int satNum = 0;
     for (unsigned jj = 0; jj < allObs.size(); jj++) {
-      if (allObs[jj]->prn().system() == system) {
+      if (allObs[jj]->prn().system() == sys) {
         satNum++;
       }
     }
+    if (!satNum) {
+      continue;
+    }
     // all LCs
-    unsigned realUsedLCs = OPT->LCs(system).size();
+    unsigned realUsedLCs = OPT->LCs(sys).size();
     // exclude pseudo obs GIM
-    if (OPT->_pseudoObsIono) {
+    if (OPT->_pseudoObsIono && !pseudoObsIono) {
       realUsedLCs -= 1;
     }
@@ -828,11 +877,13 @@
     trafoObs += satNum * realUsedLCs;
 
-    if (OPT->_pseudoObsTropo) {
+    if (OPT->_pseudoObsTropo && _datumTrafo->firstSystem(sys)) {
       trafoObs += 1;
     }
-
-  }
-  _datumTrafo->setObsNum(trafoObs);
-  _datumTrafo->setParNum(_parlist->nPar());
+    if (OPT->_pseudoObsIono && pseudoObsIono) {
+      trafoObs -= 1; // pseudo obs iono with respect to refSat
+    }
+  }
+  _datumTrafo->setNumObs(trafoObs);
+  _datumTrafo->setNumPar(_parlist->nPar());
   _datumTrafo->initAA();
 }
Index: trunk/BNC/src/PPP/pppFilter.h
===================================================================
--- trunk/BNC/src/PPP/pppFilter.h	(revision 9399)
+++ trunk/BNC/src/PPP/pppFilter.h	(revision 9419)
@@ -24,5 +24,6 @@
 
   t_irc datumTransformation();
-  void initDatumTransformation(const std::vector<t_pppSatObs*>& allObs);
+  void initDatumTransformation(const std::vector<t_pppSatObs*>& allObs, bool pseudoObsIono);
+  unsigned setTrafoObs();
 
   const ColumnVector&    x() const {return _xFlt;}
@@ -79,10 +80,28 @@
   class t_datumTrafo {
   public:
-    t_datumTrafo () {initIndices();}
-    void initIndices() {_firstRow = 1; _lastRow = 0;}
-    void setFirstSystem(bool firstSys) {_firstSys = firstSys;}
-    bool firstSystem() {return _firstSys;}
-    void updateIndices(int maxObsSys) {
-      if (firstSystem()) {
+    t_datumTrafo () {
+      initIndices();
+    }
+    ~t_datumTrafo () {
+
+    }
+
+    void initIndices() {
+      _firstRow = 1; _lastRow = 0;
+    }
+
+    void setFirstSystem(char firstSys) {
+      _firstSys = firstSys;
+    }
+
+    bool firstSystem(char sys) {
+      if (_firstSys == sys) {
+        return true;
+      }
+      return false;
+    }
+
+    void updateIndices(char sys, int maxObsSys) {
+      if (firstSystem(sys)) {
         initIndices();
       }
@@ -90,17 +109,27 @@
         _firstRow = _lastRow + 1;
       }
-      _lastRow += maxObsSys;
-
+      _lastRow += maxObsSys;//LOG << "updateIndices: lastRow: " << _lastRow << endl;
     };
-    void setObsNum(int maxObs) {_maxObs = maxObs;}
-    void setParNum(int numPar) {_numPar = numPar;}
-    int obsNum() {return _maxObs;}
-    int parNum() {return _numPar;}
+
+    void setNumObs(int maxObs) {_maxObs = maxObs;}
+    void setNumPar(int numPar) { _numPar = numPar;}
+    void setLastEpoParlist(t_pppParlist* parlist) {_parlist = parlist;}
+    t_pppParlist* lastEpoParlist() {return _parlist;}
+    int numPar() {return _numPar;}
+    int numObs() {return _maxObs;}
+    void updateNumObs() {//LOG << "updateObsNum _maxObs " << _maxObs;
+      _maxObs = _lastRow;//LOG << "=>  _maxObs " << _maxObs << " _numPar: " << _numPar << endl;
+      _AA1 = _AA1.SubMatrix(1, _lastRow, 1, _numPar);
+      _AA2 = _AA2.SubMatrix(1, _lastRow, 1, _numPar);
+    }
+
     const Matrix& AA1() {return _AA1;}
     const Matrix& AA2() {return _AA2;}
-
-    void initAA() {
+    const Matrix& D21() {return _D21;}
+
+    void initAA() {//LOG << "initAA: _maxObs: " << _maxObs << " _numPar: " << _numPar << endl;
       _AA1.ReSize(_maxObs, _numPar); _AA1 = 0.0;
       _AA2.ReSize(_maxObs, _numPar); _AA2 = 0.0;
+      _D21.ReSize(_numPar, _numPar); _D21 = 0.0;
     }
 
@@ -112,17 +141,18 @@
       Prep->SubMatrix(_firstRow, _lastRow, 1, _numPar) << AA;
     }
+
     void switchAA() {
       _AA1 = _AA2;
     }
-    Matrix&  getAA(int ind) {
-      if (ind == 1) {
-          return _AA1;
-      }
-      return _AA2;
-    }
-    Matrix computeTrafoMatrix() {
-      Matrix D21 = ((_AA2.t() * _AA2).i()) * _AA2.t() * _AA1;
-      return D21;
-    }
+
+    t_irc computeTrafoMatrix() {
+      if (((_AA2.t() * _AA2)).Determinant() == 0.0) {
+        LOG << "(_AA2.t() * _AA2).inv() is singular" << endl;
+        return failure;
+      }
+      _D21 = ((_AA2.t() * _AA2).i()) * _AA2.t() * _AA1;
+      return success;
+    }
+
     void printMatrix(const Matrix& X, int nRow, int nCol) {
       for (int rr = 0; rr < nRow; rr++) {
@@ -134,13 +164,15 @@
       LOG << endl;
     }
-
+  private:
     int               _firstRow;
     int               _lastRow;
     Matrix            _AA1;
     Matrix            _AA2;
-    bool              _firstSys;
+    Matrix            _D21;
+    char              _firstSys;
     int               _maxObs;
     int               _numPar;
     QMap<char, t_prn> _refSatMapPseudoObs;
+    t_pppParlist*     _parlist;
   };
 
Index: trunk/BNC/src/PPP/pppParlist.cpp
===================================================================
--- trunk/BNC/src/PPP/pppParlist.cpp	(revision 9399)
+++ trunk/BNC/src/PPP/pppParlist.cpp	(revision 9419)
@@ -121,6 +121,6 @@
      _sigma0  = OPT->_aprSigCodeBias;
      break;
-   case pBiasG1:   case pBiasE1:   case pBiasC1:
-   case pBiasG2:   case pBiasE2:   case pBiasC2:
+   case pBiasG1:   case pBiasE1:   case pBiasR1:   case pBiasC1:
+   case pBiasG2:   case pBiasE2:   case pBiasR2:   case pBiasC2:
      _epoSpec = true;
      _sigma0  = OPT->_aprSigPhaseBias;
@@ -261,4 +261,7 @@
     if ((obs->prn().system() == 'G') && (tLC == t_lc::l1)) {return 1.0;} else {return 0.0;}
     break;
+  case pBiasR1:
+    if ((obs->prn().system() == 'R') && (tLC == t_lc::l1)) {return 1.0;} else {return 0.0;}
+    break;
   case pBiasE1:
     if ((obs->prn().system() == 'E') && (tLC == t_lc::l1)) {return 1.0;} else {return 0.0;}
@@ -269,4 +272,7 @@
   case pBiasG2:
     if ((obs->prn().system() == 'G') && (tLC == t_lc::l2)) {return 1.0;} else {return 0.0;}
+    break;
+  case pBiasR2:
+    if ((obs->prn().system() == 'R') && (tLC == t_lc::l2)) {return 1.0;} else {return 0.0;}
     break;
   case pBiasE2:
@@ -320,6 +326,6 @@
     ss << "BIA  " << left << setw(3) << t_lc::toString(_tLC) << right << " G  ";
     break;
-  case cBiasR1:
-  case cBiasR2:
+  case cBiasR1:  case pBiasR1:
+  case cBiasR2:  case pBiasR2:
     ss << "BIA  " << left << setw(3) << t_lc::toString(_tLC) << right << " R  ";
     break;
@@ -351,6 +357,5 @@
 //
 ////////////////////////////////////////////////////////////////////////////
-t_irc t_pppParlist::set(const bncTime& epoTime,
-    const std::vector<t_pppSatObs*>& obsVector,
+t_irc t_pppParlist::set(const bncTime& epoTime, const std::vector<t_pppSatObs*>& obsVector,
     const QMap<char, t_pppRefSat*>& refSatMap) {
 
@@ -374,14 +379,17 @@
       }
     }
+
     else if (par->type() == t_pppParam::amb) {
-      char system = par->prn().system();
-      t_prn refPrn = t_prn();
-      if (OPT->_refSatRequired) {
-        refPrn = (refSatMap[system])->prn();
-      }
-      if ((par->lastObsTime().valid() &&
-          (epoTime - par->lastObsTime() > 60.0)) ||
-          (refPrn == par->prn())) {
-        remove = true;
+      if (OPT->_obsModelType == OPT->DCMcodeBias ||  OPT->_obsModelType == OPT->DCMphaseBias) {
+        t_prn refPrn = (refSatMap[par->prn().system()])->prn();
+        if (par->lastObsTime().valid() &&
+            ((epoTime - par->lastObsTime() > 1.0) || (par->prn() == refPrn))) {
+            remove = true;
+        }
+      }
+      else {
+        if (par->lastObsTime().valid() && (epoTime - par->lastObsTime() > 60.0)) {
+            remove = true;
+        }
       }
     }
@@ -420,4 +428,41 @@
   }
 
+  // Check if ambiguity parameters have observations
+  // -----------------------------------------------
+  if (OPT->_obsModelType == OPT->DCMcodeBias ||
+      OPT->_obsModelType == OPT->DCMphaseBias) {
+    vector<t_pppParam*>::iterator it = _params.begin();
+    while (it != _params.end()) {
+      t_pppParam* par = *it;
+      bool remove = false;
+      if (par->type() == t_pppParam::amb && !par->lastObsTime().valid()) {
+        remove = true;
+      }
+      if (remove) {
+        delete par;
+        it = _params.erase(it);
+      }
+      else {
+        ++it;
+      }
+    }
+  }
+
+  // check which systems have observations
+  // -------------------------------------
+  _usedSystems.clear();
+  for (unsigned jj = 0; jj < obsVector.size(); jj++) {
+    const t_pppSatObs* satObs = obsVector[jj];
+    char sys = satObs->prn().system();
+    if (!_usedSystems.contains(sys)) {
+      _usedSystems.append(sys);
+    }
+  }
+
+  if (_usedSystems.size() > 1 &&
+      !_usedSystems.contains('G')) { // required to setup ISB w. r. t. GPS
+    return failure;
+  }
+
   // Required Set of Parameters
   // --------------------------
@@ -433,17 +478,17 @@
   // --------------------
   if (OPT->_obsModelType == OPT->DCMcodeBias) {
-    if (OPT->useSystem('G')) {
+    if (_usedSystems.contains('G')) {
       required.push_back(new t_pppParam(t_pppParam::cBiasG1, t_prn(), t_lc::c1));
       required.push_back(new t_pppParam(t_pppParam::cBiasG2, t_prn(), t_lc::c2));
     }
-    if (OPT->useSystem('R')) {
+    if (_usedSystems.contains('R')) {
       required.push_back(new t_pppParam(t_pppParam::cBiasR1, t_prn(), t_lc::c1));
       required.push_back(new t_pppParam(t_pppParam::cBiasR2, t_prn(), t_lc::c2));
     }
-    if (OPT->useSystem('E')) {
+    if (_usedSystems.contains('E')) {
       required.push_back(new t_pppParam(t_pppParam::cBiasE1, t_prn(), t_lc::c1));
       required.push_back(new t_pppParam(t_pppParam::cBiasE2, t_prn(), t_lc::c2));
     }
-    if (OPT->useSystem('C')) {
+    if (_usedSystems.contains('C')) {
       required.push_back(new t_pppParam(t_pppParam::cBiasC1, t_prn(), t_lc::c1));
       required.push_back(new t_pppParam(t_pppParam::cBiasC2, t_prn(), t_lc::c2));
@@ -455,17 +500,22 @@
   if ((OPT->_obsModelType == OPT->DCMphaseBias) ||
       (OPT->_obsModelType == OPT->PPPRTK)     ) {
-    if (OPT->useSystem('G')) {
+    if (_usedSystems.contains('G')) {
       required.push_back(new t_pppParam(t_pppParam::pBiasG1, t_prn(), t_lc::l1));
       required.push_back(new t_pppParam(t_pppParam::pBiasG2, t_prn(), t_lc::l2));
     }
-    if (OPT->useSystem('E')) {
+    if (_usedSystems.contains('R')) {
+      required.push_back(new t_pppParam(t_pppParam::pBiasR1, t_prn(), t_lc::l1));
+      required.push_back(new t_pppParam(t_pppParam::pBiasR2, t_prn(), t_lc::l2));
+    }
+    if (_usedSystems.contains('E')) {
       required.push_back(new t_pppParam(t_pppParam::pBiasE1, t_prn(), t_lc::l1));
       required.push_back(new t_pppParam(t_pppParam::pBiasE2, t_prn(), t_lc::l2));
     }
-    if (OPT->useSystem('C')) {
+    if (_usedSystems.contains('C')) {
       required.push_back(new t_pppParam(t_pppParam::pBiasC1, t_prn(), t_lc::l1));
       required.push_back(new t_pppParam(t_pppParam::pBiasC2, t_prn(), t_lc::l2));
     }
   }
+
   // Receiver Clock
   // --------------
@@ -474,11 +524,11 @@
   // GPS-GLONASS Clock Offset
   // ------------------------
-  if (OPT->useSystem('R') && OPT->useSystem('G')) {
+  if (_usedSystems.contains('G') && _usedSystems.contains('R')) {
     required.push_back(new t_pppParam(t_pppParam::offGR, t_prn(), t_lc::dummy));
   }
 
-  // GPS-Galileo Clock Offset
+  //GPS-Galileo Clock Offset
   // ------------------------
-  if (OPT->useSystem('E') && OPT->useSystem('G')) {
+  if (_usedSystems.contains('G') && _usedSystems.contains('E')) {
     required.push_back(new t_pppParam(t_pppParam::offGE, t_prn(), t_lc::dummy));
   }
@@ -486,5 +536,5 @@
   // GPS-BDS Clock Offset
   // ------------------------
-  if (OPT->useSystem('C') && OPT->useSystem('G')) {
+  if (_usedSystems.contains('G') && _usedSystems.contains('C')) {
     required.push_back(new t_pppParam(t_pppParam::offGC, t_prn(), t_lc::dummy));
   }
@@ -509,5 +559,5 @@
   // -----------
   for (unsigned jj = 0; jj < obsVector.size(); jj++) {
-    const t_pppSatObs*        satObs = obsVector[jj];
+    const t_pppSatObs*  satObs = obsVector[jj];
     if ((OPT->_obsModelType == OPT->IF)        ||
         (OPT->_obsModelType == OPT->PPPRTK)    ||
Index: trunk/BNC/src/PPP/pppParlist.h
===================================================================
--- trunk/BNC/src/PPP/pppParlist.h	(revision 9399)
+++ trunk/BNC/src/PPP/pppParlist.h	(revision 9419)
@@ -16,6 +16,6 @@
  public:
   enum e_type {crdX, crdY, crdZ, clkR, trp, ion, amb, offGR, offGE, offGC,
-               cBiasG1, cBiasR1, cBiasE1, cBiasC1, pBiasG1, pBiasE1, pBiasC1,
-               cBiasG2, cBiasR2, cBiasE2, cBiasC2, pBiasG2, pBiasE2, pBiasC2};
+               cBiasG1, cBiasR1, cBiasE1, cBiasC1, pBiasG1, pBiasR1, pBiasE1, pBiasC1,
+               cBiasG2, cBiasR2, cBiasE2, cBiasC2, pBiasG2, pBiasR2, pBiasE2, pBiasC2};
 
   t_pppParam(e_type type, const t_prn& prn, t_lc::type tLC, const std::vector<t_pppSatObs*>* obsVector = 0);
@@ -114,4 +114,5 @@
  private:
   std::vector<t_pppParam*> _params;
+  QList<char>              _usedSystems;
 };
 
Index: trunk/BNC/src/PPP/pppSatObs.h
===================================================================
--- trunk/BNC/src/PPP/pppSatObs.h	(revision 9399)
+++ trunk/BNC/src/PPP/pppSatObs.h	(revision 9419)
@@ -44,4 +44,5 @@
   bool                outlier() const {return _outlier;}
   void                setOutlier() {_outlier = true;}
+  void                resetOutlier() {_outlier = false;}
   void                setRes(t_lc::type tLC, double res);
   double              getRes(t_lc::type tLC) const;
