diff --git a/src/DnsmasqWebUI.Tests/DnsmasqConfigSetServiceTests.cs b/src/DnsmasqWebUI.Tests/DnsmasqConfigSetServiceTests.cs
index 5bbc74e..92e53f8 100644
--- a/src/DnsmasqWebUI.Tests/DnsmasqConfigSetServiceTests.cs
+++ b/src/DnsmasqWebUI.Tests/DnsmasqConfigSetServiceTests.cs
@@ -1,7 +1,7 @@
using DnsmasqWebUI.Models.Config;
using DnsmasqWebUI.Models.Dnsmasq;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
-using DnsmasqWebUI.Infrastructure.Services;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
diff --git a/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigFieldDisplay.razor b/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigFieldDisplay.razor
index c31abcc..621ce95 100644
--- a/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigFieldDisplay.razor
+++ b/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigFieldDisplay.razor
@@ -3,7 +3,7 @@
@using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig
@using DnsmasqWebUI.Models.Config
@using DnsmasqWebUI.Infrastructure.Helpers.Config
-@using DnsmasqWebUI.Infrastructure.Services.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions
@inject IEffectiveConfigRenderFragmentRegistry RenderFragmentRegistry
@* Custom fragment renders only the value; we keep the row shell (label + value slot + badge) here for consistency. Pending value shown until save. *@
diff --git a/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSaveFlow.razor b/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSaveFlow.razor
index c59c9e5..4bfb39d 100644
--- a/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSaveFlow.razor
+++ b/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSaveFlow.razor
@@ -1,7 +1,7 @@
@namespace DnsmasqWebUI.Components.Dnsmasq.EffectiveConfig
@using DnsmasqWebUI.Models.Dnsmasq
@using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig
-@using DnsmasqWebUI.Infrastructure.Services.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions
@if (ShowModal)
{
diff --git a/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSaveModal.razor b/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSaveModal.razor
index ed168a6..9c49fe1 100644
--- a/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSaveModal.razor
+++ b/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSaveModal.razor
@@ -1,7 +1,7 @@
@namespace DnsmasqWebUI.Components.Dnsmasq.EffectiveConfig
@using DnsmasqWebUI.Models.Dnsmasq
@using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig
-@using DnsmasqWebUI.Infrastructure.Services.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions
diff --git a/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSection.razor b/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSection.razor
index 04e7bef..e08f468 100644
--- a/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSection.razor
+++ b/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigSection.razor
@@ -2,7 +2,7 @@
@using DnsmasqWebUI.Models.Dnsmasq
@using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig
@using DnsmasqWebUI.Infrastructure.Helpers.Config
-@using DnsmasqWebUI.Infrastructure.Services.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions
@inject IEffectiveConfigEditSession Session
@inject IJSRuntime JSRuntime
diff --git a/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigValueDisplayBase.cs b/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigValueDisplayBase.cs
index d785f2b..4a91221 100644
--- a/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigValueDisplayBase.cs
+++ b/src/DnsmasqWebUI/Components/Dnsmasq/EffectiveConfig/EffectiveConfigValueDisplayBase.cs
@@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions;
namespace DnsmasqWebUI.Components.Dnsmasq.EffectiveConfig;
diff --git a/src/DnsmasqWebUI/Components/Modals/SettingsModal.razor.cs b/src/DnsmasqWebUI/Components/Modals/SettingsModal.razor.cs
index 8c5a8fc..40b3a56 100644
--- a/src/DnsmasqWebUI/Components/Modals/SettingsModal.razor.cs
+++ b/src/DnsmasqWebUI/Components/Modals/SettingsModal.razor.cs
@@ -1,6 +1,6 @@
using DnsmasqWebUI.Extensions;
using DnsmasqWebUI.Models.Client;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.UI.Settings.Abstractions;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.JSInterop;
diff --git a/src/DnsmasqWebUI/Components/_Imports.razor b/src/DnsmasqWebUI/Components/_Imports.razor
index 1d08719..78fe6d8 100644
--- a/src/DnsmasqWebUI/Components/_Imports.razor
+++ b/src/DnsmasqWebUI/Components/_Imports.razor
@@ -10,7 +10,15 @@
@using DnsmasqWebUI.Extensions
@using DnsmasqWebUI.Models.Client
@using DnsmasqWebUI.Models.Client.Abstractions
-@using DnsmasqWebUI.Infrastructure.Services.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.Common.Process.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Hosts.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Leases.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Reload.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.Logs.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.UI.Settings.Abstractions
+@using DnsmasqWebUI.Infrastructure.Services.Updates.Abstractions
@using DnsmasqWebUI.Components
@using DnsmasqWebUI.Components.Shared
@using DnsmasqWebUI.Components.Modals
diff --git a/src/DnsmasqWebUI/Controllers/ConfigController.cs b/src/DnsmasqWebUI/Controllers/ConfigController.cs
index 460a99b..4ba2dc8 100644
--- a/src/DnsmasqWebUI/Controllers/ConfigController.cs
+++ b/src/DnsmasqWebUI/Controllers/ConfigController.cs
@@ -1,4 +1,5 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Reload.Abstractions;
using DnsmasqWebUI.Models.Config;
using DnsmasqWebUI.Models.Contracts;
using DnsmasqWebUI.Models.Dnsmasq;
diff --git a/src/DnsmasqWebUI/Controllers/DhcpController.cs b/src/DnsmasqWebUI/Controllers/DhcpController.cs
index 4df3e1c..4c9d024 100644
--- a/src/DnsmasqWebUI/Controllers/DhcpController.cs
+++ b/src/DnsmasqWebUI/Controllers/DhcpController.cs
@@ -1,4 +1,5 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Reload.Abstractions;
using DnsmasqWebUI.Models.Dhcp;
using DnsmasqWebUI.Models.Dnsmasq;
using Microsoft.AspNetCore.Mvc;
diff --git a/src/DnsmasqWebUI/Controllers/HostsController.cs b/src/DnsmasqWebUI/Controllers/HostsController.cs
index 84264c5..e14814d 100644
--- a/src/DnsmasqWebUI/Controllers/HostsController.cs
+++ b/src/DnsmasqWebUI/Controllers/HostsController.cs
@@ -1,4 +1,5 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Hosts.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Reload.Abstractions;
using DnsmasqWebUI.Models.Dnsmasq;
using DnsmasqWebUI.Models.Hosts;
using Microsoft.AspNetCore.Mvc;
diff --git a/src/DnsmasqWebUI/Controllers/LeasesController.cs b/src/DnsmasqWebUI/Controllers/LeasesController.cs
index 5678227..d95990d 100644
--- a/src/DnsmasqWebUI/Controllers/LeasesController.cs
+++ b/src/DnsmasqWebUI/Controllers/LeasesController.cs
@@ -1,4 +1,4 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Leases.Abstractions;
using DnsmasqWebUI.Models.Dhcp;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
diff --git a/src/DnsmasqWebUI/Controllers/ReloadController.cs b/src/DnsmasqWebUI/Controllers/ReloadController.cs
index 1ee7f39..28518b9 100644
--- a/src/DnsmasqWebUI/Controllers/ReloadController.cs
+++ b/src/DnsmasqWebUI/Controllers/ReloadController.cs
@@ -1,4 +1,4 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Reload.Abstractions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
diff --git a/src/DnsmasqWebUI/Controllers/StatusController.cs b/src/DnsmasqWebUI/Controllers/StatusController.cs
index d404d09..45b467b 100644
--- a/src/DnsmasqWebUI/Controllers/StatusController.cs
+++ b/src/DnsmasqWebUI/Controllers/StatusController.cs
@@ -1,4 +1,5 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Common.Process.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
using DnsmasqWebUI.Models.Config;
using DnsmasqWebUI.Models.Contracts;
using DnsmasqWebUI.Models.Dnsmasq;
diff --git a/src/DnsmasqWebUI/Extensions/LoggingBuilderExtensions.cs b/src/DnsmasqWebUI/Extensions/LoggingBuilderExtensions.cs
index 113ab2b..7937526 100644
--- a/src/DnsmasqWebUI/Extensions/LoggingBuilderExtensions.cs
+++ b/src/DnsmasqWebUI/Extensions/LoggingBuilderExtensions.cs
@@ -1,7 +1,7 @@
using System.Threading.Channels;
using DnsmasqWebUI.Infrastructure.Logging;
-using DnsmasqWebUI.Infrastructure.Services;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Logs;
+using DnsmasqWebUI.Infrastructure.Services.Logs.Abstractions;
using DnsmasqWebUI.Models.Config;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
diff --git a/src/DnsmasqWebUI/Extensions/ServiceCollectionExtensions.cs b/src/DnsmasqWebUI/Extensions/ServiceCollectionExtensions.cs
index 1dd4421..8303381 100644
--- a/src/DnsmasqWebUI/Extensions/ServiceCollectionExtensions.cs
+++ b/src/DnsmasqWebUI/Extensions/ServiceCollectionExtensions.cs
@@ -1,7 +1,7 @@
using System.Reflection;
using DnsmasqWebUI.Infrastructure.Client;
using DnsmasqWebUI.Infrastructure.Client.Abstractions;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
diff --git a/src/DnsmasqWebUI/Hubs/LogsHub.cs b/src/DnsmasqWebUI/Hubs/LogsHub.cs
index 7fe88d8..461a658 100644
--- a/src/DnsmasqWebUI/Hubs/LogsHub.cs
+++ b/src/DnsmasqWebUI/Hubs/LogsHub.cs
@@ -1,4 +1,4 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Logs.Abstractions;
using Microsoft.AspNetCore.SignalR;
namespace DnsmasqWebUI.Hubs;
diff --git a/src/DnsmasqWebUI/Infrastructure/Client/Abstractions/IReloadClient.cs b/src/DnsmasqWebUI/Infrastructure/Client/Abstractions/IReloadClient.cs
index f2c9905..9de4142 100644
--- a/src/DnsmasqWebUI/Infrastructure/Client/Abstractions/IReloadClient.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Client/Abstractions/IReloadClient.cs
@@ -1,4 +1,4 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Reload.Abstractions;
namespace DnsmasqWebUI.Infrastructure.Client.Abstractions;
diff --git a/src/DnsmasqWebUI/Infrastructure/Client/ReloadClient.cs b/src/DnsmasqWebUI/Infrastructure/Client/ReloadClient.cs
index c5d2d6b..12c6813 100644
--- a/src/DnsmasqWebUI/Infrastructure/Client/ReloadClient.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Client/ReloadClient.cs
@@ -1,6 +1,6 @@
using DnsmasqWebUI.Infrastructure.Client.Abstractions;
using DnsmasqWebUI.Infrastructure.Helpers.Http;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Reload.Abstractions;
using System.Net.Http.Json;
namespace DnsmasqWebUI.Infrastructure.Client;
diff --git a/src/DnsmasqWebUI/Infrastructure/Client/SameHostBaseAddressHandler.cs b/src/DnsmasqWebUI/Infrastructure/Client/SameHostBaseAddressHandler.cs
index 1dbfcf8..348bfe5 100644
--- a/src/DnsmasqWebUI/Infrastructure/Client/SameHostBaseAddressHandler.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Client/SameHostBaseAddressHandler.cs
@@ -1,5 +1,5 @@
using System.Net;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
namespace DnsmasqWebUI.Infrastructure.Client;
diff --git a/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigFieldBuilder.cs b/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigFieldBuilder.cs
index 66bc3b0..74c658b 100644
--- a/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigFieldBuilder.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigFieldBuilder.cs
@@ -1,6 +1,6 @@
using DnsmasqWebUI.Models.Dnsmasq;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions;
namespace DnsmasqWebUI.Infrastructure.Helpers.Config;
diff --git a/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigFieldDescriptorListExtensions.cs b/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigFieldDescriptorListExtensions.cs
index deef2ff..e0249d4 100644
--- a/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigFieldDescriptorListExtensions.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigFieldDescriptorListExtensions.cs
@@ -1,6 +1,6 @@
using DnsmasqWebUI.Models.Dnsmasq;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions;
namespace DnsmasqWebUI.Infrastructure.Helpers.Config;
diff --git a/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigViews.cs b/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigViews.cs
index 66d4dd5..298b690 100644
--- a/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigViews.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Helpers/Config/EffectiveConfigViews.cs
@@ -1,6 +1,6 @@
using DnsmasqWebUI.Models.Dnsmasq;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions;
namespace DnsmasqWebUI.Infrastructure.Helpers.Config;
diff --git a/src/DnsmasqWebUI/Infrastructure/Logging/AppLogsLoggerProvider.cs b/src/DnsmasqWebUI/Infrastructure/Logging/AppLogsLoggerProvider.cs
index 35ba76b..b703bf2 100644
--- a/src/DnsmasqWebUI/Infrastructure/Logging/AppLogsLoggerProvider.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Logging/AppLogsLoggerProvider.cs
@@ -1,5 +1,5 @@
using System.Threading.Channels;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Logs.Abstractions;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IProcessRunner.cs b/src/DnsmasqWebUI/Infrastructure/Services/Common/Process/Abstractions/IProcessRunner.cs
similarity index 84%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IProcessRunner.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Common/Process/Abstractions/IProcessRunner.cs
index 1e0cd6d..31d481a 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IProcessRunner.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Common/Process/Abstractions/IProcessRunner.cs
@@ -1,6 +1,7 @@
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Contracts;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Common.Process.Abstractions;
/// Runs a shell command with timeout and cancellation. Used for status, reload, status show, and logs commands.
public interface IProcessRunner : IApplicationScopedService
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/ProcessRunner.cs b/src/DnsmasqWebUI/Infrastructure/Services/Common/Process/ProcessRunner.cs
similarity index 94%
rename from src/DnsmasqWebUI/Infrastructure/Services/ProcessRunner.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Common/Process/ProcessRunner.cs
index ac60528..8bcdc11 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/ProcessRunner.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Common/Process/ProcessRunner.cs
@@ -1,10 +1,10 @@
using System.Diagnostics;
using System.Text;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Common.Process.Abstractions;
using DnsmasqWebUI.Models.Contracts;
using Microsoft.Extensions.Logging;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Common.Process;
/// Runs shell commands via /bin/sh with async output capture and timeout. Used by StatusController and ReloadService.
public sealed class ProcessRunner : IProcessRunner
@@ -29,9 +29,9 @@ public sealed class ProcessRunner : IProcessRunner
var stdout = new StringBuilder();
var stderr = new StringBuilder();
- using var process = new Process
+ using var process = new System.Diagnostics.Process
{
- StartInfo = new ProcessStartInfo
+ StartInfo = new System.Diagnostics.ProcessStartInfo
{
FileName = "/bin/sh",
Arguments = "-c \"" + command.Replace("\"", "\\\"") + "\"",
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IConfigSetCache.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/Abstractions/IConfigSetCache.cs
similarity index 87%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IConfigSetCache.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/Abstractions/IConfigSetCache.cs
index fe80d32..df7268b 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IConfigSetCache.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/Abstractions/IConfigSetCache.cs
@@ -1,6 +1,7 @@
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Contracts;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
///
/// Singleton cache for the config set (main + conf-dir + managed file). Invalidates on file watchers, staleness, or manual Invalidate.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IDnsmasqConfigService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/Abstractions/IDnsmasqConfigService.cs
similarity index 91%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IDnsmasqConfigService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/Abstractions/IDnsmasqConfigService.cs
index 79073c3..6f49873 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IDnsmasqConfigService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/Abstractions/IDnsmasqConfigService.cs
@@ -2,9 +2,10 @@ using DnsmasqWebUI.Models.Config;
using DnsmasqWebUI.Models.Contracts;
using DnsmasqWebUI.Models.Dhcp;
using DnsmasqWebUI.Models.Dnsmasq;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
/// Reads and writes the managed dnsmasq config file and DHCP hosts entries (the app-managed config and dhcp-host= lines).
public interface IDnsmasqConfigService : IApplicationScopedService
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IDnsmasqConfigSetService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/Abstractions/IDnsmasqConfigSetService.cs
similarity index 90%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IDnsmasqConfigSetService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/Abstractions/IDnsmasqConfigSetService.cs
index 0266518..aeef10e 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IDnsmasqConfigSetService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/Abstractions/IDnsmasqConfigSetService.cs
@@ -1,7 +1,8 @@
using DnsmasqWebUI.Models.Dnsmasq;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
/// Discovers the dnsmasq config set (main + conf-file/conf-dir) and the managed file path.
public interface IDnsmasqConfigSetService : IApplicationSingleton
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/ConfigSetCache.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/ConfigSetCache.cs
similarity index 99%
rename from src/DnsmasqWebUI/Infrastructure/Services/ConfigSetCache.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/ConfigSetCache.cs
index 6bc9e78..6465f66 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/ConfigSetCache.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/ConfigSetCache.cs
@@ -5,10 +5,10 @@ using DnsmasqWebUI.Models.Dhcp;
using DnsmasqWebUI.Models.Dnsmasq;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
using DnsmasqWebUI.Infrastructure.Parsers;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
using Microsoft.Extensions.Options;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config;
///
/// Singleton cache for the config set (main + conf-dir + managed file). Reads all files once per refresh,
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/DnsmasqConfigService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/DnsmasqConfigService.cs
similarity index 99%
rename from src/DnsmasqWebUI/Infrastructure/Services/DnsmasqConfigService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/DnsmasqConfigService.cs
index 14405ba..66a911c 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/DnsmasqConfigService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/DnsmasqConfigService.cs
@@ -1,7 +1,7 @@
using System.Text;
using DnsmasqWebUI.Infrastructure.Helpers.Config;
using DnsmasqWebUI.Infrastructure.Parsers;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
using DnsmasqWebUI.Models.Config;
using DnsmasqWebUI.Models.Contracts;
using DnsmasqWebUI.Models.Dhcp;
@@ -9,7 +9,7 @@ using DnsmasqWebUI.Models.Dnsmasq;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
using Microsoft.Extensions.Logging;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config;
public class DnsmasqConfigService : IDnsmasqConfigService
{
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/DnsmasqConfigSetService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/DnsmasqConfigSetService.cs
similarity index 95%
rename from src/DnsmasqWebUI/Infrastructure/Services/DnsmasqConfigSetService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/DnsmasqConfigSetService.cs
index f7b4ea3..2c34a15 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/DnsmasqConfigSetService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/DnsmasqConfigSetService.cs
@@ -1,9 +1,9 @@
using DnsmasqWebUI.Models.Dnsmasq;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
using DnsmasqWebUI.Models.Contracts;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config;
public class DnsmasqConfigSetService : IDnsmasqConfigSetService
{
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/EnsureManagedConfigHostedService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/EnsureManagedConfigHostedService.cs
similarity index 95%
rename from src/DnsmasqWebUI/Infrastructure/Services/EnsureManagedConfigHostedService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/EnsureManagedConfigHostedService.cs
index 5d559de..f5065a2 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/EnsureManagedConfigHostedService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Config/EnsureManagedConfigHostedService.cs
@@ -1,13 +1,14 @@
using System.Text;
using DnsmasqWebUI.Infrastructure.Helpers.Config;
using DnsmasqWebUI.Infrastructure.Parsers;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Config;
using DnsmasqWebUI.Models.Dnsmasq;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config;
///
/// Runs once at startup: ensures the managed file is included only by a conf-file= directive (never conf-dir=),
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IHostsCache.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/Abstractions/IHostsCache.cs
similarity index 81%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IHostsCache.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/Abstractions/IHostsCache.cs
index 46b8f92..f2b7e22 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IHostsCache.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/Abstractions/IHostsCache.cs
@@ -1,7 +1,8 @@
using DnsmasqWebUI.Models.Contracts;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Hosts;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Hosts.Abstractions;
///
/// Singleton cache for hosts: managed hosts file + read-only (system + addn-hosts). Invalidates on watchers, staleness, or Invalidate.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IHostsFileService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/Abstractions/IHostsFileService.cs
similarity index 80%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IHostsFileService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/Abstractions/IHostsFileService.cs
index 031c27d..564101b 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IHostsFileService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/Abstractions/IHostsFileService.cs
@@ -1,6 +1,7 @@
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Hosts;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Hosts.Abstractions;
/// Reads and writes the app-managed hosts file (the single hosts file the app edits).
public interface IHostsFileService : IApplicationScopedService
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/HostsCache.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/HostsCache.cs
similarity index 97%
rename from src/DnsmasqWebUI/Infrastructure/Services/HostsCache.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/HostsCache.cs
index be7d69b..801fd35 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/HostsCache.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/HostsCache.cs
@@ -3,10 +3,11 @@ using DnsmasqWebUI.Models.Config;
using DnsmasqWebUI.Models.Contracts;
using DnsmasqWebUI.Models.Hosts;
using DnsmasqWebUI.Infrastructure.Parsers;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Hosts.Abstractions;
using Microsoft.Extensions.Options;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Hosts;
///
/// Singleton cache for hosts: managed hosts file + read-only (system + addn-hosts). Invalidates on watchers (managed + system path), staleness, or Invalidate.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/HostsFileService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/HostsFileService.cs
similarity index 89%
rename from src/DnsmasqWebUI/Infrastructure/Services/HostsFileService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/HostsFileService.cs
index 020d574..17e0d76 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/HostsFileService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Hosts/HostsFileService.cs
@@ -1,10 +1,11 @@
using DnsmasqWebUI.Infrastructure.Helpers.Config;
using DnsmasqWebUI.Infrastructure.Parsers;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Hosts.Abstractions;
using DnsmasqWebUI.Models.Hosts;
using Microsoft.Extensions.Logging;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Hosts;
public class HostsFileService : IHostsFileService
{
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ILeasesCache.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/Abstractions/ILeasesCache.cs
similarity index 81%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ILeasesCache.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/Abstractions/ILeasesCache.cs
index f0b2436..7991157 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ILeasesCache.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/Abstractions/ILeasesCache.cs
@@ -1,6 +1,7 @@
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Dhcp;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Leases.Abstractions;
///
/// Singleton cache for the leases file; invalidates when the file changes (e.g. via file watcher).
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ILeasesFileService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/Abstractions/ILeasesFileService.cs
similarity index 81%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ILeasesFileService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/Abstractions/ILeasesFileService.cs
index 9540b6b..6b0d7e9 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ILeasesFileService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/Abstractions/ILeasesFileService.cs
@@ -1,6 +1,7 @@
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Dhcp;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Leases.Abstractions;
/// Reads the dnsmasq DHCP leases file (path from effective config).
public interface ILeasesFileService : IApplicationScopedService
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/LeasesCache.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/LeasesCache.cs
similarity index 95%
rename from src/DnsmasqWebUI/Infrastructure/Services/LeasesCache.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/LeasesCache.cs
index 197dcc9..16b8cbe 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/LeasesCache.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/LeasesCache.cs
@@ -1,9 +1,10 @@
using System.Text;
using DnsmasqWebUI.Models.Dhcp;
using DnsmasqWebUI.Infrastructure.Parsers;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Leases.Abstractions;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Leases;
///
/// Singleton cache for the leases file with a so we re-read only when the file changes.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/LeasesFileService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/LeasesFileService.cs
similarity index 87%
rename from src/DnsmasqWebUI/Infrastructure/Services/LeasesFileService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/LeasesFileService.cs
index 4c003e0..2b9cf4e 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/LeasesFileService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Leases/LeasesFileService.cs
@@ -1,8 +1,8 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Leases.Abstractions;
using DnsmasqWebUI.Models.Dhcp;
using Microsoft.Extensions.Logging;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Leases;
public class LeasesFileService : ILeasesFileService
{
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IReloadService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Reload/Abstractions/IReloadService.cs
similarity index 84%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IReloadService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Reload/Abstractions/IReloadService.cs
index f7dbde9..65f13fc 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IReloadService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Reload/Abstractions/IReloadService.cs
@@ -1,4 +1,6 @@
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
+
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Reload.Abstractions;
/// Runs the configured dnsmasq reload command (e.g. systemctl reload dnsmasq).
public interface IReloadService : IApplicationScopedService
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/ReloadService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Reload/ReloadService.cs
similarity index 92%
rename from src/DnsmasqWebUI/Infrastructure/Services/ReloadService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Reload/ReloadService.cs
index 7691afb..85b1957 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/ReloadService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Dnsmasq/Reload/ReloadService.cs
@@ -1,9 +1,10 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Common.Process.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Reload.Abstractions;
using DnsmasqWebUI.Models.Config;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Reload;
public class ReloadService : IReloadService
{
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IEffectiveConfigEditSession.cs b/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/Abstractions/IEffectiveConfigEditSession.cs
similarity index 84%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IEffectiveConfigEditSession.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/Abstractions/IEffectiveConfigEditSession.cs
index 471eeb7..6f6154e 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IEffectiveConfigEditSession.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/Abstractions/IEffectiveConfigEditSession.cs
@@ -1,6 +1,7 @@
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions;
///
/// Scoped orchestrator for effective-config edit lifecycle: edit mode, active field, pending changes, and apply.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IEffectiveConfigRenderFragmentRegistry.cs b/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/Abstractions/IEffectiveConfigRenderFragmentRegistry.cs
similarity index 91%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IEffectiveConfigRenderFragmentRegistry.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/Abstractions/IEffectiveConfigRenderFragmentRegistry.cs
index 3059a22..f9f4b44 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IEffectiveConfigRenderFragmentRegistry.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/Abstractions/IEffectiveConfigRenderFragmentRegistry.cs
@@ -1,9 +1,10 @@
using Microsoft.AspNetCore.Components;
using DnsmasqWebUI.Models.Dnsmasq;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig.Abstractions;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions;
///
/// Lookup for custom display fragments per effective-config field (section + option).
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfigEditSession.cs b/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/EffectiveConfigEditSession.cs
similarity index 91%
rename from src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfigEditSession.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/EffectiveConfigEditSession.cs
index 4ff943b..bd039fc 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfigEditSession.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/EffectiveConfigEditSession.cs
@@ -1,7 +1,8 @@
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.EffectiveConfig;
public sealed class EffectiveConfigEditSession : IEffectiveConfigEditSession
{
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfigRenderFragmentRegistry.cs b/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/EffectiveConfigRenderFragmentRegistry.cs
similarity index 98%
rename from src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfigRenderFragmentRegistry.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/EffectiveConfigRenderFragmentRegistry.cs
index db9cffd..d8768d4 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfigRenderFragmentRegistry.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/EffectiveConfig/EffectiveConfigRenderFragmentRegistry.cs
@@ -3,10 +3,10 @@ using DnsmasqWebUI.Infrastructure.Helpers.Config;
using DnsmasqWebUI.Models.Dnsmasq;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig.Abstractions;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.EffectiveConfig.Abstractions;
using DnsmasqWebUI.Components.Dnsmasq.EffectiveConfig.CustomDisplays;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.EffectiveConfig;
///
/// Maps (sectionId, optionName) to custom effective-config value display component types and descriptor factories.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IAppLogsBuffer.cs b/src/DnsmasqWebUI/Infrastructure/Services/Logs/Abstractions/IAppLogsBuffer.cs
similarity index 89%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IAppLogsBuffer.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Logs/Abstractions/IAppLogsBuffer.cs
index f10f5da..5fade51 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IAppLogsBuffer.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Logs/Abstractions/IAppLogsBuffer.cs
@@ -1,4 +1,4 @@
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Logs.Abstractions;
///
/// Ring buffer of recent app log lines. Filled by ILoggerProvider, drained for SignalR push.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ILogsService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Logs/Abstractions/ILogsService.cs
similarity index 93%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ILogsService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Logs/Abstractions/ILogsService.cs
index 321931a..3413e86 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ILogsService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Logs/Abstractions/ILogsService.cs
@@ -1,4 +1,4 @@
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Logs.Abstractions;
///
/// Runs LogsCommand, diffs output, chunks by lines, and pushes via SignalR.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/AppLogsBuffer.cs b/src/DnsmasqWebUI/Infrastructure/Services/Logs/AppLogsBuffer.cs
similarity index 81%
rename from src/DnsmasqWebUI/Infrastructure/Services/AppLogsBuffer.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Logs/AppLogsBuffer.cs
index 1e0034a..17da616 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/AppLogsBuffer.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Logs/AppLogsBuffer.cs
@@ -1,7 +1,9 @@
-namespace DnsmasqWebUI.Infrastructure.Services;
+using DnsmasqWebUI.Infrastructure.Services.Logs.Abstractions;
-///
-public sealed class AppLogsBuffer : Abstractions.IAppLogsBuffer
+namespace DnsmasqWebUI.Infrastructure.Services.Logs;
+
+///
+public sealed class AppLogsBuffer : IAppLogsBuffer
{
private const int MaxLines = 1000;
private readonly List _lines = [];
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/AppLogsPushTriggeredHostedService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Logs/AppLogsPushTriggeredHostedService.cs
similarity index 91%
rename from src/DnsmasqWebUI/Infrastructure/Services/AppLogsPushTriggeredHostedService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Logs/AppLogsPushTriggeredHostedService.cs
index 51d71b1..1d25c27 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/AppLogsPushTriggeredHostedService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Logs/AppLogsPushTriggeredHostedService.cs
@@ -1,9 +1,10 @@
using System.Threading.Channels;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Logs.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Logs;
///
/// Listens for signals from AppLogsLoggerProvider; drains pending app logs and pushes via LogsService.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/ApplicationLifecycleLoggingHostedService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Logs/ApplicationLifecycleLoggingHostedService.cs
similarity index 95%
rename from src/DnsmasqWebUI/Infrastructure/Services/ApplicationLifecycleLoggingHostedService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Logs/ApplicationLifecycleLoggingHostedService.cs
index 8f13bf8..5665aee 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/ApplicationLifecycleLoggingHostedService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Logs/ApplicationLifecycleLoggingHostedService.cs
@@ -1,12 +1,12 @@
using System.Reflection;
using System.Runtime.InteropServices;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Config;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Logs;
/// Logs application start and stop with runtime and configuration context.
public sealed class ApplicationLifecycleLoggingHostedService : IApplicationHostedService
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/LogsFileWatcherHostedService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Logs/LogsFileWatcherHostedService.cs
similarity index 94%
rename from src/DnsmasqWebUI/Infrastructure/Services/LogsFileWatcherHostedService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Logs/LogsFileWatcherHostedService.cs
index 859afbd..f9b790d 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/LogsFileWatcherHostedService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Logs/LogsFileWatcherHostedService.cs
@@ -1,9 +1,11 @@
using DnsmasqWebUI.Models.Dnsmasq.EffectiveConfig;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Config.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Logs.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Logs;
///
/// When LogsPath is set in effective config, watches that file and triggers LogsService push on change.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/LogsService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Logs/LogsService.cs
similarity index 97%
rename from src/DnsmasqWebUI/Infrastructure/Services/LogsService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Logs/LogsService.cs
index e2c6af4..372067e 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/LogsService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Logs/LogsService.cs
@@ -1,5 +1,6 @@
using System.Text;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Common.Process.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Logs.Abstractions;
using DnsmasqWebUI.Models.Config;
using DnsmasqWebUI.Models.Logs;
using Microsoft.AspNetCore.SignalR;
@@ -7,7 +8,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Logs;
///
/// Runs LogsCommand, diffs against cache, chunks by lines, and pushes via SignalR.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationHostedService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationHostedService.cs
similarity index 82%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationHostedService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationHostedService.cs
index b3e06d5..ef19f05 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationHostedService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationHostedService.cs
@@ -1,6 +1,6 @@
using Microsoft.Extensions.Hosting;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
///
/// Marker interface for application hosted services that are registered via assembly scanning.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationScopedConcrete.cs b/src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationScopedConcrete.cs
similarity index 76%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationScopedConcrete.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationScopedConcrete.cs
index e4e367f..0b035bf 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationScopedConcrete.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationScopedConcrete.cs
@@ -1,4 +1,4 @@
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
///
/// Marker for types that are registered as their own concrete type with scoped lifetime.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationScopedService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationScopedService.cs
similarity index 73%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationScopedService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationScopedService.cs
index cfc92be..0764f90 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationScopedService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationScopedService.cs
@@ -1,4 +1,4 @@
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
///
/// Marker interface for application services that are registered as scoped.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationSingleton.cs b/src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationSingleton.cs
similarity index 73%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationSingleton.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationSingleton.cs
index 0cbf4aa..79c30e9 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IApplicationSingleton.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Registration/Abstractions/IApplicationSingleton.cs
@@ -1,4 +1,4 @@
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
///
/// Marker interface for application services that are registered as singleton.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IClientSettingsService.cs b/src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/Abstractions/IClientSettingsService.cs
similarity index 80%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IClientSettingsService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/Abstractions/IClientSettingsService.cs
index 76e6484..8726fa5 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IClientSettingsService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/Abstractions/IClientSettingsService.cs
@@ -1,6 +1,7 @@
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
using DnsmasqWebUI.Models.Client;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.UI.Settings.Abstractions;
///
/// Loads and saves client-side preferences (e.g. polling intervals) to browser local storage.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ISettingsModalService.cs b/src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/Abstractions/ISettingsModalService.cs
similarity index 93%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ISettingsModalService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/Abstractions/ISettingsModalService.cs
index ed43713..7691fd1 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/ISettingsModalService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/Abstractions/ISettingsModalService.cs
@@ -1,6 +1,6 @@
using DnsmasqWebUI.Models.Client;
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.UI.Settings.Abstractions;
///
/// Scoped service to open the app-level settings modal from anywhere (e.g. NavMenu, pages).
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/ClientSettingsService.cs b/src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/ClientSettingsService.cs
similarity index 95%
rename from src/DnsmasqWebUI/Infrastructure/Services/ClientSettingsService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/ClientSettingsService.cs
index 23af31e..05cd6b2 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/ClientSettingsService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/ClientSettingsService.cs
@@ -1,10 +1,10 @@
using System.Text.Json;
using DnsmasqWebUI.Extensions;
using DnsmasqWebUI.Models.Client;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.UI.Settings.Abstractions;
using Microsoft.JSInterop;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.UI.Settings;
///
/// Loads and saves client-side settings to browser local storage via JS interop.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/SettingsModalService.cs b/src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/SettingsModalService.cs
similarity index 77%
rename from src/DnsmasqWebUI/Infrastructure/Services/SettingsModalService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/SettingsModalService.cs
index 7015c14..755b7c5 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/SettingsModalService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/UI/Settings/SettingsModalService.cs
@@ -1,7 +1,7 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.UI.Settings.Abstractions;
using DnsmasqWebUI.Models.Client;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.UI.Settings;
///
public sealed class SettingsModalService : ISettingsModalService
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IUpdateCheckService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Updates/Abstractions/IUpdateCheckService.cs
similarity index 94%
rename from src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IUpdateCheckService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Updates/Abstractions/IUpdateCheckService.cs
index 3ef6bd0..365da31 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/Abstractions/IUpdateCheckService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Updates/Abstractions/IUpdateCheckService.cs
@@ -1,4 +1,4 @@
-namespace DnsmasqWebUI.Infrastructure.Services.Abstractions;
+namespace DnsmasqWebUI.Infrastructure.Services.Updates.Abstractions;
///
/// Service that checks GitHub for a newer release. Runs on a configurable interval (hosted service)
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/UpdateCheckHostedService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Updates/UpdateCheckHostedService.cs
similarity index 88%
rename from src/DnsmasqWebUI/Infrastructure/Services/UpdateCheckHostedService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Updates/UpdateCheckHostedService.cs
index 22e1f3a..9d8d4fa 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/UpdateCheckHostedService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Updates/UpdateCheckHostedService.cs
@@ -1,8 +1,9 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Registration.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Updates.Abstractions;
using DnsmasqWebUI.Models.Config;
using Microsoft.Extensions.Options;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Updates;
///
/// Runs an update check shortly after startup, then periodically at the configured interval.
diff --git a/src/DnsmasqWebUI/Infrastructure/Services/UpdateCheckService.cs b/src/DnsmasqWebUI/Infrastructure/Services/Updates/UpdateCheckService.cs
similarity index 97%
rename from src/DnsmasqWebUI/Infrastructure/Services/UpdateCheckService.cs
rename to src/DnsmasqWebUI/Infrastructure/Services/Updates/UpdateCheckService.cs
index 2c22d66..0d4eeca 100644
--- a/src/DnsmasqWebUI/Infrastructure/Services/UpdateCheckService.cs
+++ b/src/DnsmasqWebUI/Infrastructure/Services/Updates/UpdateCheckService.cs
@@ -1,11 +1,11 @@
using System.Reflection;
using System.Text.Json;
using DnsmasqWebUI.Extensions;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Updates.Abstractions;
using DnsmasqWebUI.Models.Config;
using Microsoft.Extensions.Options;
-namespace DnsmasqWebUI.Infrastructure.Services;
+namespace DnsmasqWebUI.Infrastructure.Services.Updates;
public sealed class UpdateCheckService : IUpdateCheckService
{
diff --git a/src/DnsmasqWebUI/Models/Dnsmasq/SaveWithReloadResult.cs b/src/DnsmasqWebUI/Models/Dnsmasq/SaveWithReloadResult.cs
index 1a3d83a..44f0662 100644
--- a/src/DnsmasqWebUI/Models/Dnsmasq/SaveWithReloadResult.cs
+++ b/src/DnsmasqWebUI/Models/Dnsmasq/SaveWithReloadResult.cs
@@ -1,4 +1,4 @@
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Dnsmasq.Reload.Abstractions;
namespace DnsmasqWebUI.Models.Dnsmasq;
diff --git a/src/DnsmasqWebUI/Program.cs b/src/DnsmasqWebUI/Program.cs
index b0882e7..80401eb 100644
--- a/src/DnsmasqWebUI/Program.cs
+++ b/src/DnsmasqWebUI/Program.cs
@@ -3,8 +3,10 @@ using DnsmasqWebUI.Hubs;
using DnsmasqWebUI.Models.Config;
using DnsmasqWebUI.Extensions;
using DnsmasqWebUI.Infrastructure.Helpers.Http;
-using DnsmasqWebUI.Infrastructure.Services;
-using DnsmasqWebUI.Infrastructure.Services.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.UI.Settings;
+using DnsmasqWebUI.Infrastructure.Services.UI.Settings.Abstractions;
+using DnsmasqWebUI.Infrastructure.Services.Updates;
+using DnsmasqWebUI.Infrastructure.Services.Updates.Abstractions;
using Microsoft.Extensions.Options;
// When not in Development, use the app's directory (not CWD) so static assets work when run via symlink or from any CWD.