diff --git a/Services/LiveDiscoverySignalSelectionPolicy.cs b/Services/LiveDiscoverySignalSelectionPolicy.cs
new file mode 100644
index 000000000..cf3e02b70
--- /dev/null
+++ b/Services/LiveDiscoverySignalSelectionPolicy.cs
@@ -0,0 +1,66 @@
+using ArIED61850Tester.Models;
+
+namespace ArIED61850Tester.Services;
+
+///
+/// Signal Selection policy for broad online MMS discovery.
+///
+/// Online GetNameList/VAA discovery is intentionally exhaustive. It contains process
+/// values together with quality/timestamp companions, nameplate/configuration attributes,
+/// substitution state, control-service structure and other engineering leaves. Those
+/// objects remain available in the typed live model, but they are not independent operator
+/// points and must not leak into Signal Selection.
+///
+/// Static DataSet membership is authoritative and therefore wins over this presentation
+/// noise classifier: an object explicitly configured in a DataSet remains visible even if
+/// its object-level FCD identity is not an exact runtime value leaf.
+///
+public static class LiveDiscoverySignalSelectionPolicy
+{
+ private static readonly HashSet NoiseSegments = new(StringComparer.OrdinalIgnoreCase)
+ {
+ "mod", "beh", "health", "eehealth", "namplt",
+ "q", "t", "tm", "d", "du",
+ "origin", "orcat", "orident",
+ "ctlmodel", "ctlval", "ctlnum", "stseld",
+ "sbo", "sbow", "oper", "cancel", "check", "test",
+ "datans", "subena", "subval", "subq", "subid", "blkena",
+ "configrev", "vendor", "swrev", "lnns", "numpts", "olddata"
+ };
+
+ public static bool IsVisible(SignalDefinition? signal)
+ {
+ if (signal is null || string.IsNullOrWhiteSpace(signal.ObjectReference))
+ return false;
+
+ if (!string.IsNullOrWhiteSpace(signal.DataSetReference))
+ return true;
+
+ if (IsProtocolOrEngineeringNoise(signal.ObjectReference))
+ return false;
+
+ return SasOperationalSignalPolicy.IsVisible(signal);
+ }
+
+ public static bool IsProtocolOrEngineeringNoise(string? reference)
+ {
+ if (string.IsNullOrWhiteSpace(reference))
+ return true;
+
+ var normalized = reference.Trim().Replace('$', '.');
+ var slash = normalized.IndexOf('/');
+ var path = slash >= 0 && slash < normalized.Length - 1
+ ? normalized[(slash + 1)..]
+ : normalized;
+ var segments = path.Split('.', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
+
+ // Segment 0 is the Logical Node. Only data/control path segments are classified.
+ for (var index = 1; index < segments.Length; index++)
+ {
+ if (NoiseSegments.Contains(segments[index]))
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/SignalSelectionWizardWindow.LiveDiscoveryOperationalFilter.cs b/SignalSelectionWizardWindow.LiveDiscoveryOperationalFilter.cs
new file mode 100644
index 000000000..d34e6e283
--- /dev/null
+++ b/SignalSelectionWizardWindow.LiveDiscoveryOperationalFilter.cs
@@ -0,0 +1,79 @@
+using System.Windows;
+using ArIED61850Tester.Models;
+using ArIED61850Tester.Services;
+
+namespace ArIED61850Tester;
+
+///
+/// Owns the Signal Selection presentation contract after a live MMS discovery.
+///
+/// The ARIEC/live SignalDefinition inventory intentionally remains complete enough for
+/// diagnostics, comparison, report planning, persistence and engineering inspection.
+/// Signal Selection is narrower: it shows operator points and mandatory static DataSet
+/// members, never protocol/service leaves such as Mod/Beh/Health/NamPlt/origin/q/t.
+///
+/// This filter is installed on the wizard after its constructor has installed search and
+/// column filters. That lifecycle point is important because a default WPF collection view
+/// can be shared with another DataGrid; a previously installed global filter can otherwise
+/// be replaced by the wizard's own FilterSignal predicate.
+///
+public partial class SignalSelectionWizardWindow
+{
+ private Predicate