Index: trunk/BNC/src/PPP/pppInclude.h
===================================================================
--- trunk/BNC/src/PPP/pppInclude.h	(revision 6016)
+++ trunk/BNC/src/PPP/pppInclude.h	(revision 6017)
@@ -38,4 +38,5 @@
  public:
   t_frqObs() {
+    _freq            = 0.0;
     _code            = 0.0;          
     _codeValid       = false;     
@@ -51,4 +52,5 @@
   }
   std::string _rnxType2ch; 
+  double      _freq;
   double      _code;          
   bool        _codeValid;     
@@ -122,30 +124,4 @@
 };
 
-class t_frequency {
- public:
-  enum type {dummy = 0, G1, G2, G5, R1, R2, 
-                        E1, // E1  / 1575.42          
-                        E5, // E5a / 1176.45          
-                        E7, // E5b / 1207.140         
-                        E8, // E5(E5a+E5b) / 1191.795 
-                        E6, // E6  / 1278.75          
-             maxFr};
-
-  static std::string toString(type tt) {
-    if      (tt == G1) return "G1";
-    else if (tt == G2) return "G2";
-    else if (tt == G5) return "G5";
-    else if (tt == R1) return "R1";
-    else if (tt == R2) return "R2";
-    else if (tt == E1) return "E1";
-    else if (tt == E5) return "E5";
-    else if (tt == E6) return "E6";
-    else if (tt == E7) return "E7";
-    else if (tt == E8) return "E8";
-    return std::string();
-  }
-};
-
-
 class t_lc {
  public:
Index: trunk/BNC/src/PPP/pppSatObs.cpp
===================================================================
--- trunk/BNC/src/PPP/pppSatObs.cpp	(revision 6016)
+++ trunk/BNC/src/PPP/pppSatObs.cpp	(revision 6017)
@@ -59,11 +59,11 @@
 ////////////////////////////////////////////////////////////////////////////
 t_pppSatObs::t_pppSatObs(const t_satObs& pppSatObs) {
-  _prn  = pppSatObs._prn;
-  _time = pppSatObs._time;
-  _outlier    = false;
-  for (unsigned ii = 0; ii < pppSatObs._obs.size(); ii++) {
-    _allObs.push_back(new t_frqObs(*pppSatObs._obs[ii]));
-  }
-  prepareObs();
+  _prn     = pppSatObs._prn;
+  _time    = pppSatObs._time;
+  _outlier = false;
+  for (unsigned ii = 0; ii < t_frequency::max; ii++) {
+    _obs[ii] = 0;
+  }
+  prepareObs(pppSatObs);
 }
 
@@ -71,39 +71,28 @@
 ////////////////////////////////////////////////////////////////////////////
 t_pppSatObs::~t_pppSatObs() {
-  for (unsigned ii = 0; ii < _allObs.size(); ii++) {
-    delete _allObs[ii];
-  }
-}
-
-// 
-////////////////////////////////////////////////////////////////////////////
-void t_pppSatObs::prepareObs() {
+  for (unsigned iFreq = 1; iFreq < t_frequency::max; iFreq++) {
+    delete _obs[iFreq];
+  }
+}
+
+// 
+////////////////////////////////////////////////////////////////////////////
+void t_pppSatObs::prepareObs(const t_satObs& pppSatObs) {
+
   _model.reset();
-  _valid     = true;
-  _validObs1 = 0;
-  _validObs2 = 0;
-
-  bool dualFreq = OPT->dualFreqRequired(_prn.system());
-
-  // Select two pseudoranges and two phase observations
-  // --------------------------------------------------
+
+  // Select pseudoranges and phase observations
+  // ------------------------------------------
   const string preferredAttrib = "CWP_";
-  for (unsigned iPref = 0; iPref < preferredAttrib.length(); iPref++) {
-    string obsType1 = (preferredAttrib[iPref] == '_') ? string("1") : string("1") + preferredAttrib[iPref];
-    string obsType2 = (preferredAttrib[iPref] == '_') ? string("2") : string("2") + preferredAttrib[iPref];
-    if (_validObs1 == 0) {
-      for (unsigned ii = 0; ii < _allObs.size(); ii++) {
-        t_frqObs* obs = _allObs[ii];
-        if (obs->_rnxType2ch == obsType1 && obs->_codeValid && obs->_phaseValid) {
-          _validObs1 = obs;
-        }
-      }
-    }
-    if (dualFreq) {
-      if (_validObs2 == 0) {
-        for (unsigned ii = 0; ii < _allObs.size(); ii++) {
-          t_frqObs* obs = _allObs[ii];
-          if (obs->_rnxType2ch == obsType2 && obs->_codeValid && obs->_phaseValid) {
-            _validObs2 = obs;
+
+  for (unsigned iFreq = 1; iFreq < t_frequency::max; iFreq++) {
+    string frqNum = t_frequency::toString(t_frequency::type(iFreq)).substr(1);
+    for (unsigned iPref = 0; iPref < preferredAttrib.length(); iPref++) {
+      string obsType = (preferredAttrib[iPref] == '_') ? frqNum : frqNum + preferredAttrib[iPref];
+      if (_obs[iFreq] == 0) {
+        for (unsigned ii = 0; ii < pppSatObs._obs.size(); ii++) {
+          const t_frqObs* obs = pppSatObs._obs[ii];
+          if (obs->_rnxType2ch == obsType && obs->_codeValid && obs->_phaseValid) {
+            _obs[iFreq] = new t_frqObs(*obs);
           }
         }
@@ -111,9 +100,4 @@
     }
   }
-
-  if (_validObs1 == 0 || (dualFreq && _validObs2 == 0)) {
-    _valid = false;
-    return;
-  } 
 
   // Find Glonass Channel Number
Index: trunk/BNC/src/PPP/pppSatObs.h
===================================================================
--- trunk/BNC/src/PPP/pppSatObs.h	(revision 6016)
+++ trunk/BNC/src/PPP/pppSatObs.h	(revision 6017)
@@ -16,6 +16,4 @@
   t_pppSatObs(const t_satObs& satObs);
   ~t_pppSatObs();
-  bool                isValid() const {return _valid;}
-  void                prepareObs();
   const t_prn&        prn() const {return _prn;}
   const ColumnVector& xc() const {return _xcSat;}
@@ -42,6 +40,6 @@
 
   bool slip() const {
-    for (unsigned ii = 0; ii < _allObs.size(); ii++) {
-      if (_allObs[ii]->_slip) {
+    for (unsigned ii = 1; ii < t_frequency::max; ii++) {
+      if (_obs[ii] && _obs[ii]->_slip) {
         return true;
       }
@@ -52,7 +50,7 @@
   int slipCounter() const {
     int cnt = -1;
-    for (unsigned ii = 0; ii < _allObs.size(); ii++) {
-      if (_allObs[ii]->_slipCounter > cnt) {
-        cnt = _allObs[ii]->_slipCounter;
+    for (unsigned ii = 1; ii < t_frequency::max; ii++) {
+      if (_obs[ii] && _obs[ii]->_slipCounter > cnt) {
+        cnt = _obs[ii]->_slipCounter;
       }
     }
@@ -62,7 +60,7 @@
   int biasJumpCounter() const {
     int jmp = -1;
-    for (unsigned ii = 0; ii < _allObs.size(); ii++) {
-      if (_allObs[ii]->_biasJumpCounter > jmp) {
-        jmp = _allObs[ii]->_biasJumpCounter;
+    for (unsigned ii = 1; ii < t_frequency::max; ii++) {
+      if (_obs[ii] && _obs[ii]->_biasJumpCounter > jmp) {
+        jmp = _obs[ii]->_biasJumpCounter;
       }
     }
@@ -113,17 +111,10 @@
   };
 
+  void prepareObs(const t_satObs& satObs);
+
   t_prn                        _prn;
   bncTime                      _time;
   int                          _channel;
-  std::vector<t_frqObs*>       _allObs;
-  bool                         _valid;
-  t_frqObs*                    _validObs1;
-  t_frqObs*                    _validObs2;
-  double                       _f1;
-  double                       _f2;
-  double                       _rawC1;
-  double                       _rawC2;
-  double                       _rawL1;
-  double                       _rawL2;
+  t_frqObs*                    _obs[t_frequency::max];
   ColumnVector                 _xcSat;
   ColumnVector                 _vvSat;
