diff --git a/DigitalLearningSolutions.Data.Tests/Services/ConfigServiceTests.cs b/DigitalLearningSolutions.Data.Tests/DataServices/ConfigDataServiceTests.cs
similarity index 52%
rename from DigitalLearningSolutions.Data.Tests/Services/ConfigServiceTests.cs
rename to DigitalLearningSolutions.Data.Tests/DataServices/ConfigDataServiceTests.cs
index f5d2d7bf28..293844c61d 100644
--- a/DigitalLearningSolutions.Data.Tests/Services/ConfigServiceTests.cs
+++ b/DigitalLearningSolutions.Data.Tests/DataServices/ConfigDataServiceTests.cs
@@ -1,27 +1,26 @@
-namespace DigitalLearningSolutions.Data.Tests.Services
+namespace DigitalLearningSolutions.Data.Tests.DataServices
 {
-    using DigitalLearningSolutions.Data.Services;
-    using DigitalLearningSolutions.Data.Tests.Helpers;
+    using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.Tests.TestHelpers;
-    using NUnit.Framework;
     using FluentAssertions;
+    using NUnit.Framework;
 
-    public class ConfigServiceTests
+    public class ConfigDataServiceTests
     {
-        private ConfigService configService;
+        private ConfigDataService configDataService = null!;
 
         [SetUp]
         public void Setup()
         {
             var connection = ServiceTestHelper.GetDatabaseConnection();
-            configService = new ConfigService(connection);
+            configDataService = new ConfigDataService(connection);
         }
 
         [Test]
         public void Get_config_value_returns_the_expected_value()
         {
             // When
-            var result = configService.GetConfigValue(ConfigService.MailFromAddress);
+            var result = configDataService.GetConfigValue(ConfigDataService.MailFromAddress);
 
             // Then
             result.Should().Be("noreply@itskills.nhs.uk");
diff --git a/DigitalLearningSolutions.Data.Tests/Services/ActionPlanServiceTests.cs b/DigitalLearningSolutions.Data.Tests/Services/ActionPlanServiceTests.cs
index 477e3958d8..521fa5a58a 100644
--- a/DigitalLearningSolutions.Data.Tests/Services/ActionPlanServiceTests.cs
+++ b/DigitalLearningSolutions.Data.Tests/Services/ActionPlanServiceTests.cs
@@ -6,7 +6,6 @@
     using System.Threading.Tasks;
     using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.DataServices.SelfAssessmentDataService;
-    using DigitalLearningSolutions.Data.Helpers;
     using DigitalLearningSolutions.Data.Models.External.LearningHubApiClient;
     using DigitalLearningSolutions.Data.Models.LearningResources;
     using DigitalLearningSolutions.Data.Services;
@@ -16,6 +15,7 @@
     using FluentAssertions.Execution;
     using Microsoft.Extensions.Configuration;
     using NUnit.Framework;
+    using ConfigurationExtensions = DigitalLearningSolutions.Data.Extensions.ConfigurationExtensions;
 
     public class ActionPlanServiceTests
     {
@@ -371,7 +371,7 @@ public void RemoveActionPlanResource_removes_item()
         public void VerifyDelegateCanAccessActionPlanResource_returns_null_if_signposting_is_deactivated()
         {
             // Given
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("false");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("false");
 
             // When
             var result = actionPlanService.VerifyDelegateCanAccessActionPlanResource(
@@ -392,7 +392,7 @@ public void
             VerifyDelegateCanAccessActionPlanResource_returns_null_if_LearningLogItem_with_given_id_does_not_exist()
         {
             // Given
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
             A.CallTo(() => learningLogItemsDataService.GetLearningLogItem(GenericLearningLogItemId)).Returns(null);
 
             // When
@@ -414,7 +414,7 @@ public void
         public void VerifyDelegateCanAccessActionPlanResource_returns_null_if_LearningLogItem_is_removed()
         {
             // Given
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
             var learningLogItem = Builder.CreateNew()
                 .With(i => i.LearningHubResourceReferenceId = GenericLearningHubResourceReferenceId)
                 .And(i => i.ArchivedDate = DateTime.UtcNow)
@@ -441,7 +441,7 @@ public void VerifyDelegateCanAccessActionPlanResource_returns_null_if_LearningLo
         public void VerifyDelegateCanAccessActionPlanResource_returns_null_if_LearningLogItem_has_no_linked_resource()
         {
             // Given
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
             var learningLogItem = Builder.CreateNew()
                 .With(i => i.LearningHubResourceReferenceId = null)
                 .And(i => i.ArchivedDate = null)
@@ -469,7 +469,7 @@ public void
             VerifyDelegateCanAccessActionPlanResource_returns_false_if_LearningLogItem_is_for_different_delegate()
         {
             // Given
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
             var learningLogItem = Builder.CreateNew()
                 .With(i => i.LearningHubResourceReferenceId = GenericLearningHubResourceReferenceId)
                 .And(i => i.ArchivedDate = null)
@@ -496,7 +496,7 @@ public void
         public void VerifyDelegateCanAccessActionPlanResource_returns_true_if_all_conditions_met()
         {
             // Given
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
             var learningLogItem = Builder.CreateNew()
                 .With(i => i.LearningHubResourceReferenceId = GenericLearningHubResourceReferenceId)
                 .And(i => i.ArchivedDate = null)
diff --git a/DigitalLearningSolutions.Data.Tests/Services/EmailServiceTests.cs b/DigitalLearningSolutions.Data.Tests/Services/EmailServiceTests.cs
index 291f619aeb..d580797b63 100644
--- a/DigitalLearningSolutions.Data.Tests/Services/EmailServiceTests.cs
+++ b/DigitalLearningSolutions.Data.Tests/Services/EmailServiceTests.cs
@@ -16,39 +16,39 @@ namespace DigitalLearningSolutions.Data.Tests.Services
 
     public class EmailServiceTests
     {
-        private IConfigService configService;
-        private IEmailDataService emailDataService;
-        private EmailService emailService;
-        private ISmtpClient smtpClient;
+        private IConfigDataService configDataService = null!;
+        private IEmailDataService emailDataService = null!;
+        private EmailService emailService = null!;
+        private ISmtpClient smtpClient = null!;
 
         [SetUp]
         public void Setup()
         {
             emailDataService = A.Fake();
-            configService = A.Fake();
+            configDataService = A.Fake();
             var smtpClientFactory = A.Fake();
             smtpClient = A.Fake();
             A.CallTo(() => smtpClientFactory.GetSmtpClient()).Returns(smtpClient);
 
-            A.CallTo(() => configService.GetConfigValue(ConfigService.MailPort)).Returns("25");
-            A.CallTo(() => configService.GetConfigValue(ConfigService.MailUsername)).Returns("username");
-            A.CallTo(() => configService.GetConfigValue(ConfigService.MailPassword)).Returns("password");
-            A.CallTo(() => configService.GetConfigValue(ConfigService.MailServer)).Returns("smtp.example.com");
-            A.CallTo(() => configService.GetConfigValue(ConfigService.MailFromAddress)).Returns("test@example.com");
+            A.CallTo(() => configDataService.GetConfigValue(ConfigDataService.MailPort)).Returns("25");
+            A.CallTo(() => configDataService.GetConfigValue(ConfigDataService.MailUsername)).Returns("username");
+            A.CallTo(() => configDataService.GetConfigValue(ConfigDataService.MailPassword)).Returns("password");
+            A.CallTo(() => configDataService.GetConfigValue(ConfigDataService.MailServer)).Returns("smtp.example.com");
+            A.CallTo(() => configDataService.GetConfigValue(ConfigDataService.MailFromAddress)).Returns("test@example.com");
 
             var logger = A.Fake>();
-            emailService = new EmailService(emailDataService, configService, smtpClientFactory, logger);
+            emailService = new EmailService(emailDataService, configDataService, smtpClientFactory, logger);
         }
 
-        [TestCase(ConfigService.MailPort)]
-        [TestCase(ConfigService.MailUsername)]
-        [TestCase(ConfigService.MailPassword)]
-        [TestCase(ConfigService.MailServer)]
-        [TestCase(ConfigService.MailFromAddress)]
+        [TestCase(ConfigDataService.MailPort)]
+        [TestCase(ConfigDataService.MailUsername)]
+        [TestCase(ConfigDataService.MailPassword)]
+        [TestCase(ConfigDataService.MailServer)]
+        [TestCase(ConfigDataService.MailFromAddress)]
         public void Trying_to_send_mail_with_null_config_values_should_throw_an_exception(string configKey)
         {
             // Given
-            A.CallTo(() => configService.GetConfigValue(configKey)).Returns(null);
+            A.CallTo(() => configDataService.GetConfigValue(configKey)).Returns(null);
 
             // Then
             Assert.Throws(() => emailService.SendEmail(EmailTestHelper.GetDefaultEmail()));
@@ -183,7 +183,7 @@ public void The_recipient_email_address_is_correct()
         public void The_recipient_email_addresses_are_correct()
         {
             // When
-            emailService.SendEmail(EmailTestHelper.GetDefaultEmail(new string[2] { "recipient1@example.com", "recipient2@example.com" }));
+            emailService.SendEmail(EmailTestHelper.GetDefaultEmail(new [] { "recipient1@example.com", "recipient2@example.com" }));
 
             // Then
             A.CallTo(() =>
@@ -221,7 +221,7 @@ public void The_cc_email_address_is_correct()
         public void The_cc_email_addresses_are_correct()
         {
             // When
-            emailService.SendEmail(EmailTestHelper.GetDefaultEmail(cc: new string[2] { "cc1@example.com", "cc2@example.com" }));
+            emailService.SendEmail(EmailTestHelper.GetDefaultEmail(cc: new[] { "cc1@example.com", "cc2@example.com" }));
 
             // Then
             A.CallTo(() =>
@@ -259,7 +259,7 @@ public void The_bcc_email_address_is_correct()
         public void The_bcc_email_addresses_are_correct()
         {
             // When
-            emailService.SendEmail(EmailTestHelper.GetDefaultEmail(bcc: new string[2] { "bcc1@example.com", "bcc2@example.com" }));
+            emailService.SendEmail(EmailTestHelper.GetDefaultEmail(bcc: new [] { "bcc1@example.com", "bcc2@example.com" }));
 
             // Then
             A.CallTo(() =>
diff --git a/DigitalLearningSolutions.Data.Tests/Services/GroupServiceTests/GroupsServiceTests.cs b/DigitalLearningSolutions.Data.Tests/Services/GroupServiceTests/GroupsServiceTests.cs
index 5bbdd5edee..d70ca7aa3f 100644
--- a/DigitalLearningSolutions.Data.Tests/Services/GroupServiceTests/GroupsServiceTests.cs
+++ b/DigitalLearningSolutions.Data.Tests/Services/GroupServiceTests/GroupsServiceTests.cs
@@ -5,7 +5,6 @@
     using System.Linq;
     using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.Enums;
-    using DigitalLearningSolutions.Data.Helpers;
     using DigitalLearningSolutions.Data.Models;
     using DigitalLearningSolutions.Data.Models.CustomPrompts;
     using DigitalLearningSolutions.Data.Models.DelegateGroups;
@@ -62,14 +61,15 @@ public void Setup()
             configuration = A.Fake();
             centreRegistrationPromptsService = A.Fake();
             logger = A.Fake>();
-
             jobGroupsDataService = A.Fake(x => x.Strict());
+
             A.CallTo(() => jobGroupsDataService.GetJobGroupsAlphabetical()).Returns(
                 JobGroupsTestHelper.GetDefaultJobGroupsAlphabetical()
             );
+            A.CallTo(() => configuration["AppRootPath"]).Returns("baseUrl");
 
-            A.CallTo(() => configuration[ConfigHelper.AppRootPathName]).Returns("baseUrl");
             DatabaseModificationsDoNothing();
+
             groupsService = new GroupsService(
                 groupsDataService,
                 clockService,
diff --git a/DigitalLearningSolutions.Data.Tests/Services/LearningHubLinkServiceTests.cs b/DigitalLearningSolutions.Data.Tests/Services/LearningHubLinkServiceTests.cs
index ebd19e640e..64842edbfe 100644
--- a/DigitalLearningSolutions.Data.Tests/Services/LearningHubLinkServiceTests.cs
+++ b/DigitalLearningSolutions.Data.Tests/Services/LearningHubLinkServiceTests.cs
@@ -4,7 +4,6 @@
     using System.Web;
     using DigitalLearningSolutions.Data.DataServices.UserDataService;
     using DigitalLearningSolutions.Data.Exceptions;
-    using DigitalLearningSolutions.Data.Helpers;
     using DigitalLearningSolutions.Data.Models.Signposting;
     using DigitalLearningSolutions.Data.Services;
     using FakeItEasy;
@@ -25,18 +24,10 @@ public void Setup()
             userDataService = A.Fake();
             learningHubSsoSecurityService = A.Fake();
 
-            A.CallTo(() => config[$"{ConfigHelper.LearningHubSsoSectionKey}:{ConfigHelper.LearningHubAuthBaseUrl}"])
-                .Returns("www.example.com");
-            A.CallTo(
-                () => config[$"{ConfigHelper.LearningHubSsoSectionKey}:{ConfigHelper.LearningHubAuthClientCode}"]
-            ).Returns("test");
-            A.CallTo(
-                () => config[$"{ConfigHelper.LearningHubSsoSectionKey}:{ConfigHelper.LearningHubAuthLoginEndpoint}"]
-            ).Returns("/insert-log");
-            A.CallTo(
-                () => config[
-                    $"{ConfigHelper.LearningHubSsoSectionKey}:{ConfigHelper.LearningHubAuthLinkingEndpoint}"]
-            ).Returns("/to-the-past");
+            A.CallTo(() => config["LearningHubSSO:BaseUrl"]).Returns("www.example.com");
+            A.CallTo(() => config["LearningHubSSO:ClientCode"]).Returns("test");
+            A.CallTo(() => config["LearningHubSSO:LoginEndpoint"]).Returns("/insert-log");
+            A.CallTo(() => config["LearningHubSSO:LinkingEndpoint"]).Returns("/to-the-past");
 
             A.CallTo(() => learningHubSsoSecurityService.VerifyHash("56789", "invalid-hash")).Returns(false);
             A.CallTo(() => learningHubSsoSecurityService.VerifyHash("12345", "valid-hash")).Returns(true);
diff --git a/DigitalLearningSolutions.Data.Tests/Services/UnlockServiceTests.cs b/DigitalLearningSolutions.Data.Tests/Services/UnlockServiceTests.cs
index 60983c272c..bcf9d6236c 100644
--- a/DigitalLearningSolutions.Data.Tests/Services/UnlockServiceTests.cs
+++ b/DigitalLearningSolutions.Data.Tests/Services/UnlockServiceTests.cs
@@ -1,6 +1,6 @@
 namespace DigitalLearningSolutions.Data.Tests.Services
 {
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.Models;
     using DigitalLearningSolutions.Data.Models.Email;
     using DigitalLearningSolutions.Data.Services;
@@ -44,8 +44,8 @@ public void Setup()
                 featureManager
             );
 
-            A.CallTo(() => configuration[ConfigHelper.AppRootPathName]).Returns("https://new-tracking-system.com");
-            A.CallTo(() => configuration[ConfigHelper.CurrentSystemBaseUrlName])
+            A.CallTo(() => configuration["AppRootPath"]).Returns("https://new-tracking-system.com");
+            A.CallTo(() => configuration["CurrentSystemBaseUrl"])
                 .Returns("https://old-tracking-system.com");
         }
 
@@ -64,7 +64,7 @@ public void Throws_an_exception_when_tracking_system_base_url_is_null()
         {
             // Given
             A.CallTo(() => featureManager.IsEnabledAsync(A._)).Returns(false);
-            A.CallTo(() => configuration[ConfigHelper.CurrentSystemBaseUrlName]).Returns("");
+            A.CallTo(() => configuration["CurrentSystemBaseUrl"]).Returns("");
 
             // Then
             Assert.ThrowsAsync(async () => await notificationService.SendUnlockRequest(1));
diff --git a/DigitalLearningSolutions.Data/ApiClients/LearningHubApiClient.cs b/DigitalLearningSolutions.Data/ApiClients/LearningHubApiClient.cs
index a7c46bb9fd..6ef838694a 100644
--- a/DigitalLearningSolutions.Data/ApiClients/LearningHubApiClient.cs
+++ b/DigitalLearningSolutions.Data/ApiClients/LearningHubApiClient.cs
@@ -6,7 +6,7 @@
     using System.Net.Http;
     using System.Threading.Tasks;
     using DigitalLearningSolutions.Data.Exceptions;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Models.External.LearningHubApiClient;
     using Microsoft.Extensions.Configuration;
     using Microsoft.Extensions.Logging;
diff --git a/DigitalLearningSolutions.Data/Services/ConfigService.cs b/DigitalLearningSolutions.Data/DataServices/ConfigDataService.cs
similarity index 87%
rename from DigitalLearningSolutions.Data/Services/ConfigService.cs
rename to DigitalLearningSolutions.Data/DataServices/ConfigDataService.cs
index d9b32ecb1a..0e14ec751e 100644
--- a/DigitalLearningSolutions.Data/Services/ConfigService.cs
+++ b/DigitalLearningSolutions.Data/DataServices/ConfigDataService.cs
@@ -1,18 +1,18 @@
-namespace DigitalLearningSolutions.Data.Services
+namespace DigitalLearningSolutions.Data.DataServices
 {
     using System;
     using System.Data;
     using System.Linq;
     using Dapper;
 
-    public interface IConfigService
+    public interface IConfigDataService
     {
         string? GetConfigValue(string key);
         bool GetCentreBetaTesting(int centreId);
         string GetConfigValueMissingExceptionMessage(string missingConfigValue);
     }
 
-    public class ConfigService : IConfigService
+    public class ConfigDataService : IConfigDataService
     {
         public const string MailServer = "MailServer";
         public const string MailFromAddress = "MailFromAddress";
@@ -26,7 +26,7 @@ public class ConfigService : IConfigService
 
         private readonly IDbConnection connection;
 
-        public ConfigService(IDbConnection connection)
+        public ConfigDataService(IDbConnection connection)
         {
             this.connection = connection;
         }
diff --git a/DigitalLearningSolutions.Data/Helpers/ConfigHelper.cs b/DigitalLearningSolutions.Data/Extensions/ConfigurationExtensions.cs
similarity index 77%
rename from DigitalLearningSolutions.Data/Helpers/ConfigHelper.cs
rename to DigitalLearningSolutions.Data/Extensions/ConfigurationExtensions.cs
index f37d28f3ef..5e7da95043 100644
--- a/DigitalLearningSolutions.Data/Helpers/ConfigHelper.cs
+++ b/DigitalLearningSolutions.Data/Extensions/ConfigurationExtensions.cs
@@ -1,22 +1,24 @@
-namespace DigitalLearningSolutions.Data.Helpers
+namespace DigitalLearningSolutions.Data.Extensions
 {
     using Microsoft.Extensions.Configuration;
 
-    public static class ConfigHelper
+    public static class ConfigurationExtensions
     {
-        public const string AppRootPathName = "AppRootPath";
-        public const string CurrentSystemBaseUrlName = "CurrentSystemBaseUrl";
+        public const string UseSignposting = "FeatureManagement:UseSignposting";
+
+        private const string AppRootPathName = "AppRootPath";
+        private const string CurrentSystemBaseUrlName = "CurrentSystemBaseUrl";
         private const string LearningHubOpenApiKey = "LearningHubOpenAPIKey";
         private const string LearningHubOpenApiBaseUrl = "LearningHubOpenAPIBaseUrl";
-        public const string UseSignposting = "FeatureManagement:UseSignposting";
         private const string PricingPageEnabled = "FeatureManagement:PricingPage";
 
-        public const string LearningHubAuthBaseUrl = "BaseUrl";
-        public const string LearningHubAuthLoginEndpoint = "LoginEndpoint";
-        public const string LearningHubAuthLinkingEndpoint = "LinkingEndpoint";
-        public const string LearningHubAuthClientCode = "ClientCode";
+        private const string LearningHubAuthBaseUrl = "BaseUrl";
+        private const string LearningHubAuthLoginEndpoint = "LoginEndpoint";
+        private const string LearningHubAuthLinkingEndpoint = "LinkingEndpoint";
+        private const string LearningHubAuthClientCode = "ClientCode";
 
-        public const string LearningHubSsoSectionKey = "LearningHubSSO";
+        private const string MapsApiKey = "MapsAPIKey";
+        private const string LearningHubSsoSectionKey = "LearningHubSSO";
         private const string LearningHubSsoToleranceKey = "ToleranceInSeconds";
         private const string LearningHubSsoIterationsKey = "HashIterations";
         private const string LearningHubSsoByteLengthKey = "ByteLength";
@@ -91,5 +93,10 @@ public static string GetLearningHubSsoSecretKey(this IConfiguration config)
         {
             return config[$"{LearningHubSsoSectionKey}:{LearningHubSsoSecretKey}"];
         }
+
+        public static string GetMapsApiKey(this IConfiguration config)
+        {
+            return config[MapsApiKey];
+        }
     }
 }
diff --git a/DigitalLearningSolutions.Data/Services/ActionPlanService.cs b/DigitalLearningSolutions.Data/Services/ActionPlanService.cs
index 881392b03c..43092a1872 100644
--- a/DigitalLearningSolutions.Data/Services/ActionPlanService.cs
+++ b/DigitalLearningSolutions.Data/Services/ActionPlanService.cs
@@ -8,7 +8,7 @@
     using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.DataServices.SelfAssessmentDataService;
     using DigitalLearningSolutions.Data.Exceptions;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Models.LearningResources;
     using Microsoft.Extensions.Configuration;
 
diff --git a/DigitalLearningSolutions.Data/Services/DelegateUploadFileService.cs b/DigitalLearningSolutions.Data/Services/DelegateUploadFileService.cs
index 055fb59346..632c7b0c43 100644
--- a/DigitalLearningSolutions.Data/Services/DelegateUploadFileService.cs
+++ b/DigitalLearningSolutions.Data/Services/DelegateUploadFileService.cs
@@ -11,7 +11,7 @@ namespace DigitalLearningSolutions.Data.Services
     using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.DataServices.UserDataService;
     using DigitalLearningSolutions.Data.Exceptions;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Models.DelegateUpload;
     using DigitalLearningSolutions.Data.Models.Register;
     using DigitalLearningSolutions.Data.Models.User;
diff --git a/DigitalLearningSolutions.Data/Services/EmailService.cs b/DigitalLearningSolutions.Data/Services/EmailService.cs
index a9cd34ea45..e7ec3d6751 100644
--- a/DigitalLearningSolutions.Data/Services/EmailService.cs
+++ b/DigitalLearningSolutions.Data/Services/EmailService.cs
@@ -21,20 +21,20 @@ public interface IEmailService
 
     public class EmailService : IEmailService
     {
-        private readonly IConfigService configService;
+        private readonly IConfigDataService configDataService;
         private readonly IEmailDataService emailDataService;
         private readonly ILogger logger;
         private readonly ISmtpClientFactory smtpClientFactory;
 
         public EmailService(
             IEmailDataService emailDataService,
-            IConfigService configService,
+            IConfigDataService configDataService,
             ISmtpClientFactory smtpClientFactory,
             ILogger logger
         )
         {
             this.emailDataService = emailDataService;
-            this.configService = configService;
+            this.configDataService = configDataService;
             this.smtpClientFactory = smtpClientFactory;
             this.logger = logger;
         }
@@ -100,30 +100,30 @@ ISmtpClient client
         private (string MailServerUsername, string MailServerPassword, string MailServerAddress, int MailServerPort,
             string MailSenderAddress) GetMailConfig()
         {
-            var mailServerUsername = configService.GetConfigValue(ConfigService.MailUsername)
+            var mailServerUsername = configDataService.GetConfigValue(ConfigDataService.MailUsername)
                                      ?? throw new ConfigValueMissingException
                                      (
-                                         configService.GetConfigValueMissingExceptionMessage("MailServerUsername")
+                                         configDataService.GetConfigValueMissingExceptionMessage("MailServerUsername")
                                      );
-            var mailServerPassword = configService.GetConfigValue(ConfigService.MailPassword)
+            var mailServerPassword = configDataService.GetConfigValue(ConfigDataService.MailPassword)
                                      ?? throw new ConfigValueMissingException
                                      (
-                                         configService.GetConfigValueMissingExceptionMessage("MailServerPassword")
+                                         configDataService.GetConfigValueMissingExceptionMessage("MailServerPassword")
                                      );
-            var mailServerAddress = configService.GetConfigValue(ConfigService.MailServer)
+            var mailServerAddress = configDataService.GetConfigValue(ConfigDataService.MailServer)
                                     ?? throw new ConfigValueMissingException
                                     (
-                                        configService.GetConfigValueMissingExceptionMessage("MailServerAddress")
+                                        configDataService.GetConfigValueMissingExceptionMessage("MailServerAddress")
                                     );
-            var mailServerPortString = configService.GetConfigValue(ConfigService.MailPort)
+            var mailServerPortString = configDataService.GetConfigValue(ConfigDataService.MailPort)
                                        ?? throw new ConfigValueMissingException
                                        (
-                                           configService.GetConfigValueMissingExceptionMessage("MailServerPortString")
+                                           configDataService.GetConfigValueMissingExceptionMessage("MailServerPortString")
                                        );
-            var mailSenderAddress = configService.GetConfigValue(ConfigService.MailFromAddress)
+            var mailSenderAddress = configDataService.GetConfigValue(ConfigDataService.MailFromAddress)
                                     ?? throw new ConfigValueMissingException
                                     (
-                                        configService.GetConfigValueMissingExceptionMessage("MailFromAddress")
+                                        configDataService.GetConfigValueMissingExceptionMessage("MailFromAddress")
                                     );
 
             var mailServerPort = int.Parse(mailServerPortString);
@@ -158,15 +158,15 @@ private MimeMessage CreateMessage(Email email, string mailSenderAddress)
 
         private MultipartAlternative GetMultipartAlternativeFromBody(BodyBuilder body)
         {
-            //Sets body content encooding to quoated-printable to avoid rejection by NHS email servers
+            //Sets body content encoding to quoted-printable to avoid rejection by NHS email servers
             var htmlPart = new TextPart(TextFormat.Html)
             {
-                ContentTransferEncoding = ContentEncoding.QuotedPrintable
+                ContentTransferEncoding = ContentEncoding.QuotedPrintable,
             };
             htmlPart.SetText(Encoding.UTF8, body.HtmlBody);
             var textPart = new TextPart(TextFormat.Plain)
             {
-                ContentTransferEncoding = ContentEncoding.QuotedPrintable
+                ContentTransferEncoding = ContentEncoding.QuotedPrintable,
             };
             textPart.SetText(Encoding.UTF8, body.TextBody);
             var multipartAlternative = new MultipartAlternative
diff --git a/DigitalLearningSolutions.Data/Services/FrameworkNotificationService.cs b/DigitalLearningSolutions.Data/Services/FrameworkNotificationService.cs
index bcdebee51e..219c00fc64 100644
--- a/DigitalLearningSolutions.Data/Services/FrameworkNotificationService.cs
+++ b/DigitalLearningSolutions.Data/Services/FrameworkNotificationService.cs
@@ -1,405 +1,405 @@
-namespace DigitalLearningSolutions.Data.Services
-{
-    using System;
-    using DigitalLearningSolutions.Data.Models;
-    using DigitalLearningSolutions.Data.Models.Email;
-    using MimeKit;
-    using System.Collections.Generic;
-    using System.Linq;
-    using DigitalLearningSolutions.Data.DataServices.SelfAssessmentDataService;
-
-    public interface IFrameworkNotificationService
-    {
-        void SendFrameworkCollaboratorInvite(int id, int invitedByAdminId);
-        void SendCommentNotifications(int adminId, int frameworkId, int commentId, string comment, int? replyToCommentId, string? parentComment);
-        void SendReviewRequest(int id, int invitedByAdminId, bool required, bool reminder);
-        void SendReviewOutcomeNotification(int reviewId);
-        void SendSupervisorDelegateInvite(int supervisorDelegateId, int adminId);
-        void SendSupervisorDelegateAcceptance(int supervisorDelegateId, int delegateId);
-        void SendSupervisorDelegateRejected(int supervisorDelegateId, int delegateIId);
-        void SendSupervisorDelegateConfirmed(int superviseDelegateId, int adminId, int delegateId);
-        void SendSupervisorResultReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int resultId);
-        void SendSupervisorEnroledDelegate(int adminId, int supervisorDelegateId, int candidateAssessmentId, DateTime? completeByDate);
-        void SendReminderDelegateSelfAssessment(int adminId, int supervisorDelegateId, int candidateAssessmentId);
-        void SendSupervisorMultipleResultsReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int countResults);
-        void SendDelegateSupervisorNominated(int supervisorDelegateId, int selfAssessmentID, int delegateId);
-        void SendResultVerificationRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int resultCount, int delegateId);
-        void SendSignOffRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int delegateId);
-        void SendProfileAssessmentSignedOff(int supervisorDelegateId, int candidateAssessmentId, string? supervisorComments, bool signedOff, int adminId);
-    }
-    public class FrameworkNotificationService : IFrameworkNotificationService
-    {
-        private readonly IConfigService configService;
-        private readonly IEmailService emailService;
-        private readonly IFrameworkService frameworkService;
-        private readonly IRoleProfileService roleProfileService;
-        private readonly ISupervisorService supervisorService;
-        private readonly ISelfAssessmentDataService selfAssessmentDataService;
-        public FrameworkNotificationService(
-           IFrameworkService frameworkService,
-           IConfigService configService,
-           IEmailService emailService,
-           IRoleProfileService roleProfileService,
-           ISupervisorService supervisorService,
-           ISelfAssessmentDataService selfAssessmentDataService
-       )
-        {
-            this.frameworkService = frameworkService;
-            this.configService = configService;
-            this.emailService = emailService;
-            this.roleProfileService = roleProfileService;
-            this.supervisorService = supervisorService;
-            this.selfAssessmentDataService = selfAssessmentDataService;
-        }
-
-        public void SendCommentNotifications(int adminId, int frameworkId, int commentId, string comment, int? replyToCommentId, string? parentComment)
-        {
-            var recipients = frameworkService.GetCommentRecipients(frameworkId, adminId, replyToCommentId);
-            if (recipients.Count > 1)
-            {
-                var baseFramework = frameworkService.GetBaseFrameworkByFrameworkId(frameworkId, adminId);
-                var sender = recipients.First();
-                recipients.RemoveAt(0);
-                string emailSubject = "";
-                var commentUrl = GetFrameworkUrl(frameworkId, "Comments");
-                commentUrl += $"{(replyToCommentId == null ? commentId : replyToCommentId)}";
-                foreach (var recipient in recipients)
-                {
-
-                    if (recipient.Owner)
-                    {
-                        if (replyToCommentId == null)
-                        {
-                            emailSubject = $"New comment submitted against your framework: {baseFramework.FrameworkName}  - Digital Learning Solutions";
-                        }
-                        else
-                        {
-                            emailSubject = $"Comment thread response submitted against your framework: {baseFramework.FrameworkName}  - Digital Learning Solutions";
-                        }
-                    }
-                    else
-                    {
-                        emailSubject = "Response submitted to a framework comment thread you are involved in";
-                    }
-                    var builder = new BodyBuilder
-                    {
-                        TextBody = $@"Dear {recipient.FirstName},
-                                    A comment has been submitted  against the framework, {baseFramework.FrameworkName} by {sender.FirstName} {sender.LastName} ({sender.Email}){(parentComment != null ? " in response to the thread " + parentComment : "")}.
-                                    The comment reads: {comment}
-                                    To view or reply to the comment in the framework system, visit this url: {commentUrl}. You will need to login to DLS to view the framework.",
-                        HtmlBody = $@"Dear {recipient.FirstName},
A comment has been submitted  against the framework, {baseFramework.FrameworkName}, by {sender.FirstName} {sender.LastName}{(parentComment != null ? " in response to the thread " + parentComment + "" : ".")}
The comment reads: {comment}
Click here to view or reply to the comment in the framework system. You will need to login to DLS to view the framework.
"
-                    };
-                    emailService.SendEmail(new Email(emailSubject, builder, recipient.Email));
-                }
-            }
-        }
-        public void SendFrameworkCollaboratorInvite(int id, int invitedByAdminId)
-        {
-            var collaboratorNotification = frameworkService.GetCollaboratorNotification(id, invitedByAdminId);
-            if (collaboratorNotification == null)
-            {
-                throw new NotificationDataException($"No record found when trying to fetch collaboratorNotification Data. id: {id}, invitedByAdminId: {invitedByAdminId})");
-            }
-            var frameworkUrl = GetFrameworkUrl(collaboratorNotification.FrameworkID, "Structure");
-            string emailSubjectLine = $"Framework {collaboratorNotification?.FrameworkRole} Invitation - Digital Learning Solutions";
-            var builder = new BodyBuilder
-            {
-                TextBody = $@"Dear colleague,
-                              You have been identified as a {collaboratorNotification?.FrameworkRole} for the framework, {collaboratorNotification?.FrameworkName}, by {collaboratorNotification?.InvitedByName} ({collaboratorNotification?.InvitedByEmail}).
-                              To access the framework, visit this url: {frameworkUrl}. You will need to be registered on the Digital Learning Solutions platform to view the framework.",
-                HtmlBody = $@"Dear colleague,
You have been identified as a {collaboratorNotification?.FrameworkRole} for the  framework, {collaboratorNotification?.FrameworkName}, by {collaboratorNotification?.InvitedByName}.
Click here to access the framework. You will need to be registered on the Digital Learning Solutions platform to view the framework.
"
-            };
-            emailService.SendEmail(new Email(emailSubjectLine, builder, collaboratorNotification.UserEmail, collaboratorNotification.InvitedByEmail));
-        }
-
-        public void SendReviewRequest(int id, int invitedByAdminId, bool required, bool reminder)
-        {
-            var collaboratorNotification = frameworkService.GetCollaboratorNotification(id, invitedByAdminId);
-            if (collaboratorNotification == null)
-            {
-                throw new NotificationDataException($"No record found when trying to fetch collaboratorNotification Data. id: {id}, invitedByAdminId: {invitedByAdminId}");
-            }
-            var frameworkUrl = GetFrameworkUrl(collaboratorNotification.FrameworkID, "Structure");
-            string emailSubjectLine = (reminder ? " REMINDER: " : "") + "Framework Review Request - Digital Learning Solutions";
-            string signOffRequired = required ? "You are required to sign-off this framework before it can be published." : "You are not required to sign-off this framework before it is published.";
-            var builder = new BodyBuilder
-            {
-                TextBody = $@"Dear colleague,
-                              You have been requested to review the framework, {collaboratorNotification?.FrameworkName}, by {collaboratorNotification?.InvitedByName} ({collaboratorNotification?.InvitedByEmail}).
-                              To review the framework, visit this url: {frameworkUrl}. Click the Review Framework button to submit your review and, if appropriate, sign-off the framework. {signOffRequired}. You will need to be registered on the Digital Learning Solutions platform to review the framework.",
-                HtmlBody = $@"Dear colleague,
You have been requested to review the framework, {collaboratorNotification?.FrameworkName}, by {collaboratorNotification?.InvitedByName}.
Click here to review the framework. Click the Review Framework button to submit your review and, if appropriate, sign-off the framework.
{signOffRequired}
You will need to be registered on the Digital Learning Solutions platform to view the framework.
"
-            };
-            emailService.SendEmail(new Email(emailSubjectLine, builder, collaboratorNotification.UserEmail, collaboratorNotification.InvitedByEmail));
-        }
-        public string GetFrameworkUrl(int frameworkId, string tab)
-        {
-            var frameworkUrl = GetDLSUriBuilder();
-            frameworkUrl.Path += $"Framework/{frameworkId}/{tab}/";
-            return frameworkUrl.Uri.ToString();
-        }
-        public string GetCurrentActivitiesUrl()
-        {
-            var dlsUrlBuilder = GetDLSUriBuilder();
-            dlsUrlBuilder.Path += "LearningPortal/Current";
-            return dlsUrlBuilder.Uri.ToString();
-        }
-        public string GetSelfAssessmentUrl(int selfAssessmentId)
-        {
-            var dlsUrlBuilder = GetDLSUriBuilder();
-            dlsUrlBuilder.Path += $"LearningPortal/SelfAssessment/{selfAssessmentId}/Overview";
-            return dlsUrlBuilder.Uri.ToString();
-        }
-        public string GetSupervisorReviewUrl()
-        {
-            return "";
-        }
-        public UriBuilder GetDLSUriBuilder()
-        {
-            var trackingSystemBaseUrl = configService.GetConfigValue(ConfigService.AppBaseUrl) ??
-                                       throw new ConfigValueMissingException(configService.GetConfigValueMissingExceptionMessage("AppBaseUrl"));
-            ;
-            return new UriBuilder(trackingSystemBaseUrl);
-        }
-        public void SendReviewOutcomeNotification(int reviewId)
-        {
-            var outcomeNotification = frameworkService.GetFrameworkReviewNotification(reviewId);
-            if (outcomeNotification == null)
-            {
-                throw new NotificationDataException($"No record found when trying to fetch review outcome Data. reviewId: {reviewId}");
-            }
-            var frameworkUrl = GetFrameworkUrl(outcomeNotification.FrameworkID, "Publish");
-            string emailSubjectLine = $"Framework Review Outcome - {(outcomeNotification.SignedOff ? "Approved" : "Rejected")} - Digital Learning Solutions";
-            string approvalStatus = outcomeNotification?.ReviewerFirstName + (outcomeNotification.SignedOff ? " approved the framework for publishing." : " did not approve the framework for publishing.");
-            string commentsText = outcomeNotification?.ReviewerFirstName + (outcomeNotification.Comment != null ? " left the following review comment: " + outcomeNotification.Comment : " did not leave a review comment.");
-            string commentsHtml = "" + outcomeNotification?.ReviewerFirstName + (outcomeNotification.Comment != null ? " left the following review comment:
" + outcomeNotification.Comment + "
" : " did not leave a review comment.
");
-            var builder = new BodyBuilder
-            {
-                TextBody = $@"Dear {outcomeNotification.OwnerFirstName},
-                              Your framework, {outcomeNotification?.FrameworkName}, has been reviewed by {outcomeNotification?.ReviewerFirstName + " " + outcomeNotification?.ReviewerLastName} ({outcomeNotification?.UserEmail}).
-                              {approvalStatus}
-                              {commentsText}
-                              The full framework review status, can be viewed by visiting: {frameworkUrl}. Once all of the required reviewers have approved the framework, you may publish it. You will need to login to the Digital Learning Solutions platform to access the framework.",
-                HtmlBody = $@"Dear {outcomeNotification.OwnerFirstName},
Your framework, {outcomeNotification?.FrameworkName}, has been reviewed by {outcomeNotification?.ReviewerFirstName + " " + outcomeNotification.ReviewerLastName}.
{approvalStatus}
{commentsHtml}Click here to view the full review status for the framework. Once all of the required reviewers have approved the framework, you may publish it.
You will need to login to the Digital Learning Solutions platform to access the framework.
"
-            };
-            emailService.SendEmail(new Email(emailSubjectLine, builder, outcomeNotification.OwnerEmail, outcomeNotification.UserEmail));
-        }
-        public void SendSupervisorDelegateInvite(int supervisorDelegateId, int adminId)
-        {
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
-            string emailSubjectLine = "Invite from Supervisor - Digital Learning Solutions";
-            var builder = new BodyBuilder();
-            var dlsUrlBuilder = GetDLSUriBuilder();
-            if (supervisorDelegate.CandidateID == null)
-            {
-                dlsUrlBuilder.Path += "Register";
-                dlsUrlBuilder.Query = $"centreid={supervisorDelegate.CentreId}&inviteid={supervisorDelegate.InviteHash}";
-                builder.TextBody = $@"Dear colleague,
-                              You have been invited to register to access the NHS Health Education England, Digital Learning Solutions platform as a supervised delegate by {supervisorDelegate.SupervisorName} ({supervisorDelegate.SupervisorEmail}).
-                              To register, visit {dlsUrlBuilder.Uri.ToString()}.
-                              Registering using this link will confirm your acceptance of the invite. Your supervisor will then be able to assign role profile assessments and view and validate your self assessment results.";
-                builder.HtmlBody = $@"Dear colleague,
You have been invited to register to access the NHS Health Education England, Digital Learning Solutions platform as a supervised delegate by {supervisorDelegate.SupervisorName}.
Click here to register and confirm your acceptance of the invite.
Your supervisor will then be able to assign role profile assessments and view and validate your self assessment results.
";
-            }
-            else
-            {
-                dlsUrlBuilder.Path += $"LearningPortal/ConfirmSupervisor/{supervisorDelegateId}";
-                builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
-                              You have been identified as a supervised delegate by {supervisorDelegate.SupervisorName} ({supervisorDelegate.SupervisorEmail}) in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
-                              You are already registered as a delegate at the supervisor's DLS centre. To respond to their invite, please visit {dlsUrlBuilder.Uri.ToString()} (you may need to sign in using your existing DLS credentials).
-                              Once you have accepted the invite, your supervisor will be able to assign role profile assessments and view and validate your self assessment results.";
-                builder.HtmlBody = $@"Dear  {supervisorDelegate.FirstName},
You have been identified as a supervised delegate by {supervisorDelegate.SupervisorName} in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
You are already registered as a delegate at the supervisor's DLS centre. Click here to respond to their invite (you may need to sign in using your existing DLS credentials).
Once you have accepted the invite, your supervisor will be able to assign role profile assessments and view and validate your self assessment results.
";
-            }
-            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
-        }
-
-        public void SendSupervisorDelegateAcceptance(int supervisorDelegateId, int delegateId)
-        {
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
-            var builder = new BodyBuilder();
-            var dlsUrlBuilder = GetDLSUriBuilder();
-            string emailSubjectLine = "Accepted Supervisor Invitation - Digital Learning Solutions";
-            dlsUrlBuilder.Path += $"Supervisor/Staff/List";
-            builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
-                              {supervisorDelegate.FirstName} {supervisorDelegate.LastName} has accepted your invitation to become a member of your team in the NHS Health Education England, Digital Learning Solutions platform.
-You are now confirmed as a supervisor for this delegate.
-To manage their role profile assessments, please visit {dlsUrlBuilder.Uri.ToString()}.";
-            builder.HtmlBody = $@"Dear {supervisorDelegate.SupervisorName}
{supervisorDelegate.FirstName} {supervisorDelegate.LastName} has accepted your invitation to become a member of your team in the NHS Health Education England, Digital Learning Solutions platform.
You are now confirmed as a supervisor for this delegate.
Click here to manage their role profile assessments.
";
-            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.SupervisorEmail));
-        }
-
-        public void SendSupervisorDelegateRejected(int supervisorDelegateId, int delegateId)
-        {
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
-            string emailSubjectLine = "REJECTED Supervisor Invitation - Digital Learning Solutions";
-            var builder = new BodyBuilder();
-            var dlsUrlBuilder = GetDLSUriBuilder();
-            dlsUrlBuilder.Path += $"Supervisor/Staff/List";
-            builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
-                              {supervisorDelegate.FirstName} {supervisorDelegate.LastName} has rejected your invitation to become a member of your team in the NHS Health Education England, Digital Learning Solutions platform.
-This delegate has been removed from your supervisor team.
-To manage your team, please visit {dlsUrlBuilder.Uri.ToString()}.";
-            builder.HtmlBody = $@"Dear {supervisorDelegate.SupervisorName}
{supervisorDelegate.FirstName} {supervisorDelegate.LastName} has rejected your invitation to become a member of your team in the NHS Health Education England, Digital Learning Solutions platform.
This delegate has been removed from your supervisor team.
Click here to manage your team.
";
-            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.SupervisorEmail));
-        }
-
-        public void SendSupervisorDelegateConfirmed(int supervisorDelegateId, int adminId, int delegateId)
-        {
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, delegateId);
-            string emailSubjectLine = "Supervisor Confirmed - Digital Learning Solutions";
-            var builder = new BodyBuilder();
-            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
-                               {supervisorDelegate.SupervisorName} has accepted your request to be your supervisor for profile asessment activities in the NHS Health Education England, Digital Learning Solutions platform.
-To access your role profile assessments, please visit {GetCurrentActivitiesUrl()}.";
-            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
{supervisorDelegate.SupervisorName} has accepted your request to be your supervisor for profile asessment activities in the NHS Health Education England, Digital Learning Solutions platform.
Click here to access your role profile assessments.
";
-            string toEmail = (@adminId == 0 ? supervisorDelegate.DelegateEmail : supervisorDelegate.SupervisorEmail);
-            emailService.SendEmail(new Email(emailSubjectLine, builder, toEmail));
-        }
-
-        public void SendSupervisorResultReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int resultId)
-        {
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
-            var competency = selfAssessmentDataService.GetCompetencyByCandidateAssessmentResultId(resultId, candidateAssessmentId, adminId);
-            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(candidateAssessmentId, supervisorDelegateId);
-            var selfAssessmentUrl = GetSelfAssessmentUrl(delegateSelfAssessment.SelfAssessmentID);
-            var commentString = supervisorDelegate.SupervisorName + ((bool)competency.AssessmentQuestions.First().SignedOff ? " confirmed your self assessment " : " did not confirm your self assessment ") + (competency.AssessmentQuestions.First().SupervisorComments != null ? "and left the following review comment: " + competency.AssessmentQuestions.First().SupervisorComments : "but did not leave a review comment.");
-            string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Reviewed {competency.Vocabulary} - Digital Learning Solutions";
-            var builder = new BodyBuilder();
-            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
-                               {supervisorDelegate.SupervisorName} has reviewed your self assessment against the {competency.Vocabulary} '{competency.Name}' ({competency.CompetencyGroup}) in the NHS Health Education England, Digital Learning Solutions platform.
-                               {commentString}
-                               To access your {delegateSelfAssessment.RoleName} profile assessment, please visit {selfAssessmentUrl}.";
-            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
{supervisorDelegate.SupervisorName}  has reviewed your self assessment against the {competency.Vocabulary} '{competency.Name}' ({competency.CompetencyGroup}) in the NHS Health Education England, Digital Learning Solutions platform.
{commentString}
Click here to access your  {delegateSelfAssessment.RoleName} profile assessment.
";
-            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
-        }
-
-        public void SendSupervisorEnroledDelegate(int adminId, int supervisorDelegateId, int candidateAssessmentId, DateTime? completeByDate)
-        {
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
-            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(candidateAssessmentId, supervisorDelegateId);
-            var selfAssessmentUrl = GetSelfAssessmentUrl(delegateSelfAssessment.SelfAssessmentID);
-            var completeByString = completeByDate == null ? $"Your {delegateSelfAssessment.SupervisorRoleTitle} did not specify a date by which the self assessment should be completed." : $"Your {delegateSelfAssessment.SupervisorRoleTitle} indicated that this self assessment should be completed by {completeByDate.Value.ToShortDateString()}.";
-            var supervisorReviewString = delegateSelfAssessment.SupervisorResultsReview | delegateSelfAssessment.SupervisorSelfAssessmentReview ? $"You will be able to request review for your self assessments against this profile from your {delegateSelfAssessment.SupervisorRoleTitle}." : "";
-            string emailSubjectLine = $"You have been enrolled on the profile assessment {delegateSelfAssessment.RoleName} by {supervisorDelegate.SupervisorName} - Digital Learning Solutions";
-            var builder = new BodyBuilder();
-            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
-                               {supervisorDelegate.SupervisorName} has enrolled you on the profile assessment '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions platform.
-                               {supervisorDelegate.SupervisorName} has identified themselves as your {delegateSelfAssessment.SupervisorRoleTitle} for this activity.
-                               {completeByString}
-                               {supervisorReviewString}
-                               To access your {delegateSelfAssessment.RoleName} profile assessment, please visit {selfAssessmentUrl}.";
-            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
{supervisorDelegate.SupervisorName} has enrolled you on the profile assessment '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions platform.
{(completeByString.Length > 0 ? $"{completeByString}
" : "")}{(supervisorReviewString.Length > 0 ? $"{supervisorReviewString}
" : "")}Click here to access your  {delegateSelfAssessment.RoleName} profile assessment.
";
-            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
-        }
-
-        public void SendReminderDelegateSelfAssessment(int adminId, int supervisorDelegateId, int candidateAssessmentId)
-        {
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
-            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(candidateAssessmentId, supervisorDelegateId);
-            var selfAssessmentUrl = GetSelfAssessmentUrl(delegateSelfAssessment.SelfAssessmentID);
-            string emailSubjectLine = $"Reminder to complete the profile assessment {delegateSelfAssessment.RoleName} - Digital Learning Solutions";
-            var builder = new BodyBuilder();
-            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
-                               This is a reminder sent by your {delegateSelfAssessment.RoleName}, {supervisorDelegate.SupervisorName}, to complete the profile assessment '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions platform.
-                               To access your {delegateSelfAssessment.RoleName} profile assessment, please visit {selfAssessmentUrl}.";
-            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
This is a reminder sent by your {delegateSelfAssessment.RoleName}, {supervisorDelegate.SupervisorName}, to complete the profile assessment '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions platform.
Click here to access your  {delegateSelfAssessment.RoleName} profile assessment.
";
-            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
-        }
-
-        public void SendSupervisorMultipleResultsReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int countResults)
-        {
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
-            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(candidateAssessmentId, supervisorDelegateId);
-            var selfAssessmentUrl = GetSelfAssessmentUrl(delegateSelfAssessment.SelfAssessmentID);
-            string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Confirmed {countResults} Results - Digital Learning Solutions";
-            var builder = new BodyBuilder();
-            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
-                               {supervisorDelegate.SupervisorName} has confirmed {countResults} of your self assessment results against the {delegateSelfAssessment.RoleName} profile assessment in the NHS Health Education England, Digital Learning Solutions platform.
-                               To access your {delegateSelfAssessment.RoleName} profile assessment, please visit {selfAssessmentUrl}.";
-            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
 {supervisorDelegate.SupervisorName} has confirmed {countResults} of your self assessment results against the {delegateSelfAssessment.RoleName} profile assessment in the NHS Health Education England, Digital Learning Solutions platform.
Click here to access your  {delegateSelfAssessment.RoleName} profile assessment.
";
-            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
-        }
-
-        public void SendDelegateSupervisorNominated(int supervisorDelegateId, int selfAssessmentID, int delegateId)
-        {
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
-            if (supervisorDelegate == null)
-            {
-                return;
-            }
-            if (supervisorDelegate.CandidateID == null)
-            {
-                return;
-            }
-            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateSelfAssessmentId(selfAssessmentID, (int)supervisorDelegate.ID);
-            string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Role Request - Digital Learning Solutions";
-            var builder = new BodyBuilder();
-            if (supervisorDelegate.SupervisorAdminID == null)
-            {
-                return;
-            }
-
-            var profileReviewUrl = GetSupervisorProfileReviewUrl(supervisorDelegateId, delegateSelfAssessment.ID);
-            builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
-                              You have been identified by {supervisorDelegate.FirstName} {supervisorDelegate.LastName} ({supervisorDelegate.DelegateEmail}) as their {delegateSelfAssessment.SupervisorRoleTitle} for the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
-                              To supervise this activity, please visit {profileReviewUrl} (sign in using your existing DLS credentials).";
-            builder.HtmlBody = $@"Dear {supervisorDelegate.SupervisorName},
You have been identified by {supervisorDelegate.FirstName} {supervisorDelegate.LastName} as their {delegateSelfAssessment.SupervisorRoleTitle} for the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
You are already registered as a delegate at the supervisor's DLS centre. Click here to supervise this activity (sign in using your existing DLS credentials).
";
-            supervisorService.UpdateNotificationSent(supervisorDelegateId);
-            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.SupervisorEmail));
-        }
-        protected string GetSupervisorProfileReviewUrl(int supervisorDelegateId, int delegateSelfAssessmentId)
-        {
-            var dlsUrlBuilder = GetDLSUriBuilder();
-            dlsUrlBuilder.Path += $"Supervisor/Staff/{supervisorDelegateId}/ProfileAssessment/{delegateSelfAssessmentId}/Review";
-            return dlsUrlBuilder.Uri.ToString();
-        }
-
-        public void SendResultVerificationRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int resultCount, int delegateId)
-        {
-            var candidateAssessmentSupervisor = supervisorService.GetCandidateAssessmentSupervisorById(candidateAssessmentSupervisorId);
-            int supervisorDelegateId = candidateAssessmentSupervisor.SupervisorDelegateId;
-            int candidateAssessmentId = candidateAssessmentSupervisor.CandidateAssessmentID;
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
-            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentSupervisor.CandidateAssessmentID);
-            string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Self Assessment Results Review Request - Digital Learning Solutions";
-            string? profileReviewUrl = GetSupervisorProfileReviewUrl(supervisorDelegateId, candidateAssessmentId);
-            BodyBuilder? builder = new BodyBuilder();
-            builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
-                              {supervisorDelegate.FirstName} {supervisorDelegate.LastName} ({supervisorDelegate.DelegateEmail}) has requested that you review {resultCount.ToString()} of their self assessment results for the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
-                              To review these results, please visit {profileReviewUrl} (sign in using your existing DLS credentials).";
-            builder.HtmlBody = $@"Dear {supervisorDelegate.SupervisorName},
{supervisorDelegate.FirstName} {supervisorDelegate.LastName} has requested that you review {resultCount} of their self assessment results for the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
Click here to review these results (sign in using your existing DLS credentials).
";
-            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.SupervisorEmail));
-        }
-
-        public void SendSignOffRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int delegateId)
-        {
-            var candidateAssessmentSupervisor = supervisorService.GetCandidateAssessmentSupervisorById(candidateAssessmentSupervisorId);
-            int supervisorDelegateId = candidateAssessmentSupervisor.SupervisorDelegateId;
-            int candidateAssessmentId = candidateAssessmentSupervisor.CandidateAssessmentID;
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
-            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentSupervisor.CandidateAssessmentID);
-            string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Self Assessment Sign-off Request - Digital Learning Solutions";
-            string? profileReviewUrl = GetSupervisorProfileReviewUrl(supervisorDelegateId, candidateAssessmentId);
-            BodyBuilder? builder = new BodyBuilder();
-            builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
-                              {supervisorDelegate.FirstName} {supervisorDelegate.LastName} ({supervisorDelegate.DelegateEmail}) has requested that you sign-off of their self assessment the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
-                              To review and sign-off the self-assessment, please visit {profileReviewUrl} (sign in using your existing DLS credentials).";
-            builder.HtmlBody = $@"Dear {supervisorDelegate.SupervisorName},
{supervisorDelegate.FirstName} {supervisorDelegate.LastName} has requested that you sign-off of their self assessment the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
Click here to review and sign-off the self-assessment (sign in using your existing DLS credentials).
";
-            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.SupervisorEmail));
-        }
-
-        public void SendProfileAssessmentSignedOff(int supervisorDelegateId, int candidateAssessmentId, string? supervisorComments, bool signedOff, int adminId)
-        {
-            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
-            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(candidateAssessmentId, supervisorDelegateId);
-            var selfAssessmentUrl = GetSelfAssessmentUrl(delegateSelfAssessment.SelfAssessmentID);
-            var commentString = supervisorDelegate.SupervisorName + (signedOff ? " signed off your profile assessment " : " rejected your profile assessment ") + (supervisorComments != null ? "and left the following review comment: " + supervisorComments : "but did not leave a review comment.");
-            string emailSubjectLine = $"Profile assessment {(signedOff ? " signed off " : "rejected")} by {delegateSelfAssessment.SupervisorRoleTitle} - Digital Learning Solutions";
-            var builder = new BodyBuilder();
-            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
-                               {supervisorDelegate.SupervisorName} has reviewed your profile assessment {delegateSelfAssessment.RoleName} in the NHS Health Education England, Digital Learning Solutions platform.
-                               {commentString}
-                               To access your {delegateSelfAssessment.RoleName} profile assessment, please visit {selfAssessmentUrl}.";
-            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
{supervisorDelegate.SupervisorName} has reviewed your profile assessment {delegateSelfAssessment.RoleName} in the NHS Health Education England, Digital Learning Solutions platform.
{commentString}
Click here to access your  {delegateSelfAssessment.RoleName} profile assessment.
";
-            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
-        }
-    }
-}
+namespace DigitalLearningSolutions.Data.Services
+{
+    using System;
+    using DigitalLearningSolutions.Data.Models;
+    using DigitalLearningSolutions.Data.Models.Email;
+    using MimeKit;
+    using System.Linq;
+    using DigitalLearningSolutions.Data.DataServices;
+    using DigitalLearningSolutions.Data.DataServices.SelfAssessmentDataService;
+
+    public interface IFrameworkNotificationService
+    {
+        void SendFrameworkCollaboratorInvite(int id, int invitedByAdminId);
+        void SendCommentNotifications(int adminId, int frameworkId, int commentId, string comment, int? replyToCommentId, string? parentComment);
+        void SendReviewRequest(int id, int invitedByAdminId, bool required, bool reminder);
+        void SendReviewOutcomeNotification(int reviewId);
+        void SendSupervisorDelegateInvite(int supervisorDelegateId, int adminId);
+        void SendSupervisorDelegateAcceptance(int supervisorDelegateId, int delegateId);
+        void SendSupervisorDelegateRejected(int supervisorDelegateId, int delegateIId);
+        void SendSupervisorDelegateConfirmed(int superviseDelegateId, int adminId, int delegateId);
+        void SendSupervisorResultReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int resultId);
+        void SendSupervisorEnroledDelegate(int adminId, int supervisorDelegateId, int candidateAssessmentId, DateTime? completeByDate);
+        void SendReminderDelegateSelfAssessment(int adminId, int supervisorDelegateId, int candidateAssessmentId);
+        void SendSupervisorMultipleResultsReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int countResults);
+        void SendDelegateSupervisorNominated(int supervisorDelegateId, int selfAssessmentID, int delegateId);
+        void SendResultVerificationRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int resultCount, int delegateId);
+        void SendSignOffRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int delegateId);
+        void SendProfileAssessmentSignedOff(int supervisorDelegateId, int candidateAssessmentId, string? supervisorComments, bool signedOff, int adminId);
+    }
+    public class FrameworkNotificationService : IFrameworkNotificationService
+    {
+        private readonly IConfigDataService configDataService;
+        private readonly IEmailService emailService;
+        private readonly IFrameworkService frameworkService;
+        private readonly IRoleProfileService roleProfileService;
+        private readonly ISupervisorService supervisorService;
+        private readonly ISelfAssessmentDataService selfAssessmentDataService;
+        public FrameworkNotificationService(
+           IFrameworkService frameworkService,
+           IConfigDataService configDataService,
+           IEmailService emailService,
+           IRoleProfileService roleProfileService,
+           ISupervisorService supervisorService,
+           ISelfAssessmentDataService selfAssessmentDataService
+       )
+        {
+            this.frameworkService = frameworkService;
+            this.configDataService = configDataService;
+            this.emailService = emailService;
+            this.roleProfileService = roleProfileService;
+            this.supervisorService = supervisorService;
+            this.selfAssessmentDataService = selfAssessmentDataService;
+        }
+
+        public void SendCommentNotifications(int adminId, int frameworkId, int commentId, string comment, int? replyToCommentId, string? parentComment)
+        {
+            var recipients = frameworkService.GetCommentRecipients(frameworkId, adminId, replyToCommentId);
+            if (recipients.Count > 1)
+            {
+                var baseFramework = frameworkService.GetBaseFrameworkByFrameworkId(frameworkId, adminId);
+                var sender = recipients.First();
+                recipients.RemoveAt(0);
+                string emailSubject = "";
+                var commentUrl = GetFrameworkUrl(frameworkId, "Comments");
+                commentUrl += $"{(replyToCommentId == null ? commentId : replyToCommentId)}";
+                foreach (var recipient in recipients)
+                {
+
+                    if (recipient.Owner)
+                    {
+                        if (replyToCommentId == null)
+                        {
+                            emailSubject = $"New comment submitted against your framework: {baseFramework.FrameworkName}  - Digital Learning Solutions";
+                        }
+                        else
+                        {
+                            emailSubject = $"Comment thread response submitted against your framework: {baseFramework.FrameworkName}  - Digital Learning Solutions";
+                        }
+                    }
+                    else
+                    {
+                        emailSubject = "Response submitted to a framework comment thread you are involved in";
+                    }
+                    var builder = new BodyBuilder
+                    {
+                        TextBody = $@"Dear {recipient.FirstName},
+                                    A comment has been submitted  against the framework, {baseFramework.FrameworkName} by {sender.FirstName} {sender.LastName} ({sender.Email}){(parentComment != null ? " in response to the thread " + parentComment : "")}.
+                                    The comment reads: {comment}
+                                    To view or reply to the comment in the framework system, visit this url: {commentUrl}. You will need to login to DLS to view the framework.",
+                        HtmlBody = $@"Dear {recipient.FirstName},
A comment has been submitted  against the framework, {baseFramework.FrameworkName}, by {sender.FirstName} {sender.LastName}{(parentComment != null ? " in response to the thread " + parentComment + "" : ".")}
The comment reads: {comment}
Click here to view or reply to the comment in the framework system. You will need to login to DLS to view the framework.
"
+                    };
+                    emailService.SendEmail(new Email(emailSubject, builder, recipient.Email));
+                }
+            }
+        }
+        public void SendFrameworkCollaboratorInvite(int id, int invitedByAdminId)
+        {
+            var collaboratorNotification = frameworkService.GetCollaboratorNotification(id, invitedByAdminId);
+            if (collaboratorNotification == null)
+            {
+                throw new NotificationDataException($"No record found when trying to fetch collaboratorNotification Data. id: {id}, invitedByAdminId: {invitedByAdminId})");
+            }
+            var frameworkUrl = GetFrameworkUrl(collaboratorNotification.FrameworkID, "Structure");
+            string emailSubjectLine = $"Framework {collaboratorNotification?.FrameworkRole} Invitation - Digital Learning Solutions";
+            var builder = new BodyBuilder
+            {
+                TextBody = $@"Dear colleague,
+                              You have been identified as a {collaboratorNotification?.FrameworkRole} for the framework, {collaboratorNotification?.FrameworkName}, by {collaboratorNotification?.InvitedByName} ({collaboratorNotification?.InvitedByEmail}).
+                              To access the framework, visit this url: {frameworkUrl}. You will need to be registered on the Digital Learning Solutions platform to view the framework.",
+                HtmlBody = $@"Dear colleague,
You have been identified as a {collaboratorNotification?.FrameworkRole} for the  framework, {collaboratorNotification?.FrameworkName}, by {collaboratorNotification?.InvitedByName}.
Click here to access the framework. You will need to be registered on the Digital Learning Solutions platform to view the framework.
"
+            };
+            emailService.SendEmail(new Email(emailSubjectLine, builder, collaboratorNotification.UserEmail, collaboratorNotification.InvitedByEmail));
+        }
+
+        public void SendReviewRequest(int id, int invitedByAdminId, bool required, bool reminder)
+        {
+            var collaboratorNotification = frameworkService.GetCollaboratorNotification(id, invitedByAdminId);
+            if (collaboratorNotification == null)
+            {
+                throw new NotificationDataException($"No record found when trying to fetch collaboratorNotification Data. id: {id}, invitedByAdminId: {invitedByAdminId}");
+            }
+            var frameworkUrl = GetFrameworkUrl(collaboratorNotification.FrameworkID, "Structure");
+            string emailSubjectLine = (reminder ? " REMINDER: " : "") + "Framework Review Request - Digital Learning Solutions";
+            string signOffRequired = required ? "You are required to sign-off this framework before it can be published." : "You are not required to sign-off this framework before it is published.";
+            var builder = new BodyBuilder
+            {
+                TextBody = $@"Dear colleague,
+                              You have been requested to review the framework, {collaboratorNotification?.FrameworkName}, by {collaboratorNotification?.InvitedByName} ({collaboratorNotification?.InvitedByEmail}).
+                              To review the framework, visit this url: {frameworkUrl}. Click the Review Framework button to submit your review and, if appropriate, sign-off the framework. {signOffRequired}. You will need to be registered on the Digital Learning Solutions platform to review the framework.",
+                HtmlBody = $@"Dear colleague,
You have been requested to review the framework, {collaboratorNotification?.FrameworkName}, by {collaboratorNotification?.InvitedByName}.
Click here to review the framework. Click the Review Framework button to submit your review and, if appropriate, sign-off the framework.
{signOffRequired}
You will need to be registered on the Digital Learning Solutions platform to view the framework.
"
+            };
+            emailService.SendEmail(new Email(emailSubjectLine, builder, collaboratorNotification.UserEmail, collaboratorNotification.InvitedByEmail));
+        }
+        public string GetFrameworkUrl(int frameworkId, string tab)
+        {
+            var frameworkUrl = GetDLSUriBuilder();
+            frameworkUrl.Path += $"Framework/{frameworkId}/{tab}/";
+            return frameworkUrl.Uri.ToString();
+        }
+        public string GetCurrentActivitiesUrl()
+        {
+            var dlsUrlBuilder = GetDLSUriBuilder();
+            dlsUrlBuilder.Path += "LearningPortal/Current";
+            return dlsUrlBuilder.Uri.ToString();
+        }
+        public string GetSelfAssessmentUrl(int selfAssessmentId)
+        {
+            var dlsUrlBuilder = GetDLSUriBuilder();
+            dlsUrlBuilder.Path += $"LearningPortal/SelfAssessment/{selfAssessmentId}/Overview";
+            return dlsUrlBuilder.Uri.ToString();
+        }
+        public string GetSupervisorReviewUrl()
+        {
+            return "";
+        }
+        public UriBuilder GetDLSUriBuilder()
+        {
+            var trackingSystemBaseUrl = configDataService.GetConfigValue(ConfigDataService.AppBaseUrl) ??
+                                       throw new ConfigValueMissingException(configDataService.GetConfigValueMissingExceptionMessage("AppBaseUrl"));
+            ;
+            return new UriBuilder(trackingSystemBaseUrl);
+        }
+        public void SendReviewOutcomeNotification(int reviewId)
+        {
+            var outcomeNotification = frameworkService.GetFrameworkReviewNotification(reviewId);
+            if (outcomeNotification == null)
+            {
+                throw new NotificationDataException($"No record found when trying to fetch review outcome Data. reviewId: {reviewId}");
+            }
+            var frameworkUrl = GetFrameworkUrl(outcomeNotification.FrameworkID, "Publish");
+            string emailSubjectLine = $"Framework Review Outcome - {(outcomeNotification.SignedOff ? "Approved" : "Rejected")} - Digital Learning Solutions";
+            string approvalStatus = outcomeNotification?.ReviewerFirstName + (outcomeNotification.SignedOff ? " approved the framework for publishing." : " did not approve the framework for publishing.");
+            string commentsText = outcomeNotification?.ReviewerFirstName + (outcomeNotification.Comment != null ? " left the following review comment: " + outcomeNotification.Comment : " did not leave a review comment.");
+            string commentsHtml = "" + outcomeNotification?.ReviewerFirstName + (outcomeNotification.Comment != null ? " left the following review comment:
" + outcomeNotification.Comment + "
" : " did not leave a review comment.");
+            var builder = new BodyBuilder
+            {
+                TextBody = $@"Dear {outcomeNotification.OwnerFirstName},
+                              Your framework, {outcomeNotification?.FrameworkName}, has been reviewed by {outcomeNotification?.ReviewerFirstName + " " + outcomeNotification?.ReviewerLastName} ({outcomeNotification?.UserEmail}).
+                              {approvalStatus}
+                              {commentsText}
+                              The full framework review status, can be viewed by visiting: {frameworkUrl}. Once all of the required reviewers have approved the framework, you may publish it. You will need to login to the Digital Learning Solutions platform to access the framework.",
+                HtmlBody = $@"Dear {outcomeNotification.OwnerFirstName},
Your framework, {outcomeNotification?.FrameworkName}, has been reviewed by {outcomeNotification?.ReviewerFirstName + " " + outcomeNotification.ReviewerLastName}.
{approvalStatus}
{commentsHtml}Click here to view the full review status for the framework. Once all of the required reviewers have approved the framework, you may publish it.
You will need to login to the Digital Learning Solutions platform to access the framework.
"
+            };
+            emailService.SendEmail(new Email(emailSubjectLine, builder, outcomeNotification.OwnerEmail, outcomeNotification.UserEmail));
+        }
+        public void SendSupervisorDelegateInvite(int supervisorDelegateId, int adminId)
+        {
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
+            string emailSubjectLine = "Invite from Supervisor - Digital Learning Solutions";
+            var builder = new BodyBuilder();
+            var dlsUrlBuilder = GetDLSUriBuilder();
+            if (supervisorDelegate.CandidateID == null)
+            {
+                dlsUrlBuilder.Path += "Register";
+                dlsUrlBuilder.Query = $"centreid={supervisorDelegate.CentreId}&inviteid={supervisorDelegate.InviteHash}";
+                builder.TextBody = $@"Dear colleague,
+                              You have been invited to register to access the NHS Health Education England, Digital Learning Solutions platform as a supervised delegate by {supervisorDelegate.SupervisorName} ({supervisorDelegate.SupervisorEmail}).
+                              To register, visit {dlsUrlBuilder.Uri.ToString()}.
+                              Registering using this link will confirm your acceptance of the invite. Your supervisor will then be able to assign role profile assessments and view and validate your self assessment results.";
+                builder.HtmlBody = $@"Dear colleague,
You have been invited to register to access the NHS Health Education England, Digital Learning Solutions platform as a supervised delegate by {supervisorDelegate.SupervisorName}.
Click here to register and confirm your acceptance of the invite.
Your supervisor will then be able to assign role profile assessments and view and validate your self assessment results.
";
+            }
+            else
+            {
+                dlsUrlBuilder.Path += $"LearningPortal/ConfirmSupervisor/{supervisorDelegateId}";
+                builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
+                              You have been identified as a supervised delegate by {supervisorDelegate.SupervisorName} ({supervisorDelegate.SupervisorEmail}) in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
+                              You are already registered as a delegate at the supervisor's DLS centre. To respond to their invite, please visit {dlsUrlBuilder.Uri.ToString()} (you may need to sign in using your existing DLS credentials).
+                              Once you have accepted the invite, your supervisor will be able to assign role profile assessments and view and validate your self assessment results.";
+                builder.HtmlBody = $@"Dear  {supervisorDelegate.FirstName},
You have been identified as a supervised delegate by {supervisorDelegate.SupervisorName} in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
You are already registered as a delegate at the supervisor's DLS centre. Click here to respond to their invite (you may need to sign in using your existing DLS credentials).
Once you have accepted the invite, your supervisor will be able to assign role profile assessments and view and validate your self assessment results.
";
+            }
+            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
+        }
+
+        public void SendSupervisorDelegateAcceptance(int supervisorDelegateId, int delegateId)
+        {
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
+            var builder = new BodyBuilder();
+            var dlsUrlBuilder = GetDLSUriBuilder();
+            string emailSubjectLine = "Accepted Supervisor Invitation - Digital Learning Solutions";
+            dlsUrlBuilder.Path += $"Supervisor/Staff/List";
+            builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
+                              {supervisorDelegate.FirstName} {supervisorDelegate.LastName} has accepted your invitation to become a member of your team in the NHS Health Education England, Digital Learning Solutions platform.
+You are now confirmed as a supervisor for this delegate.
+To manage their role profile assessments, please visit {dlsUrlBuilder.Uri.ToString()}.";
+            builder.HtmlBody = $@"Dear {supervisorDelegate.SupervisorName}
{supervisorDelegate.FirstName} {supervisorDelegate.LastName} has accepted your invitation to become a member of your team in the NHS Health Education England, Digital Learning Solutions platform.
You are now confirmed as a supervisor for this delegate.
Click here to manage their role profile assessments.
";
+            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.SupervisorEmail));
+        }
+
+        public void SendSupervisorDelegateRejected(int supervisorDelegateId, int delegateId)
+        {
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
+            string emailSubjectLine = "REJECTED Supervisor Invitation - Digital Learning Solutions";
+            var builder = new BodyBuilder();
+            var dlsUrlBuilder = GetDLSUriBuilder();
+            dlsUrlBuilder.Path += $"Supervisor/Staff/List";
+            builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
+                              {supervisorDelegate.FirstName} {supervisorDelegate.LastName} has rejected your invitation to become a member of your team in the NHS Health Education England, Digital Learning Solutions platform.
+This delegate has been removed from your supervisor team.
+To manage your team, please visit {dlsUrlBuilder.Uri.ToString()}.";
+            builder.HtmlBody = $@"Dear {supervisorDelegate.SupervisorName}
{supervisorDelegate.FirstName} {supervisorDelegate.LastName} has rejected your invitation to become a member of your team in the NHS Health Education England, Digital Learning Solutions platform.
This delegate has been removed from your supervisor team.
Click here to manage your team.
";
+            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.SupervisorEmail));
+        }
+
+        public void SendSupervisorDelegateConfirmed(int supervisorDelegateId, int adminId, int delegateId)
+        {
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, delegateId);
+            string emailSubjectLine = "Supervisor Confirmed - Digital Learning Solutions";
+            var builder = new BodyBuilder();
+            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
+                               {supervisorDelegate.SupervisorName} has accepted your request to be your supervisor for profile asessment activities in the NHS Health Education England, Digital Learning Solutions platform.
+To access your role profile assessments, please visit {GetCurrentActivitiesUrl()}.";
+            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
{supervisorDelegate.SupervisorName} has accepted your request to be your supervisor for profile asessment activities in the NHS Health Education England, Digital Learning Solutions platform.
Click here to access your role profile assessments.
";
+            string toEmail = (@adminId == 0 ? supervisorDelegate.DelegateEmail : supervisorDelegate.SupervisorEmail);
+            emailService.SendEmail(new Email(emailSubjectLine, builder, toEmail));
+        }
+
+        public void SendSupervisorResultReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int resultId)
+        {
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
+            var competency = selfAssessmentDataService.GetCompetencyByCandidateAssessmentResultId(resultId, candidateAssessmentId, adminId);
+            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(candidateAssessmentId, supervisorDelegateId);
+            var selfAssessmentUrl = GetSelfAssessmentUrl(delegateSelfAssessment.SelfAssessmentID);
+            var commentString = supervisorDelegate.SupervisorName + ((bool)competency.AssessmentQuestions.First().SignedOff ? " confirmed your self assessment " : " did not confirm your self assessment ") + (competency.AssessmentQuestions.First().SupervisorComments != null ? "and left the following review comment: " + competency.AssessmentQuestions.First().SupervisorComments : "but did not leave a review comment.");
+            string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Reviewed {competency.Vocabulary} - Digital Learning Solutions";
+            var builder = new BodyBuilder();
+            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
+                               {supervisorDelegate.SupervisorName} has reviewed your self assessment against the {competency.Vocabulary} '{competency.Name}' ({competency.CompetencyGroup}) in the NHS Health Education England, Digital Learning Solutions platform.
+                               {commentString}
+                               To access your {delegateSelfAssessment.RoleName} profile assessment, please visit {selfAssessmentUrl}.";
+            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
{supervisorDelegate.SupervisorName}  has reviewed your self assessment against the {competency.Vocabulary} '{competency.Name}' ({competency.CompetencyGroup}) in the NHS Health Education England, Digital Learning Solutions platform.
{commentString}
Click here to access your  {delegateSelfAssessment.RoleName} profile assessment.
";
+            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
+        }
+
+        public void SendSupervisorEnroledDelegate(int adminId, int supervisorDelegateId, int candidateAssessmentId, DateTime? completeByDate)
+        {
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
+            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(candidateAssessmentId, supervisorDelegateId);
+            var selfAssessmentUrl = GetSelfAssessmentUrl(delegateSelfAssessment.SelfAssessmentID);
+            var completeByString = completeByDate == null ? $"Your {delegateSelfAssessment.SupervisorRoleTitle} did not specify a date by which the self assessment should be completed." : $"Your {delegateSelfAssessment.SupervisorRoleTitle} indicated that this self assessment should be completed by {completeByDate.Value.ToShortDateString()}.";
+            var supervisorReviewString = delegateSelfAssessment.SupervisorResultsReview | delegateSelfAssessment.SupervisorSelfAssessmentReview ? $"You will be able to request review for your self assessments against this profile from your {delegateSelfAssessment.SupervisorRoleTitle}." : "";
+            string emailSubjectLine = $"You have been enrolled on the profile assessment {delegateSelfAssessment.RoleName} by {supervisorDelegate.SupervisorName} - Digital Learning Solutions";
+            var builder = new BodyBuilder();
+            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
+                               {supervisorDelegate.SupervisorName} has enrolled you on the profile assessment '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions platform.
+                               {supervisorDelegate.SupervisorName} has identified themselves as your {delegateSelfAssessment.SupervisorRoleTitle} for this activity.
+                               {completeByString}
+                               {supervisorReviewString}
+                               To access your {delegateSelfAssessment.RoleName} profile assessment, please visit {selfAssessmentUrl}.";
+            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
{supervisorDelegate.SupervisorName} has enrolled you on the profile assessment '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions platform.
{(completeByString.Length > 0 ? $"{completeByString}
" : "")}{(supervisorReviewString.Length > 0 ? $"{supervisorReviewString}
" : "")}Click here to access your  {delegateSelfAssessment.RoleName} profile assessment.
";
+            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
+        }
+
+        public void SendReminderDelegateSelfAssessment(int adminId, int supervisorDelegateId, int candidateAssessmentId)
+        {
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
+            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(candidateAssessmentId, supervisorDelegateId);
+            var selfAssessmentUrl = GetSelfAssessmentUrl(delegateSelfAssessment.SelfAssessmentID);
+            string emailSubjectLine = $"Reminder to complete the profile assessment {delegateSelfAssessment.RoleName} - Digital Learning Solutions";
+            var builder = new BodyBuilder();
+            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
+                               This is a reminder sent by your {delegateSelfAssessment.RoleName}, {supervisorDelegate.SupervisorName}, to complete the profile assessment '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions platform.
+                               To access your {delegateSelfAssessment.RoleName} profile assessment, please visit {selfAssessmentUrl}.";
+            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
This is a reminder sent by your {delegateSelfAssessment.RoleName}, {supervisorDelegate.SupervisorName}, to complete the profile assessment '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions platform.
Click here to access your  {delegateSelfAssessment.RoleName} profile assessment.
";
+            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
+        }
+
+        public void SendSupervisorMultipleResultsReviewed(int adminId, int supervisorDelegateId, int candidateAssessmentId, int countResults)
+        {
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
+            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(candidateAssessmentId, supervisorDelegateId);
+            var selfAssessmentUrl = GetSelfAssessmentUrl(delegateSelfAssessment.SelfAssessmentID);
+            string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Confirmed {countResults} Results - Digital Learning Solutions";
+            var builder = new BodyBuilder();
+            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
+                               {supervisorDelegate.SupervisorName} has confirmed {countResults} of your self assessment results against the {delegateSelfAssessment.RoleName} profile assessment in the NHS Health Education England, Digital Learning Solutions platform.
+                               To access your {delegateSelfAssessment.RoleName} profile assessment, please visit {selfAssessmentUrl}.";
+            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
 {supervisorDelegate.SupervisorName} has confirmed {countResults} of your self assessment results against the {delegateSelfAssessment.RoleName} profile assessment in the NHS Health Education England, Digital Learning Solutions platform.
Click here to access your  {delegateSelfAssessment.RoleName} profile assessment.
";
+            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
+        }
+
+        public void SendDelegateSupervisorNominated(int supervisorDelegateId, int selfAssessmentID, int delegateId)
+        {
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
+            if (supervisorDelegate == null)
+            {
+                return;
+            }
+            if (supervisorDelegate.CandidateID == null)
+            {
+                return;
+            }
+            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateSelfAssessmentId(selfAssessmentID, (int)supervisorDelegate.ID);
+            string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Role Request - Digital Learning Solutions";
+            var builder = new BodyBuilder();
+            if (supervisorDelegate.SupervisorAdminID == null)
+            {
+                return;
+            }
+
+            var profileReviewUrl = GetSupervisorProfileReviewUrl(supervisorDelegateId, delegateSelfAssessment.ID);
+            builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
+                              You have been identified by {supervisorDelegate.FirstName} {supervisorDelegate.LastName} ({supervisorDelegate.DelegateEmail}) as their {delegateSelfAssessment.SupervisorRoleTitle} for the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
+                              To supervise this activity, please visit {profileReviewUrl} (sign in using your existing DLS credentials).";
+            builder.HtmlBody = $@"Dear {supervisorDelegate.SupervisorName},
You have been identified by {supervisorDelegate.FirstName} {supervisorDelegate.LastName} as their {delegateSelfAssessment.SupervisorRoleTitle} for the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
You are already registered as a delegate at the supervisor's DLS centre. Click here to supervise this activity (sign in using your existing DLS credentials).
";
+            supervisorService.UpdateNotificationSent(supervisorDelegateId);
+            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.SupervisorEmail));
+        }
+        protected string GetSupervisorProfileReviewUrl(int supervisorDelegateId, int delegateSelfAssessmentId)
+        {
+            var dlsUrlBuilder = GetDLSUriBuilder();
+            dlsUrlBuilder.Path += $"Supervisor/Staff/{supervisorDelegateId}/ProfileAssessment/{delegateSelfAssessmentId}/Review";
+            return dlsUrlBuilder.Uri.ToString();
+        }
+
+        public void SendResultVerificationRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int resultCount, int delegateId)
+        {
+            var candidateAssessmentSupervisor = supervisorService.GetCandidateAssessmentSupervisorById(candidateAssessmentSupervisorId);
+            int supervisorDelegateId = candidateAssessmentSupervisor.SupervisorDelegateId;
+            int candidateAssessmentId = candidateAssessmentSupervisor.CandidateAssessmentID;
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
+            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentSupervisor.CandidateAssessmentID);
+            string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Self Assessment Results Review Request - Digital Learning Solutions";
+            string? profileReviewUrl = GetSupervisorProfileReviewUrl(supervisorDelegateId, candidateAssessmentId);
+            BodyBuilder? builder = new BodyBuilder();
+            builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
+                              {supervisorDelegate.FirstName} {supervisorDelegate.LastName} ({supervisorDelegate.DelegateEmail}) has requested that you review {resultCount.ToString()} of their self assessment results for the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
+                              To review these results, please visit {profileReviewUrl} (sign in using your existing DLS credentials).";
+            builder.HtmlBody = $@"Dear {supervisorDelegate.SupervisorName},
{supervisorDelegate.FirstName} {supervisorDelegate.LastName} has requested that you review {resultCount} of their self assessment results for the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
Click here to review these results (sign in using your existing DLS credentials).
";
+            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.SupervisorEmail));
+        }
+
+        public void SendSignOffRequest(int candidateAssessmentSupervisorId, int selfAssessmentID, int delegateId)
+        {
+            var candidateAssessmentSupervisor = supervisorService.GetCandidateAssessmentSupervisorById(candidateAssessmentSupervisorId);
+            int supervisorDelegateId = candidateAssessmentSupervisor.SupervisorDelegateId;
+            int candidateAssessmentId = candidateAssessmentSupervisor.CandidateAssessmentID;
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, 0, delegateId);
+            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBaseByCandidateAssessmentId(candidateAssessmentSupervisor.CandidateAssessmentID);
+            string emailSubjectLine = $"{delegateSelfAssessment.SupervisorRoleTitle} Self Assessment Sign-off Request - Digital Learning Solutions";
+            string? profileReviewUrl = GetSupervisorProfileReviewUrl(supervisorDelegateId, candidateAssessmentId);
+            BodyBuilder? builder = new BodyBuilder();
+            builder.TextBody = $@"Dear {supervisorDelegate.SupervisorName},
+                              {supervisorDelegate.FirstName} {supervisorDelegate.LastName} ({supervisorDelegate.DelegateEmail}) has requested that you sign-off of their self assessment the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
+                              To review and sign-off the self-assessment, please visit {profileReviewUrl} (sign in using your existing DLS credentials).";
+            builder.HtmlBody = $@"Dear {supervisorDelegate.SupervisorName},
{supervisorDelegate.FirstName} {supervisorDelegate.LastName} has requested that you sign-off of their self assessment the activity '{delegateSelfAssessment.RoleName}' in the NHS Health Education England, Digital Learning Solutions (DLS) platform.
Click here to review and sign-off the self-assessment (sign in using your existing DLS credentials).
";
+            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.SupervisorEmail));
+        }
+
+        public void SendProfileAssessmentSignedOff(int supervisorDelegateId, int candidateAssessmentId, string? supervisorComments, bool signedOff, int adminId)
+        {
+            var supervisorDelegate = supervisorService.GetSupervisorDelegateDetailsById(supervisorDelegateId, adminId, 0);
+            var delegateSelfAssessment = supervisorService.GetSelfAssessmentBySupervisorDelegateCandidateAssessmentId(candidateAssessmentId, supervisorDelegateId);
+            var selfAssessmentUrl = GetSelfAssessmentUrl(delegateSelfAssessment.SelfAssessmentID);
+            var commentString = supervisorDelegate.SupervisorName + (signedOff ? " signed off your profile assessment " : " rejected your profile assessment ") + (supervisorComments != null ? "and left the following review comment: " + supervisorComments : "but did not leave a review comment.");
+            string emailSubjectLine = $"Profile assessment {(signedOff ? " signed off " : "rejected")} by {delegateSelfAssessment.SupervisorRoleTitle} - Digital Learning Solutions";
+            var builder = new BodyBuilder();
+            builder.TextBody = $@"Dear {supervisorDelegate.FirstName},
+                               {supervisorDelegate.SupervisorName} has reviewed your profile assessment {delegateSelfAssessment.RoleName} in the NHS Health Education England, Digital Learning Solutions platform.
+                               {commentString}
+                               To access your {delegateSelfAssessment.RoleName} profile assessment, please visit {selfAssessmentUrl}.";
+            builder.HtmlBody = $@"Dear {supervisorDelegate.FirstName}
{supervisorDelegate.SupervisorName} has reviewed your profile assessment {delegateSelfAssessment.RoleName} in the NHS Health Education England, Digital Learning Solutions platform.
{commentString}
Click here to access your  {delegateSelfAssessment.RoleName} profile assessment.
";
+            emailService.SendEmail(new Email(emailSubjectLine, builder, supervisorDelegate.DelegateEmail));
+        }
+    }
+}
diff --git a/DigitalLearningSolutions.Data/Services/GroupsService.cs b/DigitalLearningSolutions.Data/Services/GroupsService.cs
index aae4fb2208..c00b9262cf 100644
--- a/DigitalLearningSolutions.Data/Services/GroupsService.cs
+++ b/DigitalLearningSolutions.Data/Services/GroupsService.cs
@@ -7,6 +7,7 @@
     using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.Enums;
     using DigitalLearningSolutions.Data.Exceptions;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Helpers;
     using DigitalLearningSolutions.Data.Models;
     using DigitalLearningSolutions.Data.Models.DelegateGroups;
