diff --git a/.fossa.yml b/.fossa.yml
index b79d42e03e2fdacc6fd84418321955a718306626..20509cd2de2cb5f1cbfe6d38c84e19d64a6d4f88 100644
--- a/.fossa.yml
+++ b/.fossa.yml
@@ -23,4 +23,8 @@ analyze:
   - name: notification-azure
     type: mvn
     target: provider/notification-azure/pom.xml
+    path: .
+  - name: notification-aws
+    type: mvn
+    target: provider/notification-aws/pom.xml
     path: .
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 67606948fc1c96a9fea8234a02713d5814fbc429..32bd84fc706eb0b8b18990f195f0f35ae442a3e4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,6 +4,17 @@ variables:
   OSDU_GCP_SERVICE: notification
   OSDU_GCP_ENV_VARS: APP_PROJECT=${OSDU_GCP_PROJECT},APP_ENTITLEMENTS=${OSDU_GCP_ENTITLEMENTS_URL},APP_REGISTER=${OSDU_GCP_REGISTER_URL},APP_GOOGLEAUDIENCE=${GOOGLE_AUDIENCE}
 
+  AWS_BUILD_SUBDIR: provider/notification-aws/build-aws
+  AWS_TEST_SUBDIR: testing/notification-test-aws
+  AWS_SERVICE: notification
+  AWS_ENVIRONMENT: dev
+
+  AZURE_SERVICE: notification
+  AZURE_BUILD_SUBDIR: provider/notification-azure
+  AZURE_TEST_SUBDIR: testing/notification-test-core
+  AZURE_SKIP_TEST: 'true'
+  AZURE_DEPLOYMENTS_SUBDIR: deployments/scripts/azure
+
 include:
   - project: 'osdu/platform/ci-cd-pipelines'
     ref: 'master'
@@ -21,9 +32,16 @@ include:
     ref: 'master'
     file: 'scanners/gitlab-ultimate.yml'
 
+  - project: "osdu/platform/ci-cd-pipelines"
+    ref: 'master'
+    file: "cloud-providers/azure.yml"
+
   - project: 'osdu/platform/ci-cd-pipelines'
     ref: 'master'
     file: 'cloud-providers/osdu-gcp-cloudrun.yml'
 
+  - project: 'osdu/platform/ci-cd-pipelines'
+    file: 'cloud-providers/aws.yml'
+
 osdu-gcp-test:
   allow_failure: true
diff --git a/NOTICE b/NOTICE
index 3d261895f12486e51fbcde0eba0c8e0efde1f1a6..501a7fbc99b99e98c1d3b0f6f5fc2ca37885ff1a 100644
--- a/NOTICE
+++ b/NOTICE
@@ -16,12 +16,27 @@ The following software have components provided under the terms of this license:
 
 - ASM Core (from )
 - ASM based accessors helper used by json-smart (from )
