diff --git a/ZB.MOM.WW.OtOpcUa.slnx b/ZB.MOM.WW.OtOpcUa.slnx
index 2d0ed744..974386b7 100644
--- a/ZB.MOM.WW.OtOpcUa.slnx
+++ b/ZB.MOM.WW.OtOpcUa.slnx
@@ -35,6 +35,7 @@
+
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasCncSeries.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts/FocasCncSeries.cs
similarity index 100%
rename from src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasCncSeries.cs
rename to src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts/FocasCncSeries.cs
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasDataType.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts/FocasDataType.cs
similarity index 57%
rename from src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasDataType.cs
rename to src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts/FocasDataType.cs
index 1ef4ee26..cb425e55 100644
--- a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasDataType.cs
+++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts/FocasDataType.cs
@@ -1,5 +1,3 @@
-using ZB.MOM.WW.OtOpcUa.Core.Abstractions;
-
namespace ZB.MOM.WW.OtOpcUa.Driver.FOCAS;
///
@@ -24,19 +22,3 @@ public enum FocasDataType
/// ASCII string (alarm text, parameter names, some PMC string areas).
String,
}
-
-public static class FocasDataTypeExtensions
-{
- /// Converts a FOCAS data type to the corresponding driver data type.
- /// The FOCAS data type to convert.
- /// The equivalent driver data type.
- public static DriverDataType ToDriverDataType(this FocasDataType t) => t switch
- {
- FocasDataType.Bit => DriverDataType.Boolean,
- FocasDataType.Byte or FocasDataType.Int16 or FocasDataType.Int32 => DriverDataType.Int32,
- FocasDataType.Float32 => DriverDataType.Float32,
- FocasDataType.Float64 => DriverDataType.Float64,
- FocasDataType.String => DriverDataType.String,
- _ => DriverDataType.Int32,
- };
-}
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasDriverOptions.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts/FocasDriverOptions.cs
similarity index 97%
rename from src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasDriverOptions.cs
rename to src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts/FocasDriverOptions.cs
index 0b0868e6..35a26941 100644
--- a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasDriverOptions.cs
+++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts/FocasDriverOptions.cs
@@ -96,7 +96,7 @@ public sealed class FocasAlarmProjectionOptions
///
/// One CNC the driver talks to. enables per-series
-/// address validation at ; leave as
+/// address validation at FocasDriver.InitializeAsync; leave as
/// to skip validation (legacy behaviour).
///
public sealed record FocasDeviceOptions(
@@ -106,7 +106,7 @@ public sealed record FocasDeviceOptions(
///
/// One FOCAS-backed OPC UA variable. is the canonical FOCAS
-/// address string that parses via —
+/// address string that parses via FocasAddress.TryParse —
/// X0.0 / R100 / PARAM:1815/0 / MACRO:500.
///
public sealed record FocasTagDefinition(
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts.csproj b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts.csproj
new file mode 100644
index 00000000..3896f7bd
--- /dev/null
+++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Contracts.csproj
@@ -0,0 +1,9 @@
+
+
+ net10.0
+ enable
+ enable
+ true
+
+
+
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasDataTypeExtensions.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasDataTypeExtensions.cs
new file mode 100644
index 00000000..9de7573d
--- /dev/null
+++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasDataTypeExtensions.cs
@@ -0,0 +1,19 @@
+using ZB.MOM.WW.OtOpcUa.Core.Abstractions;
+
+namespace ZB.MOM.WW.OtOpcUa.Driver.FOCAS;
+
+public static class FocasDataTypeExtensions
+{
+ /// Converts a FOCAS data type to the corresponding driver data type.
+ /// The FOCAS data type to convert.
+ /// The equivalent driver data type.
+ public static DriverDataType ToDriverDataType(this FocasDataType t) => t switch
+ {
+ FocasDataType.Bit => DriverDataType.Boolean,
+ FocasDataType.Byte or FocasDataType.Int16 or FocasDataType.Int32 => DriverDataType.Int32,
+ FocasDataType.Float32 => DriverDataType.Float32,
+ FocasDataType.Float64 => DriverDataType.Float64,
+ FocasDataType.String => DriverDataType.String,
+ _ => DriverDataType.Int32,
+ };
+}
diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.csproj b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.csproj
index 9caac97a..fb622f68 100644
--- a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.csproj
+++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.csproj
@@ -13,6 +13,7 @@
+