diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusTransportFactory.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusTransportFactory.cs
new file mode 100644
index 00000000..88827a8e
--- /dev/null
+++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusTransportFactory.cs
@@ -0,0 +1,37 @@
+namespace ZB.MOM.WW.OtOpcUa.Driver.Modbus;
+
+///
+/// Single mapping point from to the concrete
+/// its selects.
+/// Consumed by both 's default transport-factory closure and the
+/// AdminUI Test-Connect probe, so the switch lives in
+/// exactly one place.
+///
+public static class ModbusTransportFactory
+{
+ ///
+ /// Builds the transport .
+ /// selects, threading every shared connection setting (Host/Port/Timeout/AutoReconnect/
+ /// KeepAlive/IdleDisconnectTimeout/Reconnect) through to whichever concrete transport is built.
+ ///
+ /// Driver configuration options.
+ /// A when
+ /// is selected; otherwise a (also the default/unrecognized fallback).
+ public static IModbusTransport Create(ModbusDriverOptions options)
+ {
+ ArgumentNullException.ThrowIfNull(options);
+ return options.Transport switch
+ {
+ ModbusTransportMode.RtuOverTcp => new ModbusRtuOverTcpTransport(
+ options.Host, options.Port, options.Timeout, options.AutoReconnect,
+ keepAlive: options.KeepAlive,
+ idleDisconnect: options.IdleDisconnectTimeout,
+ reconnect: options.Reconnect),
+ _ => new ModbusTcpTransport(
+ options.Host, options.Port, options.Timeout, options.AutoReconnect,
+ keepAlive: options.KeepAlive,
+ idleDisconnect: options.IdleDisconnectTimeout,
+ reconnect: options.Reconnect),
+ };
+ }
+}
diff --git a/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusTransportFactoryTests.cs b/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusTransportFactoryTests.cs
new file mode 100644
index 00000000..5644998f
--- /dev/null
+++ b/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusTransportFactoryTests.cs
@@ -0,0 +1,22 @@
+using Shouldly;
+using Xunit;
+
+namespace ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests;
+
+public sealed class ModbusTransportFactoryTests
+{
+ [Fact]
+ public void Tcp_mode_builds_tcp_transport()
+ => ModbusTransportFactory.Create(new ModbusDriverOptions { Transport = ModbusTransportMode.Tcp })
+ .ShouldBeOfType();
+
+ [Fact]
+ public void RtuOverTcp_mode_builds_rtu_transport()
+ => ModbusTransportFactory.Create(new ModbusDriverOptions { Transport = ModbusTransportMode.RtuOverTcp })
+ .ShouldBeOfType();
+
+ [Fact]
+ public void Default_options_build_tcp_transport()
+ => ModbusTransportFactory.Create(new ModbusDriverOptions())
+ .ShouldBeOfType();
+}