Index: trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit.h
===================================================================
--- trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit.h	(revision 11033)
+++ trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit.h	(revision 11034)
@@ -78,4 +78,5 @@
   GCOBR_NOPHASEBIASPARAMETER = -12,
   GCOBR_NOVTECPARAMETER = -13,
+  GCOBR_NOANTENNAPARAMETER = -14,
   /* data mismatch - data in storage does not match new data */
   GCOBR_TIMEMISMATCH = -20,
@@ -478,13 +479,14 @@
 
   struct Antenna {
-    unsigned int SSRProviderID;
-    unsigned int SatelliteAntennaIOD;
-    unsigned int PhaseCenterInformationIndicator;
-    unsigned int GroupDelayInformationIndicator;
-    unsigned int NadirAngleDependentCorrectionIndicator;
-    unsigned int maximumOffNadirAngle;
-    unsigned int NadirAngleDependentCorrectionRangeExtension;
-    unsigned int SatelliteSetIndicator;
-    unsigned int SatelliteMask;
+    SatAntennaType messageType[CLOCKORBIT_SATNUM];
+    unsigned int SSRProviderID[CLOCKORBIT_SATNUM];
+    unsigned int SatelliteAntennaIOD[CLOCKORBIT_SATNUM];
+    unsigned int PhaseCenterInformationIndicator[CLOCKORBIT_SATNUM];
+    unsigned int GroupDelayInformationIndicator[CLOCKORBIT_SATNUM];
+    unsigned int NadirAngleDependentCorrectionIndicator[CLOCKORBIT_SATNUM];
+    unsigned int maximumOffNadirAngle[CLOCKORBIT_SATNUM];
+    unsigned int NadirAngleDependentCorrectionRangeExtension[CLOCKORBIT_SATNUM];
+    unsigned int SatelliteSetIndicator[CLOCKORBIT_SATNUM];
+    uint64_t SatelliteMask[CLOCKORBIT_SATNUM];
     struct SatellitePart {
       unsigned int FrequencySetIndicator;
@@ -496,5 +498,5 @@
       } Freq[ANT_MAXFREQUENCIES];
     } Sat[CLOCKORBIT_COUNTSAT];
-  } GNSS[CLOCKORBIT_SATNUM];
+  };
 
   /* return size of resulting data or 0 in case of an error */
@@ -598,4 +600,5 @@
 #define E_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a) ADDBITS(4,  a)                      /* DF+015 (new RTCM) to extend DF+021*/
 #define E_SATELLITE_SET_INDICATOR(a)                    ADDBITS(1,  a)                      /* DF+016 (new RTCM) */
+#define E_SATELLITE_MASK(a)                             ADDBITS(64, a)                      /* DF394 */
 #define E_FREQUENCY_SET_INDICATOR(a)                    ADDBITS(1,  a)                      /* DF+017 (new RTCM) */
 #define E_GNSS_FREQUENCY_MASK(a)                        ADDBITS(6,  a)                      /* DF+018 (new RTCM) */
@@ -843,11 +846,24 @@
 /* Antenna Information*/
 #define D_SATELLITE_ANTENNA_IOD(a)                      GETSSRBITS(a,  6)                    /* DF+010 (new RTCM) */
-#define D_PHASE_CENTER_INFO_INDICATORD(a)               GETSSRBITS(a,  1)                    /* DF+011 (new RTCM) */    
+#define D_PHASE_CENTER_INFO_INDICATOR(a)                GETSSRBITS(a,  1)                    /* DF+011 (new RTCM) */    
 #define D_GROUP_DELAY_INFO_INDICATOR(a)                 GETSSRBITS(a,  1)                    /* DF+012 (new RTCM) */    
 #define D_NADIR_ANGLE_DEPENDENT_CORR_INDICATOR(a)       GETSSRBITS(a,  1)                    /* DF+013 (new RTCM) */
