diff --git a/NEW/src/Utils/JdeScoping.ConfigManager/ViewModels/Forms/DataAccessFormViewModel.cs b/NEW/src/Utils/JdeScoping.ConfigManager/ViewModels/Forms/DataAccessFormViewModel.cs
new file mode 100644
index 0000000..0b37dd3
--- /dev/null
+++ b/NEW/src/Utils/JdeScoping.ConfigManager/ViewModels/Forms/DataAccessFormViewModel.cs
@@ -0,0 +1,137 @@
+using JdeScoping.ConfigManager.Models;
+
+namespace JdeScoping.ConfigManager.ViewModels.Forms;
+
+///
+/// ViewModel for editing DataAccess configuration section.
+///
+public class DataAccessFormViewModel : ViewModelBase
+{
+ private readonly DataAccessSection _model;
+ private readonly Action _onChanged;
+
+ public DataAccessFormViewModel(DataAccessSection model, Action onChanged)
+ {
+ _model = model ?? throw new ArgumentNullException(nameof(model));
+ _onChanged = onChanged ?? throw new ArgumentNullException(nameof(onChanged));
+ }
+
+ ///
+ /// Gets or sets the default query timeout in seconds.
+ ///
+ public int DefaultTimeoutSeconds
+ {
+ get => _model.DefaultTimeoutSeconds;
+ set
+ {
+ if (_model.DefaultTimeoutSeconds != value)
+ {
+ _model.DefaultTimeoutSeconds = value;
+ OnPropertyChanged();
+ _onChanged();
+ }
+ }
+ }
+
+ ///
+ /// Gets or sets the lot usage query timeout in seconds.
+ ///
+ public int LotUsageTimeoutSeconds
+ {
+ get => _model.LotUsageTimeoutSeconds;
+ set
+ {
+ if (_model.LotUsageTimeoutSeconds != value)
+ {
+ _model.LotUsageTimeoutSeconds = value;
+ OnPropertyChanged();
+ _onChanged();
+ }
+ }
+ }
+
+ ///
+ /// Gets or sets the MIS data query timeout in seconds.
+ ///
+ public int MisDataTimeoutSeconds
+ {
+ get => _model.MisDataTimeoutSeconds;
+ set
+ {
+ if (_model.MisDataTimeoutSeconds != value)
+ {
+ _model.MisDataTimeoutSeconds = value;
+ OnPropertyChanged();
+ _onChanged();
+ }
+ }
+ }
+
+ ///
+ /// Gets or sets the production schema name.
+ ///
+ public string ProductionSchema
+ {
+ get => _model.ProductionSchema;
+ set
+ {
+ if (_model.ProductionSchema != value)
+ {
+ _model.ProductionSchema = value;
+ OnPropertyChanged();
+ _onChanged();
+ }
+ }
+ }
+
+ ///
+ /// Gets or sets the archive schema name.
+ ///
+ public string ArchiveSchema
+ {
+ get => _model.ArchiveSchema;
+ set
+ {
+ if (_model.ArchiveSchema != value)
+ {
+ _model.ArchiveSchema = value;
+ OnPropertyChanged();
+ _onChanged();
+ }
+ }
+ }
+
+ ///
+ /// Gets or sets the stage schema name.
+ ///
+ public string StageSchema
+ {
+ get => _model.StageSchema;
+ set
+ {
+ if (_model.StageSchema != value)
+ {
+ _model.StageSchema = value;
+ OnPropertyChanged();
+ _onChanged();
+ }
+ }
+ }
+
+ ///
+ /// Gets or sets whether detailed logging is enabled.
+ ///
+ public bool EnableDetailedLogging
+ {
+ get => _model.EnableDetailedLogging;
+ set
+ {
+ if (_model.EnableDetailedLogging != value)
+ {
+ _model.EnableDetailedLogging = value;
+ OnPropertyChanged();
+ _onChanged();
+ }
+ }
+ }
+}
diff --git a/NEW/tests/JdeScoping.ConfigManager.Tests/ViewModels/Forms/DataAccessFormViewModelTests.cs b/NEW/tests/JdeScoping.ConfigManager.Tests/ViewModels/Forms/DataAccessFormViewModelTests.cs
new file mode 100644
index 0000000..5c1bdd1
--- /dev/null
+++ b/NEW/tests/JdeScoping.ConfigManager.Tests/ViewModels/Forms/DataAccessFormViewModelTests.cs
@@ -0,0 +1,43 @@
+using JdeScoping.ConfigManager.Models;
+using JdeScoping.ConfigManager.ViewModels.Forms;
+
+namespace JdeScoping.ConfigManager.Tests.ViewModels.Forms;
+
+public class DataAccessFormViewModelTests
+{
+ [Fact]
+ public void Constructor_InitializesFromModel()
+ {
+ // Arrange
+ var model = new DataAccessSection
+ {
+ DefaultTimeoutSeconds = 60,
+ ProductionSchema = "dbo",
+ EnableDetailedLogging = true
+ };
+
+ // Act
+ var sut = new DataAccessFormViewModel(model, () => { });
+
+ // Assert
+ sut.DefaultTimeoutSeconds.ShouldBe(60);
+ sut.ProductionSchema.ShouldBe("dbo");
+ sut.EnableDetailedLogging.ShouldBeTrue();
+ }
+
+ [Fact]
+ public void PropertyChange_UpdatesModelAndInvokesOnChanged()
+ {
+ // Arrange
+ var model = new DataAccessSection();
+ var changedInvoked = false;
+ var sut = new DataAccessFormViewModel(model, () => changedInvoked = true);
+
+ // Act
+ sut.ArchiveSchema = "hist";
+
+ // Assert
+ model.ArchiveSchema.ShouldBe("hist");
+ changedInvoked.ShouldBeTrue();
+ }
+}