diff --git a/DigitalLearningSolutions.Data/Services/LearningHubLinkService.cs b/DigitalLearningSolutions.Data/Services/LearningHubLinkService.cs
index 3c43c733d5..aca2ed0330 100644
--- a/DigitalLearningSolutions.Data/Services/LearningHubLinkService.cs
+++ b/DigitalLearningSolutions.Data/Services/LearningHubLinkService.cs
@@ -4,7 +4,7 @@
     using System.Web;
     using DigitalLearningSolutions.Data.DataServices.UserDataService;
     using DigitalLearningSolutions.Data.Exceptions;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Models.Signposting;
     using Microsoft.Extensions.Configuration;
 
diff --git a/DigitalLearningSolutions.Data/Services/LearningHubSsoSecurityService.cs b/DigitalLearningSolutions.Data/Services/LearningHubSsoSecurityService.cs
index c3b4d9767a..bb4bf74f08 100644
--- a/DigitalLearningSolutions.Data/Services/LearningHubSsoSecurityService.cs
+++ b/DigitalLearningSolutions.Data/Services/LearningHubSsoSecurityService.cs
@@ -3,7 +3,7 @@
     using System;
     using System.Security.Cryptography;
     using System.Text;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using Microsoft.Extensions.Configuration;
     using Microsoft.Extensions.Logging;
 