+#define D_MAXIMUM_OFF_NADIR_ANGLE(a)                    GETSSRBITS(a,  5)                    /* DF+014 (new RTCM  */
 #define D_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a) GETSSRBITS(a,  4)                    /* DF+015 (new RTCM) required to extend DF+021*/
 #define D_SATELLITE_SET_INDICATOR(a)                    GETSSRBITS(a,  1)                    /* DF+016 (new RTCM) */
-#define D_FREQUENCY_SET_INDICATOR (a)                   GETSSRBITS(a,  1)                    /* DF+017 (new RTCM) */
-#define D_GNSS_FREQUENCY_MASK (a)                       GETSSRBITS(a,  6)                    /* DF+018 (new RTCM) */
+/* GETSSRBITS cannot safely read a full 64 bits in one call: bitbuffer is
+   itself only 64 bits wide, so LOADSSRBITS's loop (which keeps whatever
+   residual (0-7) bits are already buffered from the previous field) can be
+   asked to hold residual+64 bits at once, silently shifting the residual
+   bits out before extraction. Split into two 32-bit reads instead, each of
+   which stays safely within bitbuffer's capacity. */
+#define D_SATELLITE_MASK(a)                             { \
+  unsigned int maskHi32, maskLo32; \
+  GETSSRBITS(maskHi32, 32) \
+  GETSSRBITS(maskLo32, 32) \
+  (a) = ((uint64_t)maskHi32 << 32) | maskLo32; \
+}                                                                             /* DF394 */
+#define D_FREQUENCY_SET_INDICATOR(a)                    GETSSRBITS(a,  1)                    /* DF+017 (new RTCM) */
+#define D_GNSS_FREQUENCY_MASK(a)                        GETSSRBITS(a,  6)                    /* DF+018 (new RTCM) */
 #define D_NADIR_CORR_INDICATOR(a)                       GETSSRBITS(a,  1)                    /* DF+019 (new RTCM) */
 #define D_NADIR_CORRECTION(a)                           GETSSRFLOATSIGN(a, 12, 1/1000.0)     /* DF+020 (new RTCM) in [m] */
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 11033)
+++ trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp	(revision 11034)
@@ -1109,5 +1109,87 @@
       }
     }
