Index: trunk/BNC/src/RTCM3/gnss.h
===================================================================
--- trunk/BNC/src/RTCM3/gnss.h	(revision 10125)
+++ trunk/BNC/src/RTCM3/gnss.h	(revision 10127)
@@ -82,6 +82,8 @@
 #define BDS_WAVELENGTH_B2b  (LIGHTSPEED / BDS_FREQU_B2b) /* m */
 
+#define IRNSS_FREQU_L1      1575420000.0 /* Hz */
 #define IRNSS_FREQU_L5      1176450000.0 /* Hz */
 #define IRNSS_FREQU_S       2492028000.0 /* Hz */
+#define IRNSS_WAVELENGTH_L1 (LIGHTSPEED / IRNSS_FREQU_L1) /* m */
 #define IRNSS_WAVELENGTH_L5 (LIGHTSPEED / IRNSS_FREQU_L5) /* m */
 #define IRNSS_WAVELENGTH_S  (LIGHTSPEED / IRNSS_FREQU_S)  /* m */
Index: trunk/BNC/src/bncmain.cpp
===================================================================
--- trunk/BNC/src/bncmain.cpp	(revision 10125)
+++ trunk/BNC/src/bncmain.cpp	(revision 10127)
@@ -238,10 +238,12 @@
       "   PPP/ionoFile    {VTEC file, full path [char string]}\n"
 #endif
-      "   PPP/nmeaPath    {Directory for NMEA output files [character string]}\n"
-      "   PPP/snxtroPath  {Directory for SINEX troposphere output files [character string]}\n"
-      "   PPP/snxtroIntr  {SINEX troposphere file interval [character string: 1 min|2 min|5 min|10 min|15 min|30 min|1 hour|1 day]}\n"
-      "   PPP/snxtroSampl {SINEX troposphere file sampling rate [character string: 1 sec|5 sec|10 sec|30 sec|60 sec|300 sec]}\n"
-      "   PPP/snxtroAc    {SINEX troposphere Analysis Center [3-char string]}\n"
-      "   PPP/snxtroSol   {SINEX troposphere solution ID [1-char]}\n"
+      "   PPP/nmeaPath      {Directory for NMEA output files [character string]}\n"
+      "   PPP/snxtroPath    {Directory for SINEX troposphere output files [character string]}\n"
+      "   PPP/snxtroIntr    {SINEX troposphere file interval [character string: 1 min|2 min|5 min|10 min|15 min|30 min|1 hour|1 day]}\n"
+      "   PPP/snxtroSampl   {SINEX troposphere file sampling rate [character string: 1 sec|5 sec|10 sec|30 sec|60 sec|300 sec]}\n"
+      "   PPP/snxtroAc      {SINEX troposphere Analysis Center [3-char string]}\n"
+      "   PPP/snxtroSolId   {SINEX troposphere solution ID [1-char]}\n"
+      "   PPP/snxtroSolType {SINEX troposphere solution type, e.g. RTS, UNK, .. [3-char]}\n"
+      "   PPP/snxtroCampId  {SINEX troposphere campaign ID, e.g. DEM, TST, OPS, .. [3-char]}\n"
       "\n"
       "PPP Client Panel 2 keys:\n"
Index: trunk/BNC/src/bncoutf.cpp
===================================================================
--- trunk/BNC/src/bncoutf.cpp	(revision 10125)
+++ trunk/BNC/src/bncoutf.cpp	(revision 10127)
@@ -159,9 +159,11 @@
       bncSettings settings;
       QString ac  = settings.value("PPP/snxtroAc").toString();
-      QString sol = settings.value("PPP/snxtroSol").toString();
+      QString solId = settings.value("PPP/snxtroSolId").toString();
+      QString solType = settings.value("PPP/snxtroSolType").toString();
+      QString campId  = settings.value("PPP/snxtroCampId").toString();
       baseName.replace(0,3,ac);
-      baseName.replace(3,1,sol);
-      baseName.replace(4,3,"DEM");
-      baseName.replace(7,3,"RTS");
+      baseName.replace(3,1,solId);
+      baseName.replace(4,3,solType);
+      baseName.replace(7,3,campId);
       addition = QString("_%1_TRO").arg(site);
     }
Index: trunk/BNC/src/bncsinextro.cpp
===================================================================
--- trunk/BNC/src/bncsinextro.cpp	(revision 10125)
+++ trunk/BNC/src/bncsinextro.cpp	(revision 10127)
@@ -79,7 +79,7 @@
                                        .arg(nominalEndSec , 5, 10, QLatin1Char('0'));
   int numEpochs = ((nominalEndSec - daysec) / _sampl) +1;