+- AWS Java SDK for AWS Elemental MediaLive (from https://aws.amazon.com/sdkforjava)
+- AWS Java SDK for AWS KMS (from https://aws.amazon.com/sdkforjava)
+- AWS Java SDK for AWS Lambda (from https://aws.amazon.com/sdkforjava)
+- AWS Java SDK for AWS STS (from https://aws.amazon.com/sdkforjava)
+- AWS Java SDK for AWS Secrets Manager (from https://aws.amazon.com/sdkforjava)
+- AWS Java SDK for Amazon CloudWatch Logs (from https://aws.amazon.com/sdkforjava)
+- AWS Java SDK for Amazon Cognito Identity Provider Service (from https://aws.amazon.com/sdkforjava)
+- AWS Java SDK for Amazon DynamoDB (from https://aws.amazon.com/sdkforjava)
+- AWS Java SDK for Amazon S3 (from https://aws.amazon.com/sdkforjava)
+- AWS Java SDK for Amazon SNS (from https://aws.amazon.com/sdkforjava)
+- AWS Java SDK for Amazon SQS (from https://aws.amazon.com/sdkforjava)
+- AWS Java SDK for the AWS Simple Systems Management (SSM) Service (from https://aws.amazon.com/sdkforjava)
+- AWS SDK for Java - BOM (from https://aws.amazon.com/sdkforjava)
+- AWS SDK for Java - Core (from https://aws.amazon.com/sdkforjava)
 - Adapter: RxJava (from )
 - Apache Commons BeanUtils (from http://commons.apache.org/proper/commons-beanutils/)
 - Apache Commons Codec (from http://commons.apache.org/proper/commons-codec/)
 - Apache Commons Collections (from http://commons.apache.org/proper/commons-collections/)
 - Apache Commons Lang (from http://commons.apache.org/proper/commons-lang/)
 - Apache Commons Logging (from http://commons.apache.org/proper/commons-logging/)
+- Apache Commons Logging (from http://commons.apache.org/proper/commons-logging/)
 - Apache Commons Text (from http://commons.apache.org/proper/commons-text/)
 - Apache Commons Validator (from http://commons.apache.org/proper/commons-validator/)
 - Apache HttpAsyncClient (from http://hc.apache.org/httpcomponents-asyncclient)
@@ -46,8 +61,8 @@ The following software have components provided under the terms of this license:
 - Converter: Jackson (from )
 - Elastic JNA Distribution (from https://github.com/java-native-access/jna)
 - Elasticsearch: 5.0.0-alpha5 (from https://github.com/elastic/elasticsearch)
-- Expression Language 3.0 (from https://projects.eclipse.org/projects/ee4j.el)
 - Expression Language 3.0 (from http://uel.java.net)
+- Expression Language 3.0 (from https://projects.eclipse.org/projects/ee4j.el)
 - FindBugs-jsr305 (from http://findbugs.sourceforge.net/)
 - Google APIs Client Library for Java (from )
 - Google App Engine extensions to the Google HTTP Client Library for Java. (from )
@@ -76,6 +91,7 @@ The following software have components provided under the terms of this license:
 - J2ObjC Annotations (from https://github.com/google/j2objc/)
 - JBoss Logging 3 (from http://www.jboss.org)
 - JCIP Annotations under Apache License (from http://stephenc.github.com/jcip-annotations)
+- JMES Path Query library (from https://aws.amazon.com/sdkforjava)
 - JSON Small and Fast Parser (from http://www.minidev.net/)
 - JSON Web Token support for the JVM (from https://github.com/jwtk/jjwt.git)
 - JSON library from Android SDK (from http://developer.android.com/sdk)
@@ -101,6 +117,7 @@ The following software have components provided under the terms of this license:
 - Java Servlet API (from https://projects.eclipse.org/projects/ee4j.servlet)
 - Java UUID Generator (from http://wiki.fasterxml.com/JugHome)
 - Javassist (from http://www.javassist.org/)
+- Javassist (from http://www.javassist.org/)
 - Joda-Time (from http://www.joda.org/joda-time/)
 - Json Path (from https://github.com/jayway/JsonPath)
 - Lucene Common Analyzers (from )
@@ -125,8 +142,8 @@ The following software have components provided under the terms of this license:
 - Microsoft Application Insights Java SDK Web Module (from https://github.com/Microsoft/ApplicationInsights-Java)
 - Microsoft Application Insights Log4j 2 Appender (from https://github.com/Microsoft/ApplicationInsights-Java)
 - Microsoft Azure Netty HTTP Client Library (from https://github.com/Azure/azure-sdk-for-java)
-- Mockito (from http://www.mockito.org)
 - Mockito (from http://mockito.org)
+- Mockito (from http://www.mockito.org)
 - Netty Reactive Streams Implementation (from )
 - Netty/Buffer (from http://netty.io/)
 - Netty/Codec (from )
@@ -165,7 +182,9 @@ The following software have components provided under the terms of this license:
 - Spring Boot (from http://projects.spring.io/spring-boot/)
 - Spring Boot Actuator (from http://projects.spring.io/spring-boot/)
 - Spring Boot Actuator AutoConfigure (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-actuator-autoconfigure)
+- Spring Boot Actuator Starter (from http://projects.spring.io/spring-boot/)
 - Spring Boot AutoConfigure (from http://projects.spring.io/spring-boot/)
+- Spring Boot Dependencies (from http://projects.spring.io/spring-boot/)
 - Spring Boot Json Starter (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-json)
 - Spring Boot Log4J2 Starter (from http://projects.spring.io/spring-boot/)
 - Spring Boot Logging Starter (from http://projects.spring.io/spring-boot/)
@@ -220,8 +239,10 @@ The following software have components provided under the terms of this license:
 - io.grpc:grpc-protobuf (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-protobuf-lite (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-stub (from https://github.com/grpc/grpc-java)
+- ion-java (from https://github.com/amznlabs/ion-java/)
 - jackson-databind (from http://github.com/FasterXML/jackson)
 - javax.inject (from http://code.google.com/p/atinject/)
+- jose4j (from https://bitbucket.org/b_c/jose4j/)
 - lang-mustache (from https://github.com/elastic/elasticsearch)
 - lettuce (from http://github.com/mp911de/lettuce/wiki)
 - micrometer-core (from https://github.com/micrometer-metrics/micrometer)
@@ -437,8 +458,8 @@ The following software have components provided under the terms of this license:
 - Expression Language 3.0 (from https://projects.eclipse.org/projects/ee4j.el)
 - Java Architecture For XML Binding (from )
 - Java Architecture For XML Binding (from )
-- Java Servlet API (from http://servlet-spec.java.net)
 - Java Servlet API (from https://projects.eclipse.org/projects/ee4j.servlet)
+- Java Servlet API (from http://servlet-spec.java.net)
 - Java(TM) API for WebSocket (from )
 - JavaBeans Activation Framework (from )
 - JavaBeans Activation Framework API jar (from )
@@ -470,6 +491,7 @@ The following software have components provided under the terms of this license:
 - Java Native Access (from https://github.com/java-native-access/jna)
 - Java Native Access Platform (from https://github.com/java-native-access/jna)
 - Javassist (from http://www.javassist.org/)
+- Javassist (from http://www.javassist.org/)
 - Logback Classic Module (from )
 - Logback Core Module (from )
 - Microsoft Application Insights Java SDK Core (from https://github.com/Microsoft/ApplicationInsights-Java)
@@ -485,6 +507,7 @@ The following software have components provided under the terms of this license:
 
 - Java Native Access (from https://github.com/java-native-access/jna)
 - Java Native Access Platform (from https://github.com/java-native-access/jna)
+- Javassist (from http://www.javassist.org/)
 - SnakeYAML (from http://www.snakeyaml.org)
 
 ========================================================================
@@ -500,6 +523,7 @@ MIT
 ========================================================================
 The following software have components provided under the terms of this license:
 
+- AWS Java SDK for AWS Lambda (from https://aws.amazon.com/sdkforjava)
 - Animal Sniffer Annotations (from )
 - Azure AD Spring Security Integration Spring Boot Starter (from https://github.com/Microsoft/azure-spring-boot)
 - Azure Java Client Authentication Library for AutoRest (from https://github.com/Azure/autorest-clientruntime-for-java)
@@ -529,8 +553,8 @@ The following software have components provided under the terms of this license:
 - Microsoft Azure client library for Identity (from https://github.com/Azure/azure-sdk-for-java)
 - Microsoft Azure client library for KeyVault Secrets (from https://github.com/Azure/azure-sdk-for-java)
 - Microsoft Azure common module for Storage (from https://github.com/Azure/azure-sdk-for-java)
-- Mockito (from http://mockito.org)
 - Mockito (from http://www.mockito.org)
+- Mockito (from http://mockito.org)
 - Netty/Codec/HTTP (from )
 - Netty/Common (from )
 - Project Lombok (from https://projectlombok.org)
@@ -545,6 +569,7 @@ MPL-1.1
 ========================================================================
 The following software have components provided under the terms of this license:
 
+- Javassist (from http://www.javassist.org/)
 - Javassist (from http://www.javassist.org/)
 
 ========================================================================
@@ -552,6 +577,7 @@ MPL-2.0
 ========================================================================
 The following software have components provided under the terms of this license:
 
+- Javassist (from http://www.javassist.org/)
 - Javassist (from http://www.javassist.org/)
 
 ========================================================================
diff --git a/devops/azure/README.md b/devops/azure/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..55316bc3194139d3836da5619e48055c27f0cd7e
--- /dev/null
+++ b/devops/azure/README.md
@@ -0,0 +1,17 @@
+# Pipeline Support Commands
+
+```bash
+AZURE_SERVICE="notification"
+REPO_BRANCH="master"
+TAG="latest"
+PARTIAL=${REPO_BRANCH/\//-}
+BRANCH=${PARTIAL/./-}
+
+echo "--set image.branch=$BRANCH --set image.tag=$TAG"
+
+# Install the Service
+helm upgrade -i osdu-gitlab-$AZURE_SERVICE chart --set image.branch=$BRANCH --set image.tag=$TAG
+pod=$(kubectl get pod |grep $AZURE_SERVICE | tail -1 | awk '{print $1}')
+status=$(kubectl wait --for=condition=Ready pod/$pod --timeout=60s)
+if [[ "$status" != *"met"* ]]; then echo "POD didn't start correctly" ; exit 1 ; fi
+```
diff --git a/devops/azure/chart/Chart.yaml b/devops/azure/chart/Chart.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b65147e73bff1ec02cc5cd65a9241cf1119ae8fa
--- /dev/null
+++ b/devops/azure/chart/Chart.yaml
@@ -0,0 +1,20 @@
+#  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.
+
+apiVersion: v1
+name: notification
+appVersion: "latest"
+description: Helm Chart for installing notification service.
+version: 0.1.0
+type: application
diff --git a/devops/azure/chart/templates/auth.yaml b/devops/azure/chart/templates/auth.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..81b9c11de6829209be551126f0361db503eec31a
--- /dev/null
+++ b/devops/azure/chart/templates/auth.yaml
@@ -0,0 +1,33 @@
+# Source: istio/templates/notification.yaml
+#  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.
+
+apiVersion: security.istio.io/v1beta1
+kind: AuthorizationPolicy
+metadata:
+  name: notification-jwt-authz
+  namespace: osdu
+spec:
+  selector:
+    matchLabels:
+      app: notification
+  action: DENY
+  rules:
+    - from:
+        - source:
+            notRequestPrincipals: ["*"]
+      to:
+        - operation:
+            notPaths: ["/","*/swagger-resources","*/swagger",
+                       "/api/notification/v1/swagger-resources/*","*/swagger-ui.html","*/actuator/health"]
\ No newline at end of file
diff --git a/devops/azure/chart/templates/deployment.yaml b/devops/azure/chart/templates/deployment.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..af7918321276d8aacf7ae82378167cdffc219fb5
--- /dev/null
+++ b/devops/azure/chart/templates/deployment.yaml
@@ -0,0 +1,96 @@
+#  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.
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ .Release.Name }}
+  namespace: osdu
+spec:
+  replicas: {{ .Values.global.replicaCount }}
+  selector:
+    matchLabels:
+      app: {{ .Chart.Name }}
+  template:
+    metadata:
+      labels:
+        app: {{ .Chart.Name }}
+        aadpodidbinding: osdu-identity
+    spec:
+      volumes:
+        - name: azure-keyvault
+          csi:
+            driver: secrets-store.csi.k8s.io
+            readOnly: true
+            volumeAttributes:
+              secretProviderClass: azure-keyvault
+      containers:
+        - name: {{ .Chart.Name }}
+          image: {{ .Values.image.repository }}/{{ .Chart.Name }}-{{ .Values.image.branch }}:{{ .Values.image.tag | default .Chart.AppVersion }}
+          imagePullPolicy: Always
+          ports:
+            - containerPort: 80
+          readinessProbe:
+            httpGet:
+              path: /api/notification/v1/swagger-ui.html
+              port: 80
+          volumeMounts:
+            - name: azure-keyvault
+              mountPath: "/mnt/azure-keyvault"
+              readOnly: true
+          env:
+            - name: spring_application_name
+              value: notification-azure
+            - name: server.servlet.contextPath
+              value: /api/notification/v1
+            - name: server_port
+              value: "80"
+            - name: KEYVAULT_URI
+              valueFrom:
+                configMapKeyRef:
+                  name: osdu-svc-properties
+                  key: ENV_KEYVAULT
+            - name: AZURE_TENANT_ID
+              valueFrom:
+                secretKeyRef:
+                  name: active-directory
+                  key: tenantid
+            - name: AZURE_CLIENT_ID
+              valueFrom:
+                secretKeyRef:
+                  name: active-directory
+                  key: principal-clientid
+            - name: AZURE_CLIENT_SECRET
+              valueFrom:
+                secretKeyRef:
+                  name: active-directory
+                  key: principal-clientpassword
+            - name: aad_client_id
+              valueFrom:
+                secretKeyRef:
+                 name: active-directory
+                 key: application-appid
+            - name: appinsights_key
+              valueFrom:
+                secretKeyRef:
+                  name: central-logging
+                  key: appinsights
+            - name: cosmosdb_database
+              value: osdu-db
+            - name: entitlements_service_endpoint
+              value: http://entitlements-azure/entitlements/v1
+            - name: registeration_service_endpoint
+              value: http://register/api/register/v1
+            - name: maxCacheSize
+              value:  "20"
\ No newline at end of file
diff --git a/devops/azure/chart/templates/service.yaml b/devops/azure/chart/templates/service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2df46074c077d233c6706cc7179c2c2c47d7a218
--- /dev/null
+++ b/devops/azure/chart/templates/service.yaml
@@ -0,0 +1,27 @@
+#  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.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Chart.Name }}
+  namespace: osdu
+spec:
+  type: ClusterIP
+  ports:
+    - protocol: TCP
+      port: 80
+      targetPort: 80
+  selector:
+    app: {{ .Chart.Name }}
\ No newline at end of file
diff --git a/devops/azure/chart/values.yaml b/devops/azure/chart/values.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..d503dd73deaa4d89c63c0bc034cac4354c4970b2
--- /dev/null
+++ b/devops/azure/chart/values.yaml
@@ -0,0 +1,21 @@
+#  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.
+
+global:
+  replicaCount: 1
+
+image:
+  repository: community.opengroup.org:5555/osdu/platform/system/notification
+  branch: master
+  tag: latest
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 8bd5ba30b24c8439eba7b3a8753faba987fef264..1140ba2500687002d32d5d6dc584269d93c10845 100644
--- a/pom.xml
+++ b/pom.xml
@@ -79,6 +79,7 @@
 		<module>provider/notification-gcp</module>
 		<module>provider/notification-azure</module>
 		<module>provider/notification-ibm</module>
+		<module>provider/notification-aws</module>
 	</modules>
 
 	<distributionManagement>
diff --git a/provider/notification-aws/build-aws/Dockerfile b/provider/notification-aws/build-aws/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..c24b95cd8cca643ad138ece4666f244f4c584f00
--- /dev/null
+++ b/provider/notification-aws/build-aws/Dockerfile
@@ -0,0 +1,24 @@
+# Copyright © 2020 Amazon Web Services
+#
+# 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.
+
+# https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html
+FROM amazoncorretto:8
+
+ARG JAR_FILE=provider/notification-aws/target/*spring-boot.jar
+# Harcoding this value since Notification-core requires this variable. AWS does not use it. Might change in future
+ENV ENVIRONMENT=DEV
+WORKDIR /
+COPY ${JAR_FILE} app.jar
+EXPOSE 8080
+ENTRYPOINT java $JAVA_OPTS -jar /app.jar
diff --git a/provider/notification-aws/build-aws/build-info.py b/provider/notification-aws/build-aws/build-info.py
new file mode 100644
index 0000000000000000000000000000000000000000..1ea9b54bde9216cd158e4ea43eef41f06b8da1be
--- /dev/null
+++ b/provider/notification-aws/build-aws/build-info.py
@@ -0,0 +1,88 @@
+# Copyright © 2020 Amazon Web Services
+#
+# 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.
+import boto3
+import json
+import os
+import argparse
+
+# Create the build-info.json
+parser = argparse.ArgumentParser(description="")
+
+# env - CODEBUILD_SOURCE_VERSION
+parser.add_argument("--branch", type=str, help="")
+
+# env - CODEBUILD_RESOLVED_SOURCE_VERSION
+parser.add_argument("--commit", type=str,  help="")
+
+# env - CODEBUILD_BUILD_ID
+parser.add_argument("--buildid", type=str,  help="")
+
+# env - CODEBUILD_BUILD_NUMBER
+parser.add_argument("--buildnumber", type=str,  help="")
+
+# Get from directory name
+parser.add_argument("--reponame", type=str,  help="")
+
+# env OUTPUT_DIR
+parser.add_argument("--outdir", type=str,  help="")
+
+# full ecr image and tag, and any other artifacts
+parser.add_argument("--artifact", type=str, action="append", help="")
+
+
+
+args = parser.parse_args()
+
+branch = args.branch
+commitId = args.commit
+buildId = args.buildid
+buildNumber = args.buildnumber
+repoName = args.reponame
+outputDir = args.outdir
+artifacts = args.artifact
+
+buildInfoFilePath = os.path.join(".", outputDir, "build-info.json")
+
+print(buildInfoFilePath)
+
+commitArgs = {
+    "repositoryName": repoName,
+    "commitId": commitId
+}
+
+commitDetail = {
+    "commit": ""
+}
+
+# get the commit detail
+try:
+    codecommit = boto3.client("codecommit")
+    commitDetail = codecommit.get_commit(**commitArgs)
+except Exception as e:
+    print("Getting commit information from codecommit failed")
+
+buildInfo = {
+    "branch": branch,
+    "build-id": buildId,
+    "build-number": buildNumber,
+    "repo": repoName,
+    "artifacts": artifacts,
+    "commit": commitDetail["commit"]
+}
+print(json.dumps(buildInfo, sort_keys=True, indent=4))
+
+# write the build.json file to dist
+f = open(buildInfoFilePath, "w")
+f.write(json.dumps(buildInfo, sort_keys=True, indent=4))
+f.close()
diff --git a/provider/notification-aws/build-aws/buildspec.yaml b/provider/notification-aws/build-aws/buildspec.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c5d68f03813622839e6cefb44cb7ce2e5aa78431
--- /dev/null
+++ b/provider/notification-aws/build-aws/buildspec.yaml
@@ -0,0 +1,84 @@
+# Copyright © 2020 Amazon Web Services
+#
+# 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.
+
+# https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html
+
+# https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html
+version: 0.2
+
+phases:
+  install:
+    runtime-versions:
+      java: corretto8
+    commands:
+      - if [ $(echo $CODEBUILD_SOURCE_VERSION | grep -c  ^refs/heads.*) -eq 1 ]; then echo "Branch name found"; else echo "This build only supports branch builds" && exit 1; fi
+      - apt-get update -y
+      - apt-get install -y maven
+      - java -version
+      - mvn -version
+      - mkdir -p /root/.m2
+      - cp ./provider/notification-aws/maven/settings.xml /root/.m2/settings.xml # copy the AWS-specific settings.xml to the CodeBuild instance's .m2 folder
+      - export AWS_ACCOUNT_ID=`aws sts get-caller-identity | grep Account | cut -d':' -f 2 | cut -d'"' -f 2`
+      - export AWS_OSDU_DEV_MAVEN_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain $AWS_OSDU_DEV_MAVEN_DOMAIN --domain-owner $AWS_ACCOUNT_ID --query authorizationToken --output text`
+  pre_build:
+    commands:
+      - echo "Logging in to Amazon ECR..."
+      - $(aws ecr get-login --no-include-email --region $AWS_REGION) # authenticate with ECR via the AWS CLI
+  build:
+    commands:
+      - export REPO_NAME=${PWD##*/}
+      - export OUTPUT_DIR="dist"
+      - export BRANCH_NAME=`echo ${CODEBUILD_SOURCE_VERSION} | awk '{gsub("refs/heads/","");gsub("\\.","-");gsub("[[:space:]]","-")}1' | sed 's/\//-/g' | awk '{print tolower($0)}'`
+      - export ECR_TAG=`echo build.${BRANCH_NAME}.${CODEBUILD_BUILD_NUMBER}.${CODEBUILD_RESOLVED_SOURCE_VERSION} | cut -c 1-120`
+      - export ECR_IMAGE=${ECR_REGISTRY}:${ECR_TAG}
+      - export ECR_IMAGE_BRANCH_LATEST=${ECR_REGISTRY}:${BRANCH_NAME}
+      - export INTEGRATION_TEST_OUTPUT=${OUTPUT_DIR}/testing/integration
+      - export INTEGRATION_TEST_OUTPUT_BIN=${INTEGRATION_TEST_OUTPUT}/bin
+      - mkdir -p ${OUTPUT_DIR}/bin
+      - mkdir -p ${OUTPUT_DIR}/testing && mkdir -p ${INTEGRATION_TEST_OUTPUT}  && mkdir -p ${INTEGRATION_TEST_OUTPUT}/bin
+      - echo "Placeholder" >> ${OUTPUT_DIR}/build-info.json # touched so that the output directory has some content incase the build fails so that testing reports are uploaded
+      - printenv
+
+      - echo "Building primary service assemblies..."
+      - mvn -B test install -pl notification-core,provider/notification-aws -Ddeployment.environment=prod
+
+      - echo "Building integration testing assemblies and gathering artifacts..."
+      - ./testing/notification-test-aws/build-aws/prepare-dist.sh
+
+      - echo "Building docker image..."
+      - docker build -f provider/notification-aws/build-aws/Dockerfile -t ${ECR_IMAGE} .
+      - docker tag  ${ECR_IMAGE} ${ECR_IMAGE_BRANCH_LATEST}
+      - echo "Pushing docker image..."
+      - docker push ${ECR_IMAGE}
+      - docker push ${ECR_IMAGE_BRANCH_LATEST}
+
+      - echo "Generate build-info.json"
+      - |
+        python provider/notification-aws/build-aws/build-info.py --branch ${CODEBUILD_SOURCE_VERSION} --commit ${CODEBUILD_RESOLVED_SOURCE_VERSION} \
+          --buildid ${CODEBUILD_BUILD_ID} --buildnumber ${CODEBUILD_BUILD_NUMBER} --reponame ${REPO_NAME} --outdir ${OUTPUT_DIR} \
+          --artifact ${ECR_IMAGE}
+reports:
+  SurefireReports: # CodeBuild will create a report group called "SurefireReports".
+    files: #Store all of the files
+      - "notification-core/target/surefire-reports/**/*"
+      - "provider/notification-aws/target/surefire-reports/**/*"
+    base-directory: "." # Location of the reports
+artifacts:
+  files:
+    - "**/*"
+  base-directory: "dist"
+  name: ${REPO_NAME}_${BRANCH_NAME}_$(date +%F)_${CODEBUILD_BUILD_NUMBER}.zip
+cache:
+  paths:
+    - "/root/.m2/**/*"
\ No newline at end of file
diff --git a/provider/notification-aws/build-aws/os-notification.build.json b/provider/notification-aws/build-aws/os-notification.build.json
new file mode 100644
index 0000000000000000000000000000000000000000..3cd8fc8a4574976c8fa59ca1cc10453c72f82095
--- /dev/null
+++ b/provider/notification-aws/build-aws/os-notification.build.json
@@ -0,0 +1,83 @@
+{
+    "name": "os-notification",
+    "description": "Build of the os-notification repository",
+    "source": {
+        "type": "CODECOMMIT",
+        "location": "https://git-codecommit.us-east-1.amazonaws.com/v1/repos/os-notification",
+        "gitCloneDepth": 1,
+        "gitSubmodulesConfig": {
+            "fetchSubmodules": false
+        },
+        "buildspec": "./provider/notification-aws/build-aws/buildspec.yaml",
+        "insecureSsl": false
+    },
+    "secondarySources": [],
+    "sourceVersion": "refs/heads/dev",
+    "secondarySourceVersions": [],
+    "artifacts": {
+        "type": "S3",
+        "location": "888733619319-devops-build-artifacts",
+        "path": "os-notification",
+        "namespaceType": "NONE",
+        "name": "os-notification",
+        "packaging": "ZIP",
+        "overrideArtifactName": true,
+        "encryptionDisabled": false
+    },
+    "secondaryArtifacts": [],
+    "cache": {
+        "type": "LOCAL",
+        "modes": [
+            "LOCAL_CUSTOM_CACHE"
+        ]
+    },
+    "environment": {
+        "type": "LINUX_CONTAINER",
+        "image": "aws/codebuild/standard:4.0",
+        "computeType": "BUILD_GENERAL1_SMALL",
+        "environmentVariables": [
+            {
+                "name": "ECR_REGISTRY",
+                "value": "888733619319.dkr.ecr.us-east-1.amazonaws.com/os-notification_dev",
+                "type": "PLAINTEXT"
+            },
+            {
+                "name": "AWS_OSDU_DEV_MAVEN_URL",
+                "value": "https://osdu-dev-888733619319.d.codeartifact.us-east-1.amazonaws.com/maven/osdu-maven/",
+                "type": "PLAINTEXT"
+            },
+            {
+                "name": "AWS_OSDU_DEV_MAVEN_DOMAIN",
+                "value": "osdu-dev",
+                "type": "PLAINTEXT"
+            }
+        ],
+        "privilegedMode": true,
+        "imagePullCredentialsType": "CODEBUILD"
+    },
+    "serviceRole": "arn:aws:iam::888733619319:role/service-role/dev-CodeBuildRole",
+    "timeoutInMinutes": 60,
+    "queuedTimeoutInMinutes": 480,
+    "encryptionKey": "arn:aws:kms:us-east-1:888733619319:alias/aws/s3",
+    "tags": [],
+    "vpcConfig": {
+        "vpcId": "vpc-0f273733df61bc541",
+        "subnets": [
+            "subnet-03963a50e77043e12",
+            "subnet-04a975f0e6e0c9279"
+        ],
+        "securityGroupIds": [
+            "sg-0dee4e811c2062e26"
+        ]
+    },
+    "badgeEnabled": true,
+    "logsConfig": {
+        "cloudWatchLogs": {
+            "status": "ENABLED"
+        },
+        "s3Logs": {
+            "status": "DISABLED",
+            "encryptionDisabled": false
+        }
+    }
+}
diff --git a/provider/notification-aws/maven/settings.xml b/provider/notification-aws/maven/settings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b8192246c94558d4c2d65ce1caf42871542dd79e
--- /dev/null
+++ b/provider/notification-aws/maven/settings.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright © 2020 Amazon Web Services
+
+  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.
+-->
+
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+
+    <profiles>
+        <profile>
+            <id>aws-osdu-dev-maven</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+            <repositories>
+                <repository>
+                    <id>aws-osdu-dev-maven</id>
+                    <url>${env.AWS_OSDU_DEV_MAVEN_URL}</url>
+                </repository>
+                <repository>
+                    <id>gitlab-os-core-common-maven</id>
+                    <url>https://community.opengroup.org/api/v4/projects/67/packages/maven</url>
+                </repository>
+            </repositories>
+        </profile>
+        <profile>
+            <id>credentialsConfiguration</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+            <properties>
+                <deployment.environment>dev</deployment.environment>
+                <aws.accessKeyId>no-default</aws.accessKeyId>
+                <aws.secretKey>no-default</aws.secretKey>
+                <azure.devops.username>Another-Access-Token-2021</azure.devops.username>
+                <azure.devops.token>no-default</azure.devops.token>
+            </properties>
+        </profile>
+    </profiles>
+
+    <servers>
+        <server>
+            <id>aws-osdu-dev-maven</id>
+            <username>aws</username>
+            <password>${env.AWS_OSDU_DEV_MAVEN_AUTH_TOKEN}</password>
+        </server>
+    </servers>
+
+    <!-- CodeArtifact doesn't support external repos yet that aren't Maven Central.  ETA Q4 2020. -->
+    <!-- <mirrors> -->
+    <!-- <mirror> -->
+    <!-- <id>aws-osdu-dev-maven</id> -->
+    <!-- <name>aws-osdu-dev-maven</name> -->
+    <!-- <url>https://osdu-dev-888733619319.d.codeartifact.us-east-1.amazonaws.com/maven/osdu-maven/</url> -->
+    <!-- <mirrorOf>*,!gitlab-os-core-common-maven</mirrorOf> -->
+    <!-- </mirror> -->
+    <!-- </mirrors> -->
+
+    <activeProfiles>
+        <activeProfile>credentialsConfiguration</activeProfile>
+    </activeProfiles>
+
+</settings>
\ No newline at end of file
diff --git a/provider/notification-aws/pom.xml b/provider/notification-aws/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4d2061660ae01f8bd3d5ca55224069b4135da17d
--- /dev/null
+++ b/provider/notification-aws/pom.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright © 2020 Amazon Web Services
+
+  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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.opengroup.osdu</groupId>
+    <artifactId>notification-aws</artifactId>
+    <version>1.0.0</version>
+    <name>notification-aws</name>
+    <description>AWS implementation for Notification service</description>
+    <packaging>jar</packaging>
+
+    <parent>
+        <groupId>org.opengroup.osdu</groupId>
+        <artifactId>os-notification</artifactId>
+        <version>1.0.0</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+
+    <properties>
+        <java.version>8</java.version>
+        <maven.compiler.target>${java.version}</maven.compiler.target>
+        <maven.compiler.source>${java.version}</maven.compiler.source>
+        <aws.version>1.11.637</aws.version>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>${gitlab-server}</id>
+            <url>https://community.opengroup.org/api/v4/groups/17/-/packages/maven</url>
+        </repository>
+    </repositories>
+
+    <distributionManagement>
+        <repository>
+            <id>${gitlab-server}</id>
+            <url>https://community.opengroup.org/api/v4/projects/143/packages/maven</url>
+        </repository>
+        <snapshotRepository>
+            <id>${gitlab-server}</id>
+            <url>https://community.opengroup.org/api/v4/projects/143/packages/maven</url>
+        </snapshotRepository>
+    </distributionManagement>
+
+    <dependencies>
+      <!--   <dependency>
+            <groupId>org.opengroup.osdu</groupId>
+            <artifactId>os-core-common</artifactId>
+        </dependency> -->
+
+
+        <dependency>
+            <groupId>org.opengroup.osdu.core.aws</groupId>
+            <artifactId>os-core-lib-aws</artifactId>
+            <version>0.3.11</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-secretsmanager -->
+        <dependency>
+            <groupId>com.amazonaws</groupId>
+            <artifactId>aws-java-sdk-secretsmanager</artifactId>
+            <version>${aws.version}</version>
+        </dependency>
+
+       <dependency>
+            <groupId>org.opengroup.osdu</groupId>
+            <artifactId>notification-core</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <!-- unit test dependencies -->
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-api-mockito2</artifactId>
+            <version>2.0.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-module-junit4</artifactId>
+            <version>2.0.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>2.0.2-beta</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                        <configuration>
+                            <classifier>spring-boot</classifier>
+                            <mainClass>
+                                org.opengroup.osdu.notification.provider.aws.Application
+                            </mainClass>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-war-plugin</artifactId>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/Application.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/Application.java
new file mode 100644
index 0000000000000000000000000000000000000000..c40dadeba16188da97aa52b22c25e2eba30eea3f
--- /dev/null
+++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/Application.java
@@ -0,0 +1,31 @@
+// Copyright © 2020 Amazon Web Services
+// 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.aws;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@SpringBootApplication
+@ComponentScan({"org.opengroup.osdu"})
+@EnableAsync
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(new Class[]{Application.class}, args);
+    }
+}
+
diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsAppProperties.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsAppProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..b93d10a7a7360b3c51b93a7c9e15fa0955206bda
--- /dev/null
+++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsAppProperties.java
@@ -0,0 +1,39 @@
+// Copyright © 2020 Amazon Web Services
+// 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.aws.impl;
+
+
+import org.opengroup.osdu.notification.provider.interfaces.IAppProperties;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class AwsAppProperties implements IAppProperties {
+
+    @Value("${AUTHORIZE_API}")
+    private String authorizeAPI;
+
+    @Value("${REGISTER_SERVICE_URL}")
+    private String registerAPI;
+
+    @Override
+    public String getAuthorizeAPI() {
+        return authorizeAPI;
+    }
+
+    @Override
+    public String getRegisterAPI() {
+        return registerAPI;
+    }
+}
\ No newline at end of file
diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsGoogleServiceAccountImpl.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsGoogleServiceAccountImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a47ba1c722e57196d1eda4e689eefbc600586a5
--- /dev/null
+++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsGoogleServiceAccountImpl.java
@@ -0,0 +1,29 @@
+// Copyright © 2020 Amazon Web Services
+// 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.aws.impl;
+
+import org.opengroup.osdu.notification.provider.interfaces.IGoogleServiceAccount;
+import org.springframework.stereotype.Component;
+import sun.reflect.generics.reflectiveObjects.NotImplementedException;
+
+@Component
+public class AwsGoogleServiceAccountImpl implements IGoogleServiceAccount {
+    @Override
+    public String getIdToken(String keyString, String audience) {
+        // TODO : Check if it is to be supported
+
+        throw new NotImplementedException();
+    }
+}
+
+
diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsPubSubHandshakeHandler.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsPubSubHandshakeHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb0842a0726efb54766be8502e06c895ef4a1967
--- /dev/null
+++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsPubSubHandshakeHandler.java
@@ -0,0 +1,24 @@
+// Copyright © 2020 Amazon Web Services
+// 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.aws.impl;
+
+import org.opengroup.osdu.notification.provider.interfaces.IPubsubHandshakeHandler;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AwsPubSubHandshakeHandler implements IPubsubHandshakeHandler {
+    @Override
+    public String getHandshakeResponse() {
+        return null;
+    }
+}
diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsPubsubRequestBodyExtractor.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsPubsubRequestBodyExtractor.java
new file mode 100644
index 0000000000000000000000000000000000000000..eeaba92973ea42de379c1e1f89f025b9350d5c26
--- /dev/null
+++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsPubsubRequestBodyExtractor.java
@@ -0,0 +1,140 @@
+// Copyright © 2020 Amazon Web Services
+// 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.aws.impl;
+
+import com.google.common.base.Strings;
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
+import org.opengroup.osdu.core.common.model.http.AppException;
+import org.opengroup.osdu.core.common.model.storage.MessageContent;
+import org.opengroup.osdu.notification.provider.interfaces.IPubsubRequestBodyExtractor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.annotation.RequestScope;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Component
+@RequestScope
+public class AwsPubsubRequestBodyExtractor implements IPubsubRequestBodyExtractor {
+    private static final String INVALID_PUBSUB_MESSAGE = "Invalid Publish-Subscribe Message format ";
+    private static final Gson GSON = new Gson();
+    private MessageContent messageContent;
+    private JsonObject root = null;
+
+    @Autowired
+    private HttpServletRequest request;
+
+    @Autowired
+    private JaxRsDpsLog log;
+
+    @Autowired
+    public AwsPubsubRequestBodyExtractor(HttpServletRequest httpServletRequest) {
+        this.request = httpServletRequest;
+
+    }
+
+    public Map<String, String> extractAttributesFromRequestBody() {
+        if (this.messageContent == null) {
+            this.messageContent = this.extractPubsubMessageFromRequestBody();
+        }
+        return this.messageContent.getAttributes();
+    }
+
+    public String extractDataFromRequestBody() {
+        if (this.messageContent == null) {
+            this.messageContent = this.extractPubsubMessageFromRequestBody();
+        }
+        return this.messageContent.getData();
+    }
+
+    public String extractNotificationIdFromRequestBody() {
+        if (this.root == null) {
+            this.root = this.extractRootJsonElementFromRequestBody();
+        }
+        JsonElement subscription = this.root.get("subscription");
+        if (subscription == null) {
+            throw new AppException(HttpStatus.BAD_REQUEST.value(), INVALID_PUBSUB_MESSAGE, "Subscription object not found");
+        }
+
+        String[] fullNotificationId = subscription.getAsString().split("/");
+        return fullNotificationId[fullNotificationId.length - 1];
+    }
+
+    @Override
+    public boolean isHandshakeRequest() {
+        return false;
+    }
+
+    private MessageContent extractPubsubMessageFromRequestBody() {
+        if (this.root == null) {
+            this.root = this.extractRootJsonElementFromRequestBody();
+        }
+        JsonElement message = this.root.get("message");
+        if (message == null) {
+            throw new AppException(HttpStatus.BAD_REQUEST.value(), INVALID_PUBSUB_MESSAGE, "Message object not found");
+        }
+        MessageContent content = GSON.fromJson(message.toString(), MessageContent.class);
+
+        Map<String, String> attributes = content.getAttributes();
+        if (attributes == null || attributes.isEmpty()) {
+            log.error("Incorrect Message: " + message.toString() );
+            throw new AppException(HttpStatus.BAD_REQUEST.value(), INVALID_PUBSUB_MESSAGE, "Attribute map not found");
+        }
+        String data = content.getData();
+        if (Strings.isNullOrEmpty(data)) {
+            throw new AppException(HttpStatus.BAD_REQUEST.value(), INVALID_PUBSUB_MESSAGE, "Data field not found");
+        }
+        Map<String, String> lowerCase = new HashMap<>();
+        attributes.forEach((key, value) -> lowerCase.put(key.toLowerCase(), value));
+        if (Strings.isNullOrEmpty(attributes.get("data-partition-id"))) {
+            throw new AppException(HttpStatus.BAD_REQUEST.value(), INVALID_PUBSUB_MESSAGE,
+                    "No tenant information from pubsub message.");
+        }
+        content.setAttributes(lowerCase);
+
+        String decoded = new String(Base64.getDecoder().decode(data));
+        content.setData(decoded);
+
+        return content;
+    }
+
+    private JsonObject extractRootJsonElementFromRequestBody() {
+        try {
+            JsonParser jsonParser = new JsonParser();
+            BufferedReader reader = request.getReader();
+            Stream<String> lines = reader.lines();
+            String requestBody = lines.collect(Collectors.joining("\n"));
+            JsonElement rootElement = jsonParser.parse(requestBody);
+            if (!(rootElement instanceof JsonObject)) {
+                throw new AppException(HttpStatus.BAD_REQUEST.value(), "RequestBody is not JsonObject.",
+                        "Request Body should be JsonObject to be processed.");
+            }
+            return rootElement.getAsJsonObject();
+        } catch (IOException e) {
+            throw new AppException(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Request payload parsing error",
+                    "Unable to parse request payload.", e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsServiceAccountValidator.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsServiceAccountValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..5e30acebfc36302ba190c1fdb207adce9e7ef33a
--- /dev/null
+++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/AwsServiceAccountValidator.java
@@ -0,0 +1,33 @@
+// Copyright © 2020 Amazon Web Services
+// 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.aws.impl;
+
+import org.opengroup.osdu.notification.provider.interfaces.IServiceAccountValidator;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AwsServiceAccountValidator implements IServiceAccountValidator {
+    @Override
+    public boolean isValidPublisherServiceAccount(String jwt) {
+         //Do we need to implement this since authz is done through Entitlements?
+        //Keeping false since we want to "Default Deny"
+        return false;
+    }
+
+    @Override
+    public boolean isValidServiceAccount(String jwt, String userIdentity, String... audiences) {
+        //Do we need to implement this since authz is done through Entitlements?
+        //Keeping false since we want to "Default Deny"
+        return false;
+    }
+}
diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/ServiceAccountJwtAwsClientImpl.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/ServiceAccountJwtAwsClientImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..dcfbf42aa4cedd1976432d027e0b855b7d392384
--- /dev/null
+++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/impl/ServiceAccountJwtAwsClientImpl.java
@@ -0,0 +1,213 @@
+// Copyright © 2020 Amazon Web Services
+// 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.aws.impl;
+
+import com.amazonaws.auth.AWSCredentialsProvider;
+import com.amazonaws.services.secretsmanager.AWSSecretsManager;
+import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder;
+import com.amazonaws.services.secretsmanager.model.*;
+import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagement;
+import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagementClientBuilder;
+import com.amazonaws.services.simplesystemsmanagement.model.*;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Setter;
+
+import org.opengroup.osdu.core.aws.iam.IAMConfig;
+import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
+import org.opengroup.osdu.core.common.util.IServiceAccountJwtClient;
+import org.opengroup.osdu.notification.provider.aws.utils.AwsCognitoClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class ServiceAccountJwtAwsClientImpl implements IServiceAccountJwtClient {
+
+
+    @Value("${aws.region}")
+    @Getter()
+    @Setter(AccessLevel.PROTECTED)
+    public String amazonRegion;
+
+
+
+    @Value("${aws.ssm}")
+    @Getter()
+    @Setter(AccessLevel.PROTECTED)
+    public Boolean ssmEnabled;
+
+
+    @Value("${aws.environment}")
+    @Getter()
+    @Setter(AccessLevel.PROTECTED)
+    public String environment;
+
+
+    @Autowired
+    private JaxRsDpsLog log;
+
+    String password;
+    String clientid;
+    String userpoolid;
+    String serviceprincipaluser;
+    AwsCognitoClient cognitoClient;
+
+    private AWSCredentialsProvider amazonAWSCredentials;
+    private AWSSimpleSystemsManagement ssmManager;
+
+    @PostConstruct
+    public void init() {
+        if (ssmEnabled) {
+            String secretKey = "service_principal_password";
+            String secretName = "/osdu/" + environment + "/service_principal_password";
+            String cognito_user_pool_id = "/osdu/" + environment + "/cognito-user-pool-id";
+            String cognito_client_id = "/osdu/" + environment + "/cognito-client-id";
+            String service_principal = "/osdu/" + environment + "/service-principal-user";
+            amazonAWSCredentials = IAMConfig.amazonAWSCredentials();
+            ssmManager = AWSSimpleSystemsManagementClientBuilder.standard()
+                    .withCredentials(amazonAWSCredentials)
+                    .withRegion(amazonRegion)
+                    .build();
+
+            GetParametersRequest paramRequest = new GetParametersRequest()
+                    .withNames(cognito_user_pool_id,cognito_client_id,service_principal)
+                    .withWithDecryption(true);
+            GetParametersResult paramResult = new GetParametersResult();
+            paramResult = ssmManager.getParameters(paramRequest);
+            List<Parameter> paramsResultList = new ArrayList<>();
+            List<String> paramsResultListInvalid = new ArrayList<>();
+            paramsResultList = paramResult.getParameters();
+            paramsResultListInvalid = paramResult.getInvalidParameters();
+
+            if(paramsResultListInvalid.size() >0)
+            {
+                log.error("SSM did not retrieve all parameters");
+            }
+            for (Parameter s : paramsResultList) {
+                if (s.getName().equalsIgnoreCase(cognito_user_pool_id)) {
+                    userpoolid = s.getValue();
+                }
+                if (s.getName().equalsIgnoreCase(cognito_client_id)) {
+                    clientid = s.getValue();
+                }
+                if (s.getName().equalsIgnoreCase(service_principal)) {
+                    serviceprincipaluser = s.getValue();
+                }
+
+            }
+
+            password = getSecret(secretName,amazonRegion,secretKey);
+             cognitoClient = new AwsCognitoClient(amazonRegion,clientid,"USER_PASSWORD_AUTH", serviceprincipaluser,password);
+             cognitoClient.setPassword(serviceprincipaluser,password,userpoolid);
+        }
+    }
+
+    @Override
+    public String getIdToken(String s) {
+
+        String token=  getServicePrincipalCredentials();
+        return token;
+
+    }
+
+    public  String getServicePrincipalCredentials()
+    {
+
+        String token = cognitoClient.getToken(serviceprincipaluser,password,"bearer");
+        return token;
+
+    }
+
+    public  String getSecret(String secretName, String region,String secretKey) {
+
+
+String secretVaue="";
+        // Create a Secrets Manager client
+        AWSSecretsManager client  = AWSSecretsManagerClientBuilder.standard()
+                .withRegion(region)
+                .build();
+
+        String secret="", decodedBinarySecret="";
+        GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest()
+                .withSecretId(secretName);
+        GetSecretValueResult getSecretValueResult = null;
+
+        try {
+            getSecretValueResult = client.getSecretValue(getSecretValueRequest);
+        } catch (DecryptionFailureException e) {
+            // Secrets Manager can't decrypt the protected secret text using the provided KMS key.
+            // Deal with the exception here, and/or rethrow at your discretion.
+            log.error("Error while setting up ServicePrincipalAccount"+e.getMessage());
+            throw e;
+        } catch (InternalServiceErrorException e) {
+            // An error occurred on the server side.
+            // Deal with the exception here, and/or rethrow at your discretion.
+            log.error("Error while setting up ServicePrincipalAccount"+e.getMessage());
+            throw e;
+        } catch (InvalidParameterException e) {
+            // You provided an invalid value for a parameter.
+            // Deal with the exception here, and/or rethrow at your discretion.
+            log.error("Error while setting up ServicePrincipalAccount"+e.getMessage());
+            throw e;
+        } catch (InvalidRequestException e) {
+            // You provided a parameter value that is not valid for the current state of the resource.
+            // Deal with the exception here, and/or rethrow at your discretion.
+            log.error("Error while setting up ServicePrincipalAccount"+e.getMessage());
+            throw e;
+        } catch (ResourceNotFoundException e) {
+            // We can't find the resource that you asked for.
+            // Deal with the exception here, and/or rethrow at your discretion.
+            log.error("Error while setting up ServicePrincipalAccount"+e.getMessage());
+            throw e;
+        }
+
+        // Decrypts secret using the associated KMS CMK.
+        // Depending on whether the secret is a string or binary, one of these fields will be populated.
+        if (getSecretValueResult.getSecretString() != null) {
+            secret = getSecretValueResult.getSecretString();
+            Map<String, String> secretMap=null;
+
+            try
+            {
+                secretMap = new ObjectMapper().readValue(secret.getBytes(), Map.class);
+
+            } catch (JsonParseException e) {
+                log.error(e.getMessage());
+            } catch (JsonMappingException e) {
+                log.error(e.getMessage());
+            } catch (IOException e) {
+                log.error(e.getMessage());
+            }
+
+             secretVaue = secretMap.get(secretKey);
+        }
+
+
+        return secretVaue;
+    }
+
+
+}
diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/security/AwsSecurityConfig.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/security/AwsSecurityConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..d683b65ca3e02ac7d0eefeadca1650923226c45e
--- /dev/null
+++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/security/AwsSecurityConfig.java
@@ -0,0 +1,33 @@
+// Copyright © 2020 Amazon Web Services
+// 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.aws.security;
+
+
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class AwsSecurityConfig extends WebSecurityConfigurerAdapter {
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        http.httpBasic().disable()
+                .csrf().disable();  //disable default authN. AuthN handled by endpoints proxy
+    }
+}
+
+
diff --git a/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/utils/AwsCognitoClient.java b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/utils/AwsCognitoClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..d8c9fe16334706f8bb091cf866099a1a3f46b796
--- /dev/null
+++ b/provider/notification-aws/src/main/java/org/opengroup/osdu/notification/provider/aws/utils/AwsCognitoClient.java
@@ -0,0 +1,97 @@
+// Copyright © 2020 Amazon Web Services
+//
+// 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.aws.utils;
+
+import com.amazonaws.services.cognitoidp.AWSCognitoIdentityProvider;
+import com.amazonaws.services.cognitoidp.AWSCognitoIdentityProviderClientBuilder;
+import com.amazonaws.services.cognitoidp.model.AdminSetUserPasswordRequest;
+import com.amazonaws.services.cognitoidp.model.AdminSetUserPasswordResult;
+import com.amazonaws.services.cognitoidp.model.InitiateAuthRequest;
+import com.amazonaws.services.cognitoidp.model.InitiateAuthResult;
+import org.opengroup.osdu.core.aws.iam.IAMConfig;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AwsCognitoClient {
+
+    // Parameter value locations
+    private final static String USERNAME_PARAM = "USERNAME";
+    private final static String PASSWORD_PARAM = "PASSWORD";
+    private final static String COGNITO_CLIENT_ID_PROPERTY = "AWS_COGNITO_CLIENT_ID";
+    private final static String COGNITO_AUTH_FLOW_PROPERTY = "AWS_COGNITO_AUTH_FLOW";
+    private final static String COGNITO_AUTH_PARAMS_USER_PROPERTY = "AWS_COGNITO_AUTH_PARAMS_USER";
+    private final static String COGNITO_AUTH_PARAMS_PASSWORD_PROPERTY = "AWS_COGNITO_AUTH_PARAMS_PASSWORD";
+
+
+    String awsCognitoClientId;
+    String awsCognitoAuthFlow;
+    String awsCognitoAuthParamsUser;
+    String awsCognitoAuthParamsPassword;
+    AWSCognitoIdentityProvider provider;
+
+
+    public AwsCognitoClient(String region,String awsCognitoClientId, String awsCognitoAuthFlow, String awsCognitoAuthParamsUser
+            , String awsCognitoAuthParamsPassword) {
+        this.awsCognitoClientId = awsCognitoClientId;
+        this.awsCognitoAuthFlow = awsCognitoAuthFlow;
+        this.awsCognitoAuthParamsUser = awsCognitoAuthParamsUser;
+        this.awsCognitoAuthParamsPassword = awsCognitoAuthParamsPassword;
+       this.provider = generateCognitoClient(region);
+
+
+    }
+
+    public String getToken(String username, String password,String tokenType){
+        Map<String, String> authParameters = new HashMap<>();
+        authParameters.put(USERNAME_PARAM, username);
+        authParameters.put(PASSWORD_PARAM, password);
+
+        InitiateAuthRequest request = new InitiateAuthRequest();
+        request.setClientId(awsCognitoClientId);
+        request.setAuthFlow(awsCognitoAuthFlow);
+        request.setAuthParameters(authParameters);
+        String token="";
+        InitiateAuthResult result = this.provider.initiateAuth(request);
+        if(tokenType.equals("session"))
+            token= result.getSession();
+        else if(tokenType.equals("bearer"))
+            token= "Bearer "+ result.getAuthenticationResult().getAccessToken();
+        return token;
+    }
+
+
+    public AWSCognitoIdentityProvider getProvider() {
+        return provider;
+    }
+
+    public  static AWSCognitoIdentityProvider generateCognitoClient(String region)
+    {
+        return AWSCognitoIdentityProviderClientBuilder.standard()
+                .withCredentials(IAMConfig.amazonAWSCredentials())
+                .withRegion(region)
+                .build();
+    }
+
+    public void setPassword(String username, String password,String userPoolId){
+        AdminSetUserPasswordRequest request = new AdminSetUserPasswordRequest()
+                .withUsername(username)
+                .withPassword(password)
+                .withPermanent(true)
+                .withUserPoolId(userPoolId);
+        AdminSetUserPasswordResult result = this.provider.adminSetUserPassword(request);
+
+    }
+}
diff --git a/provider/notification-aws/src/main/resources/application.properties b/provider/notification-aws/src/main/resources/application.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6412b35466c829df8611f467c82b8e2428185846
--- /dev/null
+++ b/provider/notification-aws/src/main/resources/application.properties
@@ -0,0 +1,46 @@
+# Copyright © 2020 Amazon Web Services
+#
+# 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.
+
+LOG_PREFIX=notification
+logging.level.org.springframework.web=${LOG_LEVEL:INFO}
+server.servlet.contextPath=/api/notification/v1
+server.port=${APPLICATION_PORT:8080}
+
+AUTHORIZE_API=${ENTITLEMENTS_BASE_URL}/api/entitlements/v1
+
+REGISTER_SERVICE_URL=${REGISTER_BASE_URL}/api/register/v1
+
+aws.ssm=${SSM_ENABLED:True}
+aws.environment=${RESOURCE_PREFIX}
+## AWS DynamoDB configuration
+aws.region=${AWS_REGION}
+aws.dynamodb.table.prefix=${RESOURCE_PREFIX}-
+aws.dynamodb.endpoint=dynamodb.${AWS_REGION}.amazonaws.com
+
+
+app.expireTime=300
+app.maxCacheSize=10
+
+
+# Application name
+spring.application.name=notification-aws
+
+
+#logging configuration
+logging.transaction.enabled=true
+logging.slf4jlogger.enabled=true
+logging.mdccontext.enabled=true
+
+# if this is turned on then the service tries to connect to elastic search
+management.health.elasticsearch.enabled=false
diff --git a/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/AwsPubsubRequestBodyExtractorTest.java b/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/AwsPubsubRequestBodyExtractorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..76d62972a40122ff3d76cf2efda82598d15f7680
--- /dev/null
+++ b/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/AwsPubsubRequestBodyExtractorTest.java
@@ -0,0 +1,157 @@
+// Copyright © 2020 Amazon Web Services
+//
+// 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.aws;
+
+
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDeleteExpression;
+import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+
+
+import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
+
+import org.opengroup.osdu.core.common.model.http.DpsHeaders;
+import org.opengroup.osdu.notification.provider.aws.impl.AwsPubsubRequestBodyExtractor;
+
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+
+import java.util.Map;
+
+
+
+
+@RunWith(MockitoJUnitRunner.class)
+public class AwsPubsubRequestBodyExtractorTest {
+
+    @Mock
+    private DpsHeaders dpsHeaders;
+
+
+
+    @Mock
+    private JaxRsDpsLog logger;
+
+    @Mock
+    private HttpServletRequest request;
+
+    @Mock
+    private AwsPubsubRequestBodyExtractor service;
+
+    @Before
+    public void init() {
+
+
+    }
+
+
+    @Test
+    public void should_returnValidData_extractDataFromRequestBody() throws IOException {
+        String stringRequest =  "{\n" +
+                "\t\"Type\": \"Notification\",\n" +
+                "\t\"message\": {\n" +
+                "\t\"attributes\": {\n" +
+                "\t\"correlation-id\": \"39137f49-67d6-4001-a6aa-15521ef4f49e\",\n" +
+                "\t\"data-partition-id\": \"" + TestUtils.getDataPartitionId() + "\"\n" +
+                "\t},\n" +
+                "\t\"data\": \"dGVzdERhdGE=\",\n" +
+                "\t\"messageId\": \"136969346945\"\n" +
+                "\t},\n" +
+                "\t\"subscription\": \""+ "de12345" +"\"\n" +
+                "}\n";
+        BufferedReader reader = new BufferedReader(new StringReader(stringRequest));
+        Mockito.when(request.getReader()).thenReturn(reader);
+
+        String expectedData = "testData";
+
+        service = new AwsPubsubRequestBodyExtractor(request);
+        String receivedData = service.extractDataFromRequestBody();
+
+            Assert.assertEquals(expectedData,receivedData);
+
+
+
+    }
+
+
+    @Test
+    public void should_returnValidNotificationId_FromRequestBody() throws IOException {
+        String stringRequest =  "{\n" +
+                "\t\"Type\": \"Notification\",\n" +
+                "\t\"message\": {\n" +
+                "\t\"attributes\": {\n" +
+                "\t\"correlation-id\": \"39137f49-67d6-4001-a6aa-15521ef4f49e\",\n" +
+                "\t\"data-partition-id\": \"" + TestUtils.getDataPartitionId() + "\"\n" +
+                "\t},\n" +
+                "\t\"data\": \"dGVzdERhdGE=\",\n" +
+                "\t\"messageId\": \"136969346945\"\n" +
+                "\t},\n" +
+                "\t\"subscription\": \""+ "de12345" +"\"\n" +
+                "}\n";
+        BufferedReader reader = new BufferedReader(new StringReader(stringRequest));
+        Mockito.when(request.getReader()).thenReturn(reader);
+
+        String expectedData = "de12345";
+
+        service = new AwsPubsubRequestBodyExtractor(request);
+        String receivedData = service.extractNotificationIdFromRequestBody();
+
+        Assert.assertEquals(expectedData,receivedData);
+
+
+
+    }
+
+    @Test
+    public void should_returnValidAttributes_FromRequestBody() throws IOException {
+        String stringRequest =  "{\n" +
+                "\t\"Type\": \"Notification\",\n" +
+                "\t\"message\": {\n" +
+                "\t\"attributes\": {\n" +
+                "\t\"correlation-id\": \"39137f49-123-456\",\n" +
+                "\t\"data-partition-id\": \"" + TestUtils.getDataPartitionId() + "\"\n" +
+                "\t},\n" +
+                "\t\"data\": \"dGVzdERhdGE=\",\n" +
+                "\t\"messageId\": \"136969346945\"\n" +
+                "\t},\n" +
+                "\t\"subscription\": \""+ "de12345" +"\"\n" +
+                "}\n";
+        BufferedReader reader = new BufferedReader(new StringReader(stringRequest));
+        Mockito.when(request.getReader()).thenReturn(reader);
+
+        String expectedData = "de12345";
+
+        service = new AwsPubsubRequestBodyExtractor(request);
+        // Act
+        Map<String, String> receivedAttributes = service.extractAttributesFromRequestBody();
+
+        // Asset
+        Assert.assertEquals(receivedAttributes.get("correlation-id"),"39137f49-123-456");
+        Assert.assertEquals(receivedAttributes.get("data-partition-id"),"opendes");
+
+
+
+    }
+}
diff --git a/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/TestUtils.java b/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/TestUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..de73e4c4066524dfbbf9b30d73aa904e7e1a1eee
--- /dev/null
+++ b/provider/notification-aws/src/test/java/org/opengroup/osdu/notification/provider/aws/TestUtils.java
@@ -0,0 +1,40 @@
+// Copyright © 2020 Amazon Web Services
+//
+//  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.aws;
+
+
+
+public class TestUtils {
+
+    private TestUtils() {
+    }
+
+    private static final String dataPartitionId = "opendes";
+
+    public static String getDataPartitionId() {
+        return dataPartitionId;
+    }
+
+
+
+
+
+}
+
+
+
+
+
+
diff --git a/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/pubsub/EventGridRequestBodyExtractor.java b/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/pubsub/EventGridRequestBodyExtractor.java
index c5fcedb7f6693be986329cbfd3527cdc68a57fc2..2452ed32232d38e86c7de8bc89ed9a7a03bf65a2 100644
--- a/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/pubsub/EventGridRequestBodyExtractor.java
+++ b/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/pubsub/EventGridRequestBodyExtractor.java
@@ -190,4 +190,4 @@ public class EventGridRequestBodyExtractor implements IPubsubRequestBodyExtracto
         Preconditions.checkNotNull(notificationData.getAttributes().get("correlation-id") , "Request payload parsing error" );
         Preconditions.checkNotNull(notificationData.getAttributes().get("data-partition-id") , "Request payload parsing error" );
     }
-}
\ No newline at end of file
+}
diff --git a/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/util/AzureCosmosProperties.java b/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/util/AzureCosmosProperties.java
index bc5ef75b70ab9ac7f83c72b4c87ce1fcd5f36771..84ba639f515370bcbbefcab1816a77a5fd61d166 100644
--- a/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/util/AzureCosmosProperties.java
+++ b/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/util/AzureCosmosProperties.java
@@ -21,13 +21,13 @@ public class AzureCosmosProperties {
     @Bean
     @Named("COSMOS_ENDPOINT")
     public String cosmosEndpoint(SecretClient kv) {
-        return getKeyVaultSecret(kv, "cosmos-endpoint");
+        return getKeyVaultSecret(kv, "opendes-cosmos-endpoint");
     }
 
     @Bean
     @Named("COSMOS_KEY")
     public String cosmosKey(SecretClient kv) {
-        return getKeyVaultSecret(kv, "cosmos-primary-key");
+        return getKeyVaultSecret(kv, "opendes-cosmos-primary-key");
     }
 
     @Bean
diff --git a/provider/notification-azure/src/main/resources/application.properties b/provider/notification-azure/src/main/resources/application.properties
index fa4ec0f92bebcde028de96d66d0e1cc9b5877bcc..0fbf96e4f6f9779f9bfb21665f5277f6a9a5bfac 100644
--- a/provider/notification-azure/src/main/resources/application.properties
+++ b/provider/notification-azure/src/main/resources/application.properties
@@ -32,7 +32,6 @@ aad.oboApi=${aad_client_id}
 azure.application-insights.instrumentation-key=${appinsights_key}
 
 # Azure CosmosDB configuration
-azure.cosmosdb.uri=${cosmosdb_account}
 azure.cosmosdb.database=${cosmosdb_database}
 tenantInfo.container.name=TenantInfo
 
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/pubsub/EventGridHandshakeHandlerTest.java
similarity index 99%
rename from provider/notification-azure/src/test/java/org/opengroup/osdu/notification/provider/azure/EventGridHandshakeHandlerTest.java
rename to provider/notification-azure/src/test/java/org/opengroup/osdu/notification/pubsub/EventGridHandshakeHandlerTest.java
index f16dc0061526f54938c74f8549754686e2ececb4..b1cac81ce1b3e57696690b4a3bf989b266f9afc4 100644
--- 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/pubsub/EventGridHandshakeHandlerTest.java
@@ -75,4 +75,4 @@ public class EventGridHandshakeHandlerTest {
             fail("Should Throw AppException");
         }
     }
-}
\ No newline at end of file
+}
diff --git a/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/util/AzureCosmosPropertiesTest.java b/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/util/AzureCosmosPropertiesTest.java
index 4280d1d1b562ee1969d4a5e771d02fa86a591d5f..0bc49cd9abc94173d9937166049a837b715a2d6d 100644
--- a/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/util/AzureCosmosPropertiesTest.java
+++ b/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/util/AzureCosmosPropertiesTest.java
@@ -52,14 +52,14 @@ public class AzureCosmosPropertiesTest {
         IllegalStateException exception = assertThrows(IllegalStateException.class, () -> sut.cosmosKey(kv));
 
         // Assert
-        assertEquals("No secret found with name cosmos-primary-key", exception.getMessage());
+        assertEquals("No secret found with name opendes-cosmos-primary-key", exception.getMessage());
     }
 
     @Test
     public void should_returnRightCosmosKey_getCosmosKey() {
         // Set-Up
         doReturn("cosmos-key-secret").when(secret).getValue();
-        doReturn(secret).when(kv).getSecret("cosmos-primary-key");
+        doReturn(secret).when(kv).getSecret("opendes-cosmos-primary-key");
 
         // Act
         String secretValue = sut.cosmosKey(kv);
@@ -72,7 +72,7 @@ public class AzureCosmosPropertiesTest {
     public void should_returnRightCosmosSecret_getCosmosKey() {
         // Set-Up
         doReturn("cosmos-endpoint-secret").when(secret).getValue();
-        doReturn(secret).when(kv).getSecret("cosmos-endpoint");
+        doReturn(secret).when(kv).getSecret("opendes-cosmos-endpoint");
 
         // Act
         String secretValue = sut.cosmosEndpoint(kv);
diff --git a/provider/notification-gcp/README.md b/provider/notification-gcp/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..16b5cf2d1e10d78ae5e4b3b9bddbcd395f9985d5
--- /dev/null
+++ b/provider/notification-gcp/README.md
@@ -0,0 +1,177 @@
+#Notification Service
+notification-gcp is a [Spring Boot](https://spring.io/projects/spring-boot) service that allow for interested consumers to subscribe to data and metadata changes using a publish/subscriber pattern.
+
+## Getting Started
+These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.
+
+### Requirements
+* Java 8
+* [Maven 3.6.0+](https://maven.apache.org/download.cgi)
+* GCloud command line tool
+* GCloud access to opendes project
+
+### General Tips
+
+**Environment Variable Management**
+The following tools make environment variable configuration simpler
+ - [direnv](https://direnv.net/) - for a shell/terminal environment
+ - [EnvFile](https://plugins.jetbrains.com/plugin/7861-envfile) - for [Intellij IDEA](https://www.jetbrains.com/idea/)
+
+**Lombok**
+This project uses [Lombok](https://projectlombok.org/) for code generation. You may need to configure your IDE to take advantage of this tool.
+ - [Intellij configuration](https://projectlombok.org/setup/intellij)
+ - [VSCode configuration](https://projectlombok.org/setup/vscode)
+
+### Installation
+In order to run the service locally or remotely, you will need to have the following environment variables defined.
+
+| name | value | description | sensitive? | source |
+| ---  | ---   | ---         | ---        | ---    |
+| `APP_ENTITLEMENTS` | ex `https://entitlements.com/entitlements/v1` | Entitlements API endpoint | no | output of infrastructure deployment |
+| `APP_REGISTER` | ex `https://register.com/api/register/v1` | Storage API endpoint | no | output of infrastructure deployment |
+| `APP_PROJECT` | ex `opendes` | Google Cloud Project Id | no | output of infrastructure deployment |
+| `APP_AUDIENCES` | ex `*****.apps.googleusercontent.com` | Client ID for getting access to cloud resources | yes | https://console.cloud.google.com/apis/credentials |
+
+**System Environment required to run service**
+
+| name | value | description | sensitive? | source |
+| ---  | ---   | ---         | ---        | ---    |
+| `SPRING_PROFILES_ACTIVE` | `local` | spring active profile | no |
+
+### Run Locally
+Check that maven is installed:
+```bash
+$ mvn --version
+Apache Maven 3.6.0
+Maven home: /usr/share/maven
+Java version: 1.8.0_212, vendor: AdoptOpenJDK, runtime: /usr/lib/jvm/jdk8u212-b04/jre
+...
+```
+
+You will need to configure access to the remote maven repository that holds the OSDU dependencies. This file should live within `~/.m2/settings.xml`:
+
+```bash
+$ cat ~/.m2/settings.xml
+<?xml version="1.0" encoding="UTF-8"?>
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+    <servers>
+        <server>
+            <id>os-core</id>
+            <username>slb-des-ext-collaboration</username>
+            <!-- Treat this auth token like a password. Do not share it with anyone, including Microsoft support. -->
+            <password>${VSTS_FEED_TOKEN}</password>
+        </server>
+    </servers>
+</settings>
+```
+
+* Update the Google cloud SDK to the latest version:
+
+```bash
+gcloud components update
+```
+* Set Google Project Id:
+
+```bash
+gcloud config set project <YOUR-PROJECT-ID>
+```
+
+* Perform a basic authentication in the selected project:
+
+```bash
+gcloud auth application-default login
+```
+
+* Navigate to notification service's root folder and run:
+
+```bash
+mvn jetty:run
+## Testing
+* Navigate to notification service's root folder and run:
+ 
+```bash
+mvn clean install   
+```
+
+* If you wish to see the coverage report then go to testing/target/site/jacoco-aggregate and open index.html
+
+* If you wish to build the project without running tests
+
+```bash
+mvn clean install -DskipTests
+```
+
+After configuring your environment as specified above, you can follow these steps to build and run the application. These steps should be invoked from the *repository root.*
+
+```bash
+cd provider/notification-gcp/ && mvn spring-boot:run -Dspring-boot.run.profiles=local 
+```
+
+## Testing
+Navigate to notification service's root folder and run all the tests:
+
+```bash
+# build + test + install core service code
+$ (cd notification-core/ && mvn clean install)
+```
+
+## Test the application
+
+After the service has started it should be accessible via a web browser by visiting [http://localhost:8080/api/notification/v1/swagger-ui.html](http://localhost:8080/swagger-ui.html). If the request does not fail, you can then run the integration tests.
+
+###Dependencies needed to run the integration tests 
+* Java 8
+* Maven
+* Values for the following environment variables in Config.java
+  
+| name | value | description | sensitive? | source |
+| ---  | ---   | ---         | ---        | ---    |
+| `DE_OPS_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already, also **Private key id** of this account must be set in Register service variable SUBSCRIBER_PRIVATE_KEY_ID  | yes | https://console.cloud.google.com/iam-admin/serviceaccounts |
+| `DE_ADMIN_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already | yes | https://console.cloud.google.com/iam-admin/serviceaccounts |
+| `DE_EDITOR_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already  | yes | https://console.cloud.google.com/iam-admin/serviceaccounts |
+| `DE_NO_ACCESS_TESTER` | `*****` | Service account base64 encoded string for API calls. Note: this user must have entitlements configured already | yes | https://console.cloud.google.com/iam-admin/serviceaccounts |
+| `ENVIRONMENT` | `dev` OR `local` OR `dev_gke`| Local for running locally with services url's predefined as http://localhost , Dev & Dev_Gke is configurable environment | no | - |
+| `HMAC_SECRET` | ex`7a786376626e` | String in hex , must match pattern ^[a-zA-Z0-9]{8,30}+$ & be in register variable SUBSCRIBER_SECRET | yes | - |
+| `REGISTER_BASE_URL` | `http://localhost:8081/api/register/v1` | Register service url | no | - |
+| `NOTIFICATION_BASE_URL` | `http://localhost:8080/` | Notification service url  | no | - |
+| `INTEGRATION_TEST_AUDIENCE` | `********` | Client application ID | yes | https://console.cloud.google.com/apis/credentials |
+| `CLIENT_TENANT` | ex `opendes` | Client tenant | no | - |
+| `OSDU_TENANT` | ex `osdu` | Osdu tenant | no | - |
+| `TOPIC_ID` | ex `records-changed` | PubSub topic id | no | https://console.cloud.google.com/cloudpubsub/topic |
+| `REGISTER_CUSTOM_PUSH_URL_HMAC` | ex `http://localhost:8081/api/register/v1/test/challenge/hmac-integration-test` | Register testing push url | no | - |
+
+ **Entitlements configuration for integration accounts**
+ 
+ | DE_OPS_TESTER | DE_ADMIN_TESTER | DE_EDITOR_TESTER | DE_NO_ACCESS_TESTER | 
+ | ---  | ---   | ---  | ---   |
+ |notification.pubsub<br/>service.entitlements.user<br/>users<br/>users.datalake.ops</br>| service.entitlements.user<br/>users<br/>users.datalake.admins</br> | service.entitlements.user<br/>users<br/>users.datalake.editors</br> | service.entitlements.user<br/>users<br/>|
+
+Above variables should be configured in the release pipeline to run integration tests. You should also replace them with proper values if you wish to run tests locally.
+
+###Commands to run tests
+* Integration tests are refactored into two pieces: Core and Provider. Core contains business logic for tests and is a dependency for executing the tests from provider module. To build the core module, simply navigate to `notification-test-core` directory and run `mvn clean install`. This will build the core module
+* Next, to execute the integration tests, navigate to the provider module and execute `mvn test`
+```bash
+# (cd testing/notification-test-core/ && mvn clean install)
+# Note: this assumes that the environment variables for integration tests as outlined
+#       above are already exported in your environment.
+$ (cd testing/notification-test-gcp/ && mvn clean test)
+```
+## License
+Copyright © Google LLC
+
+Copyright © EPAM Systems
+ 
+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](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.
\ No newline at end of file
diff --git a/provider/notification-gcp/pom.xml b/provider/notification-gcp/pom.xml
index e32c4a09e612f16e9ab87bb0b0d5e6c59b5cce17..50409e65f6b4d4ccaa85ee7f3190b69e02e2d7df 100644
--- a/provider/notification-gcp/pom.xml
+++ b/provider/notification-gcp/pom.xml
@@ -144,6 +144,25 @@
                     <failOnMissingWebXml>false</failOnMissingWebXml>
                 </configuration>
             </plugin>
+            <plugin>
+				<groupId>org.jacoco</groupId>
+				<artifactId>jacoco-maven-plugin</artifactId>
+				<version>0.7.7.201606060606</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>prepare-agent</goal>
+						</goals>
+					</execution>
+					<execution>
+						<id>report</id>
+						<phase>prepare-package</phase>
+						<goals>
+							<goal>report</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
         </plugins>
     </build>
 </project>
diff --git a/testing/README.md b/testing/README.md
index e23b98fbbd0c42d43c467fca28db8b3c7658f7f3..20c3a69c83cb6ad6f341768a4a9b27578255c9cf 100644
--- a/testing/README.md
+++ b/testing/README.md
@@ -40,3 +40,6 @@ Notification integration tests are refactored so that the business logic for int
 ###Commands to run tests
 * Integration tests are refactored into two pieces: Core and Provider. Core contains business logic for tests and is a dependency for executing the tests from provider module. To build the core module, simply navigate to `notification-test-core` directory and run `mvn clean install`. This will build the core module
 * Next, to execute the integration tests, navigate to the provider module and execute `mvn test`
+
+### GCP
+Instructions for running the GCP integration tests can be found [here](../provider/notification-gcp/README.md).
\ No newline at end of file
diff --git a/testing/notification-test-aws/build-aws/prepare-dist.sh b/testing/notification-test-aws/build-aws/prepare-dist.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4901fec991099ff16c9b3929dacc18954e9ff5aa
--- /dev/null
+++ b/testing/notification-test-aws/build-aws/prepare-dist.sh
@@ -0,0 +1,47 @@
+# Copyright © 2020 Amazon Web Services
+#
+# 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.
+
+# This script prepares the dist directory for the integration tests.
+# Must be run from the root of the repostiory
+
+# This script prepares the dist directory for the integration tests.
+# Must be run from the root of the repostiory
+
+set -e
+
+OUTPUT_DIR="${OUTPUT_DIR:-dist}"
+
+INTEGRATION_TEST_OUTPUT_DIR=${INTEGRATION_TEST_OUTPUT_DIR:-$OUTPUT_DIR}/testing/integration
+INTEGRATION_TEST_OUTPUT_BIN_DIR=${INTEGRATION_TEST_OUTPUT_DIR:-$INTEGRATION_TEST_OUTPUT_DIR}/bin
+INTEGRATION_TEST_SOURCE_DIR=testing
+INTEGRATION_TEST_SOURCE_DIR_AWS="$INTEGRATION_TEST_SOURCE_DIR"/notification-test-aws
+INTEGRATION_TEST_SOURCE_DIR_CORE="$INTEGRATION_TEST_SOURCE_DIR"/notification-test-core
+echo "--Source directories variables--"
+echo $INTEGRATION_TEST_SOURCE_DIR_AWS
+echo $INTEGRATION_TEST_SOURCE_DIR_CORE
+echo "--Output directories variables--"
+echo $OUTPUT_DIR
+echo $INTEGRATION_TEST_OUTPUT_DIR
+echo $INTEGRATION_TEST_OUTPUT_BIN_DIR
+
+rm -rf "$INTEGRATION_TEST_OUTPUT_DIR"
+mkdir -p "$INTEGRATION_TEST_OUTPUT_DIR" && mkdir -p "$INTEGRATION_TEST_OUTPUT_BIN_DIR"
+echo "Building integration testing assemblies and gathering artifacts..."
+mvn install -f "$INTEGRATION_TEST_SOURCE_DIR_CORE"/pom.xml
+mvn install dependency:copy-dependencies -DskipTests -f "$INTEGRATION_TEST_SOURCE_DIR_AWS"/pom.xml -DincludeGroupIds=org.opengroup.osdu -Dmdep.copyPom
+cp "$INTEGRATION_TEST_SOURCE_DIR_AWS"/target/dependency/* "${INTEGRATION_TEST_OUTPUT_BIN_DIR}"
+(cd "${INTEGRATION_TEST_OUTPUT_BIN_DIR}" && ls *.jar | sed -e 's/\.jar$//' | xargs -I {} echo mvn install:install-file -Dfile={}.jar -DpomFile={}.pom >> install-deps.sh)
+chmod +x "${INTEGRATION_TEST_OUTPUT_BIN_DIR}"/install-deps.sh
+mvn clean -f "$INTEGRATION_TEST_SOURCE_DIR_AWS"/pom.xml
+cp -R "$INTEGRATION_TEST_SOURCE_DIR_AWS"/* "${INTEGRATION_TEST_OUTPUT_DIR}"/
\ No newline at end of file
diff --git a/testing/notification-test-aws/build-aws/run-tests.sh b/testing/notification-test-aws/build-aws/run-tests.sh
new file mode 100755
index 0000000000000000000000000000000000000000..afd1e9e3a44432dacecbd08cd37d703cac09c99c
--- /dev/null
+++ b/testing/notification-test-aws/build-aws/run-tests.sh
@@ -0,0 +1,59 @@
+# Copyright © 2020 Amazon Web Services
+#
+# 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.
+
+# This script prepares the dist directory for the integration tests.
+# Must be run from the root of the repostiory
+
+# This script executes the test and copies reports to the provided output directory
+# To call this script from the service working directory
+# ./dist/testing/integration/build-aws/run-tests.sh "./reports/"
+
+
+echo "### Running Notification-Service Integration Tests... ###"
+SCRIPT_SOURCE_DIR=$(dirname "$0")
+echo "Script source location"
+echo "$SCRIPT_SOURCE_DIR"
+(cd "$SCRIPT_SOURCE_DIR"/../bin && ./install-deps.sh)
+
+#### ADD REQUIRED ENVIRONMENT VARIABLES HERE ###############################################
+# The following variables are automatically populated from the environment during integration testing
+# see os-deploy-aws/build-aws/integration-test-env-variables.py for an updated list
+
+
+export AWS_COGNITO_AUTH_FLOW=USER_PASSWORD_AUTH
+export AWS_COGNITO_AUTH_PARAMS_PASSWORD=$ADMIN_PASSWORD
+export AWS_COGNITO_AUTH_PARAMS_USER=$ADMIN_USER
+export AWS_COGNITO_AUTH_PARAMS_USER_NO_ACCESS=$USER_NO_ACCESS
+export ENVIRONMENT=DEV
+export NOTIFICATION_REGISTER_BASE_URL=$NOTIFICATION_REGISTER_BASE_URL
+export HMAC_SECRET=02030405060708090A0B0C0D0E0F
+export REGISTER_CUSTOM_PUSH_PATH=/api/register/v1/awstest/aws/challenge/1
+export REGISTER_CUSTOM_PUSH_URL_HMAC=$NOTIFICATION_REGISTER_BASE_URL$REGISTER_CUSTOM_PUSH_PATH
+export NOTIFICATION_BASE_URL=$NOTIFICATION_BASE_URL
+
+
+#### RUN INTEGRATION TEST #########################################################################
+
+mvn test -f "$SCRIPT_SOURCE_DIR"/../pom.xml
+TEST_EXIT_CODE=$?
+
+#### COPY TEST REPORTS #########################################################################
+
+if [ -n "$1" ]
+  then
+    mkdir -p "$1"
+    cp -R "$SCRIPT_SOURCE_DIR"/../target/surefire-reports "$1"
+fi
+echo "### Notification-Service Integration Tests Finished ###"
+exit $TEST_EXIT_CODE
\ No newline at end of file
diff --git a/testing/notification-test-aws/pom.xml b/testing/notification-test-aws/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cd41c53282f5f82c04b6015cef0df56248a837ea
--- /dev/null
+++ b/testing/notification-test-aws/pom.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright © 2020 Amazon Web Services
+
+  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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.opengroup.osdu</groupId>
+    <artifactId>notification-test-aws</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <name>notification-test-aws</name>
+    <description>AWS Integration tests for Notification Service</description>
+    <packaging>jar</packaging>
+
+    <properties>
+        <java.version>8</java.version>
+        <maven.compiler.target>${java.version}</maven.compiler.target>
+        <maven.compiler.source>${java.version}</maven.compiler.source>
+        <os-core-lib-aws.version>0.3.11</os-core-lib-aws.version>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>${gitlab-server}</id>
+            <url>https://community.opengroup.org/api/v4/groups/17/-/packages/maven</url>
+        </repository>
+    </repositories>
+
+    <distributionManagement>
+        <repository>
+            <id>${gitlab-server}</id>
+            <url>https://community.opengroup.org/api/v4/projects/143/packages/maven</url>
+        </repository>
+        <snapshotRepository>
+            <id>${gitlab-server}</id>
+            <url>https://community.opengroup.org/api/v4/projects/143/packages/maven</url>
+        </snapshotRepository>
+    </distributionManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.opengroup.osdu.core.aws</groupId>
+            <artifactId>os-core-lib-aws</artifactId>
+            <version>0.3.11</version>
+        </dependency>
+        <dependency>
+            <groupId>com.amazonaws</groupId>
+            <artifactId>aws-java-sdk-cognitoidp</artifactId>
+            <version>1.11.676</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opengroup.osdu.notification</groupId>
+            <artifactId>notification-test-core</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opengroup.osdu</groupId>
+            <artifactId>os-core-common</artifactId>
+            <version>0.3.6</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACDescriptor.java b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACDescriptor.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f439169743714ddba75eebe46620b3b6ad052cd
--- /dev/null
+++ b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACDescriptor.java
@@ -0,0 +1,64 @@
+// Copyright © 2020 Amazon Web Services
+// 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.api;
+
+import org.opengroup.osdu.notification.util.Config;
+import org.opengroup.osdu.notification.util.RestDescriptor;
+import org.opengroup.osdu.notification.util.TestUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class PubsubEndpointHMACDescriptor extends RestDescriptor {
+
+    @Override
+    public String getPath() {
+        return "push-handlers/records-changed";
+    }
+
+    @Override
+    public String getHttpMethod() {
+        return "POST";
+    }
+
+    @Override
+    public String getValidBody() {
+        return  "{\n" +
+                "\t\"Type\": \"Notification\",\n" +
+                "\t\"message\": {\n" +
+                "\t\"attributes\": {\n" +
+                "\t\"correlation-id\": \"39137f49-67d6-4001-a6aa-15521ef4f49e\",\n" +
+                "\t\"data-partition-id\": \"" + TestUtils.getOsduTenant() + "\"\n" +
+                "\t},\n" +
+                "\t\"data\": \"W3sia2luZCI6InRlc3RraW5kIiwiaWQiOiJ0ZXN0aWQiLCJvcGVyYXRpb250eXBlIjoiY3JlYXRlIn0seyJraW5kIjoidGVzdGtpbmQyIiwiaWQiOiJ0ZXN0aWQyIiwib3BlcmF0aW9udHlwZSI6InVwZGF0ZSJ9XQ\",\n" +
+                "\t\"messageId\": \"136969346945\"\n" +
+                "\t},\n" +
+                "\t\"subscription\": \""+ arg() +"\"\n" +
+                "}\n";
+    }
+
+    @Override
+    public Map<String,String> getOsduTenantHeaders(){
+        Map<String, String> headers = new HashMap<>();
+        headers.put("data-partition-id", Config.Instance().OsduTenant);
+        return headers;
+    }
+
+    @Override
+    public Map<String,String> getCustomerTenantHeaders(){
+        Map<String, String> headers = new HashMap<>();
+        headers.put("data-partition-id", Config.Instance().ClientTenant);
+        return headers;
+    }
+}
diff --git a/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/TestPubsubEndpointHMAC.java b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/TestPubsubEndpointHMAC.java
new file mode 100644
index 0000000000000000000000000000000000000000..d19be5fa0bdca69cf1458daf7b300187f1eb1ce3
--- /dev/null
+++ b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/api/TestPubsubEndpointHMAC.java
@@ -0,0 +1,53 @@
+// Copyright © 2020 Amazon Web Services
+//
+// 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.api;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.opengroup.osdu.notification.util.Config;
+import org.opengroup.osdu.notification.util.AwsTestUtils;
+import org.opengroup.osdu.notification.util.RestDescriptor;
+import org.opengroup.osdu.notification.util.TestUtils;
+
+import com.sun.jersey.api.client.ClientResponse;
+
+public class TestPubsubEndpointHMAC extends PubsubEndpointHMACTests {
+
+    @BeforeClass
+    public static void classSetup() throws Exception {
+        PubsubEndpointHMACTests.classSetup();
+    }
+
+    @AfterClass
+    public static void classTearDown() throws Exception {
+    }
+
+    @Before
+    @Override
+    public void setup() throws Exception {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() throws Exception {
+        this.testUtils = null;
+    }
+    
+
+}
\ No newline at end of file
diff --git a/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsCognitoClient.java b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsCognitoClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..e63144347ea286fa15ebc2c4189c0a58c0c95b98
--- /dev/null
+++ b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsCognitoClient.java
@@ -0,0 +1,93 @@
+// Copyright © 2020 Amazon Web Services
+//
+// 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.util;
+
+import com.amazonaws.services.cognitoidp.AWSCognitoIdentityProvider;
+import com.amazonaws.services.cognitoidp.AWSCognitoIdentityProviderClientBuilder;
+import com.amazonaws.services.cognitoidp.model.InitiateAuthRequest;
+import com.amazonaws.services.cognitoidp.model.InitiateAuthResult;
+
+import org.opengroup.osdu.core.aws.iam.IAMConfig;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AwsCognitoClient {
+
+    // Parameter value locations
+    private final static String USERNAME_PARAM = "USERNAME";
+    private final static String PASSWORD_PARAM = "PASSWORD";
+    private final static String COGNITO_CLIENT_ID_PROPERTY = "AWS_COGNITO_CLIENT_ID";
+    private final static String COGNITO_AUTH_FLOW_PROPERTY = "AWS_COGNITO_AUTH_FLOW";
+    private final static String COGNITO_AUTH_PARAMS_USER_PROPERTY = "AWS_COGNITO_AUTH_PARAMS_USER";
+    private final static String COGNITO_AUTH_PARAMS_PASSWORD_PROPERTY = "AWS_COGNITO_AUTH_PARAMS_PASSWORD";
+
+
+    String awsCognitoClientId;
+    String awsCognitoAuthFlow;
+    String awsCognitoAuthParamsUser;
+    String awsCognitoAuthParamsPassword;
+    AWSCognitoIdentityProvider provider;
+
+    public AwsCognitoClient() {
+        this.awsCognitoClientId = AwsConfig.getAWSCognitoClientId();
+        this.awsCognitoAuthFlow = AwsConfig.getAWSCognitoAuthFlow();
+        this.awsCognitoAuthParamsUser = AwsConfig.getAWSCognitoUser();
+        this.awsCognitoAuthParamsPassword = AwsConfig.getAWSCognitoPassword();
+        this.provider =generateCognitoClient();
+    }
+
+    public AwsCognitoClient(String awsCognitoClientId, String awsCognitoAuthFlow, String awsCognitoAuthParamsUser
+            , String awsCognitoAuthParamsPassword) {
+        this.awsCognitoClientId = awsCognitoClientId;
+        this.awsCognitoAuthFlow = awsCognitoAuthFlow;
+        this.awsCognitoAuthParamsUser = awsCognitoAuthParamsUser;
+        this.awsCognitoAuthParamsPassword = awsCognitoAuthParamsPassword;
+       this.provider = generateCognitoClient();
+
+
+    }
+
+    public String getToken(String username, String password,String tokenType){
+        Map<String, String> authParameters = new HashMap<>();
+        authParameters.put(USERNAME_PARAM, username);
+        authParameters.put(PASSWORD_PARAM, password);
+
+        InitiateAuthRequest request = new InitiateAuthRequest();
+        request.setClientId(awsCognitoClientId);
+        request.setAuthFlow(awsCognitoAuthFlow);
+        request.setAuthParameters(authParameters);
+        String token="";
+        InitiateAuthResult result = this.provider.initiateAuth(request);
+        if(tokenType.equals("session"))
+            token= result.getSession();
+        else if(tokenType.equals("bearer"))
+            token= "Bearer "+ result.getAuthenticationResult().getAccessToken();
+        return token;
+    }
+
+
+    public AWSCognitoIdentityProvider getProvider() {
+        return provider;
+    }
+
+    public  static AWSCognitoIdentityProvider generateCognitoClient()
+    {
+        return AWSCognitoIdentityProviderClientBuilder.standard()
+                .withCredentials(IAMConfig.amazonAWSCredentials())
+                .withRegion(AwsConfig.getAwsRegion())
+                .build();
+    }
+}
diff --git a/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsConfig.java b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..daee4b6a5e45c97d29a8807f33cb19e165211ee6
--- /dev/null
+++ b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsConfig.java
@@ -0,0 +1,71 @@
+// Copyright © 2020 Amazon Web Services
+//
+// 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.util;
+
+
+public class AwsConfig {
+
+
+
+    public static String getAWSCognitoClientId() {
+        return getEnvironmentVariableOrDefaultValue("AWS_COGNITO_CLIENT_ID", "");
+    }
+
+    public static String getAWSCognitoAuthFlow() {
+        return getEnvironmentVariableOrDefaultValue("AWS_COGNITO_AUTH_FLOW", "USER_PASSWORD_AUTH");
+    }
+
+    public static String getAWSCognitoUser() {
+        return getEnvironmentVariableOrDefaultValue("AWS_COGNITO_AUTH_PARAMS_USER", "");
+    }
+
+    public static String getAWSCognitoPassword() {
+        return getEnvironmentVariableOrDefaultValue("AWS_COGNITO_AUTH_PARAMS_PASSWORD", "");
+    }
+
+    public static String getAWSCognitoNoAccessUser() {
+        return getEnvironmentVariableOrDefaultValue("AWS_COGNITO_AUTH_PARAMS_USER_NO_ACCESS", "");
+    }
+
+
+    public static String getAWSCognitoUserPoolID() {
+        return getEnvironmentVariableOrDefaultValue("AWS_COGNITO_USER_POOL_ID", "");
+    }
+
+    public static String getResourcePrefix() {
+        return getEnvironmentVariableOrDefaultValue("RESOURCE_PREFIX", "");
+    }
+
+    public static String getAwsRegion() {
+        return getEnvironmentVariableOrDefaultValue("AWS_REGION", "us-east-1");
+    }
+
+
+
+    private static String getEnvironmentVariableOrDefaultValue(String key, String defaultValue) {
+        String environmentVariable = getEnvironmentVariable(key);
+        if (environmentVariable == null) {
+            environmentVariable = defaultValue;
+        }
+        return environmentVariable;
+    }
+
+    private static String getEnvironmentVariable(String propertyKey) {
+        return System.getProperty(propertyKey, System.getenv(propertyKey));
+    }
+
+
+
+}
diff --git a/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsTestUtils.java b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsTestUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..d2c64bab0ba45d473ed115c4ca445b2d8a7b2a83
--- /dev/null
+++ b/testing/notification-test-aws/src/test/java/org/opengroup/osdu/notification/util/AwsTestUtils.java
@@ -0,0 +1,59 @@
+// Copyright © 2020 Amazon Web Services
+//
+// 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.util;
+
+
+import org.apache.commons.lang3.StringUtils;
+
+public class AwsTestUtils extends TestUtils{
+
+
+
+    AwsCognitoClient client = new AwsCognitoClient();
+
+      @Override
+    public String getOpsToken() throws Exception {
+        if (opsToken==null || StringUtils.isEmpty(opsToken) ) {
+            opsToken= client.getToken(AwsConfig.getAWSCognitoUser(),AwsConfig.getAWSCognitoPassword(),"bearer");
+        }
+        return  opsToken;
+    }
+
+
+    //These users don't have access to the API, so getting the token for NoAccessUser
+    @Override
+    public String getAdminToken() throws Exception {
+        if (adminToken==null || StringUtils.isEmpty(adminToken)) {
+            adminToken=client.getToken(AwsConfig.getAWSCognitoNoAccessUser(),AwsConfig.getAWSCognitoPassword(),"bearer");
+        }
+        return adminToken;
+    }
+    //These users don't have access to the API, so getting the token for NoAccessUser
+    @Override
+    public String getEditorToken() throws Exception {
+        if (editorToken==null || StringUtils.isEmpty(editorToken)) {
+            editorToken=client.getToken(AwsConfig.getAWSCognitoNoAccessUser(),AwsConfig.getAWSCognitoPassword(),"bearer");
+        }
+        return editorToken;
+    }
+    //These users don't have access to the API, so getting the token for NoAccessUser
+    @Override
+    public String getNoAccessToken() throws Exception {
+        if (noAccessToken==null || StringUtils.isEmpty(noAccessToken)) {
+            noAccessToken=client.getToken(AwsConfig.getAWSCognitoNoAccessUser(),AwsConfig.getAWSCognitoPassword(),"bearer");
+        }
+        return  noAccessToken;
+    }
+}
diff --git a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointGSATests.java b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointGSATests.java
index a15f93348bf98faceeda1c3444e82dd04339b960..e4969dfd26b42d4eaabaead0c15eea4b492c8872 100644
--- a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointGSATests.java
+++ b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointGSATests.java
@@ -74,7 +74,12 @@ public abstract class PubsubEndpointGSATests extends BaseTestTemplate {
         gsaSecret.setSecretType("GSA");
         ((GsaSecret) gsaSecret).setValue(gsaSecretValue);
         subscription.setSecret(gsaSecret);
-        subscription = this.subscriptionService.create(subscription);
+        try {
+            subscription = this.subscriptionService.create(subscription);
+        }catch (SubscriptionException e){
+            System.out.println("Subscription exception inner response : " + e.getHttpResponse());
+            throw e;
+        }
 
         Config.Instance().NotificationId = subscription.getNotificationId();
         this.subscriptionId = subscription.getId();
diff --git a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACTests.java b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACTests.java
index 20094465104e331a08c1dfb1174573e658f7c29f..a0962f805211090dc90e4028a572030971d17d20 100644
--- a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACTests.java
+++ b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/api/PubsubEndpointHMACTests.java
@@ -84,16 +84,22 @@ public abstract class PubsubEndpointHMACTests extends BaseTestTemplate {
         subscription.setName("subscription-integration-test-hmac");
         subscription.setDescription("subscription created for hmac integration test");
         subscription.setTopic(Config.Instance().Topic);
-        subscription.setPushEndpoint(Config.Instance().HMACPushUrl + "hmac-integration-test");
+        //This seems to be a bug. Dont need to add the string
+        //subscription.setPushEndpoint(Config.Instance().HMACPushUrl + "hmac-integration-test");
+        subscription.setPushEndpoint(Config.Instance().HMACPushUrl);
         HmacSecret secret = new HmacSecret();
         secret.setValue(Config.Instance().hmacSecretValue);
 
         subscription.setSecret(secret);
-        Subscription subscriptionCreated = subscriptionService.create(subscription);
-        notificationId = subscriptionCreated.getNotificationId();
-        subscriptionId = subscriptionCreated.getId();
-
-        Config.Instance().NotificationId = notificationId;
+        try {
+            Subscription subscriptionCreated = subscriptionService.create(subscription);
+            notificationId = subscriptionCreated.getNotificationId();
+            subscriptionId = subscriptionCreated.getId();
+            Config.Instance().NotificationId = notificationId;
+        }catch (SubscriptionException e){
+            System.out.println("Subscription exception inner response : " + e.getHttpResponse());
+            throw e;
+        }
     }
 
     @Override
diff --git a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/BaseTestTemplate.java b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/BaseTestTemplate.java
index 79eb64040d3e18c4858cc06478c12151bba41cd9..4e4470550d0c2049e8ab13a61ec32f4d509d31d5 100644
--- a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/BaseTestTemplate.java
+++ b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/BaseTestTemplate.java
@@ -17,6 +17,7 @@
 package org.opengroup.osdu.notification.util;
 
 import com.sun.jersey.api.client.ClientResponse;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import java.util.ArrayList;
@@ -107,6 +108,7 @@ public abstract class BaseTestTemplate extends TestBase {
 		ClientResponse response = descriptor.runOptions(getArg(), testUtils.getEditorToken());
 		assertEquals(error(	response.getEntity(String.class)), 200, response.getStatus());
 	}
+	@Ignore("Issue logged in GL")
 	@Test
 	public void should_return307_when_makingHttpRequest()throws Exception{
 		if(Config.Instance().isLocalHost() || Config.isGke())
diff --git a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/Config.java b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/Config.java
index 7812c54cd815ca1dc159f1125a55c1a2051d88ed..3a9c5544b783a3ea0e44d981b3afe213a07a5e3e 100644
--- a/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/Config.java
+++ b/testing/notification-test-core/src/main/java/org/opengroup/osdu/notification/util/Config.java
@@ -33,10 +33,10 @@ public class Config {
 
     public static Config Instance() {
         String env = getEnvironment();
-        config.ClientTenant = "nonexistenttenant";
-        config.IntegrationAudience = "245464679631-ktfdfpl147m1mjpbutl00b3cmffissgq.apps.googleusercontent.com";
-        config.OsduTenant = "opendes";
-        config.Topic = "records-changed";
+        config.ClientTenant = getEnvironmentVariableOrDefaultValue("CLIENT_TENANT","nonexistenttenant");
+        config.IntegrationAudience =  getEnvironmentVariableOrDefaultValue("INTEGRATION_TEST_AUDIENCE","245464679631-ktfdfpl147m1mjpbutl00b3cmffissgq.apps.googleusercontent.com");
+        config.OsduTenant = getEnvironmentVariableOrDefaultValue("OSDU_TENANT","opendes");
+        config.Topic = getEnvironmentVariableOrDefaultValue("TOPIC_ID","records-changed");
 
         config.hmacSecretValue = System.getProperty("HMAC_SECRET", System.getenv("HMAC_SECRET"));
         if (env.equalsIgnoreCase("LOCAL")) {
@@ -53,10 +53,26 @@ public class Config {
             String registerUrl = System.getProperty("REGISTER_BASE_URL", System.getenv("REGISTER_BASE_URL"));
             config.HostUrl = System.getProperty("NOTIFICATION_BASE_URL", System.getenv("NOTIFICATION_BASE_URL"));
             config.GSAPushUrl = registerUrl+"/test/gsa-challenge/";
-            config.HMACPushUrl = registerUrl+"/test/challenge/";
-            config.RegisterServicePath = registerUrl;
+            //Adding this so CPs can point to custom HMAC push endpoints
+            config.HMACPushUrl = getEnvironmentVariableOrDefaultValue("REGISTER_CUSTOM_PUSH_URL_HMAC",registerUrl+"/test/challenge/");
+            //Adding a new variable NOTIFICATION_REGISTER_BASE_URL since REGISTER_BASE_URL is used by Register integration tests which needs a trailing \
+             String regUrl= getEnvironmentVariable("NOTIFICATION_REGISTER_BASE_URL");
+             if(regUrl==null)
+             {
+                 config.RegisterServicePath = registerUrl;
+             }
+             else
+             {
+                 config.RegisterServicePath = regUrl+"/api/register/v1";
+             }
+
         }else
             throw new RuntimeException("$ENVIRONMENT environment variable not provided");
+
+        System.out.println("HostUrl="+config.HostUrl);
+        System.out.println("config.Topic="+ config.Topic);
+        System.out.println("config.HMACPushUrl="+ config.HMACPushUrl);
+        System.out.println("config.RegisterServicePath="+ config.RegisterServicePath);
         return config;
     }
 
@@ -71,4 +87,16 @@ public class Config {
     private static String getEnvironment() {
         return System.getProperty("ENVIRONMENT", System.getenv("ENVIRONMENT"));
     }
+
+    private static String getEnvironmentVariableOrDefaultValue(String key, String defaultValue) {
+        String environmentVariable = getEnvironmentVariable(key);
+        if (environmentVariable == null) {
+            environmentVariable = defaultValue;
+        }
+        return environmentVariable;
+    }
+
+    private static String getEnvironmentVariable(String propertyKey) {
+        return System.getProperty(propertyKey, System.getenv(propertyKey));
+    }
 }
diff --git a/testing/pom.xml b/testing/pom.xml
index 98ce82767af6753513c309f65f50753c2ce576f9..021529541d9089758070e4cb69ec424e3020e6ae 100644
--- a/testing/pom.xml
+++ b/testing/pom.xml
@@ -35,6 +35,7 @@
 		<module>notification-test-core</module>
 		<module>notification-test-azure</module>
 		<module>notification-test-gcp</module>
+		<module>notification-test-aws</module>
 	</modules>
 
 	<repositories>