-    //else if (kind == COBOFS_)
+    else if (kind == COBOFS_SATANT) {
+      unsigned int k, satBlockIdx, numSatBlocks;
+      unsigned int freqBlockIdx, numFreqBlocks, f;
+      unsigned int deg;
+      unsigned int satPositions[64], numSatPositions = 0;
+      unsigned int freqPositions[ANT_MAXFREQUENCIES], numFreqPositions;
+      if (!a)
+        return GCOBR_NOANTENNAPARAMETER;
+      a->messageType[s] = type;
+      D_SSR_PROVIDER_ID(a->SSRProviderID[s])
+      D_SATELLITE_ANTENNA_IOD(a->SatelliteAntennaIOD[s])
+      D_PHASE_CENTER_INFO_INDICATOR(a->PhaseCenterInformationIndicator[s])
+      D_GROUP_DELAY_INFO_INDICATOR(a->GroupDelayInformationIndicator[s])
+      D_NADIR_ANGLE_DEPENDENT_CORR_INDICATOR(a->NadirAngleDependentCorrectionIndicator[s])
+      if (a->NadirAngleDependentCorrectionIndicator[s]) {
+        D_MAXIMUM_OFF_NADIR_ANGLE(a->maximumOffNadirAngle[s])
+        D_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a->NadirAngleDependentCorrectionRangeExtension[s])
+      }
+      else {
+        a->maximumOffNadirAngle[s] = 0;
+        a->NadirAngleDependentCorrectionRangeExtension[s] = 0;
+      }
+      D_SATELLITE_SET_INDICATOR(a->SatelliteSetIndicator[s])
+      D_SATELLITE_MASK(a->SatelliteMask[s])
+#ifdef BNC_DEBUG_SSR
+      fprintf(stderr, "type %d providerId %d  satAntIOD %d  PCInfoInd %d GDInfoInd %d NadirAngleDepCorrInd %d "
+                      " maxOffNadirAngle %d NadirAngleDepCorrRangeExt %d SatSetInd %d SatMask %llx\n",
+        a->messageType[s], a->SSRProviderID[s], a->SatelliteAntennaIOD[s],
+        a->PhaseCenterInformationIndicator[s], a->GroupDelayInformationIndicator[s],
+        a->NadirAngleDependentCorrectionIndicator[s],a->maximumOffNadirAngle[s],
+        a->NadirAngleDependentCorrectionRangeExtension[s],
+        a->SatelliteSetIndicator[s], (unsigned long long)a->SatelliteMask[s]);
+#endif
+
+      /* DF394 satellite mask: MSB (bit 63) = satellite 1 within this system,
+         same convention as the MSM satellite mask that shares this field. */
+      for (k = 0; k < 64 && satoffset[s] + k < satoffset[s + 1]; ++k) {
+        if ((a->SatelliteMask[s] >> (63 - k)) & 1ULL)
+          satPositions[numSatPositions++] = satoffset[s] + k;
+      }
+      numSatBlocks = a->SatelliteSetIndicator[s] ? (numSatPositions ? 1 : 0) : numSatPositions;
+
+      for (satBlockIdx = 0; satBlockIdx < numSatBlocks; ++satBlockIdx) {
+        struct Antenna::SatellitePart satBlock;
+        D_FREQUENCY_SET_INDICATOR(satBlock.FrequencySetIndicator)
+        D_GNSS_FREQUENCY_MASK(satBlock.GnssFrequencyMask)
+
+        numFreqPositions = 0;
+        for (k = 0; k < ANT_MAXFREQUENCIES; ++k) {
+          if ((satBlock.GnssFrequencyMask >> k) & 1U)
+            freqPositions[numFreqPositions++] = k;
+        }
+        numFreqBlocks = satBlock.FrequencySetIndicator ? (numFreqPositions ? 1 : 0) : numFreqPositions;
+
+        for (freqBlockIdx = 0; freqBlockIdx < numFreqBlocks; ++freqBlockIdx) {
+          f = satBlock.FrequencySetIndicator ? freqPositions[0] : freqPositions[freqBlockIdx];
+          D_NADIR_CORR_INDICATOR(satBlock.Freq[f].NadirCorrectionIndicator)
+          if (satBlock.Freq[f].NadirCorrectionIndicator)
+            D_NADIR_CORRECTION(satBlock.Freq[f].NadirCorrection)
+          if (a->NadirAngleDependentCorrectionIndicator[s]) {
+            for (deg = 0; deg <= a->maximumOffNadirAngle[s] && deg < ANT_MAXNADIRDEGREES; ++deg)
+              D_NADIR_ANGLE_DEPENDENT_CORRECTION(satBlock.Freq[f].NadirAngleCorrection[deg],
+                a->NadirAngleDependentCorrectionRangeExtension[s])
+          }
+#ifdef BNC_DEBUG_SSR
+          fprintf(stderr, "  freq %d nadirCorrInd %d nadirCorr %d\n",
+            f, satBlock.Freq[f].NadirCorrectionIndicator, satBlock.Freq[f].NadirCorrection);
+#endif
+          if (satBlock.FrequencySetIndicator) {
+            for (k = 1; k < numFreqPositions; ++k)
+              satBlock.Freq[freqPositions[k]] = satBlock.Freq[f];
+          }
+        }
+
+        if (a->SatelliteSetIndicator[s]) {
+          for (k = 0; k < numSatPositions; ++k)
+            a->Sat[satPositions[k]] = satBlock;
+        }
+        else {
+          a->Sat[satPositions[satBlockIdx]] = satBlock;
+        }
+      }
+    }
     else {
       /* COBOFS_SATANT / COBOFS_REGIONO: message numbers are
