Index: trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp
===================================================================
--- trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp	(revision 11002)
+++ trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp	(revision 11003)
@@ -199,6 +199,19 @@
     }
 
-    else if (irc < 0) {    // error  - skip 1 byte and retry
-      reset();
+    else if (irc < 0) {    // error - skip this message (or 1 byte if the
+                            // frame itself couldn't be recognized) and retry
+      if (irc != GCOBR_UNKNOWNTYPE) {
+        // A recognized-but-unimplemented message (e.g. Tropospheric or
+        // Regional Ionospheric Correction) leaves _clkOrb/_codeBias/
+        // _phaseBias/_vTEC untouched, and bytesused is already reliably set
+        // from its CRC-validated frame length, so there is nothing to
+        // discard. Every other error code may have left inconsistent
+        // partial state (e.g. mid-satellite-loop) or an unreliable frame
+        // boundary, so reset defensively there. Without this, streams with
+        // frequent unimplemented messages (e.g. dense grid-based Regional
+        // Ionospheric traffic) would wipe unrelated, still-valid orbit/
+        // clock/bias/phase-bias state every time one is skipped.
+        reset();
+      }
       _buffer = _buffer.mid(bytesused ? bytesused : 1);
     }
