diff --git a/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/provider/azure/EventGridHandshakeHandlerTest.java b/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/provider/azure/EventGridHandshakeHandlerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b58451b966a0f192f13111ad3728a3ed606c2a28
--- /dev/null
+++ b/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/provider/azure/EventGridHandshakeHandlerTest.java
@@ -0,0 +1,75 @@
+
+// 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.notification.provider.azure;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.opengroup.osdu.core.common.model.http.AppException;
+import org.opengroup.osdu.notification.provider.azure.pubsub.EventGridHandshakeHandler;
+import org.opengroup.osdu.notification.provider.azure.pubsub.EventGridRequestBodyExtractor;
+import org.springframework.http.HttpStatus;
+
+import java.io.IOException;
+
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class EventGridHandshakeHandlerTest {
+    @Mock
+    EventGridRequestBodyExtractor eventGridRequestBodyExtractor;
+
+    @InjectMocks
+    @Spy
+    private EventGridHandshakeHandler sut;
+
+    @Test
+    public void should_returnValidResponse_getHandshakeResponse() throws IOException {
+        // Set up
+        when(sut.getHandshakeResponse()).thenReturn("testValidationCode");
+        String expectedResponse = "{\"ValidationResponse\":\"testValidationCode\"}";
+
+        // Act
+        String observedResponse = this.sut.getHandshakeResponse();
+
+        // Assert
+        Assert.assertEquals(observedResponse, expectedResponse);
+    }
+
+    @Test
+    public void should_throw_getHandshakeResponse() throws IOException {
+        // Set up
+        when(sut.getHandshakeResponse())
+                .thenThrow(new AppException(HttpStatus.BAD_REQUEST.value(), "Request payload parsing error", "" ));
+        try{
+            // Act
+            String observedResponse = this.sut.getHandshakeResponse();
+
+            // Assert
+            fail("Should Throw Exception");
+        } catch (AppException appException){
+            Assert.assertEquals(HttpStatus.BAD_REQUEST.value(), appException.getError().getCode());
+            Assert.assertEquals("Unable to parse request payload.", appException.getError().getMessage());
+        } catch (Exception exception) {
+            fail("Should Throw AppException");
+        }
+    }
+}
\ No newline at end of file
diff --git a/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/provider/azure/EventGridRequestBodyExtractorTest.java b/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/provider/azure/EventGridRequestBodyExtractorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..bce964c17c1fe8f000a66c41954a63c792618285
--- /dev/null
+++ b/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/provider/azure/EventGridRequestBodyExtractorTest.java
@@ -0,0 +1,304 @@
+// 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.notification.provider.azure;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
+import org.opengroup.osdu.core.common.model.http.AppException;
+import org.opengroup.osdu.notification.provider.azure.pubsub.EventGridRequestBodyExtractor;
+import org.springframework.http.HttpStatus;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Map;
+
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class EventGridRequestBodyExtractorTest {
+
+    private EventGridRequestBodyExtractor sut;
+
+    @Mock
+    private HttpServletRequest httpServletRequest;
+
+    @Mock
+    private JaxRsDpsLog log;
+
+    @Test
+    public void should_returnTrue_isHandshakeRequest() throws IOException {
+        // Set up
+        String validHandshakeRequestRoot =
+                "    [{\n" +
+                        "        \"id\": \"testId\",\n" +
+                        "        \"topic\": \"testTopic\",\n" +
+                        "        \"subject\": \"\",\n" +
+                        "        \"data\": {\n" +
+                        "            \"validationCode\": \"testValidationCode\",\n" +
+                        "            \"validationUrl\": \"testURL\"\n" +
+                        "        },\n" +
+                        "        \"eventType\": \"Microsoft.EventGrid.SubscriptionValidationEvent\",\n" +
+                        "        \"eventTime\": \"2020-08-14T11:18:55.9278057Z\",\n" +
+                        "        \"metadataVersion\": \"1\",\n" +
+                        "        \"dataVersion\": \"2\"\n" +
+                        "    }]";
+        BufferedReader reader = new BufferedReader(new StringReader(validHandshakeRequestRoot));
+        when(this.httpServletRequest.getReader()).thenReturn(reader);
+        sut = new EventGridRequestBodyExtractor(httpServletRequest, log);
+
+        // Act
+        boolean response = this.sut.isHandshakeRequest();
+
+        // Assert
+        Assert.assertTrue(response);
+    }
+
+    @Test
+    public void shouldThrow_whenRequestTypeIsNotright_isHandshakeRequest() throws IOException {
+        //SetUp
+        String invalidHandshakeRequestRoot =
+                "    [{\n" +
+                        "        \"id\": \"testId\",\n" +
+                        "        \"topic\": \"testTopic\",\n" +
+                        "        \"subject\": \"\",\n" +
+                        "        \"data\": {\n" +
+                        "            \"validationCode\": \"testValidationCode\",\n" +
+                        "            \"validationUrl\": \"testURL\"\n" +
+                        "        },\n" +
+                        "        \"eventType\": \"SubscriptionValidationEvent\",\n" +
+                        "        \"eventTime\": \"2020-08-14T11:18:55.9278057Z\",\n" +
+                        "        \"metadataVersion\": \"1\",\n" +
+                        "        \"dataVersion\": \"2\"\n" +
+                        "    }]";
+        BufferedReader reader = new BufferedReader(new StringReader(invalidHandshakeRequestRoot));
+        when(this.httpServletRequest.getReader()).thenReturn(reader);
+
+        try{
+            // Act
+            sut = new EventGridRequestBodyExtractor(httpServletRequest, log);
+
+            // Assert
+            fail("Should Throw Exception");
+        } catch (AppException appException){
+            Assert.assertEquals(HttpStatus.BAD_REQUEST.value(), appException.getError().getCode());
+            Assert.assertEquals("Unable to parse request payload.", appException.getError().getMessage());
+        } catch (Exception exception) {
+            fail("Should Throw AppException");
+        }
+    }
+
+    @Test
+    public void should_throwWhenAttributesAreMissing_extractDataFromRequestBody() throws IOException {
+        String requestRootWithoutAttributes = "[{\n" +
+                "        \"id\": \"2425\",\n" +
+                "        \"eventType\": \"recordInserted\",\n" +
+                "        \"subject\": \"myapp/vehicles/motorcycles\",\n" +
+                "        \"data\": {\n" +
+                "            \"data\": \"W3sia2luZCI6InRlc3RraW5kIiwiaWQiOiJ0ZXN0aWQiLCJvcGVyYXRpb250eXBlIjoiY3JlYXRlIn0seyJraW5kIjoidGVzdGtpbmQyIiwiaWQiOiJ0ZXN0aWQyIiwib3BlcmF0aW9udHlwZSI6InVwZGF0ZSJ9XQ\",\n" +
+                "            \"messageId\": \"136969346945\"\n" +
+                "        },\n" +
+                "        \"dataVersion\": \"1.0\",\n" +
+                "        \"metadataVersion\": \"1\",\n" +
+                "        \"eventTime\": \"2020-08-14T18:04:12+00:00\",\n" +
+                "        \"topic\": \"/subscriptions/c99e2bf3-1777-412b-baba-d823676589c2/resourceGroups/komakkar-OSDU-RG/providers/Microsoft.EventGrid/topics/recordChanged\"\n" +
+                "    }]";
+        BufferedReader reader = new BufferedReader(new StringReader(requestRootWithoutAttributes));
+        when(this.httpServletRequest.getReader()).thenReturn(reader);
+
+        try{
+            // Act
+            sut = new EventGridRequestBodyExtractor(httpServletRequest, log);
+
+            // Asset
+            fail("Should Throw Exception");
+        } catch (AppException appException){
+            Assert.assertEquals(HttpStatus.BAD_REQUEST.value(), appException.getError().getCode());
+            Assert.assertEquals("Unable to parse request payload.", appException.getError().getMessage());
+        } catch (Exception exception) {
+            fail("Should Throw AppException");
+        }
+    }
+
+    @Test
+    public void should_throwWhenDataFiledIsMissing_extractDataFromRequestBody() throws IOException {
+        String requestRootWithoutData = "[{\n" +
+                "        \"id\": \"2425\",\n" +
+                "        \"eventType\": \"recordInserted\",\n" +
+                "        \"subject\": \"myapp/vehicles/motorcycles\",\n" +
+                "        \"data\": {\n" +
+                "            \"attributes\": {\n" +
+                "                \"correlation-id\": \"39137f49-67d6-4001-a6aa-15521ef4f49e\",\n" +
+                "                \"data-partition-id\": \"opendes \"\n" +
+                "            },\n" +
+                "            \"messageId\": \"136969346945\"\n" +
+                "        },\n" +
+                "        \"dataVersion\": \"1.0\",\n" +
+                "        \"metadataVersion\": \"1\",\n" +
+                "        \"eventTime\": \"2020-08-14T18:04:12+00:00\",\n" +
+                "        \"topic\": \"/subscriptions/c99e2bf3-1777-412b-baba-d823676589c2/resourceGroups/komakkar-OSDU-RG/providers/Microsoft.EventGrid/topics/recordChanged\"\n" +
+                "    }]";
+        BufferedReader reader = new BufferedReader(new StringReader(requestRootWithoutData));
+        when(this.httpServletRequest.getReader()).thenReturn(reader);
+
+        try{
+            // Act
+            sut = new EventGridRequestBodyExtractor(httpServletRequest, log);
+
+            // Asset
+            fail("Should Throw Exception");
+        } catch (AppException appException){
+            Assert.assertEquals(HttpStatus.BAD_REQUEST.value(), appException.getError().getCode());
+            Assert.assertEquals("Unable to parse request payload.", appException.getError().getMessage());
+        } catch (Exception exception) {
+            fail("Should Throw AppException");
+        }
+    }
+
+    @Test
+    public void should_throwWhenPartitionIdIsMissing_extractDataFromRequestBody() throws IOException {
+        String requestRootWithoutDataPartitionId = "[{\n" +
+                "        \"id\": \"2425\",\n" +
+                "        \"eventType\": \"recordInserted\",\n" +
+                "        \"subject\": \"myapp/vehicles/motorcycles\",\n" +
+                "        \"data\": {\n" +
+                "            \"attributes\": {\n" +
+                "                \"correlation-id\": \"39137f49-67d6-4001-a6aa-15521ef4f49e\"\n" +
+                "            },\n" +
+                "            \"data\": \"W3sia2luZCI6InRlc3RraW5kIiwiaWQiOiJ0ZXN0aWQiLCJvcGVyYXRpb250eXBlIjoiY3JlYXRlIn0seyJraW5kIjoidGVzdGtpbmQyIiwiaWQiOiJ0ZXN0aWQyIiwib3BlcmF0aW9udHlwZSI6InVwZGF0ZSJ9XQ\",\n"+
+                "            \"messageId\": \"136969346945\"\n" +
+                "        },\n" +
+                "        \"dataVersion\": \"1.0\",\n" +
+                "        \"metadataVersion\": \"1\",\n" +
+                "        \"eventTime\": \"2020-08-14T18:04:12+00:00\",\n" +
+                "        \"topic\": \"/subscriptions/c99e2bf3-1777-412b-baba-d823676589c2/resourceGroups/komakkar-OSDU-RG/providers/Microsoft.EventGrid/topics/recordChanged\"\n" +
+                "    }]";
+        BufferedReader reader = new BufferedReader(new StringReader(requestRootWithoutDataPartitionId));
+        when(this.httpServletRequest.getReader()).thenReturn(reader);
+
+        try{
+            // Act
+            sut = new EventGridRequestBodyExtractor(httpServletRequest, log);
+
+            // Asset
+            fail("Should Throw Exception");
+        } catch (AppException appException){
+            Assert.assertEquals(HttpStatus.BAD_REQUEST.value(), appException.getError().getCode());
+            Assert.assertEquals("Unable to parse request payload.", appException.getError().getMessage());
+        } catch (Exception exception) {
+            fail("Should Throw AppException");
+        }
+    }
+
+    @Test
+    public void should_returnValidData_extractDataFromRequestBody() throws IOException {
+        String vaidRequestRoot = "[{\n" +
+                "        \"id\": \"2425\",\n" +
+                "        \"eventType\": \"recordInserted\",\n" +
+                "        \"subject\": \"myapp/vehicles/motorcycles\",\n" +
+                "        \"data\": {\n" +
+                "            \"attributes\": {\n" +
+                "                \"correlation-id\": \"39137f49-67d6-4001-a6aa-15521ef4f49e\",\n" +
+                "                \"data-partition-id\": \"opendes \"\n" +
+                "            },\n" +
+                "            \"data\": \"W3sia2luZCI6InRlc3RraW5kIiwiaWQiOiJ0ZXN0aWQiLCJvcGVyYXRpb250eXBlIjoiY3JlYXRlIn0seyJraW5kIjoidGVzdGtpbmQyIiwiaWQiOiJ0ZXN0aWQyIiwib3BlcmF0aW9udHlwZSI6InVwZGF0ZSJ9XQ\",\n" +
+                "            \"messageId\": \"136969346945\"\n" +
+                "        },\n" +
+                "        \"dataVersion\": \"1.0\",\n" +
+                "        \"metadataVersion\": \"1\",\n" +
+                "        \"eventTime\": \"2020-08-14T18:04:12+00:00\",\n" +
+                "        \"topic\": \"/subscriptions/c99e2bf3-1777-412b-baba-d823676589c2/resourceGroups/komakkar-OSDU-RG/providers/Microsoft.EventGrid/topics/recordChanged\"\n" +
+                "    }]";
+
+        String expectedData = "[{\"kind\":\"testkind\",\"id\":\"testid\",\"operationtype\":\"create\"},{\"kind\":\"testkind2\",\"id\":\"testid2\",\"operationtype\":\"update\"}]";
+
+        BufferedReader reader = new BufferedReader(new StringReader(vaidRequestRoot));
+        when(this.httpServletRequest.getReader()).thenReturn(reader);
+
+        sut = new EventGridRequestBodyExtractor(httpServletRequest, log);
+
+        // Act
+        String receivedData = this.sut.extractDataFromRequestBody();
+
+        // Asset
+        Assert.assertEquals(expectedData,receivedData);
+    }
+
+    @Test
+    public void should_returnValidAttributes_extractDataFromRequestBody() throws IOException {
+        String vaidRequestRoot = "[{\n" +
+                "        \"id\": \"2425\",\n" +
+                "        \"eventType\": \"recordInserted\",\n" +
+                "        \"subject\": \"myapp/vehicles/motorcycles\",\n" +
+                "        \"data\": {\n" +
+                "            \"attributes\": {\n" +
+                "                \"correlation-id\": \"39137f49-67d6-4001-a6aa-15521ef4f49e\",\n" +
+                "                \"data-partition-id\": \"opendes\"\n" +
+                "            },\n" +
+                "            \"data\": \"W3sia2luZCI6InRlc3RraW5kIiwiaWQiOiJ0ZXN0aWQiLCJvcGVyYXRpb250eXBlIjoiY3JlYXRlIn0seyJraW5kIjoidGVzdGtpbmQyIiwiaWQiOiJ0ZXN0aWQyIiwib3BlcmF0aW9udHlwZSI6InVwZGF0ZSJ9XQ\",\n" +
+                "            \"messageId\": \"136969346945\"\n" +
+                "        },\n" +
+                "        \"dataVersion\": \"1.0\",\n" +
+                "        \"metadataVersion\": \"1\",\n" +
+                "        \"eventTime\": \"2020-08-14T18:04:12+00:00\",\n" +
+                "        \"topic\": \"/subscriptions/c99e2bf3-1777-412b-baba-d823676589c2/resourceGroups/komakkar-OSDU-RG/providers/Microsoft.EventGrid/topics/recordChanged\"\n" +
+                "    }]";
+        BufferedReader reader = new BufferedReader(new StringReader(vaidRequestRoot));
+        when(this.httpServletRequest.getReader()).thenReturn(reader);
+        sut = new EventGridRequestBodyExtractor(httpServletRequest, log);
+
+        // Act
+        Map<String, String> observedAttributes = this.sut.extractAttributesFromRequestBody();
+
+        // Asset
+        Assert.assertEquals(observedAttributes.get("correlation-id"),"39137f49-67d6-4001-a6aa-15521ef4f49e");
+        Assert.assertEquals(observedAttributes.get("data-partition-id"),"opendes");
+    }
+
+    @Test
+    public void should_returnValidResponse_getHandshakeResponse() throws IOException {
+        // Set up
+        String validHandshakeRequestRoot =
+                "    [{\n" +
+                        "        \"id\": \"testId\",\n" +
+                        "        \"topic\": \"testTopic\",\n" +
+                        "        \"subject\": \"\",\n" +
+                        "        \"data\": {\n" +
+                        "            \"validationCode\": \"testValidationCode\",\n" +
+                        "            \"validationUrl\": \"testURL\"\n" +
+                        "        },\n" +
+                        "        \"eventType\": \"Microsoft.EventGrid.SubscriptionValidationEvent\",\n" +
+                        "        \"eventTime\": \"2020-08-14T11:18:55.9278057Z\",\n" +
+                        "        \"metadataVersion\": \"1\",\n" +
+                        "        \"dataVersion\": \"2\"\n" +
+                        "    }]";
+        String expectedResponse = "testValidationCode";
+        BufferedReader reader = new BufferedReader(new StringReader(validHandshakeRequestRoot));
+        when(this.httpServletRequest.getReader()).thenReturn(reader);
+        sut = new EventGridRequestBodyExtractor(httpServletRequest, log);
+
+        // Act
+        String observedResponse = this.sut.getValidationCodeForHandshake();
+
+        // Assert
+        Assert.assertEquals(observedResponse, expectedResponse);
+    }
+}