diff --git a/DigitalLearningSolutions.Data/Services/NotificationService.cs b/DigitalLearningSolutions.Data/Services/NotificationService.cs
index dfda13f263..b0c934afc9 100644
--- a/DigitalLearningSolutions.Data/Services/NotificationService.cs
+++ b/DigitalLearningSolutions.Data/Services/NotificationService.cs
@@ -2,7 +2,8 @@
 {
     using System;
     using System.Threading.Tasks;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.DataServices;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Models;
     using DigitalLearningSolutions.Data.Models.Email;
     using Microsoft.Extensions.Configuration;
diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/ForgotPassword/ForgotPasswordControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/ForgotPassword/ForgotPasswordControllerTests.cs
index 9d29c71fea..cc9868f9cd 100644
--- a/DigitalLearningSolutions.Web.Tests/Controllers/ForgotPassword/ForgotPasswordControllerTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/Controllers/ForgotPassword/ForgotPasswordControllerTests.cs
@@ -8,19 +8,22 @@
     using DigitalLearningSolutions.Web.ViewModels.ForgotPassword;
     using FakeItEasy;
     using FluentAssertions.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
     using NUnit.Framework;
 
     internal class ForgotPasswordControllerTests
     {
-        private ForgotPasswordController controller;
-        private IPasswordResetService passwordResetService;
+        private ForgotPasswordController controller = null!;
+        private IPasswordResetService passwordResetService = null!;
+        private IConfiguration config = null!;
 
         [SetUp]
         public void SetUp()
         {
             passwordResetService = A.Fake();
+            config = A.Fake();
 
-            controller = new ForgotPasswordController(passwordResetService)
+            controller = new ForgotPasswordController(passwordResetService, config)
                 .WithDefaultContext()
                 .WithMockUser(false);
         }
@@ -39,7 +42,7 @@ public void Index_should_render_if_user_is_unauthenticated()
         public void Index_should_redirect_if_user_is_authenticated()
         {
             // Given
-            var controllerWithAuthenticatedUser = new ForgotPasswordController(passwordResetService)
+            var controllerWithAuthenticatedUser = new ForgotPasswordController(passwordResetService, config)
                 .WithDefaultContext()
                 .WithMockUser(true);
 
@@ -123,4 +126,4 @@ public async Task Leading_trailing_whitespaces_in_email_should_be_ignored()
             result.Should().BeRedirectToActionResult().WithActionName("Confirm");
         }
     }
-}
+}
diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/Frameworks/FrameworkControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/Frameworks/FrameworkControllerTests.cs
index ab0d3817b5..b9dc62e77c 100644
--- a/DigitalLearningSolutions.Web.Tests/Controllers/Frameworks/FrameworkControllerTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/Controllers/Frameworks/FrameworkControllerTests.cs
@@ -1,65 +1,66 @@
-namespace DigitalLearningSolutions.Web.Tests.Controllers.Frameworks
-{
-    using DigitalLearningSolutions.Data.ApiClients;
-    using DigitalLearningSolutions.Data.DataServices;
-    using DigitalLearningSolutions.Data.Services;
-    using DigitalLearningSolutions.Web.Controllers.FrameworksController;
-    using FakeItEasy;
-    using Microsoft.AspNetCore.Http;
-    using Microsoft.AspNetCore.Mvc;
-    using Microsoft.Extensions.Configuration;
-    using Microsoft.Extensions.Logging;
-    using NUnit.Framework;
-    using System.Security.Claims;
-
-    public partial class FrameworkControllerTests
-    {
-        private FrameworksController controller;
-        private IFrameworkService frameworkService;
-        private ICommonService commonService;
-        private IConfigService configService;
-        private IConfiguration config;
-        private IFrameworkNotificationService frameworkNotificationService;
-        private IImportCompetenciesFromFileService importCompetenciesFromFileService;
-        private ICompetencyLearningResourcesDataService competencyLearningResourcesDataService;
-        private ILearningHubApiClient learningHubApiClient;
-        private const string BaseUrl = "https://www.dls.nhs.uk";
-        private const int CentreId = 101;
-        private const int AdminId = 1;
-
-        [SetUp]
-        public void SetUp()
-        {
-            frameworkService = A.Fake();
-            frameworkNotificationService = A.Fake();
-            commonService = A.Fake();
-            configService = A.Fake();
-            var logger = A.Fake>();
-            config = A.Fake();
-            importCompetenciesFromFileService = A.Fake();
-            competencyLearningResourcesDataService = A.Fake();
-            learningHubApiClient = A.Fake();
-
-            A.CallTo(() => config["CurrentSystemBaseUrl"]).Returns(BaseUrl);
-
-            var user = new ClaimsPrincipal(new ClaimsIdentity(new[]
-            {
-                new Claim("UserAdminId", AdminId.ToString()),
-                new Claim("UserCentreID", CentreId.ToString()),
-                new Claim("IsFrameworkDeveloper", "True")
-            }, "mock"));
-            controller = new FrameworksController(
-                frameworkService,
-                commonService,
-                frameworkNotificationService,
-                logger,
-                importCompetenciesFromFileService,
-                competencyLearningResourcesDataService,
-                learningHubApiClient
-            )
-            {
-                ControllerContext = new ControllerContext() { HttpContext = new DefaultHttpContext { User = user } }
-            };
-        }
-    }
-}
+namespace DigitalLearningSolutions.Web.Tests.Controllers.Frameworks
+{
+    using DigitalLearningSolutions.Data.ApiClients;
+    using DigitalLearningSolutions.Data.DataServices;
+    using DigitalLearningSolutions.Data.Services;
+    using DigitalLearningSolutions.Web.Controllers.FrameworksController;
+    using FakeItEasy;
+    using Microsoft.AspNetCore.Http;
+    using Microsoft.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
+    using Microsoft.Extensions.Logging;
+    using NUnit.Framework;
+    using System.Security.Claims;
+
+    public partial class FrameworkControllerTests
+    {
+        private FrameworksController controller = null!;
+        private IFrameworkService frameworkService = null!;
+        private ICommonService commonService = null!;
+        private IConfiguration config = null!;
+        private IFrameworkNotificationService frameworkNotificationService = null!;
+        private IImportCompetenciesFromFileService importCompetenciesFromFileService = null!;
+        private ICompetencyLearningResourcesDataService competencyLearningResourcesDataService = null!;
+        private ILearningHubApiClient learningHubApiClient = null!;
+        
+        private const string BaseUrl = "https://www.dls.nhs.uk";
+        private const int CentreId = 101;
+        private const int AdminId = 1;
+
+        [SetUp]
+        public void SetUp()
+        {
+            var logger = A.Fake>();
+
+            frameworkService = A.Fake();
+            frameworkNotificationService = A.Fake();
+            commonService = A.Fake();
+            config = A.Fake();
+            importCompetenciesFromFileService = A.Fake();
+            competencyLearningResourcesDataService = A.Fake();
+            learningHubApiClient = A.Fake();
+
+            A.CallTo(() => config["CurrentSystemBaseUrl"]).Returns(BaseUrl);
+
+            var user = new ClaimsPrincipal(new ClaimsIdentity(new[]
+            {
+                new Claim("UserAdminId", AdminId.ToString()),
+                new Claim("UserCentreID", CentreId.ToString()),
+                new Claim("IsFrameworkDeveloper", "True")
+            }, "mock"));
+
+            controller = new FrameworksController(
+                frameworkService,
+                commonService,
+                frameworkNotificationService,
+                logger,
+                importCompetenciesFromFileService,
+                competencyLearningResourcesDataService,
+                learningHubApiClient
+            )
+            {
+                ControllerContext = new ControllerContext() { HttpContext = new DefaultHttpContext { User = user } }
+            };
+        }
+    }
+}
diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/LearningMenu/LearningMenuControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/LearningMenu/LearningMenuControllerTests.cs
index 35d58ea57b..3b3f50eed9 100644
--- a/DigitalLearningSolutions.Web.Tests/Controllers/LearningMenu/LearningMenuControllerTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/Controllers/LearningMenu/LearningMenuControllerTests.cs
@@ -3,7 +3,6 @@
     using System.Security.Claims;
     using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.Services;
