diff --git a/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/jobs/AboutToExpireLegalTagPublisherImpl.java b/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/jobs/AboutToExpireLegalTagPublisherImpl.java
index 8d34282f97b98917facff423b9be85d9589424c8..9963945b15928394f0fe401e7d33c3566e568bb2 100644
--- a/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/jobs/AboutToExpireLegalTagPublisherImpl.java
+++ b/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/jobs/AboutToExpireLegalTagPublisherImpl.java
@@ -7,9 +7,19 @@ import org.opengroup.osdu.legal.jobs.models.AboutToExpireLegalTags;
 import org.springframework.stereotype.Service;
 
 @Service
-public class AboutToExpireLegalTagPublisherImpl implements IAboutToExpireLegalTagPublisher {
+public class AboutToExpireLegalTagPublisherImpl extends AbstractPublisher implements IAboutToExpireLegalTagPublisher {
+    protected final static String LEGAL_TAGS_CHANGE_EVENT_SUBJECT = "legaltagclosetoexpiretopic";
+    protected final static String LEGAL_TAGS_CHANGE_EVENT_TYPE = "legaltagclosetoexpiretopic";
+    protected final static String LEGAL_TAGS_CHANGE_EVENT_DATA_VERSION = "1.0";
+    protected final static String LEGAL_TAGS_CHANGE_EVENT_DEBUG_MESSAGE = "Legal publishes about to expire tag event";
+
+    public AboutToExpireLegalTagPublisherImpl() {
+        super(LEGAL_TAGS_CHANGE_EVENT_SUBJECT, LEGAL_TAGS_CHANGE_EVENT_TYPE, LEGAL_TAGS_CHANGE_EVENT_DATA_VERSION, LEGAL_TAGS_CHANGE_EVENT_DEBUG_MESSAGE);
+    }
+
     @Override
     public void publish(String projectId, DpsHeaders headers, AboutToExpireLegalTags aboutToExpireLegalTags) {
-        // to be implemented
+        publishToServiceBus(headers, aboutToExpireLegalTags);
+        publishToEventGrid(headers, aboutToExpireLegalTags);
     }
 }
diff --git a/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/jobs/AbstractPublisher.java b/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/jobs/AbstractPublisher.java
new file mode 100644
index 0000000000000000000000000000000000000000..03ce77f86c35110d82fbb7b73b25b5a038bea8d5
--- /dev/null
+++ b/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/jobs/AbstractPublisher.java
@@ -0,0 +1,133 @@
+//  Copyright © Microsoft Corporation
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package org.opengroup.osdu.legal.azure.jobs;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.microsoft.azure.eventgrid.models.EventGridEvent;
+import com.microsoft.azure.servicebus.Message;
+import org.joda.time.DateTime;
+import org.opengroup.osdu.azure.eventgrid.EventGridTopicStore;
+import org.opengroup.osdu.azure.servicebus.ITopicClientFactory;
+import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
+import org.opengroup.osdu.core.common.model.http.DpsHeaders;
+import org.opengroup.osdu.legal.azure.di.EventGridConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import java.nio.charset.StandardCharsets;
+import java.util.UUID;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+abstract public class AbstractPublisher {
+    private final String eventSubject;
+    private final String eventType;
+    private final String eventDataVersion;
+    private final String eventDebugMessage;
+
+    @Autowired
+    private EventGridConfig eventGridConfig;
+
+    @Autowired
+    private EventGridTopicStore eventGridTopicStore;
+
+    @Inject
+    private ITopicClientFactory topicClientFactory;
+
+    @Inject
+    private JaxRsDpsLog logger;
+
+    @Inject
+    @Named("SERVICE_BUS_TOPIC")
+    private String serviceBusTopic;
+
+    AbstractPublisher(String subject, String type, String dataVersion, String debugMessage) {
+        eventSubject = subject;
+        eventType = type;
+        eventDataVersion = dataVersion;
+        eventDebugMessage = debugMessage;
+    }
+
+    protected void publishToServiceBus(DpsHeaders headers, Object tags) {
+        Message message = createMessage(headers, tags);
+        try {
+            logger.debug("Legal publishes message " + headers.getCorrelationId());
+            topicClientFactory.getClient(headers.getPartitionId(), serviceBusTopic).send(message);
+        } catch (Exception exception) {
+            logger.error(exception.getMessage(), exception);
+        }
+    }
+
+    protected void publishToEventGrid(DpsHeaders headers, Object tags) {
+        if (eventGridConfig.isPublishingToEventGridEnabled() && tags != null) {
+            HashMap<String, Object> data = new HashMap<>();
+            List<EventGridEvent> eventsList = new ArrayList<>();
+            data.put("data", tags);
+            data.put(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionId());
+            data.put(DpsHeaders.CORRELATION_ID, headers.getCorrelationId());
+            data.put(DpsHeaders.USER_EMAIL, headers.getUserEmail());
+            String messageId = UUID.randomUUID().toString();
+
+            try {
+                eventsList.add(new EventGridEvent(
+                        messageId,
+                        eventSubject,
+                        data,
+                        eventType,
+                        DateTime.now(),
+                        eventDataVersion
+                ));
+                logger.debug(eventDebugMessage + ": " + data.get(DpsHeaders.CORRELATION_ID));
+                eventGridTopicStore.publishToEventGridTopic(headers.getPartitionId(), eventGridConfig.getTopicName(), eventsList);
+            } catch (Exception exception) {
+                logger.error(exception.getMessage(), exception);
+            }
+        }
+    }
+
+    private Message createMessage(DpsHeaders headers, Object tags) {
+        Gson gson = new Gson();
+        Message message = new Message();
+        Map<String, Object> properties = new HashMap<>();
+
+        // properties
+        properties.put(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionId());
+        headers.addCorrelationIdIfMissing();
+        properties.put(DpsHeaders.CORRELATION_ID, headers.getCorrelationId());
+        properties.put(DpsHeaders.USER_EMAIL, headers.getUserEmail());
+
+        message.setProperties(properties);
+
+        // add all to body {"message": {"data":[], "id":...}}
+        JsonObject jo = new JsonObject();
+        jo.add("data", gson.toJsonTree(tags));
+        jo.addProperty(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionId());
+        jo.addProperty(DpsHeaders.CORRELATION_ID, headers.getCorrelationId());
+        jo.addProperty(DpsHeaders.USER_EMAIL, headers.getUserEmail());
+        JsonObject jomsg = new JsonObject();
+        jomsg.add("message", jo);
+
+        message.setBody(jomsg.toString().getBytes(StandardCharsets.UTF_8));
+        message.setContentType("application/json");
+
+        return message;
+    }
+}
diff --git a/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/jobs/LegalTagPublisherImpl.java b/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/jobs/LegalTagPublisherImpl.java
index 48ffbca20bcd373a884b38a82b6f2043f9e08056..7b44f6e00d7aeae89c150ffe57a4e541d593a1fc 100644
--- a/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/jobs/LegalTagPublisherImpl.java
+++ b/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/jobs/LegalTagPublisherImpl.java
@@ -14,123 +14,26 @@
 
 package org.opengroup.osdu.legal.azure.jobs;
 
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.microsoft.azure.eventgrid.models.EventGridEvent;
-import com.microsoft.azure.servicebus.Message;
-import org.joda.time.DateTime;
-import org.opengroup.osdu.azure.eventgrid.EventGridTopicStore;
-import org.opengroup.osdu.azure.servicebus.ITopicClientFactory;
-import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
 import org.opengroup.osdu.core.common.model.legal.StatusChangedTags;
-import org.opengroup.osdu.legal.azure.di.EventGridConfig;
 import org.opengroup.osdu.legal.provider.interfaces.ILegalTagPublisher;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import jakarta.inject.Inject;
-import jakarta.inject.Named;
-import java.nio.charset.StandardCharsets;
-import java.util.UUID;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.ArrayList;
-import java.util.List;
-
 @Component
-public class LegalTagPublisherImpl implements ILegalTagPublisher {
-    private final static String LEGAL_TAGS_CHANGE_EVENT_SUBJECT = "legaltagschanged";
-    private final static String LEGAL_TAGS_CHANGE_EVENT_TYPE = "legaltagschanged";
-    private final static String LEGAL_TAGS_CHANGE_EVENT_DATA_VERSION = "1.0";
-
-    @Autowired
-    private EventGridConfig eventGridConfig;
-
-    @Autowired
-    private EventGridTopicStore eventGridTopicStore;
+public class LegalTagPublisherImpl extends AbstractPublisher implements ILegalTagPublisher {
 
-    @Inject
-    private ITopicClientFactory topicClientFactory;
+    protected final static String LEGAL_TAGS_CHANGE_EVENT_SUBJECT = "legaltagschanged";
+    protected final static String LEGAL_TAGS_CHANGE_EVENT_TYPE = "legaltagschanged";
+    protected final static String LEGAL_TAGS_CHANGE_EVENT_DATA_VERSION = "1.0";
+    protected final static String LEGAL_TAGS_CHANGE_EVENT_DEBUG_MESSAGE = "Legal publishes tag changed event";
 
-    @Inject
-    private JaxRsDpsLog logger;
-
-    @Inject
-    @Named("SERVICE_BUS_TOPIC")
-    private String serviceBusTopic;
+    public LegalTagPublisherImpl() {
+        super(LEGAL_TAGS_CHANGE_EVENT_SUBJECT, LEGAL_TAGS_CHANGE_EVENT_TYPE, LEGAL_TAGS_CHANGE_EVENT_DATA_VERSION, LEGAL_TAGS_CHANGE_EVENT_DEBUG_MESSAGE);
+    }
 
     @Override
     public void publish(String projectId, DpsHeaders headers, StatusChangedTags tags) {
         publishToServiceBus(headers, tags);
-        if (eventGridConfig.isPublishingToEventGridEnabled()) {
-            publishToEventGrid(headers, tags);
-        }
-    }
-
-    private void publishToServiceBus(DpsHeaders headers, StatusChangedTags tags) {
-        Message message = createMessage(headers, tags);
-        try {
-            logger.debug("Storage publishes message " + headers.getCorrelationId());
-            topicClientFactory.getClient(headers.getPartitionId(), serviceBusTopic).send(message);
-        } catch (Exception exception) {
-            logger.error(exception.getMessage(), exception);
-        }
-    }
-
-    private void publishToEventGrid(DpsHeaders headers, StatusChangedTags tags) {
-        if (tags == null) {
-            return;
-        }
-        HashMap<String, Object> data = new HashMap<>();
-        List<EventGridEvent> eventsList = new ArrayList<>();
-        data.put("data", tags);
-        data.put(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionId());
-        data.put(DpsHeaders.CORRELATION_ID, headers.getCorrelationId());
-        data.put(DpsHeaders.USER_EMAIL, headers.getUserEmail());
-        String messageId = UUID.randomUUID().toString();
-
-        try {
-            eventsList.add(new EventGridEvent(
-                    messageId,
-                    LEGAL_TAGS_CHANGE_EVENT_SUBJECT,
-                    data,
-                    LEGAL_TAGS_CHANGE_EVENT_TYPE,
-                    DateTime.now(),
-                    LEGAL_TAGS_CHANGE_EVENT_DATA_VERSION
-            ));
-            logger.debug("Legal publishes tag changed event: " + data.get(DpsHeaders.CORRELATION_ID));
-            eventGridTopicStore.publishToEventGridTopic(headers.getPartitionId(), eventGridConfig.getTopicName(), eventsList);
-        } catch (Exception exception) {
-            logger.error(exception.getMessage(), exception);
-        }
-    }
-
-    private Message createMessage(DpsHeaders headers, StatusChangedTags tags) {
-        Gson gson = new Gson();
-        Message message = new Message();
-        Map<String, Object> properties = new HashMap<>();
-
-        // properties
-        properties.put(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionId());
-        headers.addCorrelationIdIfMissing();
-        properties.put(DpsHeaders.CORRELATION_ID, headers.getCorrelationId());
-        properties.put(DpsHeaders.USER_EMAIL, headers.getUserEmail());
-
-        message.setProperties(properties);
-
-        // add all to body {"message": {"data":[], "id":...}}
-        JsonObject jo = new JsonObject();
-        jo.add("data", gson.toJsonTree(tags));
-        jo.addProperty(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionId());
-        jo.addProperty(DpsHeaders.CORRELATION_ID, headers.getCorrelationId());
-        jo.addProperty(DpsHeaders.USER_EMAIL, headers.getUserEmail());
-        JsonObject jomsg = new JsonObject();
-        jomsg.add("message", jo);
-
-        message.setBody(jomsg.toString().getBytes(StandardCharsets.UTF_8));
-        message.setContentType("application/json");
-
-        return message;
+        publishToEventGrid(headers, tags);
     }
-}
+}
\ No newline at end of file
diff --git a/provider/legal-azure/src/main/resources/application.properties b/provider/legal-azure/src/main/resources/application.properties
index b12e46204a87babf58495308d284bc407363c418..e4e7c9a15d4c13003247445916bdd2870a758377 100644
--- a/provider/legal-azure/src/main/resources/application.properties
+++ b/provider/legal-azure/src/main/resources/application.properties
@@ -82,7 +82,7 @@ api.server.fullUrl.enabled=${swaggerFullUrlEnabled:true}
 
 # Feature flag settings
 featureFlag.strategy=appProperty
-featureFlag.aboutToExpireLegalTag.enabled=false
+featureFlag.aboutToExpireLegalTag.enabled=true
 featureFlag.legalTagQueryApi.enabled=true
 featureFlag.legalTagQueryApiFreeTextAllFields.enabled=false
 
diff --git a/provider/legal-azure/src/test/java/org/opengroup/osdu/legal/azure/AboutToExpireLegalTagPublisherImplTest.java b/provider/legal-azure/src/test/java/org/opengroup/osdu/legal/azure/AboutToExpireLegalTagPublisherImplTest.java
index 79afec2278bc18d6a40f1b990635e9ad9dce2c0d..30e3990d88136e27eeab9b57c1ee33ca52cc15e3 100644
--- a/provider/legal-azure/src/test/java/org/opengroup/osdu/legal/azure/AboutToExpireLegalTagPublisherImplTest.java
+++ b/provider/legal-azure/src/test/java/org/opengroup/osdu/legal/azure/AboutToExpireLegalTagPublisherImplTest.java
@@ -14,28 +14,208 @@
 
 package org.opengroup.osdu.legal.azure;
 
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.microsoft.azure.CloudException;
+import com.microsoft.azure.eventgrid.models.EventGridEvent;
+import com.microsoft.azure.servicebus.Message;
+import com.microsoft.azure.servicebus.MessageBody;
+import com.microsoft.azure.servicebus.TopicClient;
+import com.microsoft.azure.servicebus.primitives.ServiceBusException;
+import okhttp3.MediaType;
+import okhttp3.ResponseBody;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.opengroup.osdu.azure.eventgrid.EventGridTopicStore;
+import org.opengroup.osdu.azure.servicebus.ITopicClientFactory;
+import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
+import org.opengroup.osdu.legal.azure.di.EventGridConfig;
 import org.opengroup.osdu.legal.azure.jobs.AboutToExpireLegalTagPublisherImpl;
 import org.opengroup.osdu.legal.jobs.models.AboutToExpireLegalTags;
+import retrofit2.Response;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.never;
 
 @RunWith(MockitoJUnitRunner.class)
 public class AboutToExpireLegalTagPublisherImplTest {
 
+    private final static String EVENT_SUBJECT = "legaltagclosetoexpiretopic";
+    private static final String CORRELATION_ID = "correlation-id";
+    private static final String USER_EMAIL = "user@email.com";
+    private static final String PARTITION_ID = "partition-id";
+
+    @Mock
+    private JaxRsDpsLog logger;
+
+    @Mock
+    private ITopicClientFactory topicClientFactory;
+
+    @Mock
+    private EventGridTopicStore eventGridTopicStore;
+
+    @Mock
+    private EventGridConfig eventGridConfig;
+
+    @Mock
+    private TopicClient topicClient;
+
     @Mock
     private DpsHeaders headers;
 
     @InjectMocks
     private AboutToExpireLegalTagPublisherImpl sut;
 
+    @Before
+    public void init() throws ServiceBusException, InterruptedException {
+        doReturn(CORRELATION_ID).when(headers).getCorrelationId();
+        doReturn(USER_EMAIL).when(headers).getUserEmail();
+        doReturn(PARTITION_ID).when(headers).getPartitionId();
+        doReturn(topicClient).when(topicClientFactory).getClient(eq(PARTITION_ID), any());
+    }
+
+    @Test
+    public void shouldPublishToServiceBus() throws Exception {
+        AboutToExpireLegalTags aboutToExpireLegalTags = new AboutToExpireLegalTags();
+
+        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
+        ArgumentCaptor<String> debugLogArgumentCaptor = ArgumentCaptor.forClass(String.class);
+
+        sut.publish("project-id", headers, aboutToExpireLegalTags);
+
+        verify(logger).debug(debugLogArgumentCaptor.capture());
+        verify(topicClient).send(messageArgumentCaptor.capture());
+
+        Map<String, Object> properties = messageArgumentCaptor.getValue().getProperties();
+        MessageBody messageBody = messageArgumentCaptor.getValue().getMessageBody();
+        Gson gson = new Gson();
+        String messageKey = "message";
+        String dataKey = "data";
+        JsonObject jsonObjectMessage = gson.fromJson(new String(messageBody.getBinaryData().get(0)), JsonObject.class);
+        JsonObject jsonObject = (JsonObject) jsonObjectMessage.get(messageKey);
+
+        assertEquals("Legal publishes message " + CORRELATION_ID, debugLogArgumentCaptor.getValue());
+        assertEquals(PARTITION_ID, properties.get(DpsHeaders.DATA_PARTITION_ID));
+        assertEquals(CORRELATION_ID, properties.get(DpsHeaders.CORRELATION_ID));
+        assertEquals(USER_EMAIL, properties.get(DpsHeaders.USER_EMAIL));
+        assertEquals(PARTITION_ID, jsonObject.get(DpsHeaders.DATA_PARTITION_ID).getAsString());
+        assertEquals(CORRELATION_ID, jsonObject.get(DpsHeaders.CORRELATION_ID).getAsString());
+        assertEquals(USER_EMAIL, jsonObject.get(DpsHeaders.USER_EMAIL).getAsString());
+        assertEquals(gson.toJsonTree(aboutToExpireLegalTags), jsonObject.get(dataKey));
+    }
+
+    @Test
+    public void shouldLogError_whenPublishToServiceBusFails() throws Exception {
+        AboutToExpireLegalTags aboutToExpireLegalTags = new AboutToExpireLegalTags();
+
+        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
+        ArgumentCaptor<String> debugLogArgumentCaptor = ArgumentCaptor.forClass(String.class);
+        ArgumentCaptor<Exception> exceptionArgumentCaptor = ArgumentCaptor.forClass(Exception.class);
+        ArgumentCaptor<String> errorLogArgumentCaptor = ArgumentCaptor.forClass(String.class);
+
+        var serviceBusExceptionMessage = "com.microsoft.azure.servicebus.amqp.AmqpException: The connection was inactive for more than the allowed 300000 milliseconds";
+        ServiceBusException serviceBusException = new ServiceBusException(true, serviceBusExceptionMessage);
+        doThrow(serviceBusException).when(topicClient).send(any());
+
+        sut.publish("project-id", headers, aboutToExpireLegalTags);
+
+        verify(logger).debug(debugLogArgumentCaptor.capture());
+        verify(topicClient).send(messageArgumentCaptor.capture());
+        verify(logger).error(errorLogArgumentCaptor.capture(), exceptionArgumentCaptor.capture());
+
+        Map<String, Object> properties = messageArgumentCaptor.getValue().getProperties();
+        MessageBody messageBody = messageArgumentCaptor.getValue().getMessageBody();
+        Gson gson = new Gson();
+        String messageKey = "message";
+        String dataKey = "data";
+        JsonObject jsonObjectMessage = gson.fromJson(new String(messageBody.getBinaryData().get(0)), JsonObject.class);
+        JsonObject jsonObject = (JsonObject) jsonObjectMessage.get(messageKey);
+
+        assertEquals("Legal publishes message " + CORRELATION_ID, debugLogArgumentCaptor.getValue());
+        assertEquals(serviceBusExceptionMessage, errorLogArgumentCaptor.getValue());
+        assertEquals(serviceBusException, exceptionArgumentCaptor.getValue());
+        assertEquals(PARTITION_ID, properties.get(DpsHeaders.DATA_PARTITION_ID));
+        assertEquals(CORRELATION_ID, properties.get(DpsHeaders.CORRELATION_ID));
+        assertEquals(USER_EMAIL, properties.get(DpsHeaders.USER_EMAIL));
+        assertEquals(PARTITION_ID, jsonObject.get(DpsHeaders.DATA_PARTITION_ID).getAsString());
+        assertEquals(CORRELATION_ID, jsonObject.get(DpsHeaders.CORRELATION_ID).getAsString());
+        assertEquals(USER_EMAIL, jsonObject.get(DpsHeaders.USER_EMAIL).getAsString());
+        assertEquals(gson.toJsonTree(aboutToExpireLegalTags), jsonObject.get(dataKey));
+    }
+
+    @Test
+    public void shouldPublishToEventGrid_whenFlagIsSet() throws ServiceBusException, InterruptedException {
+        AboutToExpireLegalTags aboutToExpireLegalTags = new AboutToExpireLegalTags();
+
+        ArgumentCaptor<String> partitionNameCaptor = ArgumentCaptor.forClass(String.class);
+        ArgumentCaptor<String> topicNameArgumentCaptor = ArgumentCaptor.forClass(String.class);
+        ArgumentCaptor<List<EventGridEvent>> listEventGridEventArgumentCaptor = ArgumentCaptor.forClass(List.class);
+        doNothing().when(this.eventGridTopicStore).publishToEventGridTopic(
+                partitionNameCaptor.capture(), topicNameArgumentCaptor.capture(), listEventGridEventArgumentCaptor.capture()
+        );
+        when(this.eventGridConfig.isPublishingToEventGridEnabled()).thenReturn(true);
+        when(this.eventGridConfig.getTopicName()).thenReturn(EVENT_SUBJECT);
+
+        sut.publish("project-id", headers, aboutToExpireLegalTags);
+
+        verify(this.eventGridTopicStore, times(1)).publishToEventGridTopic(any(), any(), anyList());
+
+        assertEquals(1, listEventGridEventArgumentCaptor.getValue().size());
+        assertEquals(EVENT_SUBJECT, topicNameArgumentCaptor.getValue());
+        assertEquals(PARTITION_ID, partitionNameCaptor.getValue());
+    }
+
     @Test
-    public void shouldPublishToServiceBus() {
+    public void shouldLogError_whenPublishToEventGridFails() {
         AboutToExpireLegalTags aboutToExpireLegalTags = new AboutToExpireLegalTags();
+
+        ArgumentCaptor<String> partitionNameCaptor = ArgumentCaptor.forClass(String.class);
+        ArgumentCaptor<String> topicNameArgumentCaptor = ArgumentCaptor.forClass(String.class);
+        ArgumentCaptor<List<EventGridEvent>> listEventGridEventArgumentCaptor = ArgumentCaptor.forClass(List.class);
+        ArgumentCaptor<Exception> exceptionArgumentCaptor = ArgumentCaptor.forClass(Exception.class);
+        ArgumentCaptor<String> errorLogArgumentCaptor = ArgumentCaptor.forClass(String.class);
+
+        when(this.eventGridConfig.isPublishingToEventGridEnabled()).thenReturn(true);
+        when(this.eventGridConfig.getTopicName()).thenReturn(EVENT_SUBJECT);
+
+        var cloudExceptionMessage = "Cloud Exception occurred";
+        MediaType mediaType = null;
+        Response<ResponseBody> errorResponse = Response.error(503, ResponseBody.create("Service Unavailable", mediaType));
+        CloudException cloudException = new CloudException(cloudExceptionMessage, errorResponse);
+        doThrow(cloudException).when(eventGridTopicStore).publishToEventGridTopic(partitionNameCaptor.capture(), topicNameArgumentCaptor.capture(), listEventGridEventArgumentCaptor.capture());
+
         sut.publish("project-id", headers, aboutToExpireLegalTags);
+
+        verify(this.eventGridTopicStore, times(1)).publishToEventGridTopic(any(), any(), anyList());
+        verify(logger).error(errorLogArgumentCaptor.capture(), exceptionArgumentCaptor.capture());
+
+        assertEquals(1, listEventGridEventArgumentCaptor.getValue().size());
+        assertEquals(EVENT_SUBJECT, topicNameArgumentCaptor.getValue());
+        assertEquals( PARTITION_ID, partitionNameCaptor.getValue());
+        assertEquals(cloudExceptionMessage, errorLogArgumentCaptor.getValue());
+        assertEquals(cloudException, exceptionArgumentCaptor.getValue());
     }
 
-}
+    @Test
+    public void shouldNotPublishToEventGrid_whenFlagStatusChangedTagsIsNull() {
+        AboutToExpireLegalTags aboutToExpireLegalTags = null;
+        when(this.eventGridConfig.isPublishingToEventGridEnabled()).thenReturn(true);
+
+        sut.publish("project-id", headers, aboutToExpireLegalTags);
+
+        verify(this.eventGridTopicStore, never()).publishToEventGridTopic(any(), any(), anyList());
+    }
+}
\ No newline at end of file
diff --git a/provider/legal-azure/src/test/java/org/opengroup/osdu/legal/azure/jobs/LegalTagPublisherImplTest.java b/provider/legal-azure/src/test/java/org/opengroup/osdu/legal/azure/jobs/LegalTagPublisherImplTest.java
index f2ac798b62e2d32b62f89dceff2b7d286889da47..b8ebb1c69a2526e6f26c141d39f90a3ee1ef1aa3 100644
--- a/provider/legal-azure/src/test/java/org/opengroup/osdu/legal/azure/jobs/LegalTagPublisherImplTest.java
+++ b/provider/legal-azure/src/test/java/org/opengroup/osdu/legal/azure/jobs/LegalTagPublisherImplTest.java
@@ -110,7 +110,7 @@ public class LegalTagPublisherImplTest {
         JsonObject jsonObjectMessage = gson.fromJson(new String(messageBody.getBinaryData().get(0)), JsonObject.class);
         JsonObject jsonObject = (JsonObject) jsonObjectMessage.get(messageKey);
 
-        assertEquals("Storage publishes message " + CORRELATION_ID, debugLogArgumentCaptor.getValue());
+        assertEquals("Legal publishes message " + CORRELATION_ID, debugLogArgumentCaptor.getValue());
         assertEquals(PARTITION_ID, properties.get(DpsHeaders.DATA_PARTITION_ID));
         assertEquals(CORRELATION_ID, properties.get(DpsHeaders.CORRELATION_ID));
         assertEquals(USER_EMAIL, properties.get(DpsHeaders.USER_EMAIL));
@@ -147,7 +147,7 @@ public class LegalTagPublisherImplTest {
         JsonObject jsonObjectMessage = gson.fromJson(new String(messageBody.getBinaryData().get(0)), JsonObject.class);
         JsonObject jsonObject = (JsonObject) jsonObjectMessage.get(messageKey);
 
-        assertEquals("Storage publishes message " + CORRELATION_ID, debugLogArgumentCaptor.getValue());
+        assertEquals("Legal publishes message " + CORRELATION_ID, debugLogArgumentCaptor.getValue());
         assertEquals(serviceBusExceptionMessage, errorLogArgumentCaptor.getValue());
         assertEquals(serviceBusException, exceptionArgumentCaptor.getValue());
         assertEquals(PARTITION_ID, properties.get(DpsHeaders.DATA_PARTITION_ID));