Index: /trunk/BNC/CHANGELOG.md
===================================================================
--- /trunk/BNC/CHANGELOG.md	(revision 11084)
+++ /trunk/BNC/CHANGELOG.md	(revision 11085)
@@ -2,5 +2,5 @@
 ## 2.13.8 (2026-10-??)
 - ADDED: epoch/velocity fields to PPP coordinates file to allow BNC to propagate the reference coordinates related to a dedicated reference epoch to the current processing epoch internally; coordinates can also be given as latitude/longitude/height
-- ADDED: **SSR QC** of decoded Broadcast Correction streams (options 'QC Directory', 'QC Streams', 'QC Reference', 'QC Interval'; example configuration '31_SsrQC.bnc'). One daily report file per stream with epochs, declared and actual update intervals, gaps, latency, completeness w.r.t. healthy broadcast ephemerides, IOD matching, code and phase bias signals, missing code biases of the reference signals, clock jumps and largest orbit corrections
+- ADDED: **SSR QC** of decoded Broadcast Correction streams (options 'QC Directory', 'QC Streams', 'QC Reference', 'QC Interval'; example configuration '31_SsrQC.bnc'). One daily report file per stream with epochs, declared and actual update intervals, gaps, latency, completeness w.r.t. healthy broadcast ephemerides, IOD matching, code and phase bias signals, yaw angle availability, missing code biases of the reference signals, clock jumps and largest orbit corrections
 - ADDED: Stream comparison in the SSR QC: orbits (radial, along, cross), clocks referred to the reference signals and signal-in-space differences (SIS = radial - clock) of each stream compared with the consensus of the other ACs (one vote per AC, own AC left out, combination products not voting) or with a selected stream (e.g. 'INTERNAL'), as RMS and standard deviation per satellite and system
 - ADDED: SIS (radial - clock, satellite-specific clock offset included) per epoch and SISRMS/SISSig per satellite and system in the SP3 comparison
Index: /trunk/BNC/src/bnchelp.html
===================================================================
--- /trunk/BNC/src/bnchelp.html	(revision 11084)
+++ /trunk/BNC/src/bnchelp.html	(revision 11085)
@@ -5132,4 +5132,11 @@
       (see section 'Combination'),</li>
     <li>the phase bias signals provided,</li>
+    <li>the availability of the satellite yaw angle with the phase biases: 'not provided', or the number of
+      satellites and the percentage of phase bias records with yaw angle, listing satellites without or only partly
+      with yaw angle. New RTCM-SSR signals the yaw angle with the Yaw Information Indicator; old RTCM-SSR and
+      IGS-SSR always carry the field, a provider without attitude information sends zeros, which is counted as not
+      provided. Without a yaw angle from the stream, a PPP or combination user depends on its own attitude model
+      (see section 'Combination'), which may differ from the provider's attitude during eclipse seasons and noon/midnight
+      turns,</li>
     <li>clock jumps, i.e. clock changes between consecutive epochs (same IOD) beyond the clock rate of more than
       0.5 m,</li>
Index: /trunk/BNC/src/ssrQc.cpp
===================================================================
--- /trunk/BNC/src/ssrQc.cpp	(revision 11084)
+++ /trunk/BNC/src/ssrQc.cpp	(revision 11085)
@@ -182,5 +182,5 @@
            << "Checks: epochs and update intervals, gaps (interval > 2 x max(declared, median)), latency,"
            << " completeness w.r.t. healthy broadcast ephemerides," << endl
-           << "IOD matching, code and phase bias signals, code biases of the reference signals, clock jumps > "
+           << "IOD matching, code and phase bias signals, yaw angle, code biases of the reference signals, clock jumps > "
            << MAX_CLK_JUMP << " m, largest orbit corrections" << endl;
     }
@@ -416,4 +416,14 @@
       _phaseSignals[staSys].insert(QString::fromStdString(frqBias._rnxType2ch));
     }
+    // Yaw angle: new RTCM-SSR has an indicator, old RTCM-SSR and IGS-SSR always
+    // carry the field, providers without attitude information send zeros
+    t_satStat& stat = _satStat[QString::fromStdString(bias._staID) + ' ' +
+                               QString::fromStdString(bias._prn.toString())];
+    stat.numPB++;
+    bool yawProvided = (bias._ssrFormat == ssrRtcmNew) ? (bias._satYawInfoInd != 0)
+                                                       : (bias._yaw != 0.0 || bias._yawRate != 0.0);
+    if (yawProvided) {
+      stat.numYaw++;
+    }
   }
 }
@@ -707,4 +717,7 @@
     if (final) {
       endTime = _staLast.value(staID, _lastTime);
+      if (endTime < _intervalStart) { // stream without data in the last interval
+        endTime = _lastTime;
+      }
     }
     out << endl << "=== SSR QC " << staID.toStdString() << ' '
@@ -746,5 +759,6 @@
     for (char sys : systems) {
       QMap<QString, unsigned> missOrb, missClk, missCB, missPB, iodUnknown, unhealthy, noEph,
-                              jumps, missRef;
+                              jumps, missRef, noYaw, yawPartly;
+      unsigned numPB = 0, numYaw = 0, yawSats = 0;
       double maxRadial = 0.0, maxAlongCross = 0.0;
       QString maxRadialPrn, maxAlongCrossPrn;
@@ -792,4 +806,17 @@
         if (stat.refBiasOK) {
           biasIF.push_back(stat.biasIF);
+        }
+        if (stat.numPB) {
+          numPB  += stat.numPB;
+          numYaw += stat.numYaw;
+          if (stat.numYaw) {
+            yawSats++;
+            if (stat.numYaw < stat.numPB) {
+              yawPartly[prn] = stat.numPB - stat.numYaw;
+            }
+          }
+          else {
+            noYaw[prn] = 0;
+          }
         }
       }
@@ -843,4 +870,15 @@
         lines << "phase bias signals: " + sigs.join(" ");
       }
+      if (numPB) {
+        if (numYaw == 0) {
+          lines << "yaw angle: not provided";
+        }
+        else {
+          lines << QString("yaw angle: provided for %1 of %2 satellites (%3 % of the phase bias records)")
+                   .arg(yawSats).arg(yawSats + noYaw.size()).arg(100.0 * numYaw / numPB, 0, 'f', 1);
+          addSats("phase biases without yaw angle", noYaw);
+          addSats("phase biases partly without yaw angle (records)", yawPartly);
+        }
+      }
       addSats(QString("clock jumps > %1 m").arg(MAX_CLK_JUMP), jumps);
       if (!maxRadialPrn.isEmpty()) {
Index: /trunk/BNC/src/ssrQc.h
===================================================================
--- /trunk/BNC/src/ssrQc.h	(revision 11084)
+++ /trunk/BNC/src/ssrQc.h	(revision 11085)
@@ -66,4 +66,6 @@
     bool          refBiasOK = false;
     double        biasIF = 0.0;  // ionosphere-free combination of the reference biases [m]
+    unsigned      numPB  = 0;    // phase bias records
+    unsigned      numYaw = 0;    // phase bias records with yaw angle
   };
 