-    using DigitalLearningSolutions.Data.Tests.Helpers;
     using DigitalLearningSolutions.Data.Tests.TestHelpers;
     using DigitalLearningSolutions.Web.Controllers.LearningMenuController;
     using FakeItEasy;
@@ -15,18 +14,18 @@
 
     public partial class LearningMenuControllerTests
     {
-        private LearningMenuController controller;
-        private ICourseContentService courseContentService;
-        private ITutorialContentDataService tutorialContentDataService;
-        private ISessionService sessionService;
-        private ISectionContentDataService sectionContentDataService;
-        private IDiagnosticAssessmentDataService diagnosticAssessmentDataService;
-        private IDiagnosticAssessmentService diagnosticAssessmentService;
-        private IPostLearningAssessmentService postLearningAssessmentService;
-        private ICourseCompletionService courseCompletionService;
-        private ISession httpContextSession;
-        private IConfiguration config;
-        private IConfigService configService;
+        private LearningMenuController controller = null!;
+        private ICourseContentService courseContentService = null!;
+        private ITutorialContentDataService tutorialContentDataService = null!;
+        private ISessionService sessionService = null!;
+        private ISectionContentDataService sectionContentDataService = null!;
+        private IDiagnosticAssessmentService diagnosticAssessmentService = null!;
+        private IPostLearningAssessmentService postLearningAssessmentService = null!;
+        private ICourseCompletionService courseCompletionService = null!;
+        private ISession httpContextSession = null!;
+        private IConfiguration config = null!;
+        private IConfigDataService configDataService = null!;
+        
         private const int CandidateId = 11;
         private const int CentreId = 2;
         private const int CustomisationId = 12;
@@ -38,12 +37,11 @@ public void SetUp()
         {
             var logger = A.Fake>();
             config = A.Fake();
-            configService = A.Fake();
+            configDataService = A.Fake();
             courseContentService = A.Fake();
             tutorialContentDataService = A.Fake();
             sessionService = A.Fake();
             sectionContentDataService = A.Fake();
-            diagnosticAssessmentDataService = A.Fake();
             diagnosticAssessmentService = A.Fake();
             postLearningAssessmentService = A.Fake();
             courseCompletionService = A.Fake();
@@ -58,11 +56,10 @@ public void SetUp()
             controller = new LearningMenuController(
                 logger,
                 config,
-                configService,
+                configDataService,
                 courseContentService,
                 sectionContentDataService,
                 tutorialContentDataService,
-                diagnosticAssessmentDataService,
                 diagnosticAssessmentService,
                 postLearningAssessmentService,
                 sessionService,
diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/CompletedTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/CompletedTests.cs
index 69b3882c5f..c87aecedd8 100644
--- a/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/CompletedTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/CompletedTests.cs
@@ -3,7 +3,7 @@
     using System.Collections.Generic;
     using System.Linq;
     using System.Threading.Tasks;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Models.Courses;
     using DigitalLearningSolutions.Data.Models.LearningResources;
     using DigitalLearningSolutions.Web.Tests.TestHelpers;
@@ -23,7 +23,7 @@ bool apiIsAccessible
         )
         {
             // Given
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
             var completedCourses = new[]
             {
                 CompletedCourseHelper.CreateDefaultCompletedCourse(),
@@ -61,7 +61,7 @@ bool apiIsAccessible
         public async Task Completed_action_should_have_banner_text()
         {
             // Given
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
             const string bannerText = "Banner text";
             A.CallTo(() => centresDataService.GetBannerText(CentreId)).Returns(bannerText);
 
@@ -77,7 +77,7 @@ public async Task Completed_action_should_not_fetch_ActionPlanResources_if_signp
         {
             // Given
             GivenCompletedActivitiesAreEmptyLists();
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("false");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("false");
 
             // When
             await controller.Completed();
@@ -91,7 +91,7 @@ public async Task Completed_action_should_fetch_ActionPlanResources_if_signposti
         {
             // Given
             GivenCompletedActivitiesAreEmptyLists();
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
 
             // When
             await controller.Completed();
@@ -106,7 +106,7 @@ public async Task AllCompletedItems_action_should_not_fetch_ActionPlanResources_
         {
             // Given
             GivenCompletedActivitiesAreEmptyLists();
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("false");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("false");
 
             // When
             await controller.AllCompletedItems();
@@ -120,7 +120,7 @@ public async Task AllCompletedItems_action_should_fetch_ActionPlanResources_if_s
         {
             // Given
             GivenCompletedActivitiesAreEmptyLists();
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
 
             // When
             await controller.AllCompletedItems();
diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/CurrentTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/CurrentTests.cs
index 64692ac02f..be20f6aa02 100644
--- a/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/CurrentTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/CurrentTests.cs
@@ -5,7 +5,7 @@
     using System.Linq;
     using System.Threading.Tasks;
     using DigitalLearningSolutions.Data.Enums;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Models.Courses;
     using DigitalLearningSolutions.Data.Models.LearningResources;
     using DigitalLearningSolutions.Data.Models.SelfAssessments;
@@ -45,7 +45,7 @@ bool apiIsAccessible
             A.CallTo(() => actionPlanService.GetIncompleteActionPlanResources(CandidateId))
                 .Returns((actionPlanResources, apiIsAccessible));
             A.CallTo(() => centresDataService.GetBannerText(CentreId)).Returns(bannerText);
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
 
             // When
             var result = await controller.Current();
@@ -71,7 +71,7 @@ public async Task Current_action_should_not_fetch_ActionPlanResources_if_signpos
         {
             // Given
             GivenCurrentActivitiesAreEmptyLists();
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("false");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("false");
 
             // When
             await controller.Current();
@@ -85,7 +85,7 @@ public async Task Current_action_should_fetch_ActionPlanResources_if_signposting
         {
             // Given
             GivenCurrentActivitiesAreEmptyLists();
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
 
             // When
             await controller.Current();
@@ -100,7 +100,7 @@ public async Task AllCurrentItems_action_should_not_fetch_ActionPlanResources_if
         {
             // Given
             GivenCurrentActivitiesAreEmptyLists();
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("false");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("false");
 
             // When
             await controller.AllCurrentItems();
@@ -114,7 +114,7 @@ public async Task AllCurrentItems_action_should_fetch_ActionPlanResources_if_sig
         {
             // Given
             GivenCurrentActivitiesAreEmptyLists();
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
 
             // When
             await controller.AllCurrentItems();
@@ -362,7 +362,7 @@ public async Task Current_action_should_have_banner_text()
             // Given
             const string bannerText = "Banner text";
             A.CallTo(() => centresDataService.GetBannerText(CentreId)).Returns(bannerText);
-            A.CallTo(() => config[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => config[ConfigurationExtensions.UseSignposting]).Returns("true");
 
             // When
             var currentViewModel = await CurrentCourseHelper.CurrentPageViewModelFromController(controller);
diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/RecommendedLearningControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/RecommendedLearningControllerTests.cs
index 4ca180f859..d7349a3455 100644
--- a/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/RecommendedLearningControllerTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/RecommendedLearningControllerTests.cs
@@ -2,7 +2,6 @@
 {
     using System.Collections.Generic;
     using System.Threading.Tasks;
-    using DigitalLearningSolutions.Data.Helpers;
     using DigitalLearningSolutions.Data.Models.External.Filtered;
     using DigitalLearningSolutions.Data.Services;
     using DigitalLearningSolutions.Web.Controllers.LearningPortalController;
@@ -13,11 +12,13 @@
     using FluentAssertions.Execution;
     using Microsoft.Extensions.Configuration;
     using NUnit.Framework;
+    using ConfigurationExtensions = DigitalLearningSolutions.Data.Extensions.ConfigurationExtensions;
 
     public class RecommendedLearningControllerTests
     {
         private const int DelegateId = 2;
         private const int SelfAssessmentId = 1;
+
         private IActionPlanService actionPlanService = null!;
         private IConfiguration configuration = null!;
         private RecommendedLearningController controller = null!;
@@ -50,7 +51,7 @@ public async Task
             SelfAssessmentResults_redirect_to_expected_action_does_not_call_filtered_api_when_using_signposting()
         {
             // Given
-            A.CallTo(() => configuration[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => configuration[ConfigurationExtensions.UseSignposting]).Returns("true");
 
             // When
             var result = await controller.SelfAssessmentResults(SelfAssessmentId);
@@ -71,7 +72,7 @@ public async Task RecommendedLearning_returns_expected_view_when_using_signposti
         {
             // Given
             var expectedBookmarkString = $"/LearningPortal/SelfAssessment/{SelfAssessmentId}/RecommendedLearning";
-            A.CallTo(() => configuration[ConfigHelper.UseSignposting]).Returns("true");
+            A.CallTo(() => configuration[ConfigurationExtensions.UseSignposting]).Returns("true");
 
             // When
             var result = await controller.RecommendedLearning(SelfAssessmentId);
diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/LearningSolutions/LearningSolutionsControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/LearningSolutions/LearningSolutionsControllerTests.cs
index a328179794..046de4d95d 100644
--- a/DigitalLearningSolutions.Web.Tests/Controllers/LearningSolutions/LearningSolutionsControllerTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/Controllers/LearningSolutions/LearningSolutionsControllerTests.cs
@@ -19,14 +19,14 @@ internal class LearningSolutionsControllerTests
         private const int CandidateId = 11;
         private const int CentreId = 2;
         private ICentresDataService centresDataService = null!;
-        private IConfigService configService = null!;
+        private IConfigDataService configDataService = null!;
         private LearningSolutionsController controller = null!;
 
         [SetUp]
         public void SetUp()
         {
             centresDataService = A.Fake();
-            configService = A.Fake();
+            configDataService = A.Fake();
             var logger = A.Fake>();
 
             var user = new ClaimsPrincipal(
@@ -40,7 +40,7 @@ public void SetUp()
                 )
             );
             controller = new LearningSolutionsController(
-                configService,
+                configDataService,
                 logger,
                 centresDataService
             )
diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/Register/RegisterDelegateByCentreControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/Register/RegisterDelegateByCentreControllerTests.cs
index 34f0bc7e4a..898bb7722d 100644
--- a/DigitalLearningSolutions.Web.Tests/Controllers/Register/RegisterDelegateByCentreControllerTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/Controllers/Register/RegisterDelegateByCentreControllerTests.cs
@@ -22,6 +22,7 @@
     using FakeItEasy;
     using FluentAssertions;
     using FluentAssertions.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
     using NUnit.Framework;
     using SummaryViewModel = DigitalLearningSolutions.Web.ViewModels.Register.RegisterDelegateByCentre.SummaryViewModel;
 
@@ -34,6 +35,7 @@ public class RegisterDelegateByCentreControllerTests
         private IRegistrationService registrationService = null!;
         private IUserDataService userDataService = null!;
         private IUserService userService = null!;
+        private IConfiguration config = null!;
 
         [SetUp]
         public void Setup()
@@ -44,13 +46,16 @@ public void Setup()
             promptsService = A.Fake();
             cryptoService = A.Fake();
             registrationService = A.Fake();
+            config = A.Fake();
+
             controller = new RegisterDelegateByCentreController(
                     jobGroupsDataService,
                     userService,
                     promptsService,
                     cryptoService,
                     userDataService,
-                    registrationService
+                    registrationService,
+                    config
                 )
                 .WithDefaultContext()
                 .WithMockTempData();
diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/CourseSetup/CourseSetupControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/CourseSetup/CourseSetupControllerTests.cs
index ed42e800ca..deb824ccf2 100644
--- a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/CourseSetup/CourseSetupControllerTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/CourseSetup/CourseSetupControllerTests.cs
@@ -18,6 +18,7 @@
     using FluentAssertions.Execution;
     using Microsoft.AspNetCore.Http;
     using Microsoft.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
     using NUnit.Framework;
 
     public class CourseSetupControllerTests
@@ -91,6 +92,7 @@ public class CourseSetupControllerTests
         private HttpResponse httpResponse = null!;
         private ISectionService sectionService = null!;
         private ITutorialService tutorialService = null!;
+        private IConfiguration config = null!;
 
         [SetUp]
         public void Setup()
@@ -98,6 +100,7 @@ public void Setup()
             courseService = A.Fake();
             tutorialService = A.Fake();
             sectionService = A.Fake();
+            config = A.Fake();
 
             A.CallTo(
                 () => courseService.GetCentreSpecificCourseStatisticsWithAdminFieldResponseCounts(A._, A._)
@@ -114,7 +117,8 @@ public void Setup()
             controller = new CourseSetupController(
                     courseService,
                     tutorialService,
-                    sectionService
+                    sectionService,
+                    config
                 )
                 .WithDefaultContext()
                 .WithMockUser(true, 101)
@@ -126,7 +130,8 @@ public void Setup()
             controllerWithCookies = new CourseSetupController(
                     courseService,
                     tutorialService,
-                    sectionService
+                    sectionService,
+                    config
                 )
                 .WithMockHttpContext(httpRequest, cookieName, cookieValue, httpResponse)
                 .WithMockUser(true, 101)
diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/EmailDelegatesControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/EmailDelegatesControllerTests.cs
index 920d4e6600..69bdaf516e 100644
--- a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/EmailDelegatesControllerTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/EmailDelegatesControllerTests.cs
@@ -10,30 +10,34 @@
     using FluentAssertions;
     using Microsoft.AspNetCore.Http;
     using Microsoft.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
     using NUnit.Framework;
 
     public class EmailDelegatesControllerTests
     {
         private PromptsService promptsHelper = null!;
         private EmailDelegatesController emailDelegatesController = null!;
-
         private HttpRequest httpRequest = null!;
         private HttpResponse httpResponse = null!;
         private IJobGroupsDataService jobGroupsDataService = null!;
         private IPasswordResetService passwordResetService = null!;
         private IUserService userService = null!;
+        private IConfiguration config = null!;
 
         [SetUp]
         public void Setup()
         {
             var centreCustomPromptsService = A.Fake();
+
             promptsHelper = new PromptsService(centreCustomPromptsService);
             userService = A.Fake();
             jobGroupsDataService = A.Fake();
             passwordResetService = A.Fake();
+            config = A.Fake();
 
             httpRequest = A.Fake();
             httpResponse = A.Fake();
+
             const string cookieName = "EmailDelegateFilter";
             const string cookieValue = "JobGroupId|JobGroupId|1";
 
@@ -41,7 +45,8 @@ public void Setup()
                     promptsHelper,
                     jobGroupsDataService,
                     passwordResetService,
-                    userService
+                    userService,
+                    config
                 )
                 .WithMockHttpContext(httpRequest, cookieName, cookieValue, httpResponse)
                 .WithMockUser(true)
diff --git a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/ViewDelegateControllerTests.cs b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/ViewDelegateControllerTests.cs
index ff5771fb49..d660de41ff 100644
--- a/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/ViewDelegateControllerTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/Controllers/TrackingSystem/Delegates/ViewDelegateControllerTests.cs
@@ -11,6 +11,7 @@
     using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Delegates.ViewDelegate;
     using FakeItEasy;
     using FluentAssertions.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
     using NUnit.Framework;
 
     internal class ViewDelegateControllerTests
@@ -19,23 +20,27 @@ internal class ViewDelegateControllerTests
         private ICourseService courseService = null!;
         private IUserDataService userDataService = null!;
         private ViewDelegateController viewDelegateController = null!;
+        private IConfiguration config = null!;
 
         [SetUp]
         public void SetUp()
         {
             var centreCustomPromptsService = A.Fake();
             var centreCustomPromptsHelper = new PromptsService(centreCustomPromptsService);
+            var passwordResetService = A.Fake();
+
             userDataService = A.Fake();
             courseService = A.Fake();
-            var passwordResetService = A.Fake();
             courseDataService = A.Fake();
+            config = A.Fake();
 
             viewDelegateController = new ViewDelegateController(
                     userDataService,
                     centreCustomPromptsHelper,
                     courseService,
                     passwordResetService,
-                    courseDataService
+                    courseDataService,
+                    config
                 )
                 .WithDefaultContext()
                 .WithMockUser(true);
@@ -171,7 +176,7 @@ public void ReactivateDelegate_nonexistent_delegate_returns_not_found_result()
         {
             //Given
             A.CallTo(() => userDataService.GetDelegateUserCardById(10)).Returns(null);
-            
+
             // When
             var result = viewDelegateController.ReactivateDelegate(10);
 
@@ -183,7 +188,7 @@ public void ReactivateDelegate_nonexistent_delegate_returns_not_found_result()
         public void ReactivateDelegate_delegate_on_wrong_centre_returns_not_found_result()
         {
             //Given
-            A.CallTo(() => userDataService.GetDelegateUserCardById(10)).Returns(new DelegateUserCard() { CentreId = 1});
+            A.CallTo(() => userDataService.GetDelegateUserCardById(10)).Returns(new DelegateUserCard() { CentreId = 1 });
 
             // When
             var result = viewDelegateController.ReactivateDelegate(2);
diff --git a/DigitalLearningSolutions.Web.Tests/Helpers/OldSystemEndpointHelperTests.cs b/DigitalLearningSolutions.Web.Tests/Helpers/OldSystemEndpointHelperTests.cs
new file mode 100644
index 0000000000..98552d684e
--- /dev/null
+++ b/DigitalLearningSolutions.Web.Tests/Helpers/OldSystemEndpointHelperTests.cs
@@ -0,0 +1,74 @@
+namespace DigitalLearningSolutions.Web.Tests.Helpers
+{
+    using DigitalLearningSolutions.Web.Helpers;
+    using FakeItEasy;
+    using FluentAssertions;
+    using Microsoft.Extensions.Configuration;
+    using NUnit.Framework;
+
+    public class OldSystemEndpointHelperTests
+    {
+        private IConfiguration config = null!;
+
+        [SetUp]
+        public void Setup()
+        {
+            config = A.Fake();
+
+            A.CallTo(() => config["CurrentSystemBaseUrl"]).Returns("https://www.dls.nhs.uk");
+        }
+
+        [Test]
+        public void GetEvaluateUrl_returns_expected()
+        {
+            // Given
+            const int progressId = 1;
+            const string expected = "https://www.dls.nhs.uk/tracking/finalise?ProgressID=1";
+
+            // Then
+            OldSystemEndpointHelper.GetEvaluateUrl(config, progressId).Should().Be(expected);
+        }
+
+        [Test]
+        public void GetTrackingUrl_returns_expected()
+        {
+            // Given
+            const string expected = "https://www.dls.nhs.uk/tracking/tracker";
+
+            // Then
+            OldSystemEndpointHelper.GetTrackingUrl(config).Should().Be(expected);
+        }
+
+        [Test]
+        public void GetScormPlayerUrl_returns_expected()
+        {
+            // Given
+            const string expected = "https://www.dls.nhs.uk/scoplayer/sco";
+
+            // Then
+            OldSystemEndpointHelper.GetScormPlayerUrl(config).Should().Be(expected);
+        }
+
+        [Test]
+        public void GetDownloadSummaryUrl_returns_expected()
+        {
+            // Given
+            const int progressId = 1;
+            const string expected = "https://www.dls.nhs.uk/tracking/summary?ProgressID=1";
+
+            // Then
+            OldSystemEndpointHelper.GetDownloadSummaryUrl(config, progressId).Should().Be(expected);
+        }
+
+        [Test]
+        public void GetConsolidationPathUrl_returns_expected()
+        {
+            // Given
+            const string consolidationPath = "path";
+            const string expected = "https://www.dls.nhs.uk/tracking/dlconsolidation?client=path";
+
+            // Then
+            OldSystemEndpointHelper.GetConsolidationPathUrl(config, consolidationPath).Should().Be(expected);
+        }
+    }
+}
diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/Common/SearchablePageViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/Common/SearchablePageViewModelTests.cs
index 1863a7f132..30034ee7f6 100644
--- a/DigitalLearningSolutions.Web.Tests/ViewModels/Common/SearchablePageViewModelTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/ViewModels/Common/SearchablePageViewModelTests.cs
@@ -6,18 +6,23 @@
     using DigitalLearningSolutions.Data.Models.Courses;
     using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage;
     using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.CourseSetup;
+    using FakeItEasy;
     using FizzWare.NBuilder;
     using FluentAssertions;
     using FluentAssertions.Execution;
+    using Microsoft.Extensions.Configuration;
     using NUnit.Framework;
 
     public class SearchablePageViewModelTests
     {
         private CentreCourseDetails details = null!;
+        private IConfiguration config = null!;
 
         [SetUp]
         public void Setup()
         {
+            config = A.Fake();
+
             details = Builder.CreateNew()
                 .With(x => x.Courses = new List
                 {
@@ -53,7 +58,8 @@ public void SearchablePageViewModel_should_default_to_returning_the_first_ten_de
                 GenericSortingHelper.Ascending,
                 null,
                 1,
-                null
+                null,
+                config
             );
 
             // Then
@@ -76,7 +82,8 @@ public void SearchablePageViewModel_should_correctly_return_the_second_page_of_d
                 GenericSortingHelper.Ascending,
                 null,
                 2,
-                null
+                null,
+                config
             );
 
             // Then
@@ -100,7 +107,8 @@ public void SearchablePageViewModel_filters_should_be_set()
                 GenericSortingHelper.Ascending,
                 null,
                 2,
-                null
+                null,
+                config
             );
 
             // Then
@@ -121,7 +129,8 @@ public void SearchablePageViewModel_with_custom_items_per_page_should_return_the
                 GenericSortingHelper.Ascending,
                 null,
                 1,
-                itemsPerPage
+                itemsPerPage,
+                config
             );
 
             // Then
diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/FindYourCentre/FindYourCentreViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/FindYourCentre/FindYourCentreViewModelTests.cs
index 7bad2f0001..751a425192 100644
--- a/DigitalLearningSolutions.Web.Tests/ViewModels/FindYourCentre/FindYourCentreViewModelTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/ViewModels/FindYourCentre/FindYourCentreViewModelTests.cs
@@ -1,19 +1,30 @@
 namespace DigitalLearningSolutions.Web.Tests.ViewModels.FindYourCentre
 {
-    using DigitalLearningSolutions.Web.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Web.ViewModels.FindYourCentre;
+    using FakeItEasy;
     using FluentAssertions;
+    using Microsoft.Extensions.Configuration;
     using NUnit.Framework;
 
     public class FindYourCentreViewModelTests
     {
-        private string defaultUrl = ConfigHelper.GetAppConfig()["CurrentSystemBaseUrl"] + "/findyourcentre?nonav=true";
+        private IConfiguration config = null!;
+
+        [SetUp]
+        public void Setup()
+        {
+            config = A.Fake();
+        }
 
         [Test]
         public void FindYourCentreViewModel_without_centreid_should_have_default_Url()
         {
+            // Given
+            var defaultUrl = $"{config.GetCurrentSystemBaseUrl()}/findyourcentre?nonav=true";
+
             // When
-            var model = new FindYourCentreViewModel();
+            var model = new FindYourCentreViewModel(config);
 
             // Then
             model.Url.Should().BeEquivalentTo(defaultUrl);
@@ -24,12 +35,13 @@ public void FindYourCentreViewModel_with_centreid_should_have_centreid_added_to_
         {
             // Given
             var centreId = "5";
+            var defaultUrl = $"{config.GetCurrentSystemBaseUrl()}/findyourcentre?nonav=true¢reid={centreId}";
 
             // When
-            var model = new FindYourCentreViewModel(centreId);
+            var model = new FindYourCentreViewModel(centreId, config);
 
             // Then
-            model.Url.Should().BeEquivalentTo(defaultUrl + "¢reid=" + centreId);
+            model.Url.Should().BeEquivalentTo(defaultUrl);
         }
     }
 }
diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/ContentViewerViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/ContentViewerViewModelTests.cs
index 4653abb3bd..d2fc684140 100644
--- a/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/ContentViewerViewModelTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/ContentViewerViewModelTests.cs
@@ -9,7 +9,8 @@
 
     public class ContentViewerViewModelTests
     {
-        private IConfiguration config;
+        private IConfiguration config = null!;
+
         private const string BaseUrl = "https://example.com";
         private const int CustomisationId = 37545;
         private const int CentreId = 101;
diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/CourseCompletionViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/CourseCompletionViewModelTests.cs
index b9c624ea3e..7f109ff58f 100644
--- a/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/CourseCompletionViewModelTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/CourseCompletionViewModelTests.cs
@@ -8,9 +8,10 @@
     using Microsoft.Extensions.Configuration;
     using NUnit.Framework;
 
-    class CourseCompletionViewModelTests
+    public class CourseCompletionViewModelTests
     {
-        private IConfiguration config;
+        private IConfiguration config = null!;
+
         private const string BaseUrl = "https://example.com";
         private const int ProgressId = 23;
 
diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/DiagnosticContentViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/DiagnosticContentViewModelTests.cs
index 645bafeed1..32b16e5cd0 100644
--- a/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/DiagnosticContentViewModelTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/DiagnosticContentViewModelTests.cs
@@ -1,7 +1,6 @@
 namespace DigitalLearningSolutions.Web.Tests.ViewModels.LearningMenu
 {
     using System.Collections.Generic;
-    using DigitalLearningSolutions.Data.Tests.Helpers;
     using DigitalLearningSolutions.Data.Tests.TestHelpers;
     using DigitalLearningSolutions.Web.ViewModels.LearningMenu;
     using FakeItEasy;
@@ -11,7 +10,8 @@
 
     public class DiagnosticContentViewModelTests
     {
-        private IConfiguration config;
+        private IConfiguration config = null!;
+
         private const string BaseUrl = "https://example.com";
         private const int CustomisationId = 5;
         private const int CentreId = 6;
diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/PostLearningContentViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/PostLearningContentViewModelTests.cs
index 7c03edaae0..6b334882d8 100644
--- a/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/PostLearningContentViewModelTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/PostLearningContentViewModelTests.cs
@@ -1,6 +1,5 @@
 namespace DigitalLearningSolutions.Web.Tests.ViewModels.LearningMenu
 {
-    using DigitalLearningSolutions.Data.Tests.Helpers;
     using DigitalLearningSolutions.Data.Tests.TestHelpers;
     using DigitalLearningSolutions.Web.ViewModels.LearningMenu;
     using FakeItEasy;
@@ -10,7 +9,8 @@
 
     public class PostLearningContentViewModelTests
     {
-        private IConfiguration config;
+        private IConfiguration config = null!;
+
         private const string BaseUrl = "https://example.com";
         private const int CustomisationId = 5;
         private const int CentreId = 6;
diff --git a/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/SectionContentViewModelTests.cs b/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/SectionContentViewModelTests.cs
index 5acebc01a3..8d8dea17b0 100644
--- a/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/SectionContentViewModelTests.cs
+++ b/DigitalLearningSolutions.Web.Tests/ViewModels/LearningMenu/SectionContentViewModelTests.cs
@@ -1,802 +1,802 @@
-namespace DigitalLearningSolutions.Web.Tests.ViewModels.LearningMenu
-{
-    using System;
-    using DigitalLearningSolutions.Web.Helpers;
-    using DigitalLearningSolutions.Web.Tests.TestHelpers;
-    using DigitalLearningSolutions.Web.ViewModels.LearningMenu;
-    using FakeItEasy;
-    using FluentAssertions;
-    using Microsoft.Extensions.Configuration;
-    using NUnit.Framework;
-
-    public class SectionContentViewModelTests
-    {
-        private IConfiguration config;
-        private const int CustomisationId = 5;
-        private const int SectionId = 5;
-        private const string BaseUrl = "https://example.com";
-
-        [SetUp]
-        public void SetUp()
-        {
-            config = A.Fake();
-            A.CallTo(() => config["CurrentSystemBaseUrl"]).Returns(BaseUrl);
-        }
-
-        [Test]
-        public void Section_content_should_have_title()
-        {
-            // Given
-            const string applicationName = "Application name";
-            const string customisationName = "Customisation name";
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                applicationName: applicationName,
-                customisationName: customisationName
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.CourseTitle.Should().Be($"{applicationName} - {customisationName}");
-        }
-
-        [Test]
-        public void Section_content_should_have_section_name()
-        {
-            // Given
-            const string sectionName = "Section name";
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                sectionName: sectionName
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.SectionName.Should().Be(sectionName);
-        }
-
-        [Test]
-        public void Section_content_view_model_should_properly_convert_consolidation_path()
-        {
-            // Given
-            const string consolidationPath = "consolidation/path";
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                consolidationPath: consolidationPath
-            );
-            var expectedConsolidationPath = $"{BaseUrl}/tracking/dlconsolidation?client={consolidationPath}";
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ConsolidationExercisePath.Should().Be(expectedConsolidationPath);
-        }
-
-        [Test]
-        public void Section_content_should_have_consolidationExerciseLabel_from_courseSetting()
-        {
-            // Given
-            const string consolidationText = "Different consolidation description";
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                courseSettings: "{\"lm.ce\":\"" + consolidationText + "\"}"
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ConsolidationExerciseLabel.Should().Be(consolidationText);
-        }
-
-        [Test]
-        public void Section_content_should_have_default_consolidationExerciseLabel_when_courseSetting_is_empty()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                courseSettings: null
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ConsolidationExerciseLabel.Should().Be("Consolidation Exercise");
-        }
-
-        [Test]
-        public void Section_content_with_has_learning_and_courseSetting_should_show_percent_complete()
-        {
-            // Given
-            const string courseSettings = "{\"lm.sp\":true}"; // ShowPercentage = true
-            var tutorials = new[]
-            {
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
-            };
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                hasLearning: true,
-                courseSettings: courseSettings
-            );
-            sectionContent.Tutorials.AddRange(tutorials);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowPercentComplete.Should().BeTrue();
-        }
-
-        [Test]
-        public void Section_content_without_has_learning_should_not_show_percent_complete()
-        {
-            // Given
-            const string courseSettings = "{\"lm.sp\":true}"; // ShowPercentage = true
-            var tutorials = new[]
-            {
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
-            };
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                hasLearning: false,
-                courseSettings: courseSettings
-            );
-            sectionContent.Tutorials.AddRange(tutorials);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowPercentComplete.Should().BeFalse();
-        }
-
-        [Test]
-        public void Section_content_with_false_showPercentage_course_setting_should_not_show_percent_complete()
-        {
-            // Given
-            const string courseSettings = "{\"lm.sp\":false}"; // ShowPercentage = false
-            var tutorials = new[]
-            {
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
-            };
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                hasLearning: true,
-                courseSettings: courseSettings
-            );
-            sectionContent.Tutorials.AddRange(tutorials);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowPercentComplete.Should().BeFalse();
-        }
-
-        [Test]
-        public void Section_content_with_no_complete_tutorials_should_have_zero_percent_complete()
-        {
-            // Given
-            const bool hasLearning = true;
-            var tutorials = new[]
-            {
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
-            };
-            const int expectedPercentComplete = 0;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
-            sectionContent.Tutorials.AddRange(tutorials);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PercentComplete.Should().Be($"{expectedPercentComplete}% learning complete");
-        }
-
-        [Test]
-        public void Section_content_with_all_complete_tutorials_should_have_one_hundred_percent_complete()
-        {
-            // Given
-            const bool hasLearning = true;
-            var tutorials = new[]
-            {
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2)
-            };
-            const int expectedPercentComplete = 100;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
-            sectionContent.Tutorials.AddRange(tutorials);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PercentComplete.Should().Be($"{expectedPercentComplete}% learning complete");
-        }
-
-        [Test]
-        public void Section_content_with_all_started_tutorials_should_have_fifty_percent_complete()
-        {
-            // Given
-            const bool hasLearning = true;
-            var tutorials = new[]
-            {
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 1),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 1),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 1)
-            };
-            const int expectedPercentComplete = 50;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
-            sectionContent.Tutorials.AddRange(tutorials);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PercentComplete.Should().Be($"{expectedPercentComplete}% learning complete");
-        }
-
-        [Test]
-        public void Section_content_with_mixed_status_tutorials_that_dont_need_rounding_returns_correct_percent_complete()
-        {
-            // Given
-            const bool hasLearning = true;
-            var tutorials = new[]
-            {
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 1),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 1),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2)
-            };
-            const int expectedPercentComplete = 50;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
-            sectionContent.Tutorials.AddRange(tutorials);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PercentComplete.Should().Be($"{expectedPercentComplete}% learning complete");
-        }
-
-        [Test]
-        public void Section_content_with_mixed_status_tutorials_that_need_rounding_returns_correct_percent_complete()
-        {
-            // Given
-            const bool hasLearning = true;
-            var tutorials = new[]
-            {
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
-            };
-            const int roundedPercentComplete = 33;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
-            sectionContent.Tutorials.AddRange(tutorials);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PercentComplete.Should().Be($"{roundedPercentComplete}% learning complete");
-        }
-
-        [Test]
-        public void Percent_complete_should_correctly_be_floored()
-        {
-            // Given
-            const bool hasLearning = true;
-            var tutorials = new[]
-            {
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
-                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
-            };
-            // Percent complete will be 66.666667 which when floored should be 66
-            const int roundedPercentComplete = 66;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
-            sectionContent.Tutorials.AddRange(tutorials);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PercentComplete.Should().Be($"{roundedPercentComplete}% learning complete");
-        }
-
-        [Test]
-        public void Section_content_should_have_customisation_id()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent();
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.CustomisationId.Should().Be(CustomisationId);
-        }
-
-        [Test]
-        public void Section_content_post_learning_passed_should_be_false_if_pl_passes_is_zero()
-        {
-            // When
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(plPasses: 0);
-
-            // Then
-            sectionContent.PostLearningPassed.Should().BeFalse();
-        }
-
-        [Test]
-        public void Section_content_post_learning_passed_should_be_true_if_pl_passes_is_one()
-        {
-            // When
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(plPasses: 1);
-
-            // Then
-            sectionContent.PostLearningPassed.Should().BeTrue();
-        }
-
-        [Test]
-        public void Section_content_post_learning_passed_should_be_true_if_pl_passes_is_more_than_one()
-        {
-            // When
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(plPasses: 3);
-
-            // Then
-            sectionContent.PostLearningPassed.Should().BeTrue();
-        }
-
-        [Test]
-        public void Post_learning_should_not_be_shown_if_no_post_learning_path()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(plAssessPath: null);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowPostLearning.Should().BeFalse();
-        }
-
-        [Test]
-        public void Post_learning_should_not_be_shown_if_is_assessed_is_false()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(isAssessed: false);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowPostLearning.Should().BeFalse();
-        }
-
-        [Test]
-        public void Post_learning_should_be_shown_if_there_is_post_learning_path_and_is_assessed_is_true()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                plAssessPath: "https://www.dls.nhs.uk/CMS/CMSContent/Course308/PLAssess/02-PLA-Entering-data/itspplayer.html",
-                isAssessed: true);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowPostLearning.Should().BeTrue();
-        }
-
-        [Test]
-        public void Diagnostic_assessment_should_not_be_shown_if_no_diagnostic_path()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(diagAssessPath: null);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowDiagnostic.Should().BeFalse();
-        }
-
-        [Test]
-        public void Diagnostic_assessment_should_not_be_shown_if_diag_status_is_false()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(diagStatus: false);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowDiagnostic.Should().BeFalse();
-        }
-
-        [Test]
-        public void Diagnostic_assessment_should_be_shown_if_diag_status_is_true_and_diag_assessment_path_exists()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                diagAssessPath: "https://www.dls.nhs.uk/CMS/CMSContent/Course308/Diagnostic/02-DIAG-Entering-data/itspplayer.html",
-                diagStatus: true);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowDiagnostic.Should().BeTrue();
-        }
-
-        [Test]
-        public void Post_learning_status_should_be_not_attempted_if_pl_attempts_is_zero()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 0);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PostLearningStatus.Should().Be("Not Attempted");
-        }
-
-        [Test]
-        public void Post_learning_status_should_be_failed_if_pl_attempts_is_more_than_zero_and_pl_passes_is_zero()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 3, plPasses: 0);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PostLearningStatus.Should().Be("Failed");
-        }
-
-        [Test]
-        public void Post_learning_status_should_be_passed_if_pl_attempts_is_more_than_zero_and_pl_passes_is_more_than_zero()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 3, plPasses: 1);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PostLearningStatus.Should().Be("Passed");
-        }
-
-        [Test]
-        public void Post_learning_status_styling_should_have_not_passed_styling_if_pl_attempts_is_zero()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 0);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PostLearningStatusStyling.Should().Be("not-passed-text");
-        }
-
-        [Test]
-        public void Post_learning_status_should_have_not_passed_styling_if_pl_attempts_is_more_than_zero_and_pl_passes_is_zero()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 3, plPasses: 0);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PostLearningStatusStyling.Should().Be("not-passed-text");
-        }
-
-        [Test]
-        public void Post_learning_status_should_have_passed_styling_if_pl_attempts_is_more_than_zero_and_pl_passes_is_more_than_zero()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 3, plPasses: 1);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.PostLearningStatusStyling.Should().Be("passed-text");
-        }
-
-        [Test]
-        public void Diagnostic_assessment_completion_status_is_not_attempted_if_diag_attempts_is_zero()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(diagAttempts: 0);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.DiagnosticCompletionStatus.Should().Be("Not Attempted");
-        }
-
-        [Test]
-        public void Diagnostic_assessment_completion_status_shows_score_and_attempts_if_diag_attempts_is_more_than_0()
-        {
-            // Given
-            const int diagAttempts = 4;
-            const int secScore = 10;
-            const int secOutOf = 15;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                diagAttempts: diagAttempts,
-                secScore: secScore,
-                secOutOf: secOutOf);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.DiagnosticCompletionStatus.Should().Be($"{secScore}/{secOutOf} - {diagAttempts} attempts");
-        }
-
-        [Test]
-        public void Diagnostic_assessment_completion_status_does_not_use_plural_if_attempts_is_one()
-        {
-            // Given
-            const int diagAttempts = 1;
-            const int secScore = 10;
-            const int secOutOf = 15;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                diagAttempts: diagAttempts,
-                secScore: secScore,
-                secOutOf: secOutOf);
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.DiagnosticCompletionStatus.Should().Be($"{secScore}/{secOutOf} - {diagAttempts} attempt");
-        }
-
-        [TestCase(true, true, true, true, true)]
-        [TestCase(true, true, true, false, true)]
-        [TestCase(true, true, false, true, true)]
-        [TestCase(true, true, false, false, true)]
-        [TestCase(true, false, true, true, true)]
-        [TestCase(true, false, true, false, true)]
-        [TestCase(true, false, false, true, true)]
-        [TestCase(true, false, false, false, false)]
-        [TestCase(false, true, true, true, false)]
-        [TestCase(false, true, true, false, false)]
-        [TestCase(false, true, false, true, false)]
-        [TestCase(false, true, false, false, false)]
-        [TestCase(false, false, true, true, false)]
-        [TestCase(false, false, true, false, false)]
-        [TestCase(false, false, false, true, false)]
-        [TestCase(false, false, false, false, false)]
-        public void Diagnostic_assessment_separator_displays_in_correct_situations(
-            bool showDiagnosticAssessment,
-            bool showTutorials,
-            bool showPostLearningAssessment,
-            bool showConsolidationExercise,
-            bool separatorExpected
-        )
-        {
-            // Given
-            var consolidationPath = showConsolidationExercise
-                ? "https://www.dls.nhs.uk/tracking/MOST/Word07Core/cons/WC07-Exercise_1.zip"
-                : null;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                diagStatus: showDiagnosticAssessment,
-                isAssessed: showPostLearningAssessment,
-                consolidationPath: consolidationPath
-            );
-            if (showTutorials)
-            {
-                var tutorials = new[]
-                {
-                    SectionTutorialHelper.CreateDefaultSectionTutorial(),
-                    SectionTutorialHelper.CreateDefaultSectionTutorial()
-                };
-                sectionContent.Tutorials.AddRange(tutorials);
-            }
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.DisplayDiagnosticSeparator.Should().Be(separatorExpected);
-        }
-
-        [TestCase(true, true, true, true)]
-        [TestCase(true, false, true, true)]
-        [TestCase(true, true, false, true)]
-        [TestCase(true, false, false, false)]
-        [TestCase(false, true, true, false)]
-        [TestCase(false, false, true, false)]
-        [TestCase(false, true, false, false)]
-        [TestCase(false, false, false, false)]
-        public void Tutorial_separator_displays_in_correct_situations(
-            bool showTutorials,
-            bool showPostLearningAssessment,
-            bool showConsolidationExercise,
-            bool separatorExpected
-        )
-        {
-            // Given
-            var consolidationPath = showConsolidationExercise
-                ? "https://www.dls.nhs.uk/tracking/MOST/Word07Core/cons/WC07-Exercise_1.zip"
-                : null;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                isAssessed: showPostLearningAssessment,
-                consolidationPath: consolidationPath
-            );
-            if (showTutorials)
-            {
-                var tutorials = new[]
-                {
-                    SectionTutorialHelper.CreateDefaultSectionTutorial(),
-                    SectionTutorialHelper.CreateDefaultSectionTutorial()
-                };
-                sectionContent.Tutorials.AddRange(tutorials);
-            }
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.DisplayTutorialSeparator.Should().Be(separatorExpected);
-        }
-
-        [TestCase(true, true, true)]
-        [TestCase(true, false, false)]
-        [TestCase(false, true, false)]
-        [TestCase(false, false, false)]
-        public void Post_learning_separator_displays_in_correct_situations(
-            bool showPostLearningAssessment,
-            bool showConsolidationExercise,
-            bool separatorExpected
-        )
-        {
-            // Given
-            var consolidationPath = showConsolidationExercise
-                ? "https://www.dls.nhs.uk/tracking/MOST/Word07Core/cons/WC07-Exercise_1.zip"
-                : null;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                isAssessed: showPostLearningAssessment,
-                consolidationPath: consolidationPath
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.DisplayPostLearningSeparator.Should().Be(separatorExpected);
-        }
-
-        [Test]
-        public void Should_have_next_section_id_if_there_is_one()
-        {
-            // Given
-            const int nextSectionId = 2;
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                nextSectionId: nextSectionId
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.NextSectionId.Should().Be(nextSectionId);
-        }
-
-        [Test]
-        public void Should_have_null_next_section_id_if_there_is_no_next_section()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                nextSectionId: null
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.NextSectionId.Should().BeNull();
-        }
-
-        [Test]
-        public void Section_content_should_have_otherSectionsExist_when_other_sections_exist()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                otherSectionsExist: true
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.OtherSectionsExist.Should().BeTrue();
-        }
-
-        [Test]
-        public void Section_content_should_not_have_otherSectionsExist_when_no_other_sections_exist()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                otherSectionsExist: false
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.OtherSectionsExist.Should().BeFalse();
-        }
-
-        [Test]
-        public void Section_content_should_show_completion_summary_when_include_certification_and_only_section()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                otherSectionsExist: false,
-                includeCertification: true
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowCompletionSummary.Should().BeTrue();
-        }
-
-        [Test]
-        public void Section_content_should_not_show_completion_summary_when_include_certification_is_false()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                otherSectionsExist: false,
-                includeCertification: false
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowCompletionSummary.Should().BeFalse();
-        }
-
-        [Test]
-        public void Section_content_should_not_show_completion_summary_when_other_sections_exist()
-        {
-            // Given
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
-                otherSectionsExist: true,
-                includeCertification: true
-            );
-
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
-
-            // Then
-            sectionContentViewModel.ShowCompletionSummary.Should().BeFalse();
-        }
-
-        [TestCase(2, "2020-12-25T15:00:00Z", 1, true, 75, 80, 85)]
-        [TestCase(3, null, 0, true, 75, 80, 85)]
-        [TestCase(4, null, 3, true, 75, 80, 85)]
-        [TestCase(5, null, 3, false, 75, 80, 85)]
-        [TestCase(6, null, 3, false, 75, 80, 0)]
-        [TestCase(7, null, 3, false, 75, 0, 85)]
-        [TestCase(8, null, 3, false, 75, 0, 0)]
+namespace DigitalLearningSolutions.Web.Tests.ViewModels.LearningMenu
+{
+    using System;
+    using DigitalLearningSolutions.Web.Tests.TestHelpers;
+    using DigitalLearningSolutions.Web.ViewModels.LearningMenu;
+    using FakeItEasy;
+    using FluentAssertions;
+    using Microsoft.Extensions.Configuration;
+    using NUnit.Framework;
+
+    public class SectionContentViewModelTests
+    {
+        private IConfiguration config = null!;
+
+        private const int CustomisationId = 5;
+        private const int SectionId = 5;
+        private const string BaseUrl = "https://example.com";
+
+        [SetUp]
+        public void SetUp()
+        {
+            config = A.Fake();
+            A.CallTo(() => config["CurrentSystemBaseUrl"]).Returns(BaseUrl);
+        }
+
+        [Test]
+        public void Section_content_should_have_title()
+        {
+            // Given
+            const string applicationName = "Application name";
+            const string customisationName = "Customisation name";
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                applicationName: applicationName,
+                customisationName: customisationName
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.CourseTitle.Should().Be($"{applicationName} - {customisationName}");
+        }
+
+        [Test]
+        public void Section_content_should_have_section_name()
+        {
+            // Given
+            const string sectionName = "Section name";
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                sectionName: sectionName
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.SectionName.Should().Be(sectionName);
+        }
+
+        [Test]
+        public void Section_content_view_model_should_properly_convert_consolidation_path()
+        {
+            // Given
+            const string consolidationPath = "consolidation/path";
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                consolidationPath: consolidationPath
+            );
+            var expectedConsolidationPath = $"{BaseUrl}/tracking/dlconsolidation?client={consolidationPath}";
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ConsolidationExercisePath.Should().Be(expectedConsolidationPath);
+        }
+
+        [Test]
+        public void Section_content_should_have_consolidationExerciseLabel_from_courseSetting()
+        {
+            // Given
+            const string consolidationText = "Different consolidation description";
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                courseSettings: "{\"lm.ce\":\"" + consolidationText + "\"}"
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ConsolidationExerciseLabel.Should().Be(consolidationText);
+        }
+
+        [Test]
+        public void Section_content_should_have_default_consolidationExerciseLabel_when_courseSetting_is_empty()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                courseSettings: null
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ConsolidationExerciseLabel.Should().Be("Consolidation Exercise");
+        }
+
+        [Test]
+        public void Section_content_with_has_learning_and_courseSetting_should_show_percent_complete()
+        {
+            // Given
+            const string courseSettings = "{\"lm.sp\":true}"; // ShowPercentage = true
+            var tutorials = new[]
+            {
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
+            };
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                hasLearning: true,
+                courseSettings: courseSettings
+            );
+            sectionContent.Tutorials.AddRange(tutorials);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowPercentComplete.Should().BeTrue();
+        }
+
+        [Test]
+        public void Section_content_without_has_learning_should_not_show_percent_complete()
+        {
+            // Given
+            const string courseSettings = "{\"lm.sp\":true}"; // ShowPercentage = true
+            var tutorials = new[]
+            {
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
+            };
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                hasLearning: false,
+                courseSettings: courseSettings
+            );
+            sectionContent.Tutorials.AddRange(tutorials);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowPercentComplete.Should().BeFalse();
+        }
+
+        [Test]
+        public void Section_content_with_false_showPercentage_course_setting_should_not_show_percent_complete()
+        {
+            // Given
+            const string courseSettings = "{\"lm.sp\":false}"; // ShowPercentage = false
+            var tutorials = new[]
+            {
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
+            };
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                hasLearning: true,
+                courseSettings: courseSettings
+            );
+            sectionContent.Tutorials.AddRange(tutorials);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowPercentComplete.Should().BeFalse();
+        }
+
+        [Test]
+        public void Section_content_with_no_complete_tutorials_should_have_zero_percent_complete()
+        {
+            // Given
+            const bool hasLearning = true;
+            var tutorials = new[]
+            {
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
+            };
+            const int expectedPercentComplete = 0;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
+            sectionContent.Tutorials.AddRange(tutorials);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PercentComplete.Should().Be($"{expectedPercentComplete}% learning complete");
+        }
+
+        [Test]
+        public void Section_content_with_all_complete_tutorials_should_have_one_hundred_percent_complete()
+        {
+            // Given
+            const bool hasLearning = true;
+            var tutorials = new[]
+            {
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2)
+            };
+            const int expectedPercentComplete = 100;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
+            sectionContent.Tutorials.AddRange(tutorials);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PercentComplete.Should().Be($"{expectedPercentComplete}% learning complete");
+        }
+
+        [Test]
+        public void Section_content_with_all_started_tutorials_should_have_fifty_percent_complete()
+        {
+            // Given
+            const bool hasLearning = true;
+            var tutorials = new[]
+            {
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 1),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 1),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 1)
+            };
+            const int expectedPercentComplete = 50;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
+            sectionContent.Tutorials.AddRange(tutorials);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PercentComplete.Should().Be($"{expectedPercentComplete}% learning complete");
+        }
+
+        [Test]
+        public void Section_content_with_mixed_status_tutorials_that_dont_need_rounding_returns_correct_percent_complete()
+        {
+            // Given
+            const bool hasLearning = true;
+            var tutorials = new[]
+            {
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 1),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 1),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2)
+            };
+            const int expectedPercentComplete = 50;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
+            sectionContent.Tutorials.AddRange(tutorials);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PercentComplete.Should().Be($"{expectedPercentComplete}% learning complete");
+        }
+
+        [Test]
+        public void Section_content_with_mixed_status_tutorials_that_need_rounding_returns_correct_percent_complete()
+        {
+            // Given
+            const bool hasLearning = true;
+            var tutorials = new[]
+            {
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
+            };
+            const int roundedPercentComplete = 33;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
+            sectionContent.Tutorials.AddRange(tutorials);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PercentComplete.Should().Be($"{roundedPercentComplete}% learning complete");
+        }
+
+        [Test]
+        public void Percent_complete_should_correctly_be_floored()
+        {
+            // Given
+            const bool hasLearning = true;
+            var tutorials = new[]
+            {
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 2),
+                SectionTutorialHelper.CreateDefaultSectionTutorial(tutStat: 0)
+            };
+            // Percent complete will be 66.666667 which when floored should be 66
+            const int roundedPercentComplete = 66;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(hasLearning: hasLearning);
+            sectionContent.Tutorials.AddRange(tutorials);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PercentComplete.Should().Be($"{roundedPercentComplete}% learning complete");
+        }
+
+        [Test]
+        public void Section_content_should_have_customisation_id()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent();
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.CustomisationId.Should().Be(CustomisationId);
+        }
+
+        [Test]
+        public void Section_content_post_learning_passed_should_be_false_if_pl_passes_is_zero()
+        {
+            // When
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(plPasses: 0);
+
+            // Then
+            sectionContent.PostLearningPassed.Should().BeFalse();
+        }
+
+        [Test]
+        public void Section_content_post_learning_passed_should_be_true_if_pl_passes_is_one()
+        {
+            // When
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(plPasses: 1);
+
+            // Then
+            sectionContent.PostLearningPassed.Should().BeTrue();
+        }
+
+        [Test]
+        public void Section_content_post_learning_passed_should_be_true_if_pl_passes_is_more_than_one()
+        {
+            // When
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(plPasses: 3);
+
+            // Then
+            sectionContent.PostLearningPassed.Should().BeTrue();
+        }
+
+        [Test]
+        public void Post_learning_should_not_be_shown_if_no_post_learning_path()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(plAssessPath: null);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowPostLearning.Should().BeFalse();
+        }
+
+        [Test]
+        public void Post_learning_should_not_be_shown_if_is_assessed_is_false()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(isAssessed: false);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowPostLearning.Should().BeFalse();
+        }
+
+        [Test]
+        public void Post_learning_should_be_shown_if_there_is_post_learning_path_and_is_assessed_is_true()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                plAssessPath: "https://www.dls.nhs.uk/CMS/CMSContent/Course308/PLAssess/02-PLA-Entering-data/itspplayer.html",
+                isAssessed: true);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowPostLearning.Should().BeTrue();
+        }
+
+        [Test]
+        public void Diagnostic_assessment_should_not_be_shown_if_no_diagnostic_path()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(diagAssessPath: null);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowDiagnostic.Should().BeFalse();
+        }
+
+        [Test]
+        public void Diagnostic_assessment_should_not_be_shown_if_diag_status_is_false()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(diagStatus: false);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowDiagnostic.Should().BeFalse();
+        }
+
+        [Test]
+        public void Diagnostic_assessment_should_be_shown_if_diag_status_is_true_and_diag_assessment_path_exists()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                diagAssessPath: "https://www.dls.nhs.uk/CMS/CMSContent/Course308/Diagnostic/02-DIAG-Entering-data/itspplayer.html",
+                diagStatus: true);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowDiagnostic.Should().BeTrue();
+        }
+
+        [Test]
+        public void Post_learning_status_should_be_not_attempted_if_pl_attempts_is_zero()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 0);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PostLearningStatus.Should().Be("Not Attempted");
+        }
+
+        [Test]
+        public void Post_learning_status_should_be_failed_if_pl_attempts_is_more_than_zero_and_pl_passes_is_zero()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 3, plPasses: 0);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PostLearningStatus.Should().Be("Failed");
+        }
+
+        [Test]
+        public void Post_learning_status_should_be_passed_if_pl_attempts_is_more_than_zero_and_pl_passes_is_more_than_zero()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 3, plPasses: 1);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PostLearningStatus.Should().Be("Passed");
+        }
+
+        [Test]
+        public void Post_learning_status_styling_should_have_not_passed_styling_if_pl_attempts_is_zero()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 0);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PostLearningStatusStyling.Should().Be("not-passed-text");
+        }
+
+        [Test]
+        public void Post_learning_status_should_have_not_passed_styling_if_pl_attempts_is_more_than_zero_and_pl_passes_is_zero()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 3, plPasses: 0);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PostLearningStatusStyling.Should().Be("not-passed-text");
+        }
+
+        [Test]
+        public void Post_learning_status_should_have_passed_styling_if_pl_attempts_is_more_than_zero_and_pl_passes_is_more_than_zero()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(attemptsPl: 3, plPasses: 1);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.PostLearningStatusStyling.Should().Be("passed-text");
+        }
+
+        [Test]
+        public void Diagnostic_assessment_completion_status_is_not_attempted_if_diag_attempts_is_zero()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(diagAttempts: 0);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.DiagnosticCompletionStatus.Should().Be("Not Attempted");
+        }
+
+        [Test]
+        public void Diagnostic_assessment_completion_status_shows_score_and_attempts_if_diag_attempts_is_more_than_0()
+        {
+            // Given
+            const int diagAttempts = 4;
+            const int secScore = 10;
+            const int secOutOf = 15;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                diagAttempts: diagAttempts,
+                secScore: secScore,
+                secOutOf: secOutOf);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.DiagnosticCompletionStatus.Should().Be($"{secScore}/{secOutOf} - {diagAttempts} attempts");
+        }
+
+        [Test]
+        public void Diagnostic_assessment_completion_status_does_not_use_plural_if_attempts_is_one()
+        {
+            // Given
+            const int diagAttempts = 1;
+            const int secScore = 10;
+            const int secOutOf = 15;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                diagAttempts: diagAttempts,
+                secScore: secScore,
+                secOutOf: secOutOf);
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.DiagnosticCompletionStatus.Should().Be($"{secScore}/{secOutOf} - {diagAttempts} attempt");
+        }
+
+        [TestCase(true, true, true, true, true)]
+        [TestCase(true, true, true, false, true)]
+        [TestCase(true, true, false, true, true)]
+        [TestCase(true, true, false, false, true)]
+        [TestCase(true, false, true, true, true)]
+        [TestCase(true, false, true, false, true)]
+        [TestCase(true, false, false, true, true)]
+        [TestCase(true, false, false, false, false)]
+        [TestCase(false, true, true, true, false)]
+        [TestCase(false, true, true, false, false)]
+        [TestCase(false, true, false, true, false)]
+        [TestCase(false, true, false, false, false)]
+        [TestCase(false, false, true, true, false)]
+        [TestCase(false, false, true, false, false)]
+        [TestCase(false, false, false, true, false)]
+        [TestCase(false, false, false, false, false)]
+        public void Diagnostic_assessment_separator_displays_in_correct_situations(
+            bool showDiagnosticAssessment,
+            bool showTutorials,
+            bool showPostLearningAssessment,
+            bool showConsolidationExercise,
+            bool separatorExpected
+        )
+        {
+            // Given
+            var consolidationPath = showConsolidationExercise
+                ? "https://www.dls.nhs.uk/tracking/MOST/Word07Core/cons/WC07-Exercise_1.zip"
+                : null;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                diagStatus: showDiagnosticAssessment,
+                isAssessed: showPostLearningAssessment,
+                consolidationPath: consolidationPath
+            );
+            if (showTutorials)
+            {
+                var tutorials = new[]
+                {
+                    SectionTutorialHelper.CreateDefaultSectionTutorial(),
+                    SectionTutorialHelper.CreateDefaultSectionTutorial()
+                };
+                sectionContent.Tutorials.AddRange(tutorials);
+            }
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.DisplayDiagnosticSeparator.Should().Be(separatorExpected);
+        }
+
+        [TestCase(true, true, true, true)]
+        [TestCase(true, false, true, true)]
+        [TestCase(true, true, false, true)]
+        [TestCase(true, false, false, false)]
+        [TestCase(false, true, true, false)]
+        [TestCase(false, false, true, false)]
+        [TestCase(false, true, false, false)]
+        [TestCase(false, false, false, false)]
+        public void Tutorial_separator_displays_in_correct_situations(
+            bool showTutorials,
+            bool showPostLearningAssessment,
+            bool showConsolidationExercise,
+            bool separatorExpected
+        )
+        {
+            // Given
+            var consolidationPath = showConsolidationExercise
+                ? "https://www.dls.nhs.uk/tracking/MOST/Word07Core/cons/WC07-Exercise_1.zip"
+                : null;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                isAssessed: showPostLearningAssessment,
+                consolidationPath: consolidationPath
+            );
+            if (showTutorials)
+            {
+                var tutorials = new[]
+                {
+                    SectionTutorialHelper.CreateDefaultSectionTutorial(),
+                    SectionTutorialHelper.CreateDefaultSectionTutorial()
+                };
+                sectionContent.Tutorials.AddRange(tutorials);
+            }
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.DisplayTutorialSeparator.Should().Be(separatorExpected);
+        }
+
+        [TestCase(true, true, true)]
+        [TestCase(true, false, false)]
+        [TestCase(false, true, false)]
+        [TestCase(false, false, false)]
+        public void Post_learning_separator_displays_in_correct_situations(
+            bool showPostLearningAssessment,
+            bool showConsolidationExercise,
+            bool separatorExpected
+        )
+        {
+            // Given
+            var consolidationPath = showConsolidationExercise
+                ? "https://www.dls.nhs.uk/tracking/MOST/Word07Core/cons/WC07-Exercise_1.zip"
+                : null;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                isAssessed: showPostLearningAssessment,
+                consolidationPath: consolidationPath
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.DisplayPostLearningSeparator.Should().Be(separatorExpected);
+        }
+
+        [Test]
+        public void Should_have_next_section_id_if_there_is_one()
+        {
+            // Given
+            const int nextSectionId = 2;
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                nextSectionId: nextSectionId
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.NextSectionId.Should().Be(nextSectionId);
+        }
+
+        [Test]
+        public void Should_have_null_next_section_id_if_there_is_no_next_section()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                nextSectionId: null
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.NextSectionId.Should().BeNull();
+        }
+
+        [Test]
+        public void Section_content_should_have_otherSectionsExist_when_other_sections_exist()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                otherSectionsExist: true
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.OtherSectionsExist.Should().BeTrue();
+        }
+
+        [Test]
+        public void Section_content_should_not_have_otherSectionsExist_when_no_other_sections_exist()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                otherSectionsExist: false
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.OtherSectionsExist.Should().BeFalse();
+        }
+
+        [Test]
+        public void Section_content_should_show_completion_summary_when_include_certification_and_only_section()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                otherSectionsExist: false,
+                includeCertification: true
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowCompletionSummary.Should().BeTrue();
+        }
+
+        [Test]
+        public void Section_content_should_not_show_completion_summary_when_include_certification_is_false()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                otherSectionsExist: false,
+                includeCertification: false
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowCompletionSummary.Should().BeFalse();
+        }
+
+        [Test]
+        public void Section_content_should_not_show_completion_summary_when_other_sections_exist()
+        {
+            // Given
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+                otherSectionsExist: true,
+                includeCertification: true
+            );
+
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, CustomisationId, SectionId);
+
+            // Then
+            sectionContentViewModel.ShowCompletionSummary.Should().BeFalse();
+        }
+
+        [TestCase(2, "2020-12-25T15:00:00Z", 1, true, 75, 80, 85)]
+        [TestCase(3, null, 0, true, 75, 80, 85)]
+        [TestCase(4, null, 3, true, 75, 80, 85)]
+        [TestCase(5, null, 3, false, 75, 80, 85)]
+        [TestCase(6, null, 3, false, 75, 80, 0)]
+        [TestCase(7, null, 3, false, 75, 0, 85)]
+        [TestCase(8, null, 3, false, 75, 0, 0)]
         public void Section_content_should_have_completion_summary_card_view_model(
             int customisationId,
             string? completed,
@@ -808,9 +808,9 @@ int tutorialsCompletionThreshold
         )
         {
             // Given
-            var completedDateTime = completed != null ? DateTime.Parse(completed) : (DateTime?)null;
-
-            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
+            var completedDateTime = completed != null ? DateTime.Parse(completed) : (DateTime?)null;
+
+            var sectionContent = SectionContentHelper.CreateDefaultSectionContent(
                 completed: completedDateTime,
                 maxPostLearningAssessmentAttempts: maxPostLearningAssessmentAttempts,
                 isAssessed: isAssessed,
@@ -829,12 +829,12 @@ int tutorialsCompletionThreshold
                 tutorialsCompletionThreshold
             );
 
-            // When
-            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, customisationId, SectionId);
+            // When
+            var sectionContentViewModel = new SectionContentViewModel(config, sectionContent, customisationId, SectionId);
 
