diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 26d71193cd906796ba5cd7136050c949c7cc4ddf..da1e3e9a310f0ce23802cc8cc2ad27d834f49091 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,5 @@
 variables:
+  CORE_BUILD_SUBDIR: unit-core
   IBM_BUILD_SUBDIR: provider/unit-ibm/unit-ocp
   IBM_INT_TEST_PY_SUBDIR: testing/unit_test_ibm
   IBM_INT_TEST_PY_FILE: run_test.py
diff --git a/unit-core/lombok.config b/unit-core/lombok.config
new file mode 100644
index 0000000000000000000000000000000000000000..df71bb6a0fb87825475c75620c4d5e30088ade7f
--- /dev/null
+++ b/unit-core/lombok.config
@@ -0,0 +1,2 @@
+config.stopBubbling = true
+lombok.addLombokGeneratedAnnotation = true
diff --git a/unit-core/pom.xml b/unit-core/pom.xml
index 1f10116c2a9d1693407c1e746df2ec13e95c3177..f295ddd0972d1b6322ba7cdf89ccc8493ee44de2 100644
--- a/unit-core/pom.xml
+++ b/unit-core/pom.xml
@@ -214,6 +214,13 @@
                 <groupId>org.jacoco</groupId>
                 <artifactId>jacoco-maven-plugin</artifactId>
                 <version>0.8.11</version>