-  QString epo  = QString("%1").arg(numEpochs, 5, 10, QLatin1Char('0'));
-  QString ac   = QString("%1").arg(settings.value("PPP/snxtroAc").toString(),3,QLatin1Char(' '));
-  QString sol  = QString("   %1").arg(settings.value("PPP/snxtroSol").toString(),1,QLatin1Char(' '));
+  QString epo    = QString("%1").arg(numEpochs, 5, 10, QLatin1Char('0'));
+  QString ac     = QString("%1").arg(settings.value("PPP/snxtroAc").toString(),3,QLatin1Char(' '));
+  QString solId  = settings.value("PPP/snxtroSolId").toString();
   QString corr = "";
   if      (settings.value("PPP/dataSource").toString() == "Real-Time Streams") {
@@ -118,12 +118,42 @@
        << startTime.toStdString()    << " " << endTime.toStdString() << " P "
        << epo.toStdString() << " 0 " << " T " << endl;
-
+  _out << "*-------------------------------------------------------------------------------" << endl;
   _out << "+FILE/REFERENCE" << endl;
+  _out << "*INFO_TYPE_________ INFO________________________________________________________" << endl;
   _out << " DESCRIPTION        " << "BNC generated SINEX TRO file" << endl;
   _out << " OUTPUT             " << "Total Troposphere Zenith Path Delay Product" << endl;
   _out << " SOFTWARE           " <<  BNCPGMNAME <<  endl;
-  _out << " INPUT              " << "Observations: " << _opt->_roverName.substr(0,9)
-                                 << ", SSR corrections: "  << corr.toStdString() << endl;
-  _out << "-FILE/REFERENCE" << endl << endl;
+  _out << " INPUT              " << "OBS: "    << _opt->_roverName.substr(0,9) << ", SSR: "  << corr.toStdString() << endl;
+  _out << " VERSON NUMBER      " <<  QString("%1").arg(solId, 10, QLatin1Char(' ')).toStdString() << endl;
+  _out << "-FILE/REFERENCE" << endl;
+  _out << "*-------------------------------------------------------------------------------" << endl;
+
+
+  QString blqFileName = QString::fromStdString(_opt->_blqFileName);
+  QString blqFileBaseName;
+  QString blqFileExtension;
+  if (! blqFileName.isEmpty()) {
+    QFileInfo fileInfo(blqFileName);
+    blqFileBaseName  = fileInfo.baseName();
+    blqFileExtension = fileInfo.completeSuffix();
+    if (!blqFileExtension.isEmpty()) {
+      blqFileExtension = "." + blqFileExtension;
+    }
+  }
+  _out << "+TROP/DESCRIPTION" << endl;
+  _out << "*KEYWORD______________________ VALUE(S)______________" << endl;
+  _out << " SAMPLING INTERVAL                               "
+       << setw(4) << _sampl << endl;
+  _out << " SAMPLING TROP                                   "
+       << setw(4) << _sampl << endl;
+  _out << " ELEVATION CUTOFF ANGLE                          "
+       << setw(4) <<  int(_opt->_minEle * 180.0/M_PI) << endl;
+  if (! blqFileName.isEmpty()) {
+    _out << " OCEAN TIDE LOADING MODEL      " << blqFileBaseName.toStdString() + blqFileExtension.toStdString() << endl;
+  }
+  _out << " TROP MAPPING FUNCTION         " << "Saastamoinen" << endl;
+  _out << " SOLUTION_FIELDS_1             " << "TROTOT STDEV" << endl;
+  _out << "-TROP/DESCRIPTION"<< endl;
+  _out << "*-------------------------------------------------------------------------------" << endl;
 
   double recEll[3];
@@ -144,33 +174,56 @@
   }
   _out << "+SITE/ID" << endl;
-  _out << "*CODE      PT DOMES____ T _STATION DESCRIPTION__ APPROX_LON_ APPROX_LAT_ _APP_H_" << endl;
+  _out << "*STATION__ PT __DOMES__ T _STATION_DESCRIPTION__ _LONGITUDE _LATITUDE_ _HGT_ELI_" << endl;
   _out << " " << _opt->_roverName.substr(0,9) << "  A           P "
        << country.toStdString() << "                   "
-       << QString(" %1").arg(lonD, 3, 10, QLatin1Char(' ')).toStdString()
-       << QString(" %1").arg(lonM, 2, 10, QLatin1Char(' ')).toStdString()
-       << QString(" %1").arg(lonS, 4, 'f', 1, QLatin1Char(' ')).toStdString()
-       << QString(" %1").arg(latD, 3, 10, QLatin1Char(' ')).toStdString()
-       << QString(" %1").arg(latM, 2, 10, QLatin1Char(' ')).toStdString()
-       << QString(" %1").arg(latS, 4, 'f', 1, QLatin1Char(' ')).toStdString()
-       << QString(" %1").arg(recEll[2], 7, 'f', 1, QLatin1Char(' ')).toStdString()
+       << QString(" %1").arg(recEll[0]* 180.0 / M_PI,10, 'f', 6, QLatin1Char(' ')).toStdString()
+       << QString(" %1").arg(recEll[1]* 180.0 / M_PI,10, 'f', 6, QLatin1Char(' ')).toStdString()
+       << QString(" %1").arg(recEll[2], 9, 'f', 3, QLatin1Char(' ')).toStdString()
        << endl;