-            // Then
+            // Then
             sectionContentViewModel.CompletionSummaryCardViewModel
                 .Should().BeEquivalentTo(expectedCompletionSummaryViewModel);
-        }
-    }
-}
+        }
+    }
+}
diff --git a/DigitalLearningSolutions.Web/Controllers/FindYourCentreController.cs b/DigitalLearningSolutions.Web/Controllers/FindYourCentreController.cs
index bcfc3ad0ef..03e9adb104 100644
--- a/DigitalLearningSolutions.Web/Controllers/FindYourCentreController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/FindYourCentreController.cs
@@ -5,15 +5,26 @@
     using DigitalLearningSolutions.Web.Models.Enums;
     using DigitalLearningSolutions.Web.ViewModels.FindYourCentre;
     using Microsoft.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
 
     [SetDlsSubApplication(nameof(DlsSubApplication.Main))]
     [SetSelectedTab(nameof(NavMenuTab.FindYourCentre))]
     public class FindYourCentreController : Controller
     {
+        private readonly IConfiguration configuration;
+
+        public FindYourCentreController(IConfiguration configuration)
+        {
+            this.configuration = configuration;
+        }
+
         [RedirectDelegateOnlyToLearningPortal]
         public IActionResult Index(string? centreId)
         {
-            var model = centreId == null ? new FindYourCentreViewModel() : new FindYourCentreViewModel(centreId);
+            var model = centreId == null
+                ? new FindYourCentreViewModel(configuration)
+                : new FindYourCentreViewModel(centreId, configuration);
+
             return View(model);
         }
     }