+                <configuration>
+                    <excludes>
+                        <exclude>org/opengroup/osdu/unitservice/configuration/*</exclude>
+                        <exclude>org/opengroup/osdu/unitservice/swagger/*</exclude>
+                    </excludes>
+                </configuration>
+
                 <executions>
                     <execution>
                         <goals>
diff --git a/unit-core/src/test/java/org/opengroup/osdu/unitservice/api/HealthCheckTest.java b/unit-core/src/test/java/org/opengroup/osdu/unitservice/api/HealthCheckTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..adf8695554f85b4c098c00b487ed9b5f5efffbd7
--- /dev/null
+++ b/unit-core/src/test/java/org/opengroup/osdu/unitservice/api/HealthCheckTest.java
@@ -0,0 +1,28 @@
+package org.opengroup.osdu.unitservice.api;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.http.HttpStatus;
+
+import static org.junit.Assert.assertEquals;
+
+public class HealthCheckTest {
+
+    private HealthCheck sut;
+
+    @Before
+    public void setup() {
+        this.sut = new HealthCheck();
+    }
+
+    @Test
+    public void should_returnHttp200_when_checkLiveness() {
+        assertEquals(HttpStatus.OK, this.sut.livenessCheck().getStatusCode());
+    }
+
+    @Test
+    public void should_returnHttp200_when_checkReadiness() {
+        assertEquals(HttpStatus.OK, this.sut.readinessCheck().getStatusCode());
+    }
+
+}
diff --git a/unit-core/src/test/java/org/opengroup/osdu/unitservice/api/InfoApiTest.java b/unit-core/src/test/java/org/opengroup/osdu/unitservice/api/InfoApiTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca5a6b535d93b1881b38e5abd96ee7d9d4ef13b2
--- /dev/null
+++ b/unit-core/src/test/java/org/opengroup/osdu/unitservice/api/InfoApiTest.java
@@ -0,0 +1,40 @@
+package org.opengroup.osdu.unitservice.api;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.opengroup.osdu.core.common.info.VersionInfoBuilder;
+import org.opengroup.osdu.core.common.model.info.VersionInfo;
+import java.io.IOException;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class InfoApiTest {
+
+    @InjectMocks
+    private InfoApi sut;
+
+    @Mock
+    private VersionInfoBuilder versionInfoBuilder;
+
+    @Test
+    public void should_return200_getVersionInfo() throws IOException {
+        VersionInfo expectedVersionInfo = VersionInfo.builder()
+                .groupId("group")
+                .artifactId("artifact")
+                .version("0.1.0")
+                .buildTime("1000")
+                .branch("master")
+                .commitId("7777")
+                .commitMessage("Test commit")
+                .build();
+        when(versionInfoBuilder.buildVersionInfo()).thenReturn(expectedVersionInfo);
+
+        VersionInfo actualVersionInfo = this.sut.info();
+
+        assertEquals(expectedVersionInfo, actualVersionInfo);
+    }
+}
diff --git a/unit-core/src/test/java/org/opengroup/osdu/unitservice/middleware/GlobalExceptionMapperTest.java b/unit-core/src/test/java/org/opengroup/osdu/unitservice/middleware/GlobalExceptionMapperTest.java
index 5f57e8418b576c2dfac80ddd5a947273288bd6c5..32defe9558571a497f6d205084ad77765bcf7580 100644
--- a/unit-core/src/test/java/org/opengroup/osdu/unitservice/middleware/GlobalExceptionMapperTest.java
+++ b/unit-core/src/test/java/org/opengroup/osdu/unitservice/middleware/GlobalExceptionMapperTest.java
@@ -11,9 +11,10 @@ import org.opengroup.osdu.unitservice.util.AppError;
 import org.opengroup.osdu.unitservice.util.AppException;
 import org.junit.Test;
 import org.springframework.http.ResponseEntity;
-
+import java.io.IOException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
 
 @RunWith(MockitoJUnitRunner.class)
 public class GlobalExceptionMapperTest {
@@ -62,4 +63,18 @@ public class GlobalExceptionMapperTest {
         assertEquals("Bad Request", body.getReason());
         Mockito.verify(jaxRsDpsLog).error(exception.getError().getMessage(), exception);
     }
+
+    @Test
+    public void should_handleIOException_andReturnInternalServerError() {
+        IOException exception = new IOException("IO error");
+
+        ResponseEntity<AppError> response = globalExceptionMapper.handleIOException(exception);
+        AppError body = response.getBody();
+        assertNotNull(body);
+        assertEquals(INTERNAL_SERVER_ERROR.value(), body.getCode());
+        assertEquals("IO error", body.getMessage());
+        assertEquals("IOException", body.getReason());
+        Mockito.verify(jaxRsDpsLog).error(Mockito.eq("IO error"), Mockito.any(AppException.class));
+    }
+
 }
diff --git a/unit-core/src/test/java/org/opengroup/osdu/unitservice/middleware/ResponseHeaderFilterTest.java b/unit-core/src/test/java/org/opengroup/osdu/unitservice/middleware/ResponseHeaderFilterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..48726bff57610cdc33bdc0d8551f739925abaea6
--- /dev/null
+++ b/unit-core/src/test/java/org/opengroup/osdu/unitservice/middleware/ResponseHeaderFilterTest.java
@@ -0,0 +1,62 @@
+package org.opengroup.osdu.unitservice.middleware;
+
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.opengroup.osdu.core.common.http.ResponseHeadersFactory;
+import org.opengroup.osdu.core.common.model.http.DpsHeaders;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.never;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ResponseHeaderFilterTest {
+
+    @Mock
+    private DpsHeaders dpsHeaders;
+
+    @Mock
+    private ResponseHeadersFactory responseHeadersFactory;
+
+    @Mock
+    private HttpServletRequest httpServletRequest;
+
+    @Mock
+    private HttpServletResponse httpServletResponse;
+
+    @Mock
+    private FilterChain filterChain;
+
+    @InjectMocks
+    private ResponseHeaderFilter responseHeaderFilter;
+
+    @Test
+    public void test_doFilter_Handles_OptionsRequest() throws Exception {
+        when(httpServletRequest.getMethod()).thenReturn("OPTIONS");
+
+        responseHeaderFilter.doFilter(httpServletRequest, httpServletResponse, filterChain);
+
+        verify(httpServletResponse).setStatus(HttpServletResponse.SC_OK);
+    }
+
+    @Test
+    public void test_doFilter_Handles_GETRequest() throws Exception {
+        when(httpServletRequest.getMethod()).thenReturn("GET");
+
+        responseHeaderFilter.doFilter(httpServletRequest, httpServletResponse, filterChain);
+
+        verify(httpServletResponse, never()).setStatus(HttpServletResponse.SC_OK);
+    }
+
+    @After
+    public void tearDown() {
+        responseHeaderFilter.destroy();
+    }
+
+}
diff --git a/unit-core/src/test/java/org/opengroup/osdu/unitservice/middleware/UnitFilterTest.java b/unit-core/src/test/java/org/opengroup/osdu/unitservice/middleware/UnitFilterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..02777f03c7b416771457ea852cbb0ea03739169a
--- /dev/null
+++ b/unit-core/src/test/java/org/opengroup/osdu/unitservice/middleware/UnitFilterTest.java
@@ -0,0 +1,68 @@
+package org.opengroup.osdu.unitservice.middleware;
+
+import jakarta.servlet.ServletException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.opengroup.osdu.core.common.http.ResponseHeadersFactory;
+import org.opengroup.osdu.core.common.model.http.DpsHeaders;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Map;
+import static org.mockito.Mockito.verify;
+import static org.powermock.api.mockito.PowerMockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class UnitFilterTest {
+
+    @Mock
+    private DpsHeaders dpsHeaders;
+
+    @Mock
+    private ResponseHeadersFactory responseHeadersFactory;
+
+    @Mock
+    private FilterChain filterChain;
+
+    @Mock
+    private ServletRequest servletRequest;
+
+    @Mock
+    private HttpServletResponse httpServletResponse;
+
+    @InjectMocks
+    private UnitFilter unitFilter;
+
+    @Before
+    public void setUp() {
+        unitFilter.ACCESS_CONTROL_ALLOW_ORIGIN_DOMAINS = "*";
+    }
+
+    @Test
+    public void should_AddHeadersIn_doFilter() throws IOException, ServletException {
+        // Arrange
+        when(responseHeadersFactory.getResponseHeaders("*")).thenReturn(Map.of("Custom-Header", "Value"));
+        when(dpsHeaders.getCorrelationId()).thenReturn("correlation-id");
+
+        // Act
+        unitFilter.doFilter(servletRequest, httpServletResponse, filterChain);
+
+        // Assert
+        verify(filterChain).doFilter(servletRequest, httpServletResponse);
+        verify(dpsHeaders).addCorrelationIdIfMissing();
+        verify(httpServletResponse).setHeader("Custom-Header", "Value");
+        verify(httpServletResponse).addHeader(DpsHeaders.CORRELATION_ID, "correlation-id");
+    }
+
+    @After
+    public void tearDown() {
+        unitFilter.destroy();
+    }
+
+}