Index: /trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp
===================================================================
--- /trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp	(revision 11001)
+++ /trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp	(revision 11002)
@@ -117,8 +117,10 @@
 //
 ////////////////////////////////////////////////////////////////////////////
-void RTCM3coDecoder::reset() {
+void RTCM3coDecoder::reset(bool resetPhaseBias) {
   memset(&_clkOrb,    0, sizeof(_clkOrb));
   memset(&_codeBias,  0, sizeof(_codeBias));
-  memset(&_phaseBias, 0, sizeof(_phaseBias));
+  if (resetPhaseBias) {
+    memset(&_phaseBias, 0, sizeof(_phaseBias));
+  }
   memset(&_vTEC,      0, sizeof(_vTEC));
 }
@@ -218,5 +220,10 @@
           retCode = failure;
         }
-        reset();
+        // Keep _phaseBias intact: an Extended Phase Bias message (COBOFS_PBEXT)
+        // arriving later needs to correlate against the satellite/signal list
+        // just published by this Phase Bias message. clock_orbit_rtcm_new.cpp's
+        // COBOFS_PBIAS handling resets pb->NumberOfSat[s] itself before decoding
+        // a fresh message, so this doesn't cause stale data to accumulate.
+        reset(false);
       }
     }
Index: /trunk/BNC/src/RTCM3/RTCM3coDecoder.h
===================================================================
--- /trunk/BNC/src/RTCM3/RTCM3coDecoder.h	(revision 11001)
+++ /trunk/BNC/src/RTCM3/RTCM3coDecoder.h	(revision 11002)
@@ -67,5 +67,5 @@
 
  private:
-  void reset();
+  void reset(bool resetPhaseBias = true);
   void setEpochTime();
   void sendResults();
Index: /trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp
===================================================================
--- /trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp	(revision 11001)
+++ /trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp	(revision 11002)
@@ -566,4 +566,11 @@
           pb->messageType = type;
           /* Header Part*/
+          /* pb->NumberOfSat[s] is no longer cleared by the caller between
+           * messages (kept intact so a subsequent Extended Phase Bias message
+           * can correlate against it), so this decode must start each fresh
+           * message with an empty satellite list itself rather than relying
+           * on D_..._EPOCH_TIME_CHECK's stale-data check, which would
+           * otherwise reject every message but the first with GCOBR_TIMEMISMATCH. */
+          pb->NumberOfSat[s] = 0;
           switch (s) {
             case CLOCKORBIT_SATGPS:
@@ -572,8 +579,8 @@
             case CLOCKORBIT_SATSBAS:
             case CLOCKORBIT_SATBDS:
-              D_GPS_EPOCH_TIME_CHECK(pb->EpochTime[s], pb->NumberOfSat[s])
+              D_GPS_EPOCH_TIME(pb->EpochTime[s])
               break;
             case CLOCKORBIT_SATGLONASS:
-              D_GLONASS_EPOCH_TIME_CHECK(pb->EpochTime[s], pb->NumberOfSat[s])
+              D_GLONASS_EPOCH_TIME(pb->EpochTime[s])
               break;
           }
@@ -665,12 +672,11 @@
             ExtendedPhaseBiasPropertyID == pb->ExtendedPhaseBiasPropertyID) {
           for (i = 0; i < pb->NumberOfSat[s]; ++i) {
-            for (pos = satoffset[s];
-                pos < satoffset[s] + pb->NumberOfSat[s];
-                ++pos)
-              ;
+            /* The wire format does not repeat the satellite ID here: entries
+             * are implicitly in the same satellite/signal order as the
+             * correlated Phase Bias message, so the i-th satellite is simply
+             * the i-th one already recorded for this system. */
+            pos = satoffset[s] + i;
             if (pos >= satoffset[s + 1])
               return GCOBR_DATAMISMATCH;
-            else if (pos == pb->NumberOfSat[s] + satoffset[s])
-              ++pb->NumberOfSat[s];
 #ifdef BNC_DEBUG_SSR
             fprintf(stderr, "id %2d ", pb->Sat[pos].ID);