diff --git a/DigitalLearningSolutions.Web/Controllers/ForgotPasswordController.cs b/DigitalLearningSolutions.Web/Controllers/ForgotPasswordController.cs
index e1bc64d00c..c63324c700 100644
--- a/DigitalLearningSolutions.Web/Controllers/ForgotPasswordController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/ForgotPasswordController.cs
@@ -3,22 +3,25 @@
     using System.Threading.Tasks;
     using DigitalLearningSolutions.Data.Enums;
     using DigitalLearningSolutions.Data.Exceptions;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Services;
     using DigitalLearningSolutions.Web.Attributes;
-    using DigitalLearningSolutions.Web.Helpers;
     using DigitalLearningSolutions.Web.Models.Enums;
     using DigitalLearningSolutions.Web.ViewModels.ForgotPassword;
     using Microsoft.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
 
     [SetDlsSubApplication(nameof(DlsSubApplication.Main))]
     [SetSelectedTab(nameof(NavMenuTab.LogIn))]
     public class ForgotPasswordController : Controller
     {
         private readonly IPasswordResetService passwordResetService;
+        private readonly IConfiguration config;
 
-        public ForgotPasswordController(IPasswordResetService passwordResetService)
+        public ForgotPasswordController(IPasswordResetService passwordResetService, IConfiguration config)
         {
             this.passwordResetService = passwordResetService;
+            this.config = config;
         }
 
         [HttpGet]
@@ -40,7 +43,7 @@ public async Task Index(ForgotPasswordViewModel model)
                 return View(model);
             }
 
