Index: trunk/BNC/src/PPP/options.h
===================================================================
--- trunk/BNC/src/PPP/options.h	(revision 5751)
+++ trunk/BNC/src/PPP/options.h	(revision 5752)
@@ -11,4 +11,11 @@
 class t_options {
  public:
+  class t_optBias {
+   public:
+    t_optBias(char system, t_lc::type tLC) : _system(system), _tLC(tLC) {}
+    char       _system;
+    t_lc::type _tLC;
+  };
+
   t_options();
   ~t_options();
@@ -17,4 +24,5 @@
   bool useGlonass();
   bool xyzAprRoverSet();
+  bool estTropo();
   std::vector<t_lc::type> LCs();
   double maxRes(t_lc::type tLC);
@@ -39,4 +47,5 @@
   std::vector<t_lc::type> _lcGLONASS;
   std::vector<t_lc::type> _lcGalileo;
+  std::vector<t_optBias>  _estBias;
 
   ColumnVector _xyzAprRover;
Index: trunk/BNC/src/PPP/parlist.cpp
===================================================================
--- trunk/BNC/src/PPP/parlist.cpp	(revision 5751)
+++ trunk/BNC/src/PPP/parlist.cpp	(revision 5752)
@@ -7,9 +7,9 @@
 #include "parlist.h"
 #include "satobs.h"
+
 #include "station.h"
-#include "tropo.h"
-#include "iono.h"
-#include "utils.h"
-#include "genconst.h"
+#include "bncutils.h"
+#include "bncconst.h"
+#include "pppClient.h"
 
 using namespace BNC;
@@ -33,13 +33,13 @@
    case crdX:
      _epoSpec = true;
-     _sigma0  = OPT->sigmaCrd();
+     _sigma0  = OPT->_sigCrd[0];
      break;
    case crdY:
      _epoSpec = true;
-     _sigma0  = OPT->sigmaCrd();
+     _sigma0  = OPT->_sigCrd[1];
      break;
    case crdZ:
      _epoSpec = true;
-     _sigma0  = OPT->sigmaCrd();
+     _sigma0  = OPT->_sigCrd[2];
      break;
    case clkR:
@@ -57,5 +57,5 @@
              offGG = PPP_CLIENT->offGG();
            }
-           _x0 = nint((obs->obsValue(tLC) - offGG - obs->cmpValue(tLC)) / obs->lambda(tLC));
+           _x0 = floor((obs->obsValue(tLC) - offGG - obs->cmpValue(tLC)) / obs->lambda(tLC) + 0.5);
            break;
          }
@@ -72,16 +72,6 @@
    case trp:
      _epoSpec = false;
-     _sigma0  = OPT->sigmaTropo();
-     _noise   = OPT->noiseTropo();
-     break;
-   case iono:
-     if (OPT->noiseIono() > 0.0) {
-       _epoSpec = false;
-     }
-     else {
-       _epoSpec = true;
-     }
-     _sigma0  = OPT->sigmaIono();
-     _noise   = OPT->noiseIono();
+     _sigma0  = OPT->_sigTropo;
+     _noise   = OPT->_noiseTropo;
      break;
    case bias:
@@ -100,5 +90,5 @@
 // 
 ////////////////////////////////////////////////////////////////////////////