-  _out << "-SITE/ID" << endl << endl;
+  _out << "-SITE/ID" << endl;
+  _out << "*-------------------------------------------------------------------------------" << endl;
+
+  _out << "+TROP/COORDINATES" << endl;
+  _out << "*SITE      PT SOLN T STA_X_______ STA_Y_______ STA_Z_______ SYSTEM REMARK" << endl;
+  _out << " " << _opt->_roverName.substr(0,9) << "  A "
+       <<  solId.toStdString() << " P"
+       << QString(" %1").arg(_opt->_xyzAprRover(1), 12, 'f', 3, QLatin1Char(' ')).toStdString()
+       << QString(" %1").arg(_opt->_xyzAprRover(2), 12, 'f', 3, QLatin1Char(' ')).toStdString()
+       << QString(" %1").arg(_opt->_xyzAprRover(3), 12, 'f', 3, QLatin1Char(' ')).toStdString()
+       << " IGS20 " << ac.toStdString() << endl;
+  _out << "-TROP/COORDINATES"<< endl;
+  _out << "*-------------------------------------------------------------------------------" << endl;
+
+
+  _out << "+SITE/ECCENTRICITY" << endl;
+  _out << "*                                             UP______ NORTH___ EAST____" << endl;
+  _out << "*SITE      PT SOLN T DATA_START__ DATA_END____ AXE ARP->BENCHMARK(M)_________" << endl;
+  _out << " " << _opt->_roverName.substr(0,9) << "  A "
+       <<  solId.toStdString() << " P "
+       << startTime.toStdString() << " " << endTime.toStdString() << " UNE"
+       << QString("%1").arg(_opt->_neuEccRover(3), 9, 'f', 4, QLatin1Char(' ')).toStdString()
+       << QString("%1").arg(_opt->_neuEccRover(1), 9, 'f', 4, QLatin1Char(' ')).toStdString()
+       << QString("%1").arg(_opt->_neuEccRover(2), 9, 'f', 4, QLatin1Char(' ')).toStdString() << endl;
+  _out << "-SITE/ECCENTRICITY" << endl;
+  _out << "*-------------------------------------------------------------------------------" << endl;
 
   if (!_opt->_recNameRover.empty()) {
     _out << "+SITE/RECEIVER" << endl;
-    _out << "*SITE      PT SOLN T DATA_START__ DATA_END____ DESCRIPTION_________ S/N__ FIRMWARE___" << endl;
-    _out << " " << _opt->_roverName.substr(0,9) << "  A "  <<  sol.toStdString() << " P "
+    _out << "*STATION__ PT SOLN T __DATA_START__ __DATA_END____ DESCRIPTION_________ S/N_________________ FIRMW______" << endl;
+    _out << " " << _opt->_roverName.substr(0,9) << "  A "  <<  solId.toStdString() << " P "
          << startTime.toStdString() << " " << endTime.toStdString()
          << QString(" %1").arg(_opt->_recNameRover.c_str(), 20,QLatin1Char(' ')).toStdString()
          << " -----" << " -----------" << endl;
-    _out << "-SITE/RECEIVER" << endl << endl;
+    _out << "-SITE/RECEIVER" << endl;
+    _out << "*-------------------------------------------------------------------------------" << endl;
   }
 
   _out << "+SITE/ANTENNA" << endl;
-  _out << "*SITE      PT SOLN T DATA_START__ DATA_END____ DESCRIPTION_________ S/N__" << endl;
-  _out << " " << _opt->_roverName.substr(0,9) << "  A "  <<  sol.toStdString() << " P "
+  _out << "*STATION__ PT SOLN T __DATA_START__ __DATA_END____ DESCRIPTION_________ S/N_________________ PCV_MODEL_" << endl;
+  _out << " " << _opt->_roverName.substr(0,9) << "  A "  <<  solId.toStdString() << " P "
        << startTime.toStdString() << " " << endTime.toStdString() << " "
        << _opt->_antNameRover << " -----" << endl;
-  _out << "-SITE/ANTENNA" << endl << endl;
+  _out << "-SITE/ANTENNA" << endl;
+  _out << "*-------------------------------------------------------------------------------" << endl;
 
   if (!_opt->_antexFileName.empty()) {
@@ -188,5 +241,6 @@
            }
       _out << " ---------" << endl;
-      _out << "-SITE/GPS_PHASE_CENTER" << endl << endl;
+      _out << "-SITE/GPS_PHASE_CENTER" << endl;
+      _out << "*-------------------------------------------------------------------------------" << endl;
     }
     if (_opt->_LCsGLONASS.size()) {
@@ -202,5 +256,6 @@
            }
       _out << " ---------" << endl;
-      _out << "-SITE/GLONASS_PHASE_CENTER" << endl << endl;
+      _out << "-SITE/GLONASS_PHASE_CENTER" << endl;
+      _out << "*-------------------------------------------------------------------------------" << endl;
     }
     if (_opt->_LCsGalileo.size()) {
@@ -216,5 +271,6 @@
            }
       _out << " ---------" << endl;
-      _out << "-SITE/GALILEO_PHASE_CENTER" << endl << endl;
+      _out << "-SITE/GALILEO_PHASE_CENTER" << endl;
+      _out << "*-------------------------------------------------------------------------------" << endl;
     }
     if (_opt->_LCsBDS.size()) {
@@ -230,5 +286,6 @@
                }
       _out << " ---------" << endl;
-      _out << "-SITE/BEIDOU_PHASE_CENTER" << endl << endl;
+      _out << "-SITE/BEIDOU_PHASE_CENTER" << endl;
+      _out << "*-------------------------------------------------------------------------------" << endl;
     }
     delete _antex;
@@ -236,49 +293,6 @@
   }
 