-            string baseUrl = ConfigHelper.GetAppConfig().GetAppRootPath();
+            var baseUrl = config.GetAppRootPath();
 
             try
             {
diff --git a/DigitalLearningSolutions.Web/Controllers/HomeController.cs b/DigitalLearningSolutions.Web/Controllers/HomeController.cs
index 97c325c738..a460a9b3bf 100644
--- a/DigitalLearningSolutions.Web/Controllers/HomeController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/HomeController.cs
@@ -2,7 +2,7 @@
 {
     using System.Collections.Generic;
     using DigitalLearningSolutions.Data.Enums;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Web.Attributes;
     using DigitalLearningSolutions.Web.Models.Enums;
     using DigitalLearningSolutions.Web.ViewModels.Common.MiniHub;
diff --git a/DigitalLearningSolutions.Web/Controllers/LearningMenuController/LearningMenuController.cs b/DigitalLearningSolutions.Web/Controllers/LearningMenuController/LearningMenuController.cs
index e0207f7799..43f95e9e6e 100644
--- a/DigitalLearningSolutions.Web/Controllers/LearningMenuController/LearningMenuController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/LearningMenuController/LearningMenuController.cs
@@ -17,12 +17,11 @@ public class LearningMenuController : Controller
     {
         private readonly ILogger logger;
         private readonly IConfiguration config;
-        private readonly IConfigService configService;
+        private readonly IConfigDataService configDataService;
         private readonly ICourseContentService courseContentService;
         private readonly ISessionService sessionService;
         private readonly ISectionContentDataService sectionContentDataService;
         private readonly ITutorialContentDataService tutorialContentDataService;
-        private readonly IDiagnosticAssessmentDataService diagnosticAssessmentDataService;
         private readonly IDiagnosticAssessmentService diagnosticAssessmentService;
         private readonly IPostLearningAssessmentService postLearningAssessmentService;
         private readonly ICourseCompletionService courseCompletionService;
@@ -30,11 +29,10 @@ public class LearningMenuController : Controller
         public LearningMenuController(
             ILogger logger,
             IConfiguration config,
-            IConfigService configService,
+            IConfigDataService configDataService,
             ICourseContentService courseContentService,
             ISectionContentDataService sectionContentDataService,
             ITutorialContentDataService tutorialContentDataService,
-            IDiagnosticAssessmentDataService diagnosticAssessmentDataService,
             IDiagnosticAssessmentService diagnosticAssessmentService,
             IPostLearningAssessmentService postLearningAssessmentService,
             ISessionService sessionService,
@@ -43,12 +41,11 @@ ICourseCompletionService courseCompletionService
         {
             this.logger = logger;
             this.config = config;
-            this.configService = configService;
+            this.configDataService = configDataService;
             this.courseContentService = courseContentService;
             this.tutorialContentDataService = tutorialContentDataService;
             this.sessionService = sessionService;
             this.sectionContentDataService = sectionContentDataService;
-            this.diagnosticAssessmentDataService = diagnosticAssessmentDataService;
             this.diagnosticAssessmentService = diagnosticAssessmentService;
             this.postLearningAssessmentService = postLearningAssessmentService;
             this.courseCompletionService = courseCompletionService;
@@ -60,7 +57,7 @@ public IActionResult Index(int customisationId)
             var centreId = User.GetCentreId();
             if (config.GetValue("LegacyLearningMenu") != "")
             {
-                if ((config.GetValue("LegacyLearningMenu") && !configService.GetCentreBetaTesting(centreId))|(!config.GetValue("LegacyLearningMenu") && configService.GetCentreBetaTesting(centreId)))
+                if ((config.GetValue("LegacyLearningMenu") && !configDataService.GetCentreBetaTesting(centreId))|(!config.GetValue("LegacyLearningMenu") && configDataService.GetCentreBetaTesting(centreId)))
                 {
                     string baseUrl = config.GetValue("CurrentSystemBaseUrl");
                     string url = $"{baseUrl}/tracking/learn?customisationid={customisationId}&lp=1";
diff --git a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Completed.cs b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Completed.cs
index 45747a0021..461569d5ff 100644
--- a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Completed.cs
+++ b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Completed.cs
@@ -3,6 +3,7 @@
     using System.Collections.Generic;
     using System.Linq;
     using System.Threading.Tasks;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Helpers;
     using DigitalLearningSolutions.Data.Models.LearningResources;
     using DigitalLearningSolutions.Web.Attributes;
diff --git a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs
index 08872b8fa6..c8f41854ed 100644
--- a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs
+++ b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs
@@ -5,6 +5,7 @@
     using System.Linq;
     using System.Threading.Tasks;
     using DigitalLearningSolutions.Data.Enums;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Helpers;
     using DigitalLearningSolutions.Data.Models.LearningResources;
     using DigitalLearningSolutions.Web.Attributes;
diff --git a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/RecommendedLearningController.cs b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/RecommendedLearningController.cs
index 5f97ce9085..da9af367c9 100644
--- a/DigitalLearningSolutions.Web/Controllers/LearningPortalController/RecommendedLearningController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/LearningPortalController/RecommendedLearningController.cs
@@ -5,7 +5,7 @@
     using System.Linq;
     using System.Threading.Tasks;
     using DigitalLearningSolutions.Data.Exceptions;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Models.External.Filtered;
     using DigitalLearningSolutions.Data.Services;
     using DigitalLearningSolutions.Web.Attributes;
diff --git a/DigitalLearningSolutions.Web/Controllers/LearningSolutions/LearningSolutionsController.cs b/DigitalLearningSolutions.Web/Controllers/LearningSolutions/LearningSolutionsController.cs
index d4c11f7571..8ce904c9fb 100644
--- a/DigitalLearningSolutions.Web/Controllers/LearningSolutions/LearningSolutionsController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/LearningSolutions/LearningSolutionsController.cs
@@ -1,7 +1,6 @@
 namespace DigitalLearningSolutions.Web.Controllers.LearningSolutions
 {
     using DigitalLearningSolutions.Data.DataServices;
-    using DigitalLearningSolutions.Data.Services;
     using DigitalLearningSolutions.Web.Attributes;
     using DigitalLearningSolutions.Web.Helpers;
     using DigitalLearningSolutions.Web.Models.Enums;
@@ -12,23 +11,23 @@ namespace DigitalLearningSolutions.Web.Controllers.LearningSolutions
     public class LearningSolutionsController : Controller
     {
         private readonly ICentresDataService centresDataService;
-        private readonly IConfigService configService;
+        private readonly IConfigDataService configDataService;
         private readonly ILogger logger;
 
         public LearningSolutionsController(
-            IConfigService configService,
+            IConfigDataService configDataService,
             ILogger logger,
             ICentresDataService centresDataService
         )
         {
-            this.configService = configService;
+            this.configDataService = configDataService;
             this.logger = logger;
             this.centresDataService = centresDataService;
         }
 
         public IActionResult AccessibilityHelp()
         {
-            var accessibilityText = configService.GetConfigValue(ConfigService.AccessibilityHelpText);
+            var accessibilityText = configDataService.GetConfigValue(ConfigDataService.AccessibilityHelpText);
             if (accessibilityText == null)
             {
                 logger.LogError("Accessibility text from Config table is null");
@@ -41,7 +40,7 @@ public IActionResult AccessibilityHelp()
 
         public IActionResult Terms()
         {
-            var termsText = configService.GetConfigValue(ConfigService.TermsText);
+            var termsText = configDataService.GetConfigValue(ConfigDataService.TermsText);
             if (termsText == null)
             {
                 logger.LogError("Terms text from Config table is null");
diff --git a/DigitalLearningSolutions.Web/Controllers/Register/RegisterDelegateByCentreController.cs b/DigitalLearningSolutions.Web/Controllers/Register/RegisterDelegateByCentreController.cs
index 00a91688a6..8d67b11672 100644
--- a/DigitalLearningSolutions.Web/Controllers/Register/RegisterDelegateByCentreController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/Register/RegisterDelegateByCentreController.cs
@@ -7,6 +7,7 @@ namespace DigitalLearningSolutions.Web.Controllers.Register
     using DigitalLearningSolutions.Data.DataServices.UserDataService;
     using DigitalLearningSolutions.Data.Enums;
     using DigitalLearningSolutions.Data.Exceptions;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Services;
     using DigitalLearningSolutions.Web.Attributes;
     using DigitalLearningSolutions.Web.Extensions;
@@ -19,6 +20,7 @@ namespace DigitalLearningSolutions.Web.Controllers.Register
     using DigitalLearningSolutions.Web.ViewModels.Register.RegisterDelegateByCentre;
     using Microsoft.AspNetCore.Authorization;
     using Microsoft.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
     using Microsoft.FeatureManagement.Mvc;
     using ConfirmationViewModel =
         DigitalLearningSolutions.Web.ViewModels.Register.RegisterDelegateByCentre.ConfirmationViewModel;
@@ -37,6 +39,7 @@ public class RegisterDelegateByCentreController : Controller
         private readonly IRegistrationService registrationService;
         private readonly IUserDataService userDataService;
         private readonly IUserService userService;
+        private readonly IConfiguration config;
 
         public RegisterDelegateByCentreController(
             IJobGroupsDataService jobGroupsDataService,
@@ -44,7 +47,8 @@ public RegisterDelegateByCentreController(
             PromptsService promptsService,
             ICryptoService cryptoService,
             IUserDataService userDataService,
-            IRegistrationService registrationService
+            IRegistrationService registrationService,
+            IConfiguration config
         )
         {
             this.jobGroupsDataService = jobGroupsDataService;
@@ -53,6 +57,7 @@ IRegistrationService registrationService
             this.userDataService = userDataService;
             this.registrationService = registrationService;
             this.cryptoService = cryptoService;
+            this.config = config;
         }
 
         [Route("/TrackingSystem/Delegates/Register")]
@@ -215,8 +220,8 @@ public IActionResult Summary()
         public IActionResult Summary(SummaryViewModel model)
         {
             var data = TempData.Peek()!;
+            var baseUrl = config.GetAppRootPath();
 
-            string baseUrl = ConfigHelper.GetAppConfig().GetAppRootPath();
             try
             {
                 var candidateNumber = registrationService.RegisterDelegateByCentre(
diff --git a/DigitalLearningSolutions.Web/Controllers/RoleProfilesController/RoleProfilesController.cs b/DigitalLearningSolutions.Web/Controllers/RoleProfilesController/RoleProfilesController.cs
index 018390f84f..91cbe64344 100644
--- a/DigitalLearningSolutions.Web/Controllers/RoleProfilesController/RoleProfilesController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/RoleProfilesController/RoleProfilesController.cs
@@ -1,5 +1,6 @@
 namespace DigitalLearningSolutions.Web.Controllers.RoleProfilesController
 {
+    using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.Services;
     using DigitalLearningSolutions.Web.Helpers;
     using Microsoft.AspNetCore.Authorization;
@@ -13,21 +14,21 @@ public partial class RoleProfilesController : Controller
         private readonly IRoleProfileService roleProfileService;
         private readonly ICommonService commonService;
         private readonly IFrameworkNotificationService frameworkNotificationService;
-        private readonly IConfigService configService;
+        private readonly IConfigDataService configDataService;
         private readonly ILogger logger;
         private readonly IConfiguration config;
         public RoleProfilesController(
            IRoleProfileService roleProfileService,
            ICommonService commonService,
            IFrameworkNotificationService frameworkNotificationService,
-          IConfigService configService,
+          IConfigDataService configDataService,
            ILogger logger,
            IConfiguration config)
         {
             this.roleProfileService = roleProfileService;
             this.commonService = commonService;
             this.frameworkNotificationService = frameworkNotificationService;
-            this.configService = configService;
+            this.configDataService = configDataService;
             this.logger = logger;
             this.config = config;
         }
diff --git a/DigitalLearningSolutions.Web/Controllers/SupervisorController/SupervisorController.cs b/DigitalLearningSolutions.Web/Controllers/SupervisorController/SupervisorController.cs
index b69d4dd90a..3f5bcaa5f9 100644
--- a/DigitalLearningSolutions.Web/Controllers/SupervisorController/SupervisorController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/SupervisorController/SupervisorController.cs
@@ -1,5 +1,6 @@
 namespace DigitalLearningSolutions.Web.Controllers.SupervisorController
 {
+    using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.DataServices.UserDataService;
     using DigitalLearningSolutions.Data.Services;
     using DigitalLearningSolutions.Web.Helpers;
@@ -15,40 +16,45 @@ public partial class SupervisorController : Controller
         private readonly ICommonService commonService;
         private readonly IFrameworkNotificationService frameworkNotificationService;
         private readonly ISelfAssessmentService selfAssessmentService;
-        private readonly IConfigService configService;
+        private readonly IConfigDataService configDataService;
         private readonly ICentreRegistrationPromptsService centreRegistrationPromptsService;
         private readonly IUserDataService userDataService;
         private readonly ILogger logger;
         private readonly IConfiguration config;
+
         public SupervisorController(
-           ISupervisorService supervisorService,
-           ICommonService commonService,
-           IFrameworkNotificationService frameworkNotificationService,
-           ISelfAssessmentService selfAssessmentService,
-           IConfigService configService,
-           ICentreRegistrationPromptsService centreRegistrationPromptsService,
-           IUserDataService userDataService,
-           ILogger logger,
-           IConfiguration config)
+            ISupervisorService supervisorService,
+            ICommonService commonService,
+            IFrameworkNotificationService frameworkNotificationService,
+            ISelfAssessmentService selfAssessmentService,
+            IConfigDataService configDataService,
+            ICentreRegistrationPromptsService centreRegistrationPromptsService,
+            IUserDataService userDataService,
+            ILogger logger,
+            IConfiguration config
+        )
         {
             this.supervisorService = supervisorService;
             this.commonService = commonService;
             this.frameworkNotificationService = frameworkNotificationService;
             this.selfAssessmentService = selfAssessmentService;
-            this.configService = configService;
+            this.configDataService = configDataService;
             this.centreRegistrationPromptsService = centreRegistrationPromptsService;
             this.userDataService = userDataService;
             this.logger = logger;
             this.config = config;
         }
+
         private int GetCentreId()
         {
             return User.GetCustomClaimAsRequiredInt(CustomClaimTypes.UserCentreId);
         }
+
         private int GetAdminID()
         {
             return User.GetCustomClaimAsRequiredInt(CustomClaimTypes.UserAdminId);
         }
+
         private string GetUserEmail()
         {
             var userEmail = User.GetUserEmail();
diff --git a/DigitalLearningSolutions.Web/Controllers/Support/FaqsController.cs b/DigitalLearningSolutions.Web/Controllers/Support/FaqsController.cs
index 95de5ece7b..c661e55f81 100644
--- a/DigitalLearningSolutions.Web/Controllers/Support/FaqsController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/Support/FaqsController.cs
@@ -2,7 +2,7 @@
 {
     using System.Linq;
     using DigitalLearningSolutions.Data.Enums;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Services;
     using DigitalLearningSolutions.Web.Attributes;
     using DigitalLearningSolutions.Web.Models.Enums;
diff --git a/DigitalLearningSolutions.Web/Controllers/Support/ResourcesController.cs b/DigitalLearningSolutions.Web/Controllers/Support/ResourcesController.cs
index 7e433307d0..8c75711d71 100644
--- a/DigitalLearningSolutions.Web/Controllers/Support/ResourcesController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/Support/ResourcesController.cs
@@ -1,8 +1,7 @@
 namespace DigitalLearningSolutions.Web.Controllers.Support
 {
-    using System.Threading.Tasks;
     using DigitalLearningSolutions.Data.Enums;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Services;
     using DigitalLearningSolutions.Web.Attributes;
     using DigitalLearningSolutions.Web.Helpers;
diff --git a/DigitalLearningSolutions.Web/Controllers/Support/SupportController.cs b/DigitalLearningSolutions.Web/Controllers/Support/SupportController.cs
index 9ca6087851..5dce2b6685 100644
--- a/DigitalLearningSolutions.Web/Controllers/Support/SupportController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/Support/SupportController.cs
@@ -1,8 +1,7 @@
 namespace DigitalLearningSolutions.Web.Controllers.Support
 {
-    using System.Threading.Tasks;
     using DigitalLearningSolutions.Data.Enums;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Web.Attributes;
     using DigitalLearningSolutions.Web.Helpers;
     using DigitalLearningSolutions.Web.Models.Enums;
diff --git a/DigitalLearningSolutions.Web/Controllers/Support/SupportTicketsController.cs b/DigitalLearningSolutions.Web/Controllers/Support/SupportTicketsController.cs
index 334322697f..1c8ef7fe30 100644
--- a/DigitalLearningSolutions.Web/Controllers/Support/SupportTicketsController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/Support/SupportTicketsController.cs
@@ -1,7 +1,7 @@
 namespace DigitalLearningSolutions.Web.Controllers.Support
 {
     using DigitalLearningSolutions.Data.Enums;
-    using DigitalLearningSolutions.Data.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Web.Attributes;
     using DigitalLearningSolutions.Web.Helpers;
     using DigitalLearningSolutions.Web.Models.Enums;
diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/CourseSetup/CourseSetupController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/CourseSetup/CourseSetupController.cs
index 99f31a5727..3291948575 100644
--- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/CourseSetup/CourseSetupController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/CourseSetup/CourseSetupController.cs
@@ -20,6 +20,7 @@
     using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.CourseSetup.CourseDetails;
     using Microsoft.AspNetCore.Authorization;
     using Microsoft.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
     using Microsoft.FeatureManagement.Mvc;
 
     [FeatureGate(FeatureFlags.RefactoredTrackingSystem)]
@@ -29,21 +30,24 @@
     [Route("/TrackingSystem/CourseSetup")]
     public class CourseSetupController : Controller
     {
-        private const string CourseFilterCookieName = "CourseFilter";
         public const string SaveAction = "save";
+        private const string CourseFilterCookieName = "CourseFilter";
         private readonly ICourseService courseService;
         private readonly ISectionService sectionService;
         private readonly ITutorialService tutorialService;
+        private readonly IConfiguration config;
 
         public CourseSetupController(
             ICourseService courseService,
             ITutorialService tutorialService,
-            ISectionService sectionService
+            ISectionService sectionService,
+            IConfiguration config
         )
         {
             this.courseService = courseService;
             this.tutorialService = tutorialService;
             this.sectionService = sectionService;
+            this.config = config;
         }
 
         [Route("{page=1:int}")]
@@ -78,7 +82,8 @@ public IActionResult Index(
                 sortDirection,
                 existingFilterString,
                 page,
-                itemsPerPage
+                itemsPerPage,
+                config
             );
 
             Response.UpdateOrDeleteFilterCookie(CourseFilterCookieName, existingFilterString);
@@ -93,7 +98,7 @@ public IActionResult AllCourseStatistics()
             var categoryId = User.GetAdminCourseCategoryFilter();
             var details = courseService.GetCentreCourseDetails(centreId, categoryId);
 
-            var model = new AllCourseStatisticsViewModel(details);
+            var model = new AllCourseStatisticsViewModel(details, config);
 
             return View(model);
         }
diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/DelegateProgressController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/DelegateProgressController.cs
index c2b6ab967e..c0282253c8 100644
--- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/DelegateProgressController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/DelegateProgressController.cs
@@ -2,6 +2,7 @@
 {
     using System;
     using DigitalLearningSolutions.Data.Enums;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Helpers;
     using DigitalLearningSolutions.Data.Services;
     using DigitalLearningSolutions.Web.Attributes;
diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/EmailDelegatesController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/EmailDelegatesController.cs
index a137180663..28e03ff81b 100644
--- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/EmailDelegatesController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/EmailDelegatesController.cs
@@ -5,6 +5,7 @@ namespace DigitalLearningSolutions.Web.Controllers.TrackingSystem.Delegates
     using System.Linq;
     using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.Enums;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Helpers;
     using DigitalLearningSolutions.Data.Models.User;
     using DigitalLearningSolutions.Data.Services;
@@ -14,8 +15,8 @@ namespace DigitalLearningSolutions.Web.Controllers.TrackingSystem.Delegates
     using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Delegates.EmailDelegates;
     using Microsoft.AspNetCore.Authorization;
     using Microsoft.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
     using Microsoft.FeatureManagement.Mvc;
-    using ConfigHelper = DigitalLearningSolutions.Web.Helpers.ConfigHelper;
 
     [FeatureGate(FeatureFlags.RefactoredTrackingSystem)]
     [Authorize(Policy = CustomPolicies.UserCentreAdmin)]
@@ -29,18 +30,21 @@ public class EmailDelegatesController : Controller
         private readonly IJobGroupsDataService jobGroupsDataService;
         private readonly IPasswordResetService passwordResetService;
         private readonly IUserService userService;
+        private readonly IConfiguration config;
 
         public EmailDelegatesController(
             PromptsService promptsService,
             IJobGroupsDataService jobGroupsDataService,
             IPasswordResetService passwordResetService,
-            IUserService userService
+            IUserService userService,
+            IConfiguration config
         )
         {
             this.promptsService = promptsService;
             this.jobGroupsDataService = jobGroupsDataService;
             this.passwordResetService = passwordResetService;
             this.userService = userService;
+            this.config = config;
         }
 
         [HttpGet]
@@ -100,7 +104,7 @@ public IActionResult Index(EmailDelegatesViewModel model, string? existingFilter
 
             var selectedUsers = delegateUsers.Where(user => model.SelectedDelegateIds!.Contains(user.Id)).ToList();
             var emailDate = new DateTime(model.Year!.Value, model.Month!.Value, model.Day!.Value);
-            var baseUrl = ConfigHelper.GetAppRootPath(ConfigHelper.GetAppConfig());
+            var baseUrl = config.GetAppRootPath();
 
             passwordResetService.SendWelcomeEmailsToDelegates(selectedUsers, emailDate, baseUrl);
 
diff --git a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/ViewDelegateController.cs b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/ViewDelegateController.cs
index 75ad0d2085..7412c38c34 100644
--- a/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/ViewDelegateController.cs
+++ b/DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/ViewDelegateController.cs
@@ -3,6 +3,7 @@
     using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.DataServices.UserDataService;
     using DigitalLearningSolutions.Data.Enums;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Services;
     using DigitalLearningSolutions.Web.Attributes;
     using DigitalLearningSolutions.Web.Helpers;
@@ -11,6 +12,7 @@
     using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Delegates.ViewDelegate;
     using Microsoft.AspNetCore.Authorization;
     using Microsoft.AspNetCore.Mvc;
+    using Microsoft.Extensions.Configuration;
     using Microsoft.FeatureManagement.Mvc;
 
     [FeatureGate(FeatureFlags.RefactoredTrackingSystem)]
@@ -26,13 +28,15 @@ public class ViewDelegateController : Controller
         private readonly ICourseService courseService;
         private readonly IPasswordResetService passwordResetService;
         private readonly IUserDataService userDataService;
+        private readonly IConfiguration config;
 
         public ViewDelegateController(
             IUserDataService userDataService,
             PromptsService promptsService,
             ICourseService courseService,
             IPasswordResetService passwordResetService,
-            ICourseDataService courseDataService
+            ICourseDataService courseDataService,
+            IConfiguration config
         )
         {
             this.userDataService = userDataService;
@@ -40,6 +44,7 @@ ICourseDataService courseDataService
             this.courseService = courseService;
             this.passwordResetService = passwordResetService;
             this.courseDataService = courseDataService;
+            this.config = config;
         }
 
         public IActionResult Index(int delegateId)
@@ -62,7 +67,7 @@ public IActionResult SendWelcomeEmail(int delegateId)
         {
             var delegateUser = userDataService.GetDelegateUserCardById(delegateId)!;
 
-            var baseUrl = ConfigHelper.GetAppConfig().GetAppRootPath();
+            var baseUrl = config.GetAppRootPath();
 
             passwordResetService.GenerateAndSendDelegateWelcomeEmail(
                 delegateUser.EmailAddress!,
diff --git a/DigitalLearningSolutions.Web/Helpers/ConfigHelper.cs b/DigitalLearningSolutions.Web/Helpers/ConfigHelper.cs
index 94a379f075..bb691af8ad 100644
--- a/DigitalLearningSolutions.Web/Helpers/ConfigHelper.cs
+++ b/DigitalLearningSolutions.Web/Helpers/ConfigHelper.cs
@@ -5,16 +5,10 @@
     using Microsoft.Extensions.Configuration;
     using static System.String;
 
-    [Obsolete(
-        "We are moving to the ConfigHelper in the Data project. Copy the methods you need into there. This class will be removed in HEEDLS-609"
-    )]
     public static class ConfigHelper
     {
         public const string DefaultConnectionStringName = "DefaultConnection";
         public const string UnitTestConnectionStringName = "UnitTestConnection";
-        public const string CurrentSystemBaseUrlName = "CurrentSystemBaseUrl";
-        public const string AppRootPathName = "AppRootPath";
-        public const string MapsApiKey = "MapsAPIKey";
 
         public static IConfigurationRoot GetAppConfig()
         {
@@ -31,45 +25,10 @@ public static string GetEnvironmentVariablePrefix()
             return $"DlsRefactor{environmentName}_";
         }
 
-        public static string GetAppSettingsFilename()
+        private static string GetAppSettingsFilename()
         {
             var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
             return IsNullOrEmpty(environmentName) ? "appsettings.json" : $"appsettings.{environmentName}.json";
         }
-
-        public static string GetEvaluateUrl(this IConfiguration config, int progressId, bool fromLearningPortal)
-        {
-            return $"{config[CurrentSystemBaseUrlName]}/tracking/finalise?ProgressID={progressId}";
-        }
-
-        public static string GetTrackingUrl(this IConfiguration config)
-        {
-            return $"{config[CurrentSystemBaseUrlName]}/tracking/tracker";
-        }
-
-        public static string GetScormPlayerUrl(this IConfiguration config)
-        {
-            return $"{config[CurrentSystemBaseUrlName]}/scoplayer/sco";
-        }
-
-        public static string GetDownloadSummaryUrl(this IConfiguration config, int progressId)
-        {
-            return $"{config[CurrentSystemBaseUrlName]}/tracking/summary?ProgressID={progressId}";
-        }
-
-        public static string GetConsolidationPathUrl(this IConfiguration config, string consolidationPath)
-        {
-            return $"{config[CurrentSystemBaseUrlName]}/tracking/dlconsolidation?client={consolidationPath}";
-        }
-
-        public static string GetMapsApiKey(this IConfiguration config)
-        {
-            return config[MapsApiKey];
-        }
-
-        public static string GetAppRootPath(this IConfiguration config)
-        {
-            return config[AppRootPathName];
-        }
     }
 }
diff --git a/DigitalLearningSolutions.Web/Helpers/ExternalApis/MapsApiHelper.cs b/DigitalLearningSolutions.Web/Helpers/ExternalApis/MapsApiHelper.cs
index 7165fd7317..f44566d0eb 100644
--- a/DigitalLearningSolutions.Web/Helpers/ExternalApis/MapsApiHelper.cs
+++ b/DigitalLearningSolutions.Web/Helpers/ExternalApis/MapsApiHelper.cs
@@ -2,6 +2,7 @@
 {
     using System.Net.Http;
     using System.Threading.Tasks;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Models.External.Maps;
     using Microsoft.Extensions.Configuration;
     using Newtonsoft.Json;
diff --git a/DigitalLearningSolutions.Web/Helpers/OldSystemEndpointHelper.cs b/DigitalLearningSolutions.Web/Helpers/OldSystemEndpointHelper.cs
new file mode 100644
index 0000000000..f99a89d08b
--- /dev/null
+++ b/DigitalLearningSolutions.Web/Helpers/OldSystemEndpointHelper.cs
@@ -0,0 +1,33 @@
+namespace DigitalLearningSolutions.Web.Helpers
+{
+    using DigitalLearningSolutions.Data.Extensions;
+    using Microsoft.Extensions.Configuration;
+
+    public static class OldSystemEndpointHelper
+    {
+        public static string GetEvaluateUrl(IConfiguration config, int progressId)
+        {
+            return $"{config.GetCurrentSystemBaseUrl()}/tracking/finalise?ProgressID={progressId}";
+        }
+
+        public static string GetTrackingUrl(IConfiguration config)
+        {
+            return $"{config.GetCurrentSystemBaseUrl()}/tracking/tracker";
+        }
+
+        public static string GetScormPlayerUrl(IConfiguration config)
+        {
+            return $"{config.GetCurrentSystemBaseUrl()}/scoplayer/sco";
+        }
+
+        public static string GetDownloadSummaryUrl(IConfiguration config, int progressId)
+        {
+            return $"{config.GetCurrentSystemBaseUrl()}/tracking/summary?ProgressID={progressId}";
+        }
+
+        public static string GetConsolidationPathUrl(IConfiguration config, string consolidationPath)
+        {
+            return $"{config.GetCurrentSystemBaseUrl()}/tracking/dlconsolidation?client={consolidationPath}";
+        }
+    }
+}
diff --git a/DigitalLearningSolutions.Web/Startup.cs b/DigitalLearningSolutions.Web/Startup.cs
index bd34d9c20a..e68262788f 100644
--- a/DigitalLearningSolutions.Web/Startup.cs
+++ b/DigitalLearningSolutions.Web/Startup.cs
@@ -10,6 +10,7 @@ namespace DigitalLearningSolutions.Web
     using DigitalLearningSolutions.Data.DataServices;
     using DigitalLearningSolutions.Data.DataServices.SelfAssessmentDataService;
     using DigitalLearningSolutions.Data.DataServices.UserDataService;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Factories;
     using DigitalLearningSolutions.Data.Mappers;
     using DigitalLearningSolutions.Data.Models.DelegateUpload;
@@ -169,7 +170,7 @@ private static void RegisterServices(IServiceCollection services)
             services.AddScoped();
             services.AddScoped();
             services.AddScoped();
-            services.AddScoped();
+            services.AddScoped();
             services.AddScoped();
             services.AddScoped();
             services.AddScoped();
diff --git a/DigitalLearningSolutions.Web/ViewModels/FindYourCentre/FindYourCentreViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/FindYourCentre/FindYourCentreViewModel.cs
index 566632fd2a..38f1c62b18 100644
--- a/DigitalLearningSolutions.Web/ViewModels/FindYourCentre/FindYourCentreViewModel.cs
+++ b/DigitalLearningSolutions.Web/ViewModels/FindYourCentre/FindYourCentreViewModel.cs
@@ -1,19 +1,20 @@
 namespace DigitalLearningSolutions.Web.ViewModels.FindYourCentre
 {
-    using DigitalLearningSolutions.Web.Helpers;
+    using DigitalLearningSolutions.Data.Extensions;
+    using Microsoft.Extensions.Configuration;
 
     public class FindYourCentreViewModel
     {
         public string Url { get; set; }
 
-        public FindYourCentreViewModel()
+        public FindYourCentreViewModel(IConfiguration config)
         {
-            Url = ConfigHelper.GetAppConfig()["CurrentSystemBaseUrl"] + "/findyourcentre?nonav=true";
+            Url = $"{config.GetCurrentSystemBaseUrl()}/findyourcentre?nonav=true";
         }
 
-        public FindYourCentreViewModel(string centreId)
+        public FindYourCentreViewModel(string centreId, IConfiguration config)
         {
-            Url = ConfigHelper.GetAppConfig()["CurrentSystemBaseUrl"] + "/findyourcentre?nonav=true¢reid=" + centreId;
+            Url = $"{config.GetCurrentSystemBaseUrl()}/findyourcentre?nonav=true¢reid={centreId}";
         }
     }
 }
diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningMenu/ContentViewerViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningMenu/ContentViewerViewModel.cs
index 283ca6102e..fcbd41b4a3 100644
--- a/DigitalLearningSolutions.Web/ViewModels/LearningMenu/ContentViewerViewModel.cs
+++ b/DigitalLearningSolutions.Web/ViewModels/LearningMenu/ContentViewerViewModel.cs
@@ -54,12 +54,12 @@ private string GetHtmlSource(IConfiguration config, TutorialContent tutorialCont
                    $"&Version={tutorialContent.Version}" +
                    $"&ProgressID={ProgressId}" +
                    "&type=learn" +
-                   $"&TrackURL={config.GetTrackingUrl()}";
+                   $"&TrackURL={OldSystemEndpointHelper.GetTrackingUrl(config)}";
         }
 
         private string GetScormSource(IConfiguration config, TutorialContent tutorialContent)
         {
-            return $"{config.GetScormPlayerUrl()}" +
+            return $"{OldSystemEndpointHelper.GetScormPlayerUrl(config)}" +
                    $"?CentreID={CentreId}" +
                    $"&CustomisationID={CustomisationId}" +
                    $"&TutorialID={TutorialId}" +
diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningMenu/CourseCompletionViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningMenu/CourseCompletionViewModel.cs
index 4b1c8ec947..f82086dd42 100644
--- a/DigitalLearningSolutions.Web/ViewModels/LearningMenu/CourseCompletionViewModel.cs
+++ b/DigitalLearningSolutions.Web/ViewModels/LearningMenu/CourseCompletionViewModel.cs
@@ -61,8 +61,8 @@ public CourseCompletionViewModel(IConfiguration config, CourseCompletion courseC
                 courseCompletion.TutorialsCompletionThreshold
             );
 
-            DownloadSummaryUrl = config.GetDownloadSummaryUrl(progressId);
-            FinaliseUrl = config.GetEvaluateUrl(progressId, false);
+            DownloadSummaryUrl = OldSystemEndpointHelper.GetDownloadSummaryUrl(config, progressId);
+            FinaliseUrl = OldSystemEndpointHelper.GetEvaluateUrl(config, progressId);
         }
 
         private string? GetEvaluationOrCertificateText(DateTime? completed, DateTime? evaluated, bool isAssessed)
diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningMenu/DiagnosticContentViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningMenu/DiagnosticContentViewModel.cs
index f0afc08b13..faae987077 100644
--- a/DigitalLearningSolutions.Web/ViewModels/LearningMenu/DiagnosticContentViewModel.cs
+++ b/DigitalLearningSolutions.Web/ViewModels/LearningMenu/DiagnosticContentViewModel.cs
@@ -1,61 +1,61 @@
-namespace DigitalLearningSolutions.Web.ViewModels.LearningMenu
-{
-    using System.Collections.Generic;
-    using DigitalLearningSolutions.Data.Models.DiagnosticAssessment;
-    using DigitalLearningSolutions.Web.Helpers;
-    using Microsoft.Extensions.Configuration;
-
-    public class DiagnosticContentViewModel
-    {
-        public int CustomisationId { get; }
-        public int SectionId { get; }
-        public string CourseTitle { get; }
-        public string SectionName { get; }
-        public string ContentSource { get; }
-        private const string type = "diag";
-
-        public DiagnosticContentViewModel(
-            IConfiguration config,
-            DiagnosticContent diagnosticContent,
-            List selectedTutorials,
-            int customisationId,
-            int centreId,
-            int sectionId,
-            int progressId,
-            int candidateId
-        )
-        {
-            CustomisationId = customisationId;
-            SectionId = sectionId;
-            SectionName = diagnosticContent.SectionName;
-            CourseTitle = diagnosticContent.CourseTitle;
-
-            var tutorials = diagnosticContent.CanSelectTutorials
-                ? selectedTutorials
-                : diagnosticContent.Tutorials;
-
-            ContentSource = ContentViewerHelper.IsScormPath(diagnosticContent.DiagnosticAssessmentPath)
-                ? ContentViewerHelper.GetScormAssessmentSource(
-                    config.GetScormPlayerUrl(),
-                    centreId,
-                    customisationId,
-                    candidateId,
-                    sectionId,
-                    diagnosticContent.Version,
-                    diagnosticContent.DiagnosticAssessmentPath,
-                    type)
-                : ContentViewerHelper.GetHtmlAssessmentSource(
-                    diagnosticContent.DiagnosticAssessmentPath,
-                    centreId,
-                    customisationId,
-                    candidateId,
-                    sectionId,
-                    diagnosticContent.Version,
-                    progressId,
-                    type,
-                    config.GetTrackingUrl(),
-                    tutorials,
-                    diagnosticContent.PassThreshold);
-        }
-    }
-}
+namespace DigitalLearningSolutions.Web.ViewModels.LearningMenu
+{
+    using System.Collections.Generic;
+    using DigitalLearningSolutions.Data.Models.DiagnosticAssessment;
+    using DigitalLearningSolutions.Web.Helpers;
+    using Microsoft.Extensions.Configuration;
+
+    public class DiagnosticContentViewModel
+    {
+        public int CustomisationId { get; }
+        public int SectionId { get; }
+        public string CourseTitle { get; }
+        public string SectionName { get; }
+        public string ContentSource { get; }
+        private const string type = "diag";
+
+        public DiagnosticContentViewModel(
+            IConfiguration config,
+            DiagnosticContent diagnosticContent,
+            List selectedTutorials,
+            int customisationId,
+            int centreId,
+            int sectionId,
+            int progressId,
+            int candidateId
+        )
+        {
+            CustomisationId = customisationId;
+            SectionId = sectionId;
+            SectionName = diagnosticContent.SectionName;
+            CourseTitle = diagnosticContent.CourseTitle;
+
+            var tutorials = diagnosticContent.CanSelectTutorials
+                ? selectedTutorials
+                : diagnosticContent.Tutorials;
+
+            ContentSource = ContentViewerHelper.IsScormPath(diagnosticContent.DiagnosticAssessmentPath)
+                ? ContentViewerHelper.GetScormAssessmentSource(
+                    OldSystemEndpointHelper.GetScormPlayerUrl(config),
+                    centreId,
+                    customisationId,
+                    candidateId,
+                    sectionId,
+                    diagnosticContent.Version,
+                    diagnosticContent.DiagnosticAssessmentPath,
+                    type)
+                : ContentViewerHelper.GetHtmlAssessmentSource(
+                    diagnosticContent.DiagnosticAssessmentPath,
+                    centreId,
+                    customisationId,
+                    candidateId,
+                    sectionId,
+                    diagnosticContent.Version,
+                    progressId,
+                    type,
+                    OldSystemEndpointHelper.GetTrackingUrl(config),
+                    tutorials,
+                    diagnosticContent.PassThreshold);
+        }
+    }
+}
diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningMenu/PostLearningContentViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningMenu/PostLearningContentViewModel.cs
index fbb926193c..a00b9bc557 100644
--- a/DigitalLearningSolutions.Web/ViewModels/LearningMenu/PostLearningContentViewModel.cs
+++ b/DigitalLearningSolutions.Web/ViewModels/LearningMenu/PostLearningContentViewModel.cs
@@ -1,56 +1,55 @@
-namespace DigitalLearningSolutions.Web.ViewModels.LearningMenu
-{
-    using System.Collections.Generic;
-    using DigitalLearningSolutions.Data.Models.PostLearningAssessment;
-    using DigitalLearningSolutions.Web.Helpers;
-    using Microsoft.Extensions.Configuration;
-
-    public class PostLearningContentViewModel
-    {
-        public int CustomisationId { get; }
-        public int SectionId { get; }
-        public string CourseTitle { get; }
-        public string SectionName { get; }
-        public string ContentSource { get; }
-        private const string type = "pl";
-
-        public PostLearningContentViewModel(
-            IConfiguration config,
-            PostLearningContent postLearningContent,
-            int customisationId,
-            int centreId,
-            int sectionId,
-            int progressId,
-            int candidateId
-        )
-        {
-            CustomisationId = customisationId;
-            SectionId = sectionId;
-            SectionName = postLearningContent.SectionName;
-            CourseTitle = postLearningContent.CourseTitle;
-
-            ContentSource = ContentViewerHelper.IsScormPath(postLearningContent.PostLearningAssessmentPath)
-                ? ContentViewerHelper.GetScormAssessmentSource(
-                    config.GetScormPlayerUrl(),
-                    centreId,
-                    customisationId,
-                    candidateId,
-                    sectionId,
-                    postLearningContent.Version,
-                    postLearningContent.PostLearningAssessmentPath,
-                    type)
-                : ContentViewerHelper.GetHtmlAssessmentSource(
-                    postLearningContent.PostLearningAssessmentPath,
-                    centreId,
-                    customisationId,
-                    candidateId,
-                    sectionId,
-                    postLearningContent.Version,
-                    progressId,
-                    type,
-                    config.GetTrackingUrl(),
-                    postLearningContent.Tutorials,
-                    postLearningContent.PassThreshold);
-        }
-    }
-}
+namespace DigitalLearningSolutions.Web.ViewModels.LearningMenu
+{
+    using DigitalLearningSolutions.Data.Models.PostLearningAssessment;
+    using DigitalLearningSolutions.Web.Helpers;
+    using Microsoft.Extensions.Configuration;
+
+    public class PostLearningContentViewModel
+    {
+        public int CustomisationId { get; }
+        public int SectionId { get; }
+        public string CourseTitle { get; }
+        public string SectionName { get; }
+        public string ContentSource { get; }
+        private const string type = "pl";
+
+        public PostLearningContentViewModel(
+            IConfiguration config,
+            PostLearningContent postLearningContent,
+            int customisationId,
+            int centreId,
+            int sectionId,
+            int progressId,
+            int candidateId
+        )
+        {
+            CustomisationId = customisationId;
+            SectionId = sectionId;
+            SectionName = postLearningContent.SectionName;
+            CourseTitle = postLearningContent.CourseTitle;
+
+            ContentSource = ContentViewerHelper.IsScormPath(postLearningContent.PostLearningAssessmentPath)
+                ? ContentViewerHelper.GetScormAssessmentSource(
+                    OldSystemEndpointHelper.GetScormPlayerUrl(config),
+                    centreId,
+                    customisationId,
+                    candidateId,
+                    sectionId,
+                    postLearningContent.Version,
+                    postLearningContent.PostLearningAssessmentPath,
+                    type)
+                : ContentViewerHelper.GetHtmlAssessmentSource(
+                    postLearningContent.PostLearningAssessmentPath,
+                    centreId,
+                    customisationId,
+                    candidateId,
+                    sectionId,
+                    postLearningContent.Version,
+                    progressId,
+                    type,
+                    OldSystemEndpointHelper.GetTrackingUrl(config),
+                    postLearningContent.Tutorials,
+                    postLearningContent.PassThreshold);
+        }
+    }
+}
diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningMenu/SectionContentViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningMenu/SectionContentViewModel.cs
index ea3aa55631..9f6b949511 100644
--- a/DigitalLearningSolutions.Web/ViewModels/LearningMenu/SectionContentViewModel.cs
+++ b/DigitalLearningSolutions.Web/ViewModels/LearningMenu/SectionContentViewModel.cs
@@ -1,139 +1,139 @@
-namespace DigitalLearningSolutions.Web.ViewModels.LearningMenu
-{
-    using System;
-    using System.Collections.Generic;
-    using System.Linq;
-    using DigitalLearningSolutions.Data.Models.SectionContent;
-    using DigitalLearningSolutions.Web.Helpers;
-    using Microsoft.Extensions.Configuration;
-
-    public class SectionContentViewModel
-    {
+namespace DigitalLearningSolutions.Web.ViewModels.LearningMenu
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Linq;
+    using DigitalLearningSolutions.Data.Models.SectionContent;
+    using DigitalLearningSolutions.Web.Helpers;
+    using Microsoft.Extensions.Configuration;
+
+    public class SectionContentViewModel
+    {
         public string CourseTitle { get; }
-        public string? CourseDescription { get; }
-        public string SectionName { get; }
+        public string? CourseDescription { get; }
+        public string SectionName { get; }
         public bool ShowPercentComplete { get; }
-        public string PercentComplete { get; }
-        public int CustomisationId { get; }
-        public int SectionId { get; }
-        public bool ShowPostLearning { get; }
-        public string PostLearningStatus { get; }
-        public string PostLearningStatusStyling { get; }
-        public bool ShowDiagnostic { get; }
-        public string DiagnosticCompletionStatus { get; }
+        public string PercentComplete { get; }
+        public int CustomisationId { get; }
+        public int SectionId { get; }
+        public bool ShowPostLearning { get; }
+        public string PostLearningStatus { get; }
+        public string PostLearningStatusStyling { get; }
+        public bool ShowDiagnostic { get; }
+        public string DiagnosticCompletionStatus { get; }
         public string? ConsolidationExercisePath { get; }
-        public bool ShowConsolidation { get; }
-        public string ConsolidationExerciseLabel { get; }
-        public IEnumerable Tutorials { get; }
-        public bool DisplayDiagnosticSeparator { get; }
-        public bool DisplayTutorialSeparator { get; }
-        public bool DisplayPostLearningSeparator { get; }
-        public int? NextSectionId { get; }
+        public bool ShowConsolidation { get; }
+        public string ConsolidationExerciseLabel { get; }
+        public IEnumerable Tutorials { get; }
+        public bool DisplayDiagnosticSeparator { get; }
+        public bool DisplayTutorialSeparator { get; }
+        public bool DisplayPostLearningSeparator { get; }
+        public int? NextSectionId { get; }
         public bool ShowCompletionSummary { get; }
         public bool OtherSectionsExist { get; }
-        public CompletionSummaryCardViewModel CompletionSummaryCardViewModel { get; }
-
-        public SectionContentViewModel(IConfiguration config, SectionContent sectionContent, int customisationId, int sectionId)
-        {
+        public CompletionSummaryCardViewModel CompletionSummaryCardViewModel { get; }
+
+        public SectionContentViewModel(IConfiguration config, SectionContent sectionContent, int customisationId, int sectionId)
+        {
             CourseTitle = sectionContent.CourseTitle;
-            CourseDescription = sectionContent.CourseDescription;
-            SectionName = sectionContent.SectionName;
-            PercentComplete = FormatPercentComplete(sectionContent);
-            ShowPercentComplete = sectionContent.HasLearning && sectionContent.CourseSettings.ShowPercentage;
-            CustomisationId = customisationId;
-            SectionId = sectionId;
-            ShowPostLearning = sectionContent.PostLearningAssessmentPath != null && sectionContent.IsAssessed;
-            PostLearningStatus = GetPostLearningStatus(sectionContent);
-            PostLearningStatusStyling = GetPostLearningStatusStyling(sectionContent);
-            ShowDiagnostic = sectionContent.DiagnosticAssessmentPath != null && sectionContent.DiagnosticStatus;
-            DiagnosticCompletionStatus = GetDiagnosticCompletionStatus(sectionContent);
-            ConsolidationExercisePath = sectionContent.ConsolidationPath == null
-                ? null
-                : config.GetConsolidationPathUrl(sectionContent.ConsolidationPath);
-            ShowConsolidation = ConsolidationExercisePath != null;
+            CourseDescription = sectionContent.CourseDescription;
+            SectionName = sectionContent.SectionName;
+            PercentComplete = FormatPercentComplete(sectionContent);
+            ShowPercentComplete = sectionContent.HasLearning && sectionContent.CourseSettings.ShowPercentage;
+            CustomisationId = customisationId;
+            SectionId = sectionId;
+            ShowPostLearning = sectionContent.PostLearningAssessmentPath != null && sectionContent.IsAssessed;
+            PostLearningStatus = GetPostLearningStatus(sectionContent);
+            PostLearningStatusStyling = GetPostLearningStatusStyling(sectionContent);
+            ShowDiagnostic = sectionContent.DiagnosticAssessmentPath != null && sectionContent.DiagnosticStatus;
+            DiagnosticCompletionStatus = GetDiagnosticCompletionStatus(sectionContent);
+            ConsolidationExercisePath = sectionContent.ConsolidationPath == null
+                ? null
+                : OldSystemEndpointHelper.GetConsolidationPathUrl(config, sectionContent.ConsolidationPath);
+            ShowConsolidation = ConsolidationExercisePath != null;
             ConsolidationExerciseLabel = sectionContent.CourseSettings.ConsolidationExercise ?? "Consolidation Exercise";
 
-            Tutorials = sectionContent.Tutorials.Select(tutorial => new TutorialCardViewModel(
-                tutorial,
-                sectionContent.CourseSettings.ShowTime,
-                sectionContent.CourseSettings.ShowLearnStatus,
-                sectionId,
-                customisationId
+            Tutorials = sectionContent.Tutorials.Select(tutorial => new TutorialCardViewModel(
+                tutorial,
+                sectionContent.CourseSettings.ShowTime,
+                sectionContent.CourseSettings.ShowLearnStatus,
+                sectionId,
+                customisationId
             ));
-
-            DisplayDiagnosticSeparator = ShowDiagnostic && (sectionContent.Tutorials.Any() || ShowPostLearning || ShowConsolidation);
-            DisplayTutorialSeparator = sectionContent.Tutorials.Any() && (ShowPostLearning || ShowConsolidation);
-            DisplayPostLearningSeparator = ShowConsolidation && ShowPostLearning;
-            NextSectionId = sectionContent.NextSectionId;
-            ShowCompletionSummary = sectionContent.IncludeCertification && !sectionContent.OtherSectionsExist;
-            OtherSectionsExist = sectionContent.OtherSectionsExist;
-            CompletionSummaryCardViewModel = new CompletionSummaryCardViewModel(
-                customisationId,
-                sectionContent.Completed,
-                sectionContent.MaxPostLearningAssessmentAttempts,
-                sectionContent.IsAssessed,
-                sectionContent.PostLearningAssessmentPassThreshold,
-                sectionContent.DiagnosticAssessmentCompletionThreshold,
-                sectionContent.TutorialsCompletionThreshold
-            );
-        }
-
-        private static string FormatPercentComplete(SectionContent sectionContent)
-        {
-            var totalStatus = sectionContent.Tutorials.Sum(tutorial => tutorial.TutorialStatus);
-            double percentage =
-                sectionContent.Tutorials.Count == 0 || !sectionContent.HasLearning
-                    ? 0
-                    : (totalStatus * 100) / (sectionContent.Tutorials.Count * 2);
-
-            return $"{Convert.ToInt32(Math.Floor(percentage))}% learning complete";
-        }
-
-        private static string GetPostLearningStatus(SectionContent sectionContent)
-        {
-            if (sectionContent.PostLearningAttempts == 0)
-            {
-                return "Not Attempted";
-            }
-
-            if (sectionContent.PostLearningAttempts > 0 && sectionContent.PostLearningPassed)
-            {
-                return "Passed";
-            }
-
-            if (sectionContent.PostLearningAttempts > 0 && !sectionContent.PostLearningPassed)
-            {
-                return "Failed";
-            }
-
-            return "";
+
+            DisplayDiagnosticSeparator = ShowDiagnostic && (sectionContent.Tutorials.Any() || ShowPostLearning || ShowConsolidation);
+            DisplayTutorialSeparator = sectionContent.Tutorials.Any() && (ShowPostLearning || ShowConsolidation);
+            DisplayPostLearningSeparator = ShowConsolidation && ShowPostLearning;
+            NextSectionId = sectionContent.NextSectionId;
+            ShowCompletionSummary = sectionContent.IncludeCertification && !sectionContent.OtherSectionsExist;
+            OtherSectionsExist = sectionContent.OtherSectionsExist;
+            CompletionSummaryCardViewModel = new CompletionSummaryCardViewModel(
+                customisationId,
+                sectionContent.Completed,
+                sectionContent.MaxPostLearningAssessmentAttempts,
+                sectionContent.IsAssessed,
+                sectionContent.PostLearningAssessmentPassThreshold,
+                sectionContent.DiagnosticAssessmentCompletionThreshold,
+                sectionContent.TutorialsCompletionThreshold
+            );
+        }
+
+        private static string FormatPercentComplete(SectionContent sectionContent)
+        {
+            var totalStatus = sectionContent.Tutorials.Sum(tutorial => tutorial.TutorialStatus);
+            double percentage =
+                sectionContent.Tutorials.Count == 0 || !sectionContent.HasLearning
+                    ? 0
+                    : (totalStatus * 100) / (sectionContent.Tutorials.Count * 2);
+
+            return $"{Convert.ToInt32(Math.Floor(percentage))}% learning complete";
+        }
+
+        private static string GetPostLearningStatus(SectionContent sectionContent)
+        {
+            if (sectionContent.PostLearningAttempts == 0)
+            {
+                return "Not Attempted";
+            }
+
+            if (sectionContent.PostLearningAttempts > 0 && sectionContent.PostLearningPassed)
+            {
+                return "Passed";
+            }
+
+            if (sectionContent.PostLearningAttempts > 0 && !sectionContent.PostLearningPassed)
+            {
+                return "Failed";
+            }
+
+            return "";
+        }
+
+        private static string GetPostLearningStatusStyling(SectionContent sectionContent)
+        {
+            return sectionContent.PostLearningAttempts > 0 && sectionContent.PostLearningPassed
+                ? "passed-text"
+                : "not-passed-text";
+        }
+
+        private static string GetDiagnosticCompletionStatus(SectionContent sectionContent)
+        {
+            if (sectionContent.DiagnosticAttempts == 0)
+            {
+                return "Not Attempted";
+            }
+
+            if (sectionContent.DiagnosticAttempts == 1)
+            {
+                return $"{sectionContent.SectionScore}/{sectionContent.MaxSectionScore} - {sectionContent.DiagnosticAttempts} attempt";
+            }
+
+            if (sectionContent.DiagnosticAttempts > 0)
+            {
+                return $"{sectionContent.SectionScore}/{sectionContent.MaxSectionScore} - {sectionContent.DiagnosticAttempts} attempts";
+            }
+
+            return "";
         }
-
-        private static string GetPostLearningStatusStyling(SectionContent sectionContent)
-        {
-            return sectionContent.PostLearningAttempts > 0 && sectionContent.PostLearningPassed
-                ? "passed-text"
-                : "not-passed-text";
-        }
-
-        private static string GetDiagnosticCompletionStatus(SectionContent sectionContent)
-        {
-            if (sectionContent.DiagnosticAttempts == 0)
-            {
-                return "Not Attempted";
-            }
-
-            if (sectionContent.DiagnosticAttempts == 1)
-            {
-                return $"{sectionContent.SectionScore}/{sectionContent.MaxSectionScore} - {sectionContent.DiagnosticAttempts} attempt";
-            }
-
-            if (sectionContent.DiagnosticAttempts > 0)
-            {
-                return $"{sectionContent.SectionScore}/{sectionContent.MaxSectionScore} - {sectionContent.DiagnosticAttempts} attempts";
-            }
-
-            return "";
-        }
-    }
-}
+    }
+}
diff --git a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedCourseViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedCourseViewModel.cs
index 2b56b26b26..02ef4636a4 100644
--- a/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedCourseViewModel.cs
+++ b/DigitalLearningSolutions.Web/ViewModels/LearningPortal/Completed/CompletedCourseViewModel.cs
@@ -8,7 +8,7 @@ public class CompletedCourseViewModel : CompletedLearningItemViewModel
     {
         public CompletedCourseViewModel(CompletedLearningItem course, IConfiguration config) : base(course)
         {
-            EvaluateUrl = config.GetEvaluateUrl(course.ProgressID, true);
+            EvaluateUrl = OldSystemEndpointHelper.GetEvaluateUrl(config, course.ProgressID);
         }
 
         public string EvaluateUrl { get; }
diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/AllCourseStatisticsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/AllCourseStatisticsViewModel.cs
index ad5d67bb91..6e069afffc 100644
--- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/AllCourseStatisticsViewModel.cs
+++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/AllCourseStatisticsViewModel.cs
@@ -5,12 +5,13 @@
     using DigitalLearningSolutions.Data.Models.Courses;
     using DigitalLearningSolutions.Web.Extensions;
     using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage;
+    using Microsoft.Extensions.Configuration;
 
     public class AllCourseStatisticsViewModel : BaseJavaScriptFilterableViewModel
     {
-        public AllCourseStatisticsViewModel(CentreCourseDetails details)
+        public AllCourseStatisticsViewModel(CentreCourseDetails details, IConfiguration config)
         {
-            Courses = details.Courses.Select(c => new SearchableCourseStatisticsViewModel(c));
+            Courses = details.Courses.Select(c => new SearchableCourseStatisticsViewModel(c, config));
 
             Filters = CourseStatisticsViewModelFilterOptions.GetFilterOptions(details.Categories, details.Topics)
                 .SelectAppliedFilterViewModels();
diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/CourseSetupViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/CourseSetupViewModel.cs
index a207b3e8e0..86d35b9069 100644
--- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/CourseSetupViewModel.cs
+++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/CourseSetupViewModel.cs
@@ -5,6 +5,7 @@
     using DigitalLearningSolutions.Data.Helpers;
     using DigitalLearningSolutions.Data.Models.Courses;
     using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage;
+    using Microsoft.Extensions.Configuration;
 
     public class CourseSetupViewModel : BaseSearchablePageViewModel
     {
@@ -15,7 +16,8 @@ public CourseSetupViewModel(
             string sortDirection,
             string? existingFilterString,
             int page,
-            int? itemsPerPage
+            int? itemsPerPage,
+            IConfiguration config
         ) : base(
             searchString,
             page,
@@ -30,7 +32,7 @@ public CourseSetupViewModel(
             var searchedItems = GenericSearchHelper.SearchItems(details.Courses.AsQueryable(), SearchString).ToList();
             var paginatedItems = SortFilterAndPaginate(searchedItems);
 
-            Courses = paginatedItems.Select(c => new SearchableCourseStatisticsViewModel(c));
+            Courses = paginatedItems.Select(c => new SearchableCourseStatisticsViewModel(c, config));
 
             Filters = CourseStatisticsViewModelFilterOptions.GetFilterOptions(details.Categories, details.Topics);
         }
diff --git a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/SearchableCourseStatisticsViewModel.cs b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/SearchableCourseStatisticsViewModel.cs
index f9a288eef0..a836001b06 100644
--- a/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/SearchableCourseStatisticsViewModel.cs
+++ b/DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/SearchableCourseStatisticsViewModel.cs
@@ -3,16 +3,17 @@
     using System;
     using System.Collections.Generic;
     using System.Linq;
+    using DigitalLearningSolutions.Data.Extensions;
     using DigitalLearningSolutions.Data.Helpers;
     using DigitalLearningSolutions.Data.Models.Courses;
     using DigitalLearningSolutions.Data.Models.CustomPrompts;
     using DigitalLearningSolutions.Web.Helpers;
     using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage;
-    using ConfigHelper = DigitalLearningSolutions.Web.Helpers.ConfigHelper;
+    using Microsoft.Extensions.Configuration;
 
     public class SearchableCourseStatisticsViewModel : BaseFilterableViewModel
     {
-        public SearchableCourseStatisticsViewModel(CourseStatisticsWithAdminFieldResponseCounts courseStatistics)
+        public SearchableCourseStatisticsViewModel(CourseStatisticsWithAdminFieldResponseCounts courseStatistics, IConfiguration config)
         {
             CustomisationId = courseStatistics.CustomisationId;
             DelegateCount = courseStatistics.DelegateCount;
@@ -24,8 +25,11 @@ public SearchableCourseStatisticsViewModel(CourseStatisticsWithAdminFieldRespons
             Tags = FilterableTagHelper.GetCurrentTagsForCourseStatistics(courseStatistics);
             Assessed = courseStatistics.IsAssessed;
             AdminFieldWithResponseCounts = courseStatistics.AdminFieldsWithResponses;
+            LaunchCourseLink = $"{config.GetAppRootPath()}/LearningMenu/{CustomisationId}";
         }
 
+        private string LaunchCourseLink { get; set; }
+
         public int CustomisationId { get; set; }
         public int DelegateCount { get; set; }
         public int InProgressCount { get; set; }
@@ -34,7 +38,6 @@ public SearchableCourseStatisticsViewModel(CourseStatisticsWithAdminFieldRespons
         public string CourseTopic { get; set; }
         public string LearningMinutes { get; set; }
         public bool Assessed { get; set; }
-
         public IEnumerable AdminFieldWithResponseCounts { get; set; }
         public bool HasAdminFields => AdminFieldWithResponseCounts.Any();
 
@@ -55,10 +58,9 @@ public SearchableCourseStatisticsViewModel(CourseStatisticsWithAdminFieldRespons
 
         private string GenerateEmailHref()
         {
-            var launchCourseLink =
-                $"{ConfigHelper.GetAppConfig()[ConfigHelper.AppRootPathName]}/LearningMenu/{CustomisationId}";
             var subject = Uri.EscapeDataString($"Digital Learning Solutions Course Link - {CourseName}");
-            var content = Uri.EscapeDataString($"To start your {CourseName} course, go to {launchCourseLink}");
+            var content = Uri.EscapeDataString($"To start your {CourseName} course, go to {LaunchCourseLink}");
+
             return $"mailto:?subject={subject}&body={content}";
         }
     }
diff --git a/DigitalLearningSolutions.Web/Views/LearningContent/Index.cshtml b/DigitalLearningSolutions.Web/Views/LearningContent/Index.cshtml
index 5a47bc0918..2cdb7e3953 100644
--- a/DigitalLearningSolutions.Web/Views/LearningContent/Index.cshtml
+++ b/DigitalLearningSolutions.Web/Views/LearningContent/Index.cshtml
@@ -1,11 +1,9 @@
-@inject IConfiguration Configuration
-@using DigitalLearningSolutions.Web.Helpers
-@using DigitalLearningSolutions.Web.ViewModels.LearningContent
+@using DigitalLearningSolutions.Data.Extensions
 @using Microsoft.Extensions.Configuration
-@model LearningContentViewModel
+@inject IConfiguration configuration
 @{
   ViewData["Title"] = "Learning Content";
-  var url = ConfigHelper.GetAppConfig()["CurrentSystemBaseUrl"] + "/Learning?brand=" + Model.Brand + "&nonav=true";
+  var url = $"{configuration.GetCurrentSystemBaseUrl()}/Learning?brand={Model.Brand}&nonav=true";
 }
 
 @section NavBreadcrumbs {
diff --git a/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/SelfAssessmentOverview.cshtml b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/SelfAssessmentOverview.cshtml
index 93c07b583c..240397b32f 100644
--- a/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/SelfAssessmentOverview.cshtml
+++ b/DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/SelfAssessmentOverview.cshtml
@@ -1,5 +1,5 @@
 @inject IConfiguration Configuration
-@using DigitalLearningSolutions.Data.Helpers
+@using DigitalLearningSolutions.Data.Extensions
 @using DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments
 @using Microsoft.Extensions.Configuration
 @model SelfAssessmentOverviewViewModel
diff --git a/DigitalLearningSolutions.Web/Views/Pricing/Index.cshtml b/DigitalLearningSolutions.Web/Views/Pricing/Index.cshtml
index 5dc3192e9e..f3e0c98210 100644
--- a/DigitalLearningSolutions.Web/Views/Pricing/Index.cshtml
+++ b/DigitalLearningSolutions.Web/Views/Pricing/Index.cshtml
@@ -1,7 +1,9 @@
-@using DigitalLearningSolutions.Web.Helpers
+@using DigitalLearningSolutions.Data.Extensions
+@using Microsoft.Extensions.Configuration
+@inject IConfiguration configuration
 @{
   ViewData["Title"] = "Pricing";
-  var url = ConfigHelper.GetAppConfig()["CurrentSystemBaseUrl"] + "/pricing?nonav=true";
+  var url = $"{configuration.GetCurrentSystemBaseUrl()}/pricing?nonav=true";
 }
 
 
diff --git a/DigitalLearningSolutions.Web/Views/Shared/Components/LearningResourceWarning/Default.cshtml b/DigitalLearningSolutions.Web/Views/Shared/Components/LearningResourceWarning/Default.cshtml
index 22a44ec326..916cab5b1c 100644
--- a/DigitalLearningSolutions.Web/Views/Shared/Components/LearningResourceWarning/Default.cshtml
+++ b/DigitalLearningSolutions.Web/Views/Shared/Components/LearningResourceWarning/Default.cshtml
@@ -1,4 +1,4 @@
-@using DigitalLearningSolutions.Data.Helpers
+@using DigitalLearningSolutions.Data.Extensions
 @using DigitalLearningSolutions.Web.ViewModels.Common.ViewComponents
 @using Microsoft.Extensions.Configuration
 @model InsetTextViewModel
diff --git a/DigitalLearningSolutions.Web/Views/Shared/_NavMenuItems.cshtml b/DigitalLearningSolutions.Web/Views/Shared/_NavMenuItems.cshtml
index 20afbb092c..952779200a 100644
--- a/DigitalLearningSolutions.Web/Views/Shared/_NavMenuItems.cshtml
+++ b/DigitalLearningSolutions.Web/Views/Shared/_NavMenuItems.cshtml
@@ -1,5 +1,5 @@
 @using DigitalLearningSolutions.Data.Enums
-@using DigitalLearningSolutions.Data.Helpers
+@using DigitalLearningSolutions.Data.Extensions
 @using DigitalLearningSolutions.Web.Extensions
 @using Microsoft.Extensions.Configuration
 @inject IConfiguration configuration