diff --git a/ZB.MOM.WW.OtOpcUa.slnx b/ZB.MOM.WW.OtOpcUa.slnx
index ebe20da3..34b52687 100644
--- a/ZB.MOM.WW.OtOpcUa.slnx
+++ b/ZB.MOM.WW.OtOpcUa.slnx
@@ -30,6 +30,7 @@
+
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/AbLegacyDataType.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts/AbLegacyDataType.cs
similarity index 55%
rename from src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/AbLegacyDataType.cs
rename to src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts/AbLegacyDataType.cs
index e46283d4..3c066c7e 100644
--- a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/AbLegacyDataType.cs
+++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts/AbLegacyDataType.cs
@@ -1,5 +1,3 @@
-using ZB.MOM.WW.OtOpcUa.Core.Abstractions;
-
namespace ZB.MOM.WW.OtOpcUa.Driver.AbLegacy;
///
@@ -27,22 +25,3 @@ public enum AbLegacyDataType
/// Control sub-element — caller addresses .LEN, .POS, .EN, .DN, .ER.
ControlElement,
}
-
-/// Map a PCCC data type to the driver-surface .
-public static class AbLegacyDataTypeExtensions
-{
- /// Converts an AbLegacyDataType to the corresponding DriverDataType.
- /// The PCCC data type to convert.
- /// The mapped driver data type.
- public static DriverDataType ToDriverDataType(this AbLegacyDataType t) => t switch
- {
- AbLegacyDataType.Bit => DriverDataType.Boolean,
- AbLegacyDataType.Int or AbLegacyDataType.AnalogInt => DriverDataType.Int32,
- AbLegacyDataType.Long => DriverDataType.Int32, // matches Modbus/AbCip 64→32 gap
- AbLegacyDataType.Float => DriverDataType.Float32,
- AbLegacyDataType.String => DriverDataType.String,
- AbLegacyDataType.TimerElement or AbLegacyDataType.CounterElement
- or AbLegacyDataType.ControlElement => DriverDataType.Int32,
- _ => DriverDataType.Int32,
- };
-}
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/AbLegacyDriverOptions.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts/AbLegacyDriverOptions.cs
similarity index 96%
rename from src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/AbLegacyDriverOptions.cs
rename to src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts/AbLegacyDriverOptions.cs
index 37f12515..81513274 100644
--- a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/AbLegacyDriverOptions.cs
+++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts/AbLegacyDriverOptions.cs
@@ -30,7 +30,7 @@ public sealed record AbLegacyDeviceOptions(
///
/// One PCCC-backed OPC UA variable. is the canonical PCCC
-/// file-address string that parses via .
+/// file-address string that parses via AbLegacyAddress.TryParse.
///
public sealed record AbLegacyTagDefinition(
string Name,
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/PlcFamilies/AbLegacyPlcFamilyProfile.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts/AbLegacyPlcFamilyProfile.cs
similarity index 100%
rename from src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/PlcFamilies/AbLegacyPlcFamilyProfile.cs
rename to src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts/AbLegacyPlcFamilyProfile.cs
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts.csproj b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts.csproj
new file mode 100644
index 00000000..d911061a
--- /dev/null
+++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Contracts.csproj
@@ -0,0 +1,9 @@
+
+
+ net10.0
+ enable
+ enable
+ true
+
+
+
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/AbLegacyDataTypeExtensions.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/AbLegacyDataTypeExtensions.cs
new file mode 100644
index 00000000..88ea2c33
--- /dev/null
+++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/AbLegacyDataTypeExtensions.cs
@@ -0,0 +1,22 @@
+using ZB.MOM.WW.OtOpcUa.Core.Abstractions;
+
+namespace ZB.MOM.WW.OtOpcUa.Driver.AbLegacy;
+
+/// Map a PCCC data type to the driver-surface .
+public static class AbLegacyDataTypeExtensions
+{
+ /// Converts an AbLegacyDataType to the corresponding DriverDataType.
+ /// The PCCC data type to convert.
+ /// The mapped driver data type.
+ public static DriverDataType ToDriverDataType(this AbLegacyDataType t) => t switch
+ {
+ AbLegacyDataType.Bit => DriverDataType.Boolean,
+ AbLegacyDataType.Int or AbLegacyDataType.AnalogInt => DriverDataType.Int32,
+ AbLegacyDataType.Long => DriverDataType.Int32, // matches Modbus/AbCip 64→32 gap
+ AbLegacyDataType.Float => DriverDataType.Float32,
+ AbLegacyDataType.String => DriverDataType.String,
+ AbLegacyDataType.TimerElement or AbLegacyDataType.CounterElement
+ or AbLegacyDataType.ControlElement => DriverDataType.Int32,
+ _ => DriverDataType.Int32,
+ };
+}
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.csproj b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.csproj
index 22df544c..167eb613 100644
--- a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.csproj
+++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.csproj
@@ -13,6 +13,7 @@
+