-  _out << "+SITE/ECCENTRICITY" << endl;
-  _out << "*                                             UP______ NORTH___ EAST____" << endl;
-  _out << "*SITE      PT SOLN T DATA_START__ DATA_END____ AXE ARP->BENCHMARK(M)_________" << endl;
-  _out << " " << _opt->_roverName.substr(0,9) << "  A "  <<  sol.toStdString() << " P "
-       << startTime.toStdString() << " " << endTime.toStdString() << " UNE"
-       << QString("%1").arg(_opt->_neuEccRover(3), 9, 'f', 4, QLatin1Char(' ')).toStdString()
-       << QString("%1").arg(_opt->_neuEccRover(1), 9, 'f', 4, QLatin1Char(' ')).toStdString()
-       << QString("%1").arg(_opt->_neuEccRover(2), 9, 'f', 4, QLatin1Char(' ')).toStdString() << endl;
-  _out << "-SITE/ECCENTRICITY" << endl << endl;
-
-  _out << "+TROP/COORDINATES" << endl;
-  _out << "*SITE      PT SOLN T STA_X_______ STA_Y_______ STA_Z_______ SYSTEM REMARK" << endl;
-  _out << " " << _opt->_roverName.substr(0,9) << "  A "  <<  sol.toStdString() << " P"
-       << QString(" %1").arg(_opt->_xyzAprRover(1), 12, 'f', 3, QLatin1Char(' ')).toStdString()
-       << QString(" %1").arg(_opt->_xyzAprRover(2), 12, 'f', 3, QLatin1Char(' ')).toStdString()
-       << QString(" %1").arg(_opt->_xyzAprRover(3), 12, 'f', 3, QLatin1Char(' ')).toStdString()
-       << " IGS20 " << ac.toStdString() << endl;
-  _out << "-TROP/COORDINATES"<< endl << endl;
-
-  QString blqFileName = QString::fromStdString(_opt->_blqFileName);
-  QString blqFileBaseName;
-  QString blqFileExtension;
-  if (! blqFileName.isEmpty()) {
-    QFileInfo fileInfo(blqFileName);
-    blqFileBaseName  = fileInfo.baseName();
-    blqFileExtension = fileInfo.completeSuffix();
-    if (!blqFileExtension.isEmpty()) {
-      blqFileExtension = "." + blqFileExtension;
-    }
-  }
-  _out << "+TROP/DESCRIPTION" << endl;
-  _out << "*KEYWORD______________________ VALUE(S)______________" << endl;
-  _out << " SAMPLING INTERVAL                               "
-       << setw(4) << _sampl << endl;
-  _out << " SAMPLING TROP                                   "
-       << setw(4) << _sampl << endl;
-  _out << " ELEVATION CUTOFF ANGLE                          "
-       << setw(4) <<  int(_opt->_minEle * 180.0/M_PI) << endl;
-  _out << " OCEAN TIDE LOADING MODEL      " << blqFileBaseName.toStdString() + blqFileExtension.toStdString() << endl;
-  _out << " TROP MAPPING FUNCTION         " << "Saastamoinen" << endl;
-  _out << " SOLUTION_FIELDS_1             " << "TROTOT STDEV" << endl;
-  _out << "-TROP/DESCRIPTION"<< endl << endl;
-
   _out << "+TROP/SOLUTION" << endl;
-  _out << "*SITE      EPOCH_______ TROTOT STDEV" << endl;
+  _out << "*STATION__ ____EPOCH_____ TROTOT STDDEV " << endl;
 }
 
Index: trunk/BNC/src/bncsp3.cpp
===================================================================
--- trunk/BNC/src/bncsp3.cpp	(revision 10125)
+++ trunk/BNC/src/bncsp3.cpp	(revision 10127)
@@ -78,5 +78,5 @@
       if (_lastEpoTime.valid() && _sampl > 0) {
         for (bncTime ep = _lastEpoTime +_sampl; ep < epoTime; ep = ep +_sampl) {
-          _out << "*  " << ep.datestr(' ') << ' ' << ep.timestr(8, ' ') << endl;
+          _out << "\n*  " << ep.datestr(' ') << ' ' << ep.timestr(8, ' ');
         }
       }
@@ -84,23 +84,21 @@
       // Print the new epoch
       // -------------------
-      _out << "*  " << epoTime.datestr(' ') << ' ' << epoTime.timestr(8, ' ') << endl;
+      _out << "\n*  " << epoTime.datestr(' ') << ' ' << epoTime.timestr(8, ' ');
 
       _lastEpoTime = epoTime;
     }
 
-    _out << "P" << prn.toLatin1().data()
+    _out << "\nP" << prn.toLatin1().data()
          << setw(14) << setprecision(6) << xCoM(1) / 1000.0 // [km]
          << setw(14) << setprecision(6) << xCoM(2) / 1000.0 // [km]
          << setw(14) << setprecision(6) << xCoM(3) / 1000.0 // [km]
-         << setw(14) << setprecision(6) << sp3Clk * 1e6     // microseconds
-         << endl;
+         << setw(14) << setprecision(6) << sp3Clk * 1e6;     // microseconds
 
     if (sp3ClkRate) {
-      _out << "V" << prn.toLatin1().data()
+      _out << "\nV" << prn.toLatin1().data()
            << setw(14) << setprecision(6) << v(1) * 10.0      // [dm/s]
            << setw(14) << setprecision(6) << v(2) * 10.0      // [dm/s]
            << setw(14) << setprecision(6) << v(3) * 10.0      // [dm/s]
-           << setw(14) << setprecision(6) << sp3ClkRate * 1e2 // 10^⁻4 microseconds/sec
-           << endl;
+           << setw(14) << setprecision(6) << sp3ClkRate * 1e2; // 10^⁻4 microseconds/sec
     }
     return success;
@@ -212,11 +210,16 @@
     istringstream in(_lastLine.substr(1).c_str());
     in >> sp3Sat->_prn >> sp3Sat->_xyz(1) >> sp3Sat->_xyz(2) >> sp3Sat->_xyz(3) >> sp3Sat->_clk;
-
-    if (sp3Sat->_xyz.NormFrobenius() == 0.0) {
+    sp3Sat->_xyz *= 1.e3;
+
+    // Simple Check - check satellite radial distance
+    double rr = sp3Sat->_xyz.NormFrobenius();
+    const double MINDIST = 2.e7;
+    const double MAXDIST = 6.e7;
+    if (rr < MINDIST || rr > MAXDIST || std::isnan(rr)) {
       delete sp3Sat;
       continue;
     }
 
-    sp3Sat->_xyz *= 1.e3;
+    // Simple Check - clock valid
     if (sp3Sat->_clk == 999999.999999) {
       sp3Sat->_clkValid = false;
Index: trunk/BNC/src/bncwindow.cpp
===================================================================
--- trunk/BNC/src/bncwindow.cpp	(revision 10125)
+++ trunk/BNC/src/bncwindow.cpp	(revision 10127)
@@ -983,8 +983,10 @@
   _pppWidgets._logPath->setMaximumWidth(35*ww);
   _pppWidgets._snxtroPath->setMaximumWidth(35*ww);
-  _pppWidgets._snxtroIntr->setMaximumWidth(10*ww);
-  _pppWidgets._snxtroAc  ->setMaximumWidth(10*ww);
-  _pppWidgets._snxtroSol ->setMaximumWidth(7*ww);
-  _pppWidgets._ionoMount->setMaximumWidth(15*ww);
+  _pppWidgets._snxtroIntr->setMaximumWidth(7*ww);
+  _pppWidgets._snxtroAc->setMaximumWidth(7*ww);
+  _pppWidgets._snxtroSolId->setMaximumWidth(7*ww);
+  _pppWidgets._snxtroSolType->setMaximumWidth(7*ww);
+  _pppWidgets._snxtroCampId->setMaximumWidth(7*ww);
+    _pppWidgets._ionoMount->setMaximumWidth(15*ww);
 
 
@@ -1029,10 +1031,15 @@
   pppLayout1->addWidget(new QLabel("   SNX TRO AC"),         ir, 4);
   pppLayout1->addWidget(_pppWidgets._snxtroAc,               ir, 5);
-  pppLayout1->addWidget(new QLabel("   SNX TRO solution"),   ir, 6);
-  pppLayout1->addWidget(_pppWidgets._snxtroSol,              ir, 7, Qt::AlignRight);
+  pppLayout1->addWidget(new QLabel("   SNX TRO solution ID"),ir, 6);
+  pppLayout1->addWidget(_pppWidgets._snxtroSolId,            ir, 7, Qt::AlignRight);
   ++ir;
 #ifdef USE_PPP
-  pppLayout1->addWidget(new QLabel("BLQ file"),              ir, 0);
-  pppLayout1->addWidget(_pppWidgets._blqFile,                ir, 1);
+  pppLayout1->addWidget(new QLabel("BLQ file"),               ir, 0);
+  pppLayout1->addWidget(_pppWidgets._blqFile,                 ir, 1);
+  pppLayout1->addWidget(new QLabel("   SNX TRO campaign ID"), ir, 4);
+  pppLayout1->addWidget(_pppWidgets._snxtroCampId,            ir, 5);
+  pppLayout1->addWidget(new QLabel("   SNX TRO solution type"),ir, 6);
+  pppLayout1->addWidget(_pppWidgets._snxtroSolType,            ir, 7, Qt::AlignRight);
+
 #endif
   pppLayout1->setRowStretch(ir+1, 999);
@@ -1492,6 +1499,7 @@
   _pppWidgets._snxtroSampl->setWhatsThis(tr("<p>Select a 'Sampling' rate for saving troposphere parameters. <i>[key: PPP/snxtroSampl]</i></p>"));
   _pppWidgets._snxtroAc->setWhatsThis(tr("<p>Specify a 3-character abbreviation describing you as the generating Analysis Center (AC) in your SINEX troposphere files. <i>[key: PPP/snxtroAc]</i></p>"));
-  _pppWidgets._snxtroSol->setWhatsThis(tr("<p>Specify a 1-character solution ID to allow a distinction between different solutions per AC. <i>[key: PPP/snxtroSol]</i></p>"));
-
+  _pppWidgets._snxtroSolId->setWhatsThis(tr("<p>Specify a 1-character solution ID to allow a distinction between different solutions per AC. <i>[key: PPP/snxtroSolId]</i></p>"));
+  _pppWidgets._snxtroSolType->setWhatsThis(tr("<p>Specify a 3-character solution type, e.g. real-time (RTS), unknown (UNK), .. <i>[key: PPP/snxtroSolType]</i></p>"));
+  _pppWidgets._snxtroCampId->setWhatsThis(tr("<p>Specify a 3-character campaign ID, e.g. operational (OPS), demonstration (DEM), testing (TST), .. <i>[key: PPP/snxtroCampId]</i></p>"));
 
   // WhatsThis, PPP (3)
Index: trunk/BNC/src/orbComp/sp3Comp.cpp
===================================================================
--- trunk/BNC/src/orbComp/sp3Comp.cpp	(revision 10125)
+++ trunk/BNC/src/orbComp/sp3Comp.cpp	(revision 10127)
@@ -225,5 +225,5 @@
     for (map<t_prn, double>::iterator it = dc.begin(); it != dc.end(); it++) {
       const t_prn& prn = it->first;
-      std::string sys; sys.assign(1, prn.system());
+      stringstream all; all << prn.system() << 99;
       if (satIndex(clkSats, prn) != -1) {
         int  index = epochs.size() + satIndex(clkSats, prn);
@@ -233,7 +233,7 @@
           dcRed[prn] = dc[prn] - dr.find(prn)->second[0]; // clock minus radial component
           stat[prn.toString()]._dcRedMean += dcRed[prn];
-          stat[sys           ]._dcRedMean += dcRed[prn];
+          stat[all.str()     ]._dcRedMean += dcRed[prn];
           stat[prn.toString()]._nc        += 1;
-          stat[sys           ]._nc        += 1;
+          stat[all.str()     ]._nc        += 1;
         }
       }
@@ -380,5 +380,5 @@
     for (map<t_prn, ColumnVector>::const_iterator it = dr.begin(); it != dr.end(); it++) {
       const t_prn&  prn = it->first;
-      std::string sys; sys.assign(1, prn.system());
+      stringstream all; all << prn.system() << 99;
       if (!excludeSat(prn)) {
         const ColumnVector& rao = it->second;
@@ -390,7 +390,7 @@
         }
         stat[prn.toString()]._rao += SP(rao, rao); // Schur product
-        stat[sys           ]._rao += SP(rao, rao);
+        stat[all.str()     ]._rao += SP(rao, rao);
         stat[prn.toString()]._nr  += 1;
-        stat[sys           ]._nr  += 1;
+        stat[all.str()     ]._nr  += 1;
         if (dc.find(prn) != dc.end() && dcRed.find(prn) != dc.end()) {
           double clkRes    = dc.find(prn)->second;
@@ -401,11 +401,11 @@
           }
           stat[prn.toString()]._dcRMS     += clkRes * clkRes;
-          stat[sys           ]._dcRMS     += clkRes * clkRes;
+          stat[all.str()     ]._dcRMS     += clkRes * clkRes;
           stat[prn.toString()]._dcRedRMS  += clkResRed * clkResRed;
-          stat[sys           ]._dcRedRMS  += clkResRed * clkResRed;
+          stat[all.str()     ]._dcRedRMS  += clkResRed * clkResRed;
           stat[prn.toString()]._dcRedSig  += (clkResRed - stat[prn.toString()]._dcRedMean) *
                                              (clkResRed - stat[prn.toString()]._dcRedMean);
-          stat[sys           ]._dcRedSig  += (clkResRed - stat[sys           ]._dcRedMean) *
-                                             (clkResRed - stat[sys           ]._dcRedMean);
+          stat[all.str()     ]._dcRedSig  += (clkResRed - stat[all.str()     ]._dcRedMean) *
+                                             (clkResRed - stat[all.str()     ]._dcRedMean);
         }
         else {
@@ -432,5 +432,5 @@
     const string& prn  = it->first;
     t_stat&       stat = it->second;
-    std::string sys; sys.assign(1, prn[0]);
+    stringstream all; all << prn[0] << 99;
     if (stat._nr > 0) {
       stat._rao[0] = sqrt(stat._rao[0] / stat._nr);
@@ -438,77 +438,32 @@
       stat._rao[2] = sqrt(stat._rao[2] / stat._nr);
       stat._rao3DRMS = stat._rao.NormFrobenius();
-      if (prn != sys) {
-        (_summaryOnly) ? out << "     " << prn << ' ' :
+      // orbit values in millimeter
+      if (prn != all.str()) {
+        (_summaryOnly) ? out << "     "  << prn << ' ':
                          out << "!     " << prn << ' ';
       }
-      // orbit values in millimeters
-      if (prn != sys) {
-        out << setw(10) << setprecision(1) << stat._rao[0]   * 1e3 << ' '
-            << setw(10) << setprecision(1) << stat._rao[1]   * 1e3 << ' '
-            << setw(10) << setprecision(1) << stat._rao[2]   * 1e3 << ' '
-            << setw(10) << setprecision(1) << stat._rao3DRMS * 1e3 << ' '
-            << setw( 7) << stat._nr << " ";
-      }
+      else {
+        (_summaryOnly) ? out << "     "   << QString("%1  ").arg(all.str()[0]).toStdString() << " ":
+                         out << "!     "  << QString("%1  ").arg(all.str()[0]).toStdString() << " ";
+      }
+      out << setw(10) << setprecision(1) << stat._rao[0]   * 1e3 << ' '
+          << setw(10) << setprecision(1) << stat._rao[1]   * 1e3 << ' '
+          << setw(10) << setprecision(1) << stat._rao[2]   * 1e3 << ' '
+          << setw(10) << setprecision(1) << stat._rao3DRMS * 1e3 << ' '
+          << setw( 7) << stat._nr << " ";
+      // clock values in nano seconds
       if (stat._nc > 0) {
         stat._dcRMS    = sqrt(stat._dcRMS    / stat._nc);
         stat._dcRedRMS = sqrt(stat._dcRedRMS / stat._nc);
         stat._dcRedSig = sqrt(stat._dcRedSig / stat._nc);
-        // clock values in nano seconds
-        if (prn != sys) {
-          out << setw(10) << setprecision(2) << stat._dcRMS    / t_CST::c * 1e9 << ' '
-              << setw(10) << setprecision(2) << stat._dcRedRMS / t_CST::c * 1e9 << ' '
-              << setw(10) << setprecision(2) << stat._dcRedSig / t_CST::c * 1e9 << ' '
-              << setw( 9) << stat._nc << " "
-              << setw( 9) << setprecision(2) << stat._offset / t_CST::c * 1e9;
-        }
-      }
-      else {
-        if  (prn != sys) {
-//          out << "  .       .    ";
-        }
-      }
-      if (prn != sys) {
-        out << "\n";
-      }
-    }
-  }
-  // Print Total
-  // ------------
-  out << "!\n! Mean";
-  out << "\n! -----------------------------------------------------------------------------------------------------------------\n";
-  out << "!\n!    GNSS   radialRMS   alongRMS    outRMS     3DRMS      nOrb    clkRMS    clkRedRMS   clkRedSig   nClk "
-          "\n!              [mm]       [mm]        [mm]      [mm]      [-]      [ns]        [ns]        [ns]      [-] "
-          "\n! -----------------------------------------------------------------------------------------------------------------";
-  for (map<string, t_stat>::iterator it = stat.begin(); it != stat.end(); it++) {
-    const string& prn  = it->first;
-    t_stat&       stat = it->second;
-    std::string sys; sys.assign(1, prn[0]);
-    if (stat._nr > 0) {
-      if (prn == sys) {
-        (_summaryOnly) ? out << "\n       "   << sys << " " :
-                         out << "\n!       "  << sys << " ";
-      }
-      // orbit values in millimeters
-      if (prn == sys) {
-        out << setw(10) << setprecision(1) << stat._rao[0]   * 1e3 << ' '
-            << setw(10) << setprecision(1) << stat._rao[1]   * 1e3 << ' '
-            << setw(10) << setprecision(1) << stat._rao[2]   * 1e3 << ' '
-            << setw(10) << setprecision(1) << stat._rao3DRMS * 1e3 << ' '
-            << setw( 7) << stat._nr << " ";
-      }
-      if (stat._nc > 0) {
-        // clock values in nano seconds
-        if (prn == sys) {
-          out << setw(10) << setprecision(2) << stat._dcRMS    / t_CST::c * 1e9 << ' '
-              << setw(10) << setprecision(2) << stat._dcRedRMS / t_CST::c * 1e9 << ' '
-              << setw(10) << setprecision(2) << stat._dcRedSig / t_CST::c * 1e9 << ' '
-              << setw( 9) << stat._nc << " ";
-        }
-      }
-      else {
-        if (prn == sys) {
-//          out << "  .       .    ";
-        }
-      }
+        out << setw(10) << setprecision(2) << stat._dcRMS    / t_CST::c * 1e9 << ' '
+            << setw(10) << setprecision(2) << stat._dcRedRMS / t_CST::c * 1e9 << ' '
+            << setw(10) << setprecision(2) << stat._dcRedSig / t_CST::c * 1e9 << ' '
+            << setw( 9) << stat._nc << " ";
+        if (prn != all.str()) {
+          out << setw( 9) << setprecision(2) << stat._offset / t_CST::c * 1e9;
+        }
+      }
+      out << "\n";
     }
   }
Index: trunk/BNC/src/pppWidgets.cpp
===================================================================
--- trunk/BNC/src/pppWidgets.cpp	(revision 10125)
+++ trunk/BNC/src/pppWidgets.cpp	(revision 10127)
@@ -77,5 +77,7 @@
   _snxtroIntr   = new QComboBox();     _snxtroIntr  ->setObjectName("PPP/snxtroIntr");   _widgets << _snxtroIntr;
   _snxtroAc     = new QLineEdit();     _snxtroAc    ->setObjectName("PPP/snxtroAc");     _widgets << _snxtroAc;
-  _snxtroSol    = new QLineEdit();     _snxtroSol   ->setObjectName("PPP/snxtroSol");    _widgets << _snxtroSol;
+  _snxtroSolId  = new QLineEdit();     _snxtroSolId ->setObjectName("PPP/snxtroSolId");  _widgets << _snxtroSolId;
+  _snxtroSolType= new QLineEdit();     _snxtroSolType->setObjectName("PPP/snxtroSolType");_widgets << _snxtroSolType;
+  _snxtroCampId = new QLineEdit();     _snxtroCampId ->setObjectName("PPP/snxtroCampId");  _widgets << _snxtroCampId;
   _staTable     = new QTableWidget();  _staTable    ->setObjectName("PPP/staTable");     _widgets << _staTable;
   _lcGPS        = new QComboBox();     _lcGPS       ->setObjectName("PPP/lcGPS");        _widgets << _lcGPS;
@@ -118,5 +120,7 @@
   connect(_snxtroPath, SIGNAL(textChanged(const QString &)), this, SLOT(slotPPPTextChanged()));
   connect(_snxtroAc, SIGNAL(textChanged(const QString &)), this, SLOT(slotPPPTextChanged()));
-  connect(_snxtroSol, SIGNAL(textChanged(const QString &)), this, SLOT(slotPPPTextChanged()));
+  connect(_snxtroSolId, SIGNAL(textChanged(const QString &)), this, SLOT(slotPPPTextChanged()));
+  connect(_snxtroSolType, SIGNAL(textChanged(const QString &)), this, SLOT(slotPPPTextChanged()));
+  connect(_snxtroCampId, SIGNAL(textChanged(const QString &)), this, SLOT(slotPPPTextChanged()));
 
   slotEnableWidgets();
@@ -247,5 +251,7 @@
   delete _snxtroIntr;
   delete _snxtroAc;
-  delete _snxtroSol;
+  delete _snxtroSolId;
+  delete _snxtroSolType;
+  delete _snxtroCampId;
   for (int iRow = _staTable->rowCount()-1; iRow >=0; iRow--) {
     _staTable->removeRow(iRow);
@@ -333,11 +339,13 @@
   // LineEdits
   // ---------
-  _corrMount  ->setText(settings.value(_corrMount  ->objectName()).toString());
-  _ionoMount  ->setText(settings.value(_ionoMount  ->objectName()).toString());
-  _logPath    ->setText(settings.value(_logPath    ->objectName()).toString());
-  _nmeaPath   ->setText(settings.value(_nmeaPath   ->objectName()).toString());
-  _snxtroPath ->setText(settings.value(_snxtroPath ->objectName()).toString());
-  _snxtroAc   ->setText(settings.value(_snxtroAc   ->objectName()).toString());
-  _snxtroSol  ->setText(settings.value(_snxtroSol  ->objectName()).toString());
+  _corrMount    ->setText(settings.value(_corrMount     ->objectName()).toString());
+  _ionoMount    ->setText(settings.value(_ionoMount     ->objectName()).toString());
+  _logPath      ->setText(settings.value(_logPath       ->objectName()).toString());
+  _nmeaPath     ->setText(settings.value(_nmeaPath      ->objectName()).toString());
+  _snxtroPath   ->setText(settings.value(_snxtroPath    ->objectName()).toString());
+  _snxtroAc     ->setText(settings.value(_snxtroAc      ->objectName()).toString());
+  _snxtroSolId  ->setText(settings.value(_snxtroSolId   ->objectName()).toString());
+  _snxtroSolType->setText(settings.value(_snxtroSolType ->objectName()).toString());
+  _snxtroCampId ->setText(settings.value(_snxtroCampId  ->objectName()).toString());
 
   if (!settings.value(_sigmaC1->objectName()).toString().isEmpty()) {
@@ -462,5 +470,7 @@
   settings.setValue(_snxtroIntr  ->objectName(), _snxtroIntr  ->currentText());
   settings.setValue(_snxtroAc    ->objectName(), _snxtroAc    ->text());
-  settings.setValue(_snxtroSol   ->objectName(), _snxtroSol   ->text());
+  settings.setValue(_snxtroSolId  ->objectName(), _snxtroSolId   ->text());
+  settings.setValue(_snxtroSolType->objectName(), _snxtroSolType ->text());
+  settings.setValue(_snxtroCampId ->objectName(), _snxtroCampId  ->text());
   settings.setValue(_lcGPS       ->objectName(), _lcGPS       ->currentText());
   settings.setValue(_lcGLONASS   ->objectName(), _lcGLONASS   ->currentText());
@@ -545,5 +555,7 @@
     _snxtroIntr ->setEnabled(true);
     _snxtroAc   ->setEnabled(true);
-    _snxtroSol  ->setEnabled(true);
+    _snxtroSolId  ->setEnabled(true);
+    _snxtroSolType ->setEnabled(true);
+    _snxtroCampId  ->setEnabled(true);
   }
   else {
@@ -551,5 +563,7 @@
     _snxtroIntr ->setEnabled(false);
     _snxtroAc   ->setEnabled(false);
-    _snxtroSol  ->setEnabled(false);
+    _snxtroSolId  ->setEnabled(false);
+    _snxtroSolType ->setEnabled(false);
+    _snxtroCampId  ->setEnabled(false);
   }
 
@@ -639,9 +653,13 @@
       _snxtroIntr ->setEnabled(true);
       _snxtroAc   ->setEnabled(true);
-      _snxtroSol  ->setEnabled(true);
+      _snxtroSolId  ->setEnabled(true);
+      _snxtroSolType ->setEnabled(true);
+      _snxtroCampId  ->setEnabled(true);
       _snxtroSampl->setPalette(paletteWhite);
       _snxtroIntr ->setPalette(paletteWhite);
       _snxtroAc   ->setPalette(paletteWhite);
-      _snxtroSol  ->setPalette(paletteWhite);
+      _snxtroSolId  ->setPalette(paletteWhite);
+      _snxtroSolType ->setPalette(paletteWhite);
+      _snxtroCampId  ->setPalette(paletteWhite);
     }
     else {
@@ -649,12 +667,16 @@
     _snxtroIntr ->setEnabled(false);
     _snxtroAc   ->setEnabled(false);
-    _snxtroSol  ->setEnabled(false);
+    _snxtroSolId  ->setEnabled(false);
+    _snxtroSolType ->setEnabled(false);
+    _snxtroCampId  ->setEnabled(false);
     _snxtroSampl->setPalette(paletteGray);
     _snxtroIntr ->setPalette(paletteGray);
     _snxtroAc   ->setPalette(paletteGray);
-    _snxtroSol  ->setPalette(paletteGray);
-    }
-  }
-
-
-}
+    _snxtroSolId  ->setPalette(paletteGray);
+    _snxtroSolType ->setPalette(paletteGray);
+    _snxtroCampId  ->setPalette(paletteGray);
+    }
+  }
+
+
+}
Index: trunk/BNC/src/pppWidgets.h
===================================================================
--- trunk/BNC/src/pppWidgets.h	(revision 10125)
+++ trunk/BNC/src/pppWidgets.h	(revision 10127)
@@ -61,5 +61,7 @@
   QComboBox*     _snxtroIntr;
   QLineEdit*     _snxtroAc;
-  QLineEdit*     _snxtroSol;
+  QLineEdit*     _snxtroSolId;
+  QLineEdit*     _snxtroSolType;
+  QLineEdit*     _snxtroCampId;
   QTableWidget*  _staTable;
   QComboBox*     _lcGPS;
Index: trunk/BNC/src/rinex/rnxnavfile.h
===================================================================
--- trunk/BNC/src/rinex/rnxnavfile.h	(revision 10125)
+++ trunk/BNC/src/rinex/rnxnavfile.h	(revision 10127)
@@ -38,5 +38,5 @@
 #define defaultRnxNavVersion2 2.11
 #define defaultRnxNavVersion3 3.05
-#define defaultRnxNavVersion4 4.00
+#define defaultRnxNavVersion4 4.01
 
 class t_rnxNavFile {
Index: trunk/BNC/src/rinex/rnxobsfile.h
===================================================================
--- trunk/BNC/src/rinex/rnxobsfile.h	(revision 10125)
+++ trunk/BNC/src/rinex/rnxobsfile.h	(revision 10127)
@@ -40,5 +40,5 @@
 #define defaultRnxObsVersion2 2.11
 #define defaultRnxObsVersion3 3.05
-#define defaultRnxObsVersion4 4.00
+#define defaultRnxObsVersion4 4.01
 
 class t_rnxObsHeader {
Index: trunk/BNC/src/src.pro
===================================================================
--- trunk/BNC/src/src.pro	(revision 10125)
+++ trunk/BNC/src/src.pro	(revision 10127)
@@ -2,6 +2,6 @@
 TARGET = ../bnc
 
-CONFIG -= debug
-CONFIG += release
+CONFIG += debug
+CONFIG -= release
 
 include(src.pri)