-double t_param::partial(const bncTime& epoTime, const t_satObs* obs, 
+double t_param::partial(const bncTime& /* epoTime */, const t_satObs* obs, 
                         const t_lc::type& tLC) const {
 
@@ -144,13 +134,5 @@
     return 0.0;
   case trp:
-    return t_tropo::mf(OPT->tropoMF(), epoTime, sta->ellApr()[0],
-                       sta->ellApr()[1], sta->ellApr()[2], obs->eleSat());
-  case iono:
-    if (obs->prn() == _prn) {
-      return t_iono::dLCdI(tLC, obs->prn().system(), obs->channel());
-    }
-    else {
-      return 0.0;
-    }
+    return 1.0 / sin(obs->eleSat()); 
   case bias:
     if (tLC == _tLC && obs->prn().system() == _prn.system()) {
@@ -191,7 +173,4 @@
     ss << "TRP        ";
     break;
-  case iono:
-    ss << "IONO " << _prn.toString();
-    break;
   case bias:
     ss << "BIAS " << _prn.system() << ' ' << left << setw(3) << t_lc::toString(_tLC);
@@ -237,5 +216,5 @@
     }
 
-    else if (par->type() == t_param::amb || par->type() == t_param::iono) {
+    else if (par->type() == t_param::amb) {
       if (par->lastObsTime().valid() && (epoTime - par->lastObsTime() > 3600.0)) {
         remove = true;
@@ -298,6 +277,6 @@
   // Receiver Biases
   // ---------------
-  for (unsigned ii = 0; ii < OPT->estBias().size(); ii++) {
-    const t_options::t_optBias& optBias = OPT->estBias()[ii];
+  for (unsigned ii = 0; ii < OPT->_estBias.size(); ii++) {
+    const t_options::t_optBias& optBias = OPT->_estBias[ii];
     required.push_back(new t_param(t_param::bias, t_prn(optBias._system, 1), optBias._tLC));
   }
@@ -316,13 +295,4 @@
       const t_satObs* satObs = obsVector[jj];
       required.push_back(new t_param(t_param::amb, satObs->prn(), tLC, &obsVector));
-    }
-  }
-
-  // Stochastic Ionosphere
-  //----------------------
-  if (OPT->estIono()) {
-    for (unsigned jj = 0; jj < obsVector.size(); jj++) {
-      const t_satObs* satObs = obsVector[jj];
-      required.push_back(new t_param(t_param::iono, satObs->prn(), t_lc::dummy));
     }
   }
@@ -365,5 +335,5 @@
   }
 
-  return t_irc::success;
+  return success;
 }
 
@@ -398,5 +368,5 @@
           << setw(8)  << setprecision(4) << sqrt(QQ[ind][ind]);
       if (par->type() == t_param::amb) {
-        LOG << " el = " << setw(6) << setprecision(2) << par->ambEleSat() * t_genConst::rho_deg 
+        LOG << " el = " << setw(6) << setprecision(2) << par->ambEleSat() * 180.0 / M_PI
             << " epo = " << setw(4) << par->ambNumEpo();
       }
Index: trunk/BNC/src/PPP/parlist.h
===================================================================
--- trunk/BNC/src/PPP/parlist.h	(revision 5751)
+++ trunk/BNC/src/PPP/parlist.h	(revision 5752)
@@ -14,5 +14,5 @@
 class t_param {
  public:
-  enum e_type {crdX, crdY, crdZ, clkR, amb, offGG, trp, iono, bias};
+  enum e_type {crdX, crdY, crdZ, clkR, amb, offGG, trp, bias};
 
   t_param(e_type type, const t_prn& prn, t_lc::type tLC,
Index: trunk/BNC/src/bncutils.cpp
===================================================================
--- trunk/BNC/src/bncutils.cpp	(revision 5751)
+++ trunk/BNC/src/bncutils.cpp	(revision 5752)
@@ -285,4 +285,81 @@
 }
 
+// Jacobian XYZ --> NEU 
+////////////////////////////////////////////////////////////////////////////
+void jacobiXYZ_NEU(const double* Ell, Matrix& jacobi) {
+
+  Tracer tracer("jacobiXYZ_NEU");
+
+  double sinPhi = sin(Ell[0]);
+  double cosPhi = cos(Ell[0]);
+  double sinLam = sin(Ell[1]);
+  double cosLam = cos(Ell[1]);
+
+  jacobi(1,1) = - sinPhi * cosLam;
+  jacobi(1,2) = - sinPhi * sinLam;
+  jacobi(1,3) =   cosPhi;
+                           
+  jacobi(2,1) = - sinLam;        
+  jacobi(2,2) =   cosLam;
+  jacobi(2,3) =   0.0;          
+                           
+  jacobi(3,1) = cosPhi * cosLam; 
+  jacobi(3,2) = cosPhi * sinLam; 
+  jacobi(3,3) = sinPhi;
+}
+
+// Jacobian Ell --> XYZ
+////////////////////////////////////////////////////////////////////////////
+void jacobiEll_XYZ(const double* Ell, Matrix& jacobi) {
+
+  Tracer tracer("jacobiEll_XYZ");
+
+  double sinPhi = sin(Ell[0]);
+  double cosPhi = cos(Ell[0]);
+  double sinLam = sin(Ell[1]);
+  double cosLam = cos(Ell[1]);
+  double hh     = Ell[2];
+
+  double bell =  t_CST::aell*(1.0-1.0/t_CST::fInv);
+  double e2   = (t_CST::aell*t_CST::aell-bell*bell)/(t_CST::aell*t_CST::aell) ;
+  double nn   =  t_CST::aell/sqrt(1.0-e2*sinPhi*sinPhi) ;
+
+  jacobi(1,1) = -(nn+hh) * sinPhi * cosLam;
+  jacobi(1,2) = -(nn+hh) * cosPhi * sinLam;
+  jacobi(1,3) = cosPhi * cosLam;
+
+  jacobi(2,1) = -(nn+hh) * sinPhi * sinLam;
+  jacobi(2,2) =  (nn+hh) * cosPhi * cosLam;
+  jacobi(2,3) = cosPhi * sinLam;
+
+  jacobi(3,1) = (nn*(1.0-e2)+hh) * cosPhi;
+  jacobi(3,2) = 0.0;
+  jacobi(3,3) = sinPhi;
+} 
+
+// Covariance Matrix in NEU
+////////////////////////////////////////////////////////////////////////////
+void covariXYZ_NEU(const SymmetricMatrix& QQxyz, const double* Ell, 
+                   SymmetricMatrix& Qneu) {
+
+  Tracer tracer("covariXYZ_NEU");
+
+  Matrix CC(3,3);
+  jacobiXYZ_NEU(Ell, CC);
+  Qneu << CC * QQxyz * CC.t();
+}
+
+// Covariance Matrix in XYZ
+////////////////////////////////////////////////////////////////////////////
+void covariNEU_XYZ(const SymmetricMatrix& QQneu, const double* Ell, 
+                   SymmetricMatrix& Qxyz) {
+
+  Tracer tracer("covariNEU_XYZ");
+
+  Matrix CC(3,3);
+  jacobiXYZ_NEU(Ell, CC);
+  Qxyz << CC.t() * QQneu * CC;
+}
+
 // Fourth order Runge-Kutta numerical integrator for ODEs
 ////////////////////////////////////////////////////////////////////////////
Index: trunk/BNC/src/bncutils.h
===================================================================
--- trunk/BNC/src/bncutils.h	(revision 5751)
+++ trunk/BNC/src/bncutils.h	(revision 5752)
@@ -58,4 +58,14 @@
 void neu2xyz(const double* Ell, const double* neu, double* xyz);
 
+void jacobiXYZ_NEU(const double* Ell, Matrix& jacobi);
+
+void jacobiEll_XYZ(const double* Ell, Matrix& jacobi);
+
+void covariXYZ_NEU(const SymmetricMatrix& Qxyz, const double* Ell, 
+                   SymmetricMatrix& Qneu);
+
+void covariNEU_XYZ(const SymmetricMatrix& Qneu, const double* Ell, 
+                   SymmetricMatrix& Qxyz);
+
 ColumnVector rungeKutta4(double xi, const ColumnVector& yi, double dx,
                          double* acc,
Index: trunk/BNC/src/src.pri
===================================================================
--- trunk/BNC/src/src.pri	(revision 5751)
+++ trunk/BNC/src/src.pri	(revision 5752)
@@ -61,5 +61,5 @@
           PPP/pppThread.h PPP/pppClient.h                             \
           PPP/obspool.h PPP/station.h PPP/filter.h PPP/ephpool.h      \
-          PPP/satobs.h PPP/satbias.h 
+          PPP/satobs.h PPP/satbias.h PPP/parlist.h
 
 HEADERS       += serial/qextserialbase.h serial/qextserialport.h
@@ -92,5 +92,5 @@
           PPP/pppThread.cpp PPP/pppClient.cpp                         \
           PPP/obspool.cpp PPP/station.cpp PPP/filter.cpp PPP/ephpool.cpp \
-          PPP/satobs.cpp PPP/satbias.cpp
+          PPP/satobs.cpp PPP/satbias.cpp PPP/parlist.cpp
 
 SOURCES       += serial/qextserialbase.cpp serial/qextserialport.cpp
