Index: /trunk/BNC/CHANGELOG.md
===================================================================
--- /trunk/BNC/CHANGELOG.md	(revision 11097)
+++ /trunk/BNC/CHANGELOG.md	(revision 11098)
@@ -10,4 +10,5 @@
 - ADDED: Combination: clocks of AC satellites without code biases of both reference signals are combined, but excluded from the clock datum (hourly message)
 - ADDED: Combination: hourly report of AC satellites persistently rejected as outliers, and of satellites skipped because fewer than 2 ACs provide corrections
+- CHANGED: Combination: the orbits of a system come from the first stream in the table providing that system; after an outage of that stream, BNC switches back to it once it delivers again for 60 s (before, a single missing epoch moved the orbits permanently to another stream)
 - ADDED: Combination of APC (SSRA) and CoM (SSRC) streams together: with an ANTEX file the combination is done in the CoM frame, the orbits of the APC streams are converted to CoM; ACs not combined because of a different reference point are reported
 - ADDED: Option 'Reference Signals' (key ssrRefSignals): reference signals of the satellite clocks per GNSS for the combination (AC clock referral, code biases from the Bias SINEX file) and the SSR QC, default IGS Real-Time convention G:1W&2W R:1P&2P E:1C&5Q C:2I&6I J:1C&2L S:1C&5Q, e.g. for a switch of BDS to C1P/C5P or of QZSS to L1/L5
Index: /trunk/BNC/src/bnchelp.html
===================================================================
--- /trunk/BNC/src/bnchelp.html	(revision 11097)
+++ /trunk/BNC/src/bnchelp.html	(revision 11098)
@@ -8436,9 +8436,17 @@
   </p>
   <p>
-    The sequence of entries in the 'Combine Corrections' table is not of importance.
-    Note that the orbit information in the final combination stream is just copied from one of the incoming streams.
-    The stream used for providing the orbits may vary over time: if the orbit-providing stream has an outage then BNC
-    switches
-    to the next remaining stream for getting hold of the orbit information.</p>
+    The sequence of entries in the 'Combine Corrections' table defines the preference for the orbits: the orbit
+    information in the final combination stream is copied from one of the incoming streams, per satellite system from
+    the first stream in the table that provides corrections for that system (a stream that excludes a system, e.g.
+    with 'C' in its exclusion list, or never sends it, is skipped). Put the stream with the best orbits of a system
+    first. If the orbit-providing stream has an outage, BNC switches to the next stream in the table that provides
+    corrections. As soon as a stream higher in the table delivers again without interruption for 60 seconds, BNC
+    switches back to it, so that a single missing epoch does not move the orbits permanently to another stream, and
+    the orbits do not change back and forth. Each switch is written to the combination logfile, e.g.</p>
+  <pre>
+2026-10-15 00:01:50.000 Switching Master R CHC00 --> GMV00
+2026-10-15 00:03:00.000 Switching Master R GMV00 --> CHC00 (preferred AC delivers again)
+</pre>
+  <p>
   <p>
     It is possible to specify only one Broadcast Ephemeris correction stream in the 'Combine Corrections' table.
Index: /trunk/BNC/src/combination/bnccomb.cpp
===================================================================
--- /trunk/BNC/src/combination/bnccomb.cpp	(revision 11097)
+++ /trunk/BNC/src/combination/bnccomb.cpp	(revision 11098)
@@ -1050,4 +1050,12 @@
       }
     }
+    if (AC->numObs[sys] > 0) {
+      if (!AC->presentSince[sys].valid()) {
+        AC->presentSince[sys] = epoTime;
+      }
+    }
+    else {
+      AC->presentSince[sys].reset();
+    }
     out << epoTime.datestr().c_str()    << " "
         << epoTime.timestr().c_str()    << " "
@@ -1086,4 +1094,29 @@
         }
       }
+    }
+  }
+
+  // Switch back to an AC higher in the table (the preferred one) once it
+  // delivers again without interruption for SWITCH_BACK_SEC, so that a single
+  // missing epoch of the preferred AC does not move the orbits permanently
+  // to another AC, and the orbits do not change back and forth
+  // ------------------------------------------------------------------------
+  const double SWITCH_BACK_SEC = 60.0;
+  QListIterator<cmbAC*> icPref(_ACs);
+  while (icPref.hasNext()) {
+    cmbAC* AC = icPref.next();
+    if (AC->name == _masterOrbitAC[sys]) {
+      break;
+    }
+    if (AC->numObs[sys] > 0 && AC->presentSince[sys].valid() &&
+        epoTime - AC->presentSince[sys] >= SWITCH_BACK_SEC) {
+      out <<  epoTime.datestr().c_str()    << " "
+          << epoTime.timestr().c_str()     << " "
+          << "Switching Master " << sys << " "
+          << _masterOrbitAC[sys].toLatin1().data() << " --> "
+          << AC->name.toLatin1().data()   << " (preferred AC delivers again)\n";
+      _masterOrbitAC[sys] = AC->name;
+      _masterIsAPC[sys]   = _cmbCoM ? false : AC->isAPC;
+      break;
     }
   }
Index: /trunk/BNC/src/combination/bnccomb.h
===================================================================
--- /trunk/BNC/src/combination/bnccomb.h	(revision 11097)
+++ /trunk/BNC/src/combination/bnccomb.h	(revision 11098)
@@ -106,4 +106,5 @@
     bool                 isAPC;
     QString              attitudeSource; // "Computed", "SSR", or "Nominal"
+    QMap<char, bncTime>  presentSince;   // per system: delivering without interruption since
     QMap<char, unsigned> numObs;
   };
