diff --git a/provider/register-aws/build-aws/Dockerfile b/provider/register-aws/build-aws/Dockerfile
index 94a5511ff04fd6ce83326cc213d8bb41496673d3..4a2260ee6eafa9a45d9d76b386a6e3ed6ffec560 100644
--- a/provider/register-aws/build-aws/Dockerfile
+++ b/provider/register-aws/build-aws/Dockerfile
@@ -16,6 +16,8 @@
 FROM amazoncorretto:8
 
 ARG JAR_FILE=provider/register-aws/target/*spring-boot.jar
+# Harcoding this value since Register-core requires this variable. AWS does not use it. Might change in future
+ENV ENVIRONMENT=DEV
 WORKDIR /
 COPY ${JAR_FILE} app.jar
 EXPOSE 8080
diff --git a/provider/register-aws/build-aws/buildspec.yaml b/provider/register-aws/build-aws/buildspec.yaml
index b9d2a2ca645bda8a27613f9a34b53ac4317fd9eb..ee0ca0337542b0e57452ac21c7907fd5659ec0c7 100644
--- a/provider/register-aws/build-aws/buildspec.yaml
+++ b/provider/register-aws/build-aws/buildspec.yaml
@@ -53,8 +53,8 @@ phases:
       - echo "Building primary service assemblies..."
       - mvn -B test install -pl register-core,provider/register-aws -Ddeployment.environment=prod
 
-      #- echo "Building integration testing assemblies and gathering artifacts..."
-      #- ./testing/storage-test-aws/build-aws/prepare-dist.sh
+      - echo "Building integration testing assemblies and gathering artifacts..."
+      - ./testing/register-test-aws/build-aws/prepare-dist.sh
 
       - echo "Building docker image..."
       - docker build -f provider/register-aws/build-aws/Dockerfile -t ${ECR_IMAGE} .
diff --git a/provider/register-aws/pom.xml b/provider/register-aws/pom.xml
index 942cff85192423333f0bff1a03fc415ef52fc5c3..649084a316e52da23e2a13dedc38d758d537db5d 100644
--- a/provider/register-aws/pom.xml
+++ b/provider/register-aws/pom.xml
@@ -66,7 +66,7 @@
         <dependency>
             <groupId>org.opengroup.osdu.core.aws</groupId>
             <artifactId>os-core-lib-aws</artifactId>
-            <version>0.3.7</version>
+            <version>0.3.11-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.opengroup.osdu</groupId>
diff --git a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/action/ActionDoc.java b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/action/ActionDoc.java
index 78025fb7ed695c1d93f4b808f8927adf5664e315..086490e97e2ecd06d07754912825a9b3b3d1a7b4 100644
--- a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/action/ActionDoc.java
+++ b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/action/ActionDoc.java
@@ -50,7 +50,7 @@ public class ActionDoc {
     private String contactEmail;
 
     @DynamoDBAttribute(attributeName = "createdOnEpoch")
-    private Timestamp createdOnEpoch;
+    private String createdOnEpoch;
 
     @DynamoDBAttribute(attributeName = "dataPartitionId")
     private String dataPartitionId;
@@ -92,7 +92,7 @@ public class ActionDoc {
                 .url(action.getUrl())
                 .contactEmail(action.getContactEmail())
                 .filter(action.getFilter())
-                .createdOnEpoch(new Timestamp(System.currentTimeMillis()))
+                .createdOnEpoch((new Timestamp(System.currentTimeMillis())).toString())
                 .dataPartitionId(dataPartitionId);
 
         return actionDocBuilder.build();
@@ -107,10 +107,17 @@ public class ActionDoc {
         action.setImg(actionDoc.getImg());
         action.setUrl(actionDoc.getUrl());
         action.setContactEmail(actionDoc.getContactEmail());
-        action.setCreatedOnEpoch(com.google.cloud.Timestamp.of(actionDoc.getCreatedOnEpoch()));
+        Timestamp sqlTimestamp = Timestamp.valueOf(actionDoc.getCreatedOnEpoch());
+        com.google.cloud.Timestamp t = com.google.cloud.Timestamp.of(sqlTimestamp);
+        action.setCreatedOnEpoch(t);
         action.setFilter(actionDoc.getFilter());
         return action;
     }
+
+
+
+
+
 }
 
 
diff --git a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/action/AwsActionRepo.java b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/action/AwsActionRepo.java
index 0612c6e49104f2e5f7207cdde7f7d3ff6bcc32a4..27595914556c729347c850269f4e5250f6aaaa7e 100644
--- a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/action/AwsActionRepo.java
+++ b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/action/AwsActionRepo.java
@@ -14,13 +14,16 @@
 package org.opengroup.osdu.register.provider.aws.action;
 
 
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDeleteExpression;
 import com.amazonaws.services.dynamodbv2.model.AttributeValue;
+import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException;
 import org.opengroup.osdu.core.aws.dynamodb.DynamoDBQueryHelper;
 import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.http.AppException;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
 import org.opengroup.osdu.register.action.model.Action;
 import org.opengroup.osdu.register.provider.aws.config.AwsServiceConfig;
+import org.opengroup.osdu.register.provider.aws.util.DocUtil;
 import org.opengroup.osdu.register.provider.interfaces.action.IActionRepo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
@@ -48,6 +51,10 @@ public class AwsActionRepo implements IActionRepo {
 
     private DynamoDBQueryHelper queryHelper;
 
+    @Autowired
+    DocUtil docUtil;
+
+
     @PostConstruct
     public void init() {
             queryHelper = new DynamoDBQueryHelper(serviceConfig.getDynamoDbEndpoint(),
@@ -91,39 +98,42 @@ public class AwsActionRepo implements IActionRepo {
         ActionDoc doc = ActionDoc.mapFrom(action, dpsHeaders.getPartitionId());
 
         try {
-            queryHelper.save(doc);
+            queryHelper.saveWithHashCondition(doc,docUtil.getHashKey());
         }
-        catch (AppException e) {
-            if(e.getError().getCode() == 409) {
-                logger.error(String.format("An action already exists with the id: %s", action.getId()));
-                throw new AppException(409, "Conflict", String.format("An action already exists with the id: %s", action.getId()));
-            }
-            else {
-                logger.error(e.getMessage());
-                throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
-            }
+        catch(ConditionalCheckFailedException e){
+            logger.error(String.format("An action already exists with the id: %s", action.getId()));
+            throw new AppException(409, "Conflict", String.format("An action already exists with the id: %s", action.getId()));
         }
+        catch(AppException e)
+        {
+            throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
+        }
+
         return action;
     }
 
+
     @Override
     public boolean delete(String id) {
-        try {
-            queryHelper.deleteByPrimaryKey(ActionDoc.class, id);
-        }catch (AppException e) {
-            if(e.getError().getCode() == 404) {
-                logger.error(String.format("Action with id %s does not exist.", id));
-            }
-            else {
-                logger.error(e.getMessage());
-                throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
-            }
-            return false;
-        }
-        return true;
+    try{
+        ActionDoc objectTodelete = new ActionDoc();
+        objectTodelete.setId(id);
+        DynamoDBDeleteExpression deleteExpression = new DynamoDBDeleteExpression()
+                .withConditionExpression("attribute_exists(id)");
+        queryHelper.deleteByObjectWithCondition(objectTodelete,deleteExpression);
 
     }
+    catch(ConditionalCheckFailedException e){
+        logger.error(String.format("Failed to delete: %s Object does not exist",id));
+        throw new AppException(404, "ObjectNotFound", String.format("The Action you are trying to delete: %s does not exist", id));
+    }
+    catch(AppException e)
+    {
+        throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
+    }
+    return true;
 
+    }
     @Override
     public Action get(String id){
         ActionDoc doc = queryHelper.loadByPrimaryKey(ActionDoc.class, id);
@@ -136,4 +146,5 @@ public class AwsActionRepo implements IActionRepo {
     }
 
 
+
 }
diff --git a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/config/AwsServiceConfig.java b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/config/AwsServiceConfig.java
index 1712a037d84e832d7d20bf45849f97cc41487e20..4e93fb0f11bd2b7eb075adde24da70746c1abd1d 100644
--- a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/config/AwsServiceConfig.java
+++ b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/config/AwsServiceConfig.java
@@ -14,11 +14,15 @@
 
 package org.opengroup.osdu.register.provider.aws.config;
 
+import com.amazonaws.services.kms.AWSKMS;
+import com.amazonaws.services.sns.AmazonSNS;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
+import org.opengroup.osdu.core.aws.sns.AmazonSNSConfig;
 import org.opengroup.osdu.core.aws.ssm.ParameterStorePropertySource;
 import org.opengroup.osdu.core.aws.ssm.SSMConfig;
+import org.opengroup.osdu.register.provider.aws.subscriber.KmsConfig;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
@@ -49,22 +53,6 @@ public class AwsServiceConfig {
   @Setter(AccessLevel.PROTECTED)
   public Boolean ssmEnabled;
 
-
-  @Value("${aws.register.sns.topic.arn}")
-  @Getter()
-  private String snsTopicArn;
-
-
-  /*@Value("${aws.register.kms.key.arn}")
-  @Getter()
-  private String kmsKeyArn;*/
-
-  @Value("${aws.register.kms.key.id}")
-  @Getter()
-  @Setter(AccessLevel.PROTECTED)
-  private String kmsKeyId;
-
-
   @Value("${aws.kms.endpoint}")
   @Getter()
   @Setter(AccessLevel.PROTECTED)
@@ -76,25 +64,37 @@ public class AwsServiceConfig {
   @Setter(AccessLevel.PROTECTED)
   public String environment;
 
+  @Getter()
+  public String kmsKeyId;
 
-  /*@Inject
-  protected JaxRsDpsLog logger;*/
+  @Getter()
+  public String snsTopicArn;
+
+  @Getter()
+  public AWSKMS kmsClient;
+
+  @Getter()
+  public AmazonSNS snsClient;
 
   @PostConstruct
   public void init() {
     if (ssmEnabled) {
-      //Can be used to retrieve ssm parameters
-      SSMConfig ssmConfig = new SSMConfig();
-      ParameterStorePropertySource ssm = ssmConfig.amazonSSM();
-      String keyssmparameter = "/osdu/" + environment + "/register/register-kms-key-id";
       try {
+        //Can be used to retrieve ssm parameters
+        SSMConfig ssmConfig = new SSMConfig();
+        ParameterStorePropertySource ssm = ssmConfig.amazonSSM();
+        String keyssmparameter = "/osdu/" + environment + "/register/register-kms-key-id";
+        String snstopicArnParameter = "/osdu/" + environment + "/register/register-sns-topic-arn";
         kmsKeyId = ssm.getProperty(keyssmparameter).toString();
+        snsTopicArn=ssm.getProperty(snstopicArnParameter).toString();
+        AmazonSNSConfig snsConfig = new AmazonSNSConfig(amazonRegion);
+        snsClient = snsConfig.AmazonSNS();
+        KmsConfig kmsConfig = new KmsConfig(kmsEndpoint, amazonRegion);
+        kmsClient = kmsConfig.awsKMS();
       } catch (Exception e) {
-
-        System.out.println(String.format("SSM property %s not found", keyssmparameter));
-      }
-
-
+        System.out.println("SSM property not found");
+        System.out.println("Error while initializing AwsServiceConfig"+e.getMessage());
+     }
     }
   }
 
diff --git a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/ddms/AwsDdmsRepo.java b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/ddms/AwsDdmsRepo.java
index a8004860d5fadf7b1dbddb00066e41a54bdc5511..e9ccd8d3a8c2fa10db51ca35791c2587945a1858 100644
--- a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/ddms/AwsDdmsRepo.java
+++ b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/ddms/AwsDdmsRepo.java
@@ -14,7 +14,9 @@
 package org.opengroup.osdu.register.provider.aws.ddms;
 
 
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDeleteExpression;
 import com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList;
+import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException;
 import org.opengroup.osdu.core.aws.dynamodb.DynamoDBQueryHelper;
 import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.http.AppException;
@@ -47,7 +49,10 @@ public class AwsDdmsRepo implements IDdmsRepository {
 
     private DynamoDBQueryHelper queryHelper;
 
-    DocUtil docUtil = new DocUtil();
+
+    @Autowired
+    DocUtil docUtil;
+
 
     @PostConstruct
     public void init() {
@@ -61,17 +66,16 @@ public class AwsDdmsRepo implements IDdmsRepository {
     public Ddms create(Ddms ddms) {
         DdmsDoc doc = DdmsDoc.mapFrom(ddms, dpsHeaders.getPartitionId());
         try {
-            queryHelper.save(doc);
+
+            queryHelper.saveWithHashCondition(doc,docUtil.getHashKey());
+        }
+        catch(ConditionalCheckFailedException e){
+            logger.error(String.format("An DDMS already exists with the id: %s", ddms.getId()));
+            throw new AppException(409, "Conflict", String.format("An DDMS already exists with the id: %s", ddms.getId()));
         }
-        catch (AppException e) {
-            if(e.getError().getCode() == 409) {
-                logger.error(String.format("A DDMS already exists with the same id: %s", ddms.getId()));
-                throw new AppException(409, "Conflict", String.format("A DDMS already exists with the same id: %s", ddms.getId()));
-            }
-            else {
-                logger.error(e.getMessage());
-                throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
-            }
+        catch(AppException e)
+        {
+            throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
         }
 
         return ddms;
@@ -105,20 +109,26 @@ public class AwsDdmsRepo implements IDdmsRepository {
     }
 
     @Override
-    public boolean delete(String id){
-        try {
-            queryHelper.deleteByPrimaryKey(DdmsDoc.class, id);
-        }catch (AppException e) {
-            if(e.getError().getCode() == 404) {
-                logger.error(String.format("Ddms with id %s does not exist.", id));
-            }
-            else {
-                logger.error(e.getMessage());
-                throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
-            }
-            return false;
+    public boolean delete(String id) {
+        try{
+            DdmsDoc objectTodelete = new DdmsDoc();
+            objectTodelete.setId(id);
+            DynamoDBDeleteExpression deleteExpression = new DynamoDBDeleteExpression()
+                    .withConditionExpression("attribute_exists(id)");
+            queryHelper.deleteByObjectWithCondition(objectTodelete,deleteExpression);
+
+        }
+        catch(ConditionalCheckFailedException e){
+            logger.error(String.format("Failed to delete: %s Object does not exist",id));
+            throw new AppException(404, "ObjectNotFound", String.format("The Ddms you are trying to delete: %s does not exist", id));
+        }
+        catch(AppException e)
+        {
+            throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
         }
         return true;
 
     }
+
+
 }
diff --git a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/ddms/DdmsDoc.java b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/ddms/DdmsDoc.java
index 5cfdefece451f017b242b94972d169e7720271e4..b2ec1e50a41713ca268036131fe4de4dea3b58dd 100644
--- a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/ddms/DdmsDoc.java
+++ b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/ddms/DdmsDoc.java
@@ -45,7 +45,7 @@ public class DdmsDoc {
     private String contactEmail;
 
     @DynamoDBAttribute(attributeName = "createdDateTimeEpoch")
-    private Timestamp createdDateTimeEpoch;
+    private String createdDateTimeEpoch;
 
     @DynamoDBAttribute(attributeName = "dataPartitionId")
     private String dataPartitionId;
@@ -89,7 +89,7 @@ public class DdmsDoc {
                 .name(ddms.getName())
                 .description(ddms.getDescription())
                 .contactEmail(ddms.getContactEmail())
-                .createdDateTimeEpoch(new Timestamp(System.currentTimeMillis()))
+                .createdDateTimeEpoch((new Timestamp(System.currentTimeMillis())).toString())
                 .interfaces(ddms.getInterfaces())
                 .dataPartitionId(dataPartitionId)
                 .partitionIdEntityType(String.format("%s:%s",dataPartitionId,getEntityType(ddms)));
@@ -104,8 +104,9 @@ public class DdmsDoc {
         ddms.setName(ddmsDoc.getName());
         ddms.setDescription(ddmsDoc.getDescription());
         ddms.setContactEmail(ddmsDoc.getContactEmail());
-        ddms.setCreatedDateTimeEpoch(com.google.cloud.Timestamp.of(ddmsDoc.getCreatedDateTimeEpoch()));
-       // ddms.setInterfaces(ddmsDoc.getInterfaces().stream().map(DdmsDoc::getRegisteredInterface).collect(Collectors.toSet()));
+        Timestamp sqlTimestamp = Timestamp.valueOf(ddmsDoc.getCreatedDateTimeEpoch());
+        com.google.cloud.Timestamp t = com.google.cloud.Timestamp.of(sqlTimestamp);
+        ddms.setCreatedDateTimeEpoch(t);
         ddms.setInterfaces(ddmsDoc.getInterfaces());
         return ddms;
     }
@@ -129,7 +130,6 @@ public class DdmsDoc {
     private static String getEntityType(Ddms ddms){
 
         String entityType="";
-
         //get the first element from the set
         RegisteredInterface ri = ddms.getInterfaces().iterator().next();
         if(ri!=null) {
diff --git a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/pushApi/AwsSubscriberTestListenerApi.java b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/pushApi/AwsSubscriberTestListenerApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..81bb6a860267ed53f266484fa3359cfb776bf3d1
--- /dev/null
+++ b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/pushApi/AwsSubscriberTestListenerApi.java
@@ -0,0 +1,147 @@
+// 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.register.provider.aws.pushApi;
+
+import com.amazonaws.services.sns.message.*;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.jackson2.JacksonFactory;
+import com.google.common.base.Strings;
+import com.google.common.hash.Hashing;
+import org.opengroup.osdu.core.common.cryptographic.ISignatureService;
+import org.opengroup.osdu.core.common.cryptographic.SignatureServiceException;
+import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
+import org.opengroup.osdu.core.common.model.http.DpsHeaders;
+import org.opengroup.osdu.register.utils.AppServiceConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.context.annotation.RequestScope;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotBlank;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.Collections;
+
+//used  by integration test to validate challenge response logic and confirm subscription
+@RestController
+@RequestMapping("/awstest")
+@RequestScope
+@Validated
+public class AwsSubscriberTestListenerApi {
+
+    @Autowired
+    private AppServiceConfig serviceConfig;
+    @Autowired
+    private ISignatureService signatureService;
+    @Autowired
+    private JaxRsDpsLog logger;
+    @Inject
+    private javax.inject.Provider<DpsHeaders> headersProvider;
+
+    private final SnsMessageManager messageParser = new SnsMessageManager();
+
+
+    @GetMapping("/aws/challenge/{count}")
+    public ResponseEntity<?> testCrc(@RequestParam("crc") @NotBlank String crc, @RequestParam("hmac") @NotBlank String hmac) {
+        try {
+            signatureService.verifyHmacSignature(hmac, this.serviceConfig.getSubscriberSecret());
+        } catch (SignatureServiceException e) {
+            return new ResponseEntity<>("Authorization signature validation Failed", HttpStatus.BAD_REQUEST);
+        }
+        logger.info("Signature verified and sending response");
+        // Use the secret you send to the subscriber registration create request
+        return getResponse(crc, this.serviceConfig.getSubscriberSecret());
+    }
+
+    @PostMapping("/aws/challenge/{count}")
+    public void process(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException {
+        messageParser.handleMessage(httpRequest.getInputStream(), new DefaultSnsMessageHandler() {
+            @Override
+            public void handle(SnsNotification snsNotification) {
+                // If the subject is "unsubscribe" then unsubscribe from this topic
+                if (snsNotification.getSubject().equalsIgnoreCase("unsubscribe")) {
+                    snsNotification.unsubscribeFromTopic();
+                } else {
+                    // Otherwise process the message
+                    System.out.printf("Received message %n"
+                                    + "Subject=%s %n"
+                                    + "Message = %s %n",
+                            snsNotification.getSubject(), snsNotification.getMessage());
+                }
+            }
+
+            @Override
+            public void handle(SnsUnsubscribeConfirmation message) {
+                logger.info("Received unsubscribe confirmation.");
+            }
+
+            @Override
+            public void handle(SnsSubscriptionConfirmation message) {
+                super.handle(message);
+                logger.info("Received subscription confirmation.");
+            }
+        });
+    }
+
+
+    @PostMapping("challenge/{count}")
+    public ResponseEntity testPushHmac(@RequestBody Object o, @RequestParam("hmac") String hmac) {
+        try {
+            signatureService.verifyHmacSignature(hmac, this.serviceConfig.getSubscriberSecret());
+        } catch (SignatureServiceException e) {
+            return new ResponseEntity<>("Authorization signature validation Failed", HttpStatus.BAD_REQUEST);
+        }
+        logger.info("Sending acknowledgement from hmac endpoint");
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+
+     class ChallengeResponse {
+        public String responseHash = "";
+    }
+
+    private boolean verifyToken() {
+        DpsHeaders headers = headersProvider.get();
+        if (Strings.isNullOrEmpty(headers.getAuthorization()))
+            return true;
+
+        try {
+            GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance())
+                    .setAudience(Collections.singletonList(this.serviceConfig.getIntegrationTestJwtAudiences()))
+                    .build();
+            GoogleIdToken idToken = verifier.verify(headers.getAuthorization());
+            return idToken != null;
+        } catch (Exception ex) {
+            return false;
+        }
+    }
+
+    private ResponseEntity<ChallengeResponse> getResponse(String crc, String secretString) {
+        String response = secretString + crc;
+        response = Hashing.sha256()
+                .hashString(response, StandardCharsets.UTF_8)
+                .toString();
+        response = Base64.getEncoder().encodeToString(response.getBytes());
+        ChallengeResponse cr = new ChallengeResponse();
+        cr.responseHash = response;
+        return new ResponseEntity<>(cr, HttpStatus.OK);
+    }
+}
diff --git a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/AwsSubscriptionRepo.java b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/AwsSubscriptionRepo.java
index 0bf6fdaa01a8ce8611a8b689bc40a3ffb9b3895a..a06e78078541c682f6d1b664b274668615c92287 100644
--- a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/AwsSubscriptionRepo.java
+++ b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/AwsSubscriptionRepo.java
@@ -13,15 +13,20 @@
 // limitations under the License.
 package org.opengroup.osdu.register.provider.aws.subscriber;
 
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDeleteExpression;
 import com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList;
 import com.amazonaws.services.dynamodbv2.model.AttributeValue;
+import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException;
+import com.amazonaws.services.sns.AmazonSNS;
 import com.google.cloud.Timestamp;
 import org.opengroup.osdu.core.aws.dynamodb.DynamoDBQueryHelper;
+import org.opengroup.osdu.core.aws.sns.AmazonSNSConfig;
 import org.opengroup.osdu.core.aws.ssm.ParameterStorePropertySource;
 import org.opengroup.osdu.core.aws.ssm.SSMConfig;
 import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.http.AppException;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
+import org.opengroup.osdu.register.provider.aws.action.ActionDoc;
 import org.opengroup.osdu.register.provider.aws.config.AwsServiceConfig;
 import org.opengroup.osdu.register.provider.aws.util.DocUtil;
 import org.opengroup.osdu.register.provider.interfaces.subscriber.ISubscriptionRepository;
@@ -32,6 +37,7 @@ import org.springframework.stereotype.Repository;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
+import java.nio.ByteBuffer;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -54,19 +60,21 @@ public class AwsSubscriptionRepo implements ISubscriptionRepository {
     private AwsServiceConfig serviceConfig;
 
 
-    private String amazonSNSTopicArn;
+    private String amazonSNSTopicArn_records_changed;
 
     private  SSMConfig ssmConfig;
 
     private   ParameterStorePropertySource ssm;
 
-
+    @Autowired
     private SubscriptionHelper snsHelper;
 
-
+    @Autowired
     private KmsHelper kmsHelper;
 
-    DocUtil docUtil = new DocUtil();
+
+    @Autowired
+    DocUtil docUtil;
 
     @PostConstruct
     public void init() {
@@ -74,44 +82,28 @@ public class AwsSubscriptionRepo implements ISubscriptionRepository {
         queryHelper = new DynamoDBQueryHelper(serviceConfig.getDynamoDbEndpoint(),
                 serviceConfig.getAmazonRegion(),
                 serviceConfig.getDynamoDbTablePrefix());
+        amazonSNSTopicArn_records_changed=serviceConfig.getSnsTopicArn();
     }
 
     @Override
     public Subscription create(Subscription s) throws Exception {
 
 
-        //amazonSNSTopicArn = ssm.getProperty(serviceConfig.getSnsTopicArn()).toString();
-        //temporarily hardcodimng the topic name until TopicRepository is sorted out
-        amazonSNSTopicArn = "aws-topic-name";
-
-        //We create the SNS subscription first so that it's ARN can be stored in DynamoDB
-
-        //There is no way in aws java sdk to look up sns topic arn by name. So we call createTopic,
-        // if it exists, it returns the arn without creating the topic
-        //CreateTopicResult createRes = sns.createTopic("HelloTopic");
-        //We might want to create a separate table for Topic -- TopicArn
-
-        // For now retrieving the single topic created by cloudformation. This miht change in the future if
-        //multiple topics are created using Topics APIS.
-        //See Gitlab issue:https://community.opengroup.org/osdu/platform/system/register/-/issues/14
-
-
-        String subscriptionArn = snsHelper.createPushSubscription(amazonSNSTopicArn);
-        String encryptedSecretValue = kmsHelper.encrypt(s.getSecret().toString());
+        String pushEndPoint = s.getPushEndpoint();
+        String subscriptionArn = snsHelper.createPushSubscription(amazonSNSTopicArn_records_changed,pushEndPoint);
+        ByteBuffer encryptedSecretValue = kmsHelper.encrypt(s.getSecret().toString());
         SubscriptionDoc doc = SubscriptionDoc.mapFrom(s, dpsHeaders.getPartitionId(),subscriptionArn,encryptedSecretValue);
 
         try {
-            queryHelper.save(doc);
+            queryHelper.saveWithHashCondition(doc,docUtil.getHashKey());
         }
-        catch (AppException e) {
-            if(e.getError().getCode() == 409) {
-                logger.error(String.format("A subscription already exists with the id: %s", s.getId()));
-                throw new AppException(409, "Conflict", String.format("A subscription already exists with the id: %s", s.getId()));
-            }
-            else {
-                logger.error(e.getMessage());
-                throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
-            }
+        catch(ConditionalCheckFailedException e){
+            logger.error(String.format("A subscription already exists with the id: %s", s.getId()));
+            throw new AppException(409, "Conflict", String.format("A subscription  already exists with the id: %s", s.getId()));
+        }
+        catch(AppException e)
+        {
+            throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
         }
         return s;
 
@@ -153,25 +145,34 @@ public class AwsSubscriptionRepo implements ISubscriptionRepository {
         String snsSubscriptionArn="";
 
         try {
+            //Need this to retrieve the subscription Arn
              doc = queryHelper.loadByPrimaryKey(SubscriptionDoc.class, id);
-             snsSubscriptionArn = doc.getSnssubscriptionArn();
-             queryHelper.deleteByPrimaryKey(SubscriptionDoc.class, id);
-        }
-        catch(AppException e)
-        {
-            if(e.getError().getCode() == 404) {
-                logger.error("Could not find subscription with Id %s for delete operation", id);
-                throw e;
+            if (doc == null) {
+                logger.error(String.format("Subscription with id %s does not exist.", id));
+                throw new AppException(404, "Not found", String.format("Subscription with id %s does not exist.", id));
             }
             else {
-                logger.error("Error while deleting subscription with Id %s ", id);
-                logger.error(e.getMessage());
-                throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
+                snsSubscriptionArn = doc.getSnssubscriptionArn();
+               // queryHelper.deleteByPrimaryKey(SubscriptionDoc.class, id);
+                SubscriptionDoc objectTodelete = new SubscriptionDoc();
+                objectTodelete.setId(id);
+                DynamoDBDeleteExpression deleteExpression = new DynamoDBDeleteExpression()
+                        .withConditionExpression("attribute_exists(id)");
+                queryHelper.deleteByObjectWithCondition(objectTodelete,deleteExpression);
             }
         }
+        catch(ConditionalCheckFailedException e){
+            logger.error(String.format("Failed to delete: %s Object does not exist",id));
+            throw new AppException(404, "ObjectNotFound", String.format("The Subscription you are trying to delete: %s does not exist", id));
+        }
+        catch(AppException e)
+        {
+            throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
+        }
 
 
         //delete the SNS subscription
+        //this will throw 404 if SNS Subscription not found
         snsHelper.deletePushSubscription(snsSubscriptionArn);
         return true;
 
@@ -229,9 +230,7 @@ public class AwsSubscriptionRepo implements ISubscriptionRepository {
             String msg="Error while getting ALL subscriptions";
             throw new AppException(e.getError().getCode(), e.getError().getReason(), msg);
         }
-       // List<Subscription> subsList = results.stream().map(SubscriptionDoc::mapTo).collect(Collectors.toList());
 
-        //Alternative implementation
         List<Subscription> subsList = new ArrayList<Subscription>();
         for (SubscriptionDoc subsDoc : results){
             String secretValue = kmsHelper.decrypt(subsDoc.getSecretValue());
@@ -243,5 +242,4 @@ public class AwsSubscriptionRepo implements ISubscriptionRepository {
         return subsList;
     }
 
-
 }
diff --git a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/KmsHelper.java b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/KmsHelper.java
index 80ff6cb26401015bdcba946a06303ca1b063716c..297adbae86f0c1fa384997ef96464dd724abc992 100644
--- a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/KmsHelper.java
+++ b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/KmsHelper.java
@@ -16,7 +16,9 @@ package org.opengroup.osdu.register.provider.aws.subscriber;
 
 
 import com.amazonaws.services.kms.model.DecryptRequest;
+import com.amazonaws.services.kms.model.DecryptResult;
 import com.amazonaws.services.kms.model.EncryptRequest;
+import com.amazonaws.services.kms.model.EncryptResult;
 import org.opengroup.osdu.core.aws.dynamodb.DynamoDBQueryHelper;
 import org.opengroup.osdu.core.aws.ssm.ParameterStorePropertySource;
 import org.opengroup.osdu.core.aws.ssm.SSMConfig;
@@ -26,11 +28,16 @@ import org.opengroup.osdu.register.provider.aws.config.AwsServiceConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.amazonaws.services.kms.*;
 import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.Base64Utils;
 
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
+import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
 import java.util.Collections;
 
 @Component
@@ -42,7 +49,7 @@ public class KmsHelper {
     @Autowired
     private JaxRsDpsLog logger;
 
-    private DynamoDBQueryHelper queryHelper;
+
 
     @Inject
     private AwsServiceConfig serviceConfig;
@@ -51,63 +58,40 @@ public class KmsHelper {
 
     private String kmsKeyId;
 
-    @PostConstruct
-    public void init() {
-        queryHelper = new DynamoDBQueryHelper(serviceConfig.getDynamoDbEndpoint(),
-                serviceConfig.getAmazonRegion(),
-                serviceConfig.getDynamoDbTablePrefix());
 
 
+    @PostConstruct
+    public void init() {
 
+        kmsClient = serviceConfig.getKmsClient();
+        kmsKeyId=serviceConfig.getKmsKeyId();
 
 
     }
 
-    public String encrypt(String plaintext){
-
-        //this needs to go in init
-        /*SSMConfig ssmConfig = new SSMConfig();
-        ParameterStorePropertySource ssm = ssmConfig.amazonSSM();*/
-        //kmsKeyId = ssm.getProperty(serviceConfig.getKmsKeyId()).toString();
 
-        kmsKeyId =serviceConfig.getKmsKeyId();
 
-        KmsConfig config = new KmsConfig(serviceConfig.getKmsEndpoint(), serviceConfig.getAmazonRegion() );
-        kmsClient = config.awsKMS();
-
-        //DataPartitionId used as encryption context? Adds some level of security per tenant. That is the only info we get through the headers.. no emailid of
-        //user available for higher security
-        //see https://aws.amazon.com/blogs/security/how-to-protect-the-integrity-of-your-encrypted-data-by-using-aws-key-management-service-and-encryptioncontext/
+   public ByteBuffer encrypt(String plainTextString) {
 
 
         EncryptRequest encReq = new EncryptRequest();
         encReq.setKeyId(kmsKeyId);
-        encReq.setPlaintext(ByteBuffer.wrap(plaintext.getBytes()));
+        encReq.setPlaintext(ByteBuffer.wrap(plainTextString.getBytes()));
         encReq.setEncryptionContext(Collections.singletonMap("dataPartitionId", dpsHeaders.getPartitionId()));
         ByteBuffer ciphertext = kmsClient.encrypt(encReq).getCiphertextBlob();
-        return new String(ciphertext.array());
-    }
-
-    public String decrypt(String ciphertext){
+        return ciphertext;
 
-        //this needs to go in init
-        /*SSMConfig ssmConfig = new SSMConfig();
-        ParameterStorePropertySource ssm = ssmConfig.amazonSSM();
-        kmsKeyId = ssm.getProperty(serviceConfig.getKmsKeyId()).toString();*/
 
-        kmsKeyId =serviceConfig.getKmsKeyId();
 
-        KmsConfig config = new KmsConfig(serviceConfig.getKmsEndpoint(), serviceConfig.getAmazonRegion() );
-        kmsClient = config.awsKMS();
+    }
+    public String decrypt(ByteBuffer ciphertext) {
 
-        //DataPartitionId used as encryption context? Adds some level of security per tenant. That is the only info we get through the headers.. no emailid of
-        //user available for higher security
-        //see https://aws.amazon.com/blogs/security/how-to-protect-the-integrity-of-your-encrypted-data-by-using-aws-key-management-service-and-encryptioncontext/
         DecryptRequest decReq = new DecryptRequest();
-        ByteBuffer b = ByteBuffer.wrap(ciphertext.getBytes());
-        decReq.setCiphertextBlob(b);
+
+        decReq.setCiphertextBlob(ciphertext);
         decReq.setEncryptionContext(Collections.singletonMap("dataPartitionId", dpsHeaders.getPartitionId()));
         ByteBuffer decrypted = kmsClient.decrypt(decReq).getPlaintext();
+
         String decryptedStr = new String(decrypted.array());
         return decryptedStr;
     }
diff --git a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/SubscriptionDoc.java b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/SubscriptionDoc.java
index b8da455bb1f50f39fb84f98aa21b0eb4fe9703f5..63da8707cc021dc1b0e80862cd933d3248dfec57 100644
--- a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/SubscriptionDoc.java
+++ b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/SubscriptionDoc.java
@@ -22,6 +22,8 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.opengroup.osdu.register.subscriber.model.*;
+
+import java.nio.ByteBuffer;
 import java.sql.Timestamp;
 
 @Data
@@ -51,7 +53,7 @@ public class SubscriptionDoc {
     private String createdBy;
 
     @DynamoDBAttribute(attributeName = "createdOnEpoch")
-    private Timestamp createdOnEpoch;
+    private String createdOnEpoch;
 
     @DynamoDBAttribute(attributeName = "notificationId")
     private String notificationId;
@@ -59,8 +61,11 @@ public class SubscriptionDoc {
     @DynamoDBAttribute(attributeName = "secretType")
     private String secretType;
 
+  /*  @DynamoDBAttribute(attributeName = "secretValue")
+    private String secretValue;*/
+
     @DynamoDBAttribute(attributeName = "secretValue")
-    private String secretValue;
+    private ByteBuffer secretValue;
 
     @DynamoDBAttribute(attributeName = "dataPartitionId")
     private String dataPartitionId;
@@ -74,7 +79,7 @@ public class SubscriptionDoc {
 
 
 
-    public  static SubscriptionDoc mapFrom(Subscription sub, String dataPartitionId,String snssubscriptionArn, String encryptedSecretValue) {
+    public  static SubscriptionDoc mapFrom(Subscription sub, String dataPartitionId,String snssubscriptionArn, ByteBuffer encryptedSecretValue) {
 
 
         SubscriptionDocBuilder subDocBuilder = new SubscriptionDoc().builder()
@@ -84,9 +89,10 @@ public class SubscriptionDoc {
                 .topic(sub.getTopic())
                 .pushEndpoint(sub.getPushEndpoint())
                 .createdBy(sub.getCreatedBy())
-                .createdOnEpoch(new Timestamp(System.currentTimeMillis()))
+                .createdOnEpoch((new Timestamp(System.currentTimeMillis())).toString())
                 .notificationId(sub.getNotificationId())
                 .secretType(sub.getSecret().getSecretType())
+                //.secretValue(encryptedSecretValue)
                 .secretValue(encryptedSecretValue)
                 .dataPartitionId(dataPartitionId)
                 .snssubscriptionArn(snssubscriptionArn)
@@ -105,7 +111,10 @@ public class SubscriptionDoc {
                 sub.setTopic(subDoc.getTopic());
                 sub.setPushEndpoint(subDoc.getPushEndpoint());
                 sub.setCreatedBy(subDoc.getCreatedBy());
-                sub.setCreatedOnEpoch( com.google.cloud.Timestamp.of(subDoc.getCreatedOnEpoch()));
+                Timestamp sqlTimestamp = Timestamp.valueOf(subDoc.getCreatedOnEpoch());
+                com.google.cloud.Timestamp t = com.google.cloud.Timestamp.of(sqlTimestamp);
+                sub.setCreatedOnEpoch(t);
+                //sub.setCreatedOnEpoch( com.google.cloud.Timestamp.of(subDoc.getCreatedOnEpoch()));
                 sub.setNotificationId(subDoc.getNotificationId());
                 sub.setSecret(secret);
 
diff --git a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/SubscriptionHelper.java b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/SubscriptionHelper.java
index 3cdbaef76a3a4b5825bbd461945fbbd0537d9062..e374d35ff61fd39f60c489d93d52e51f8eb2bfe6 100644
--- a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/SubscriptionHelper.java
+++ b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/subscriber/SubscriptionHelper.java
@@ -14,6 +14,7 @@
 
 package org.opengroup.osdu.register.provider.aws.subscriber;
 
+import com.amazonaws.services.kms.AWSKMS;
 import com.amazonaws.services.sns.AmazonSNS;
 import com.amazonaws.services.sns.model.*;
 import org.opengroup.osdu.core.aws.sns.AmazonSNSConfig;
@@ -25,6 +26,7 @@ import org.opengroup.osdu.register.provider.aws.config.AwsServiceConfig;
 import org.opengroup.osdu.register.utils.AppServiceConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
@@ -33,52 +35,53 @@ import java.util.List;
 @Component
 public class SubscriptionHelper {
 
-    private AmazonSNS snsClient;
+
+
 
     private ParameterStorePropertySource ssm;
 
-    private String amazonSNSTopicArn;
+    @Inject
+    private JaxRsDpsLog logger;
+
+
 
-    @Autowired
-    private AppServiceConfig serviceConfig;
 
     @Inject
-    private AwsServiceConfig awsServiceConfig;
+    private AwsServiceConfig serviceConfig;
 
-    @Autowired
-    private JaxRsDpsLog logger;
+
+    private AmazonSNS snsClient;
 
     @PostConstruct
     public void init(){
-        AmazonSNSConfig config = new AmazonSNSConfig(awsServiceConfig.getAmazonRegion());
-        snsClient = config.AmazonSNS();
+
+        snsClient = serviceConfig.getSnsClient();
 
 
     }
 
-    public String  createPushSubscription(String topicArn) {
-        //There is no way in aws java sdk to look up sns topic arn by name. So we call createTopic,
-        // if it exists, it returns the arn without creating the topic
-        //CreateTopicResult createRes = sns.createTopic("HelloTopic");
+    public String  createPushSubscription(String topicArn,String pushEndpoint) {
+        //There is no way in aws java sdk to look up sns topic arn by name.
         //We might want to create a separate table for Topic -- TopicArn
-
-        // For now retrieving the single topic created by cloudformation. This miht change in the future if
+        // For now retrieving the single topic created by cloudformation. This might change in the future if
         //multiple topics are created using Topics APIS.
         //See Gitlab issue:https://community.opengroup.org/osdu/platform/system/register/-/issues/14
-       /* SSMConfig ssmConfig = new SSMConfig();
-        ParameterStorePropertySource ssm = ssmConfig.amazonSSM();
-        amazonSNSTopicArn = ssm.getProperty(AwsServiceConfig.getSnsTopicArn()).toString();
-*/
-        String pushEndpoint = serviceConfig.getRecordsChangePubsubEndpoint();
+
+
         try {
-            SubscribeRequest subscribeRequest = new SubscribeRequest(amazonSNSTopicArn, "https", pushEndpoint);
+            String env = System.getProperty("ENVIRONMENT", System.getenv("ENVIRONMENT"));
+            String pushUrlprotocol="https";
+            if(env.equalsIgnoreCase("LOCAL")) { // need http for local testing..
+                pushUrlprotocol="http";
+            }
+            SubscribeRequest subscribeRequest = new SubscribeRequest(topicArn, pushUrlprotocol, pushEndpoint);
             subscribeRequest.setReturnSubscriptionArn(true);
             SubscribeResult subscriptionResult = snsClient.subscribe(subscribeRequest);
             String subscriptionArn = subscriptionResult.getSubscriptionArn();
             return subscriptionArn;
         }
         catch(Exception e){
-            logger.error("Create subscription failed for topic name"+topicArn );
+           logger.error("Create subscription failed for topic name"+topicArn);
             throw e;
         }
 
@@ -89,9 +92,16 @@ public class SubscriptionHelper {
         UnsubscribeRequest unsubscribeRequest = new UnsubscribeRequest(subscriptionArn);
         try {
             UnsubscribeResult unSubscribeResult = snsClient.unsubscribe(unsubscribeRequest);
-        }catch(Exception e)
+        }catch(AppException e)
         {
-            throw new AppException(500, "Server Error", "Error deleting SNS subscription");
+            if (e.getError().getCode() == 404) {
+                logger.error(String.format("Subscription with ARN %s does not exist.", subscriptionArn));
+                throw new AppException(404, "Not found", String.format("Subscription with ARN %s does not exist.", subscriptionArn));
+            }else {
+                logger.error(e.getMessage());
+                throw new AppException(e.getError().getCode(), e.getError().getReason(), e.getMessage());
+            }
+
         }
 
 
@@ -99,9 +109,7 @@ public class SubscriptionHelper {
 
     public boolean  doesSubscriptionExist(String subscriptionArn, String topicName) {
 
-        //There is no way in aws java sdk to look up sns topic arn by name. So we call createTopic,
-        // if it exists, it returns the arn without creating the topic
-        //CreateTopicResult createRes = sns.createTopic("HelloTopic");
+        //There is no way in aws java sdk to look up sns topic arn by name.
         //We might want to create a separate table for Topic -- TopicArn
 
         // For now retrieving the single topic created by cloudformation. This miht change in the future if
@@ -109,8 +117,8 @@ public class SubscriptionHelper {
         //See Gitlab issue:https://community.opengroup.org/osdu/platform/system/register/-/issues/14
         SSMConfig ssmConfig = new SSMConfig();
         ParameterStorePropertySource ssm = ssmConfig.amazonSSM();
-        amazonSNSTopicArn = ssm.getProperty(awsServiceConfig.getSnsTopicArn()).toString();
-
+       // amazonSNSTopicArn = ssm.getProperty(awsServiceConfig.getSnsTopicArn()).toString();
+        String amazonSNSTopicArn = topicName;
         ListSubscriptionsByTopicRequest listSubsRequest = new ListSubscriptionsByTopicRequest(amazonSNSTopicArn);
         //only returns the first 100, for the next lot pass nextToken
 
diff --git a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/util/DocUtil.java b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/util/DocUtil.java
index cbb7c859aa4f9c2285701e4ce7e64486d4d27e70..166e742cbccb24c4f12e4665bff9dc2061ed1a1b 100644
--- a/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/util/DocUtil.java
+++ b/provider/register-aws/src/main/java/org/opengroup/osdu/register/provider/aws/util/DocUtil.java
@@ -23,14 +23,16 @@ import org.opengroup.osdu.register.provider.aws.subscriber.KmsHelper;
 import org.opengroup.osdu.register.provider.aws.subscriber.SubscriptionDoc;
 import org.opengroup.osdu.register.subscriber.model.*;
 import org.opengroup.osdu.register.utils.Constants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.List;
 
 
-
+@Component
 public class DocUtil {
-
+    @Autowired
     private KmsHelper kmsHelper;
 
     public List<Ddms> getDdmsList(DynamoDBQueryHelper queryHelper, DdmsDoc gsiQuery) {
@@ -74,4 +76,8 @@ public class DocUtil {
         return secret;
     }
 
+    public static String getHashKey() {
+        return "id";
+    }
+
 }
diff --git a/provider/register-aws/src/main/resources/application.properties b/provider/register-aws/src/main/resources/application.properties
index a5dc896557201a662aa866d7706b416848dd4463..b64f8e06ffa2befb015101ae3648f99cefe93faf 100644
--- a/provider/register-aws/src/main/resources/application.properties
+++ b/provider/register-aws/src/main/resources/application.properties
@@ -23,7 +23,8 @@ ACCEPT_HTTP=true
 ENTITLEMENTS_API=${ENTITLEMENTS_BASE_URL}/api/entitlements/v1
 ## AWS DynamoDB configuration
 
-aws.dynamodb.table.prefix=${ENVIRONMENT}-
+
+aws.dynamodb.table.prefix=${RESOURCE_PREFIX}-
 aws.dynamodb.endpoint=dynamodb.${AWS_REGION}.amazonaws.com
 aws.region=${AWS_REGION}
 
@@ -32,12 +33,12 @@ aws.kms.endpoint=kms.${AWS_REGION}.amazonaws.com
 
 
 aws.ssm=${SSM_ENABLED:True}
-aws.environment = ${ENVIRONMENT}
-aws.parameter.prefix=/osdu/${ENVIRONMENT}
-aws.register.sns.topic.arn=${aws.parameter.prefix}/register/register-sns-topic-arn
-aws.register.kms.key.id=${aws.parameter.prefix}/register/register-kms-key-id
-
+aws.environment=${RESOURCE_PREFIX}
+aws.parameter.prefix=/osdu/${RESOURCE_PREFIX}
+#aws.register.sns.topic.arn=${aws.parameter.prefix}/register/register-sns-topic-arn
+#aws.register.kms.key.id=${aws.parameter.prefix}/register/register-kms-key-id
 
+#aws.records.changes.topic.arn=${RECORDS_CHANGED_TOPIC_ARN}
 #logging configuration
 logging.transaction.enabled=true
 logging.slf4jlogger.enabled=true
diff --git a/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/action/AwsActionRepoTest.java b/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/action/AwsActionRepoTest.java
index 9907e10026fb58a904463c8bc72162adbb8e1dea..822ae75255e30be22dca567db110603d970bb909 100644
--- a/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/action/AwsActionRepoTest.java
+++ b/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/action/AwsActionRepoTest.java
@@ -15,6 +15,8 @@
 package org.opengroup.osdu.register.provider.aws.action;
 
 
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDeleteExpression;
+import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -64,7 +66,7 @@ public class AwsActionRepoTest {
     @Test
     public void createAction_success(){
         Action action = createMockAction();
-        Mockito.doNothing().when(dynamoDBQueryHelper).save(Mockito.any(ActionDoc.class));
+        Mockito.doNothing().when(dynamoDBQueryHelper).saveWithHashCondition(Mockito.any(ActionDoc.class),Mockito.anyString());
         Action resultAction = repo.createAction(action);
         assertEquals(action, resultAction);
 
@@ -87,7 +89,7 @@ public class AwsActionRepoTest {
     public void createAction_throw409_whenIdAlreadyExists(){
         Action action = createMockAction();
         AppException e = new AppException(409, "Conflict", String.format("An action already exists with the id: %s", action.getId()));
-        Mockito.doThrow(e).when(dynamoDBQueryHelper).save(Mockito.any(ActionDoc.class));
+        Mockito.doThrow(e).when(dynamoDBQueryHelper).saveWithHashCondition(Mockito.any(ActionDoc.class),Mockito.anyString());
 
         try {
             Action resultAction = repo.createAction(action);
@@ -98,8 +100,10 @@ public class AwsActionRepoTest {
 
     @Test
     public void deleteAction_success(){
+
+        Action action = createMockAction();
         String id = TestUtils.getAction_id();
-        Mockito.doNothing().when(dynamoDBQueryHelper).deleteByPrimaryKey(ActionDoc.class, id);
+        Mockito.doNothing().when(dynamoDBQueryHelper).deleteByObjectWithCondition(Mockito.any(ActionDoc.class),Mockito.any(DynamoDBDeleteExpression.class));
         Boolean result = repo.delete(id);
         assertEquals(result, true);
     }
@@ -107,14 +111,14 @@ public class AwsActionRepoTest {
     @Test
     public void deleteAction_throw404_whenIdoesNotExist(){
         String id = TestUtils.getAction_id();
-        AppException e = new AppException(404,"","");
-        Mockito.doThrow(e).when(dynamoDBQueryHelper).deleteByPrimaryKey(ActionDoc.class, id);
-        Boolean result=true;
+        ConditionalCheckFailedException e = new ConditionalCheckFailedException("Failed to delete");
+        Mockito.doThrow(e).when(dynamoDBQueryHelper).deleteByObjectWithCondition(Mockito.any(ActionDoc.class),Mockito.any(DynamoDBDeleteExpression.class));
+
         try {
-             result = repo.delete(id);
+              repo.delete(id);
         } catch (AppException ex) {
             assertEquals(404, ex.getError().getCode());
-            assertEquals(false, result);
+
         }
     }
 
diff --git a/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/ddms/AwsDdmsRepoTest.java b/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/ddms/AwsDdmsRepoTest.java
index c332091cb595edb808038132bcc4cf3c2f250819..4eb624b6e18d148982203f4afe9eba4f5c260846 100644
--- a/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/ddms/AwsDdmsRepoTest.java
+++ b/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/ddms/AwsDdmsRepoTest.java
@@ -15,6 +15,8 @@ package org.opengroup.osdu.register.provider.aws.ddms;
 
 
 
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDeleteExpression;
+import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,6 +30,7 @@ import org.opengroup.osdu.core.common.model.http.AppException;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
 import org.opengroup.osdu.register.ddms.model.Ddms;
 import org.opengroup.osdu.register.ddms.model.RegisteredInterface;
+import org.opengroup.osdu.register.provider.aws.action.ActionDoc;
 import org.opengroup.osdu.register.provider.aws.util.DocUtil;
 import org.opengroup.osdu.register.provider.aws.util.TestUtils;
 import java.util.ArrayList;
@@ -69,7 +72,7 @@ public class AwsDdmsRepoTest {
     @Test
     public void createDdms_success(){
         Ddms ddms = createMockDdms();
-        Mockito.doNothing().when(dynamoDBQueryHelper).save(Mockito.any(DdmsDoc.class));
+        Mockito.doNothing().when(dynamoDBQueryHelper).saveWithHashCondition(Mockito.any(DdmsDoc.class),Mockito.anyString());
         Ddms resultDdms = repo.create(ddms);
         assertEquals(ddms, resultDdms);
 
@@ -78,7 +81,7 @@ public class AwsDdmsRepoTest {
     public void createDdms_throw409_whenIdAlreadyExists(){
         Ddms ddms = createMockDdms();
         AppException e =new AppException(409, "Conflict", String.format("A DDMS already exists with the same id: %s", ddms.getId()));
-        Mockito.doThrow(e).when(dynamoDBQueryHelper).save(Mockito.any(DdmsDoc.class));
+        Mockito.doThrow(e).when(dynamoDBQueryHelper).saveWithHashCondition(Mockito.any(DdmsDoc.class), Mockito.anyString());
 
         try {
             Ddms resultDdms = repo.create(ddms);
@@ -116,8 +119,9 @@ public class AwsDdmsRepoTest {
 
     @Test
     public void deleteDdms_success(){
+        Ddms ddms = createMockDdms();
         String id = TestUtils.getDdms_id();
-        Mockito.doNothing().when(dynamoDBQueryHelper).deleteByPrimaryKey(DdmsDoc.class, id);
+        Mockito.doNothing().when(dynamoDBQueryHelper).deleteByObjectWithCondition(Mockito.any(DdmsDoc.class),Mockito.any(DynamoDBDeleteExpression.class));
         Boolean result = repo.delete(id);
         assertEquals(result, true);
     }
@@ -125,14 +129,14 @@ public class AwsDdmsRepoTest {
     @Test
     public void deleteDdms_throw404_whenIdoesNotExist(){
         String id = TestUtils.getDdms_id();
-        AppException e = new AppException(404,"","");
-        Mockito.doThrow(e).when(dynamoDBQueryHelper).deleteByPrimaryKey(DdmsDoc.class, id);
-        Boolean result=true;
+        ConditionalCheckFailedException e = new ConditionalCheckFailedException("Failed to delete");
+        Mockito.doThrow(e).when(dynamoDBQueryHelper).deleteByObjectWithCondition(Mockito.any(DdmsDoc.class),Mockito.any(DynamoDBDeleteExpression.class));
+
         try {
-            result = repo.delete(id);
+            repo.delete(id);
         } catch (AppException ex) {
             assertEquals(404, ex.getError().getCode());
-            assertEquals(false, result);
+
         }
     }
 
diff --git a/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/subscriber/AwsSubscriptionRepoTest.java b/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/subscriber/AwsSubscriptionRepoTest.java
index 65added948a53390853e956ea0a56ee32b3c6b6c..f4ccfb0bf24cbb80df659316b1d5362cfe58f589 100644
--- a/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/subscriber/AwsSubscriptionRepoTest.java
+++ b/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/subscriber/AwsSubscriptionRepoTest.java
@@ -13,6 +13,9 @@
 // limitations under the License.
 package org.opengroup.osdu.register.provider.aws.subscriber;
 
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDeleteExpression;
+import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException;
+import com.amazonaws.services.sns.AmazonSNS;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -32,6 +35,7 @@ import org.opengroup.osdu.register.provider.aws.util.TestUtils;
 import org.opengroup.osdu.register.subscriber.model.*;
 import org.opengroup.osdu.register.utils.Constants;
 
+import java.nio.ByteBuffer;
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
@@ -88,7 +92,7 @@ public class AwsSubscriptionRepoTest {
         String id = TestUtils.getSub_id();
 
         Mockito.when(dynamoDBQueryHelper.loadByPrimaryKey(SubscriptionDoc.class, id)).thenReturn(subDoc);
-        Mockito.when(kmsHelper.decrypt(Mockito.anyString())).thenReturn(TestUtils.getSub_secretValue());
+        Mockito.when(kmsHelper.decrypt(Mockito.any(ByteBuffer.class))).thenReturn(TestUtils.getSub_secretValue_string());
         Mockito.when((docUtil.createSecret(Mockito.anyString(),Mockito.anyString()))).thenReturn(createTestSecret());
 
 
@@ -115,9 +119,9 @@ public class AwsSubscriptionRepoTest {
     @Test
     public void createSubscription_success() throws Exception {
         Subscription s = createMockSubscription();
-        Mockito.when(snsHelper.createPushSubscription(Mockito.anyString())).thenReturn(TestUtils.getSub_sns_subscriptionArn());
-        Mockito.when(kmsHelper.encrypt(Mockito.anyString())).thenReturn(TestUtils.getSub_encrypted_secret_value());
-        Mockito.doNothing().when(dynamoDBQueryHelper).save(Mockito.any(SubscriptionDoc.class));
+        //Mockito.when(snsHelper.createPushSubscription(Mockito.anyString(),Mockito.anyString())).thenReturn(TestUtils.getSub_sns_subscriptionArn());
+        Mockito.when(kmsHelper.encrypt(Mockito.anyString())).thenReturn(TestUtils.getSub_encrypted_secret_value_bytebuffer());
+        Mockito.doNothing().when(dynamoDBQueryHelper).saveWithHashCondition(Mockito.any(SubscriptionDoc.class),Mockito.anyString());
 
 
 
@@ -130,7 +134,7 @@ public class AwsSubscriptionRepoTest {
     public void createSubscription_throw409_ifIdalreadyexists() throws Exception {
         Subscription s = createMockSubscription();
         AppException e =new AppException(409, "Conflict", String.format("A Subscription already exists with the same id: %s", s.getId()));
-        Mockito.doThrow(e).when(dynamoDBQueryHelper).save(Mockito.any(SubscriptionDoc.class));
+        Mockito.doThrow(e).when(dynamoDBQueryHelper).saveWithHashCondition(Mockito.any(SubscriptionDoc.class),Mockito.anyString());
         try {
             Subscription resultSub = repo.create(s);
         }
@@ -147,7 +151,7 @@ public class AwsSubscriptionRepoTest {
         SubscriptionDoc subDoc = createMockSubscriptionDoc();
         String id = TestUtils.getSub_id();
         Mockito.when(dynamoDBQueryHelper.loadByPrimaryKey(SubscriptionDoc.class, id)).thenReturn(subDoc);
-        Mockito.doNothing().when(dynamoDBQueryHelper).deleteByPrimaryKey(SubscriptionDoc.class, id);
+        Mockito.doNothing().when(dynamoDBQueryHelper).deleteByObjectWithCondition(Mockito.any(SubscriptionDoc.class),Mockito.any(DynamoDBDeleteExpression.class));
         Mockito.doNothing().when(snsHelper).deletePushSubscription(Mockito.anyString());
 
         boolean result = repo.delete(id);
@@ -156,12 +160,13 @@ public class AwsSubscriptionRepoTest {
 
     @Test
     public void delete_throws404_whenIddoesNotExist() {
+        SubscriptionDoc subDoc = createMockSubscriptionDoc();
         String id = TestUtils.getSub_id();
-        AppException e = new AppException(404,"","");
-        Mockito.doThrow(e).when(dynamoDBQueryHelper).loadByPrimaryKey(SubscriptionDoc.class, id);
-        Boolean result=true;
+        Mockito.when(dynamoDBQueryHelper.loadByPrimaryKey(SubscriptionDoc.class, id)).thenReturn(subDoc);
+        ConditionalCheckFailedException e = new ConditionalCheckFailedException("Failed to delete");
+        Mockito.doThrow(e).when(dynamoDBQueryHelper).deleteByObjectWithCondition(Mockito.any(SubscriptionDoc.class),Mockito.any(DynamoDBDeleteExpression.class));
         try {
-            result = repo.delete(id);
+           repo.delete(id);
         } catch (AppException ex) {
             assertEquals(404, ex.getError().getCode());
         }
@@ -178,7 +183,7 @@ public class AwsSubscriptionRepoTest {
         Secret secret = Mockito.mock(Secret.class);
         Mockito.when(dynamoDBQueryHelper.loadByPrimaryKey(SubscriptionDoc.class, id)).thenReturn(subDoc);
         Mockito.when(secret.getSecretType()).thenReturn(TestUtils.getSub_secretType());
-        Mockito.when(kmsHelper.encrypt(Mockito.anyString())).thenReturn(TestUtils.getSub_updated_encrypted_secretValue());
+        Mockito.when(kmsHelper.encrypt(Mockito.anyString())).thenReturn(TestUtils.getSub_updated_encrypted_secretValue_bytebuffer());
         Mockito.doNothing().when(dynamoDBQueryHelper).save(Mockito.any(SubscriptionDoc.class));
 
         boolean result = repo.patch(s,secret);
@@ -197,7 +202,7 @@ public class AwsSubscriptionRepoTest {
         Secret secret = Mockito.mock(Secret.class);
         Mockito.when(dynamoDBQueryHelper.loadByPrimaryKey(SubscriptionDoc.class, id)).thenReturn(subDoc);
         Mockito.when(secret.getSecretType()).thenReturn(TestUtils.getSub_secretType());
-        Mockito.when(kmsHelper.encrypt(Mockito.anyString())).thenReturn(TestUtils.getSub_updated_encrypted_secretValue());
+        Mockito.when(kmsHelper.encrypt(Mockito.anyString())).thenReturn(TestUtils.getSub_updated_encrypted_secretValue_bytebuffer());
         Mockito.doThrow(e).when(dynamoDBQueryHelper).save(Mockito.any(SubscriptionDoc.class));
 
         try {
@@ -234,8 +239,8 @@ public class AwsSubscriptionRepoTest {
         Subscription s2 = createMockSubscription();
         s2.setId("SubTestId2");
         List<Subscription> subList = new ArrayList<Subscription>();
-        SubscriptionDoc doc1 = SubscriptionDoc.mapFrom(s1,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(), TestUtils.getSub_encrypted_secret_value());
-        SubscriptionDoc doc2 = SubscriptionDoc.mapFrom(s2,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(), TestUtils.getSub_encrypted_secret_value());
+        SubscriptionDoc doc1 = SubscriptionDoc.mapFrom(s1,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(), TestUtils.getSub_encrypted_secret_value_bytebuffer());
+        SubscriptionDoc doc2 = SubscriptionDoc.mapFrom(s2,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(), TestUtils.getSub_encrypted_secret_value_bytebuffer());
 
 
         ArrayList<SubscriptionDoc> subDocs = new ArrayList<SubscriptionDoc>();
@@ -243,7 +248,7 @@ public class AwsSubscriptionRepoTest {
         subDocs.add(doc2);
 
         Mockito.when(dynamoDBQueryHelper.scanTable(Mockito.any(Class.class),Mockito.anyString(),Mockito.anyMap())).thenReturn(subDocs);
-        Mockito.when(kmsHelper.decrypt(Mockito.anyString())).thenReturn(TestUtils.getSub_secretValue());
+        Mockito.when(kmsHelper.decrypt(Mockito.any(ByteBuffer.class))).thenReturn(TestUtils.getSub_secretValue_string());
         Mockito.when((docUtil.createSecret(Mockito.anyString(),Mockito.anyString()))).thenReturn(createTestSecret());
 
         List<Subscription> resultSubs = repo.getAll();
@@ -264,8 +269,8 @@ public class AwsSubscriptionRepoTest {
         Subscription s2 = createMockSubscription();
         s2.setId("SubTestId2");
         List<Subscription> subList = new ArrayList<Subscription>();
-        SubscriptionDoc doc1 = SubscriptionDoc.mapFrom(s1,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(), TestUtils.getSub_encrypted_secret_value());
-        SubscriptionDoc doc2 = SubscriptionDoc.mapFrom(s2,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(), TestUtils.getSub_encrypted_secret_value());
+        SubscriptionDoc doc1 = SubscriptionDoc.mapFrom(s1,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(), TestUtils.getSub_encrypted_secret_value_bytebuffer());
+        SubscriptionDoc doc2 = SubscriptionDoc.mapFrom(s2,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(), TestUtils.getSub_encrypted_secret_value_bytebuffer());
 
 
         ArrayList<SubscriptionDoc> subDocs = new ArrayList<SubscriptionDoc>();
@@ -293,8 +298,8 @@ public class AwsSubscriptionRepoTest {
         subList.add(s1);
         subList.add(s2);
 
-        SubscriptionDoc doc1 = SubscriptionDoc.mapFrom(s1,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(),TestUtils.getSub_encrypted_secret_value());
-        SubscriptionDoc doc2 = SubscriptionDoc.mapFrom(s2,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(),TestUtils.getSub_encrypted_secret_value());
+        SubscriptionDoc doc1 = SubscriptionDoc.mapFrom(s1,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(),TestUtils.getSub_encrypted_secret_value_bytebuffer());
+        SubscriptionDoc doc2 = SubscriptionDoc.mapFrom(s2,TestUtils.getDataPartitionId(),TestUtils.getSub_sns_subscriptionArn(),TestUtils.getSub_encrypted_secret_value_bytebuffer());
 
 
         List<SubscriptionDoc> subDocsList = new ArrayList<SubscriptionDoc>();
@@ -316,12 +321,13 @@ public class AwsSubscriptionRepoTest {
         private Subscription createMockSubscription() {
         Subscription sub = new Subscription();
         sub.setId(TestUtils.getSub_id());
-        sub.setSecret(new HmacSecret(TestUtils.getSub_secretValue()));
+        sub.setSecret(new HmacSecret(TestUtils.getSub_secretValue_string()));
         sub.setNotificationId(TestUtils.getSub_id());
         sub.setTopic(TestUtils.getSub_topicName());
 
 
 
+
         return sub;
     }
 
@@ -333,8 +339,8 @@ public class AwsSubscriptionRepoTest {
         subDoc.setSecretType(TestUtils.getSub_secretType());
         subDoc.setNotificationId(TestUtils.getSub_id());
         subDoc.setTopic(TestUtils.getSub_topicName());
-        subDoc.setSecretValue(TestUtils.getSub_secretValue());
-        subDoc.setCreatedOnEpoch(new Timestamp(System.currentTimeMillis()));
+        subDoc.setSecretValue(TestUtils.getSub_secretValue_bytebuffer());
+        subDoc.setCreatedOnEpoch((new Timestamp(System.currentTimeMillis())).toString());
         subDoc.setSnssubscriptionArn(TestUtils.getSub_sns_subscriptionArn());
 
         return subDoc;
@@ -344,7 +350,7 @@ public class AwsSubscriptionRepoTest {
     {
         Secret secret;
         HmacSecret hmacSecret = new HmacSecret();
-        hmacSecret.setValue(TestUtils.getSub_secretValue());
+        hmacSecret.setValue(TestUtils.getSub_secretValue_string());
         secret = hmacSecret;
         return secret;
     }
diff --git a/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/util/TestUtils.java b/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/util/TestUtils.java
index 5f7e6d92979720466b0a628688e9fef395b0372a..3d73d5c3a499281d944e82d9c37dab23049cbabc 100644
--- a/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/util/TestUtils.java
+++ b/provider/register-aws/src/test/java/org/opengroup/osdu/register/provider/aws/util/TestUtils.java
@@ -17,6 +17,7 @@ package org.opengroup.osdu.register.provider.aws.util;
 
 import org.opengroup.osdu.register.action.model.Filter;
 
+import java.nio.ByteBuffer;
 import java.sql.Timestamp;
 
 public class TestUtils {
@@ -47,7 +48,7 @@ public class TestUtils {
     private static final String sub_id = "SubTestid1";
     private static final String sub_secretValue = "test-secret-value";
     private static final String sub_secretType = "test-secret-type";
-    private static final String sub_topicName = "aws-topic-name";
+    private static final String sub_topicName = "aws-topic-arn";
 
     private static final String sub_notificationId= "testNotificationId";
 
@@ -110,10 +111,14 @@ public class TestUtils {
     }
 
 
-    public static String getSub_secretValue() {
+    public static String getSub_secretValue_string() {
         return sub_secretValue;
     }
 
+
+    public static ByteBuffer getSub_secretValue_bytebuffer() {
+        return ByteBuffer.wrap(sub_secretValue.getBytes());
+    }
     public static String getSub_secretType() {
         return sub_secretType;
     }
@@ -127,10 +132,15 @@ public class TestUtils {
     }
 
 
-    public static String getSub_encrypted_secret_value() {
+    public static String getSub_encrypted_secret_value_string() {
         return sub_encrypted_secret_value;
     }
 
+    public static ByteBuffer getSub_encrypted_secret_value_bytebuffer() {
+
+        return ByteBuffer.wrap(sub_encrypted_secret_value.getBytes());
+    }
+
     public static String getSub_sns_subscriptionArn() {
         return sub_sns_subscriptionArn;
     }
@@ -139,6 +149,10 @@ public class TestUtils {
         return sub_updated_encrypted_secretValue;
     }
 
+    public static ByteBuffer getSub_updated_encrypted_secretValue_bytebuffer() {
+        return ByteBuffer.wrap(sub_updated_encrypted_secretValue.getBytes());
+    }
+
     public static String getSub_notificationId() {
         return sub_notificationId;
     }
diff --git a/register-core/src/main/java/org/opengroup/osdu/register/middleware/RegisterFilter.java b/register-core/src/main/java/org/opengroup/osdu/register/middleware/RegisterFilter.java
index 24a6e6d6d43713f4dc3506c6bb0e7cf5a223c23d..89061ac2827dc80d42c5bb453900ab3107dd1370 100644
--- a/register-core/src/main/java/org/opengroup/osdu/register/middleware/RegisterFilter.java
+++ b/register-core/src/main/java/org/opengroup/osdu/register/middleware/RegisterFilter.java
@@ -38,21 +38,19 @@ public class RegisterFilter implements Filter {
 
         HttpServletRequest httpRequest = (HttpServletRequest) request;
         HttpServletResponse httpResponse = (HttpServletResponse) response;
-
         this.headers.addCorrelationIdIfMissing();
-
         Map<String, List<Object>> standardHeaders = ResponseHeaders.STANDARD_RESPONSE_HEADERS;
         for (Map.Entry<String, List<Object>> header : standardHeaders.entrySet()) {
-            httpResponse.addHeader(header.getKey(), header.getValue().toString());
+          httpResponse.addHeader(header.getKey(), header.getValue().toString());
         }
         httpResponse.addHeader(DpsHeaders.CORRELATION_ID, this.headers.getCorrelationId());
-
+        httpResponse.flushBuffer();
         if (!validateIsHttps(httpResponse)) {
             //do nothing
         } else if (httpRequest.getMethod().equalsIgnoreCase(OPTIONS_STRING)) {
             httpResponse.setStatus(HttpStatus.SC_OK);
         } else {
-            chain.doFilter(request, response);
+           chain.doFilter(request, response);
         }
     }
 
diff --git a/testing/register-test-aws/build-aws/prepare-dist.sh b/testing/register-test-aws/build-aws/prepare-dist.sh
new file mode 100755
index 0000000000000000000000000000000000000000..cfb3b70e8bb4e0ddff071c4015216dc5437c3f7b
--- /dev/null
+++ b/testing/register-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"/register-test-aws
+INTEGRATION_TEST_SOURCE_DIR_CORE="$INTEGRATION_TEST_SOURCE_DIR"/register-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/register-test-aws/build-aws/run-tests.sh b/testing/register-test-aws/build-aws/run-tests.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6c0893a457afb8a3aa87c26aa3fb25e0e3120700
--- /dev/null
+++ b/testing/register-test-aws/build-aws/run-tests.sh
@@ -0,0 +1,62 @@
+# 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 Register-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 REGISTER_BASE_URL=$REGISTER_BASE_URL
+export SUBSCRIBER_SECRET=02030405060708090A0B0C0D0E0F
+export REGISTER_CUSTOM_PUSH_PATH=api/register/v1/awstest/aws/challenge
+export REGISTER_CUSTOM_PUSH_PATH1=api/register/v1/awstest/aws/challenge/1
+export REGISTER_CUSTOM_PUSH_URL=$REGISTER_BASE_URL$REGISTER_CUSTOM_PUSH_PATH
+export REGISTER_CUSTOM_PUSH_URL1=$REGISTER_BASE_URL$REGISTER_CUSTOM_PUSH_PATH1
+
+
+
+
+#### 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 "### Register-Service Integration Tests Finished ###"
+exit $TEST_EXIT_CODE
\ No newline at end of file
diff --git a/testing/register-test-aws/pom.xml b/testing/register-test-aws/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1201847efbddb0d09252d0c2b44cde3974636076
--- /dev/null
+++ b/testing/register-test-aws/pom.xml
@@ -0,0 +1,152 @@
+<?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 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.opengroup.osdu.register</groupId>
+    <artifactId>register-test-aws</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <description>Register service AWS integration tests </description>
+
+    <properties>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.8</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.json</groupId>
+            <artifactId>javax.json-api</artifactId>
+            <version>1.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish</groupId>
+            <artifactId>javax.json</artifactId>
+            <version>1.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.oauth-client</groupId>
+            <artifactId>google-oauth-client</artifactId>
+            <version>1.30.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.api-client</groupId>
+            <artifactId>google-api-client</artifactId>
+            <version>1.30.2</version>
+            <scope>compile</scope>
+            <exclusions>
+                <exclusion>
+                    <artifactId>guava-jdk5</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.jersey</groupId>
+            <artifactId>jersey-client</artifactId>
+            <version>1.19.4</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.5</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.auth</groupId>
+            <artifactId>google-auth-library-oauth2-http</artifactId>
+            <version>0.15.0</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>27.1-jre</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opengroup.osdu.register</groupId>
+            <artifactId>register-test-core</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>au.com.dius</groupId>
+            <artifactId>pact-jvm-provider-junit_2.12</artifactId>
+            <version>3.5.5</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <version>2.1</version>
+            <scope>test</scope>
+        </dependency>
+        <!-- Internal packages -->
+        <dependency>
+            <groupId>org.opengroup.osdu.core.aws</groupId>
+            <artifactId>os-core-lib-aws</artifactId>
+            <version>0.3.11-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.amazonaws</groupId>
+            <artifactId>aws-java-sdk-cognitoidp</artifactId>
+            <version>1.11.676</version>
+        </dependency>
+    </dependencies>
+
+    <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/157/packages/maven</url>
+        </repository>
+        <snapshotRepository>
+            <id>${gitlab-server}</id>
+            <url>https://community.opengroup.org/api/v4/projects/157/packages/maven</url>
+        </snapshotRepository>
+    </distributionManagement>
+</project>
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestCreateActionApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestCreateActionApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..cef80a8395a86175a21adfd9cccce6c665526245
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestCreateActionApi.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.register.action;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestCreateActionApi extends CreateActionApiTest {
+
+    @Before
+    @Override
+    public void setup() {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestDeleteActionApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestDeleteActionApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..4224de2f53b1f052424fafb6152859a95c3dfdd9
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestDeleteActionApi.java
@@ -0,0 +1,41 @@
+// 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.register.action;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+
+import static org.junit.Assert.assertEquals;
+
+public class TestDeleteActionApi extends DeleteActionApiTest {
+
+    @Before
+    @Override
+    public void setup() {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestGetActionByIdApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestGetActionByIdApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..b8a6b8824ecf6e53c1bfa2e011c2dbf6f06e0670
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestGetActionByIdApi.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.register.action;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestGetActionByIdApi extends GetActionByIdApiTest {
+
+    @Before
+    @Override
+    public void setup() {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestRetrieveActionApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestRetrieveActionApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f75bbf81fa268c5c69dee75b0fabbf231471f26
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/action/TestRetrieveActionApi.java
@@ -0,0 +1,41 @@
+// 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.register.action;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+
+import static org.junit.Assert.assertEquals;
+
+public class TestRetrieveActionApi extends RetrieveActionApiTest {
+
+    @Before
+    @Override
+    public void setup() {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestCreateRegistrationApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestCreateRegistrationApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..1d90c8b063329afcb8f4b36e94342ce66fce5a48
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestCreateRegistrationApi.java
@@ -0,0 +1,41 @@
+// 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.register.ddms;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+
+import static org.junit.Assert.assertEquals;
+
+public class TestCreateRegistrationApi extends CreateRegistrationApiTest {
+
+    @Before
+    @Override
+    public void setup() {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestDeleteRegistrationApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestDeleteRegistrationApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..2262712ed6176c33df935af4692e994542446688
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestDeleteRegistrationApi.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.register.ddms;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestDeleteRegistrationApi extends DeleteRegistrationApiTest {
+
+    @Before
+    @Override
+    public void setup() {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestGetConsumptionByIdApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestGetConsumptionByIdApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..67f2af2a684d213ac66cf441141e9298c7c78f0b
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestGetConsumptionByIdApi.java
@@ -0,0 +1,41 @@
+// 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.register.ddms;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+
+import static org.junit.Assert.assertEquals;
+
+public class TestGetConsumptionByIdApi extends GetConsumptionByIdApiTest {
+
+    @Before
+    @Override
+    public void setup() {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestGetRegistrationByIdApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestGetRegistrationByIdApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..35833773d60ac303f77cdb34afd9c60b366def9e
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestGetRegistrationByIdApi.java
@@ -0,0 +1,41 @@
+// 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.register.ddms;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+
+import static org.junit.Assert.assertEquals;
+
+public class TestGetRegistrationByIdApi extends GetRegistrationByIdApiTest {
+
+    @Before
+    @Override
+    public void setup() {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestQueryDdmsByType.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestQueryDdmsByType.java
new file mode 100644
index 0000000000000000000000000000000000000000..59738fc74b7d3d549372b6efe7159a6bd9110834
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/ddms/TestQueryDdmsByType.java
@@ -0,0 +1,41 @@
+// 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.register.ddms;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+
+import static org.junit.Assert.assertEquals;
+
+public class TestQueryDdmsByType extends QueryDdmsByTypeTest {
+
+    @Before
+    @Override
+    public void setup() {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestCreateSubscriberApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestCreateSubscriberApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..8646346e008b39f70dc0a9b14b66313c39580c75
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestCreateSubscriberApi.java
@@ -0,0 +1,80 @@
+/* Copyright © 2020 Amazon Web Services
+ * Copyright 2017-2020, Schlumberger
+ *
+ * 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.register.subscriber;
+
+import com.google.common.base.Strings;
+import com.google.gson.Gson;
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.model.Subscriber;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+import org.opengroup.osdu.register.util.Config;
+import org.opengroup.osdu.register.util.RestDescriptor;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+public class TestCreateSubscriberApi extends CreateSubscriberApiTest {
+
+    @Before
+    @Override
+    public void setup() throws Exception {
+        this.testUtils = new AwsTestUtils();
+        super.setup();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+    @Override
+    protected void validate20XResponse(ClientResponse response, RestDescriptor descriptor) {
+        //String url = Config.Instance().PushUrl + "api/register/v1/test/challenge/1";
+        String url = "";
+        String pushPath = System.getProperty("REGISTER_CUSTOM_PUSH_URL1", System.getenv("REGISTER_CUSTOM_PUSH_URL1"));
+        if( Strings.isNullOrEmpty(pushPath)) {
+            url = Config.Instance().PushUrl + "api/register/v1/test/challenge/1";
+        }
+        else
+        {
+            url = pushPath;
+        }
+        String body = response.getEntity(String.class);
+        Subscriber subscriber = new Gson().fromJson(body, Subscriber.class);
+        String createdBy = System.getProperty("AWS_COGNITO_AUTH_PARAMS_USER", System.getenv("AWS_COGNITO_AUTH_PARAMS_USER"));
+
+        assertEquals("My test listener.", subscriber.description);
+        assertEquals(createdBy, subscriber.createdBy);
+        assertEquals("My listener", subscriber.name);
+        assertEquals("records-changed", subscriber.topic);
+        assertFalse(Strings.isNullOrEmpty(subscriber.notificationId));
+        assertEquals(url, subscriber.pushEndpoint);
+    }
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestDeleteSubscriberApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestDeleteSubscriberApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..fce4f94d506eb9a6b41828ebe844443b19e6935f
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestDeleteSubscriberApi.java
@@ -0,0 +1,42 @@
+/* Copyright © 2020 Amazon Web Services
+ * Copyright 2017-2020, Schlumberger
+ *
+ * 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.register.subscriber;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestDeleteSubscriberApi extends DeleteSubscriberApiTest {
+
+    @Before
+    @Override
+    public void setup() {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestGetSubscriberByIdApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestGetSubscriberByIdApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..385233b70013d6b4a605ed3843a7a9314cc313c6
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestGetSubscriberByIdApi.java
@@ -0,0 +1,56 @@
+/*Copyright © 2020 Amazon Web Services
+ * Copyright 2017-2020, Schlumberger
+ *
+ * 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.register.subscriber;
+
+import com.google.gson.Gson;
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.model.Subscriber;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+import org.opengroup.osdu.register.util.RestDescriptor;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestGetSubscriberByIdApi extends GetSubscriberByIdApiTest {
+
+    @Before
+    @Override
+    public void setup() throws Exception {
+        this.testUtils = new AwsTestUtils();
+        super.setup();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+    @Override
+    public void validate20XResponse(ClientResponse response, RestDescriptor descriptor) {
+        String body = response.getEntity(String.class);
+        Subscriber subscriber = new Gson().fromJson(body, Subscriber.class);
+        String createdBy = System.getProperty("AWS_COGNITO_AUTH_PARAMS_USER", System.getenv("AWS_COGNITO_AUTH_PARAMS_USER"));
+
+        assertEquals("My test listener.", subscriber.description);
+        assertEquals(createdBy, subscriber.createdBy);
+        assertEquals("My listener", subscriber.name);
+        assertEquals("records-changed", subscriber.topic);
+    }
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestListTopicsApi.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestListTopicsApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1f298f6e76f3d35a3fb2b517ab7f22c0a233d71
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestListTopicsApi.java
@@ -0,0 +1,42 @@
+/*Copyright © 2020 Amazon Web Services
+ * Copyright 2017-2020, Schlumberger
+ *
+ * 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.register.subscriber;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestListTopicsApi extends ListTopicsApiTest {
+
+    @Before
+    @Override
+    public void setup() {
+        this.testUtils = new AwsTestUtils();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestQuerySubscriber.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestQuerySubscriber.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4f67c4981af520faf42587e04d2465242af4e0b
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/subscriber/TestQuerySubscriber.java
@@ -0,0 +1,43 @@
+/*Copyright © 2020 Amazon Web Services
+ * Copyright 2017-2020, Schlumberger
+ *
+ * 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.register.subscriber;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.register.util.AwsTestUtils;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestQuerySubscriber extends QuerySubscriberTest {
+
+    @Before
+    @Override
+    public void setup() throws Exception {
+        this.testUtils = new AwsTestUtils();
+        super.setup();
+    }
+
+    @After
+    @Override
+    public void tearDown() {
+        this.testUtils = null;
+    }
+
+
+}
diff --git a/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/util/AwsCognitoClient.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/util/AwsCognitoClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..6957e6377e15b249752163cb7136b22f7cb85457
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/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.register.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/register-test-aws/src/test/java/org/opengroup/osdu/register/util/AwsConfig.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/util/AwsConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf200a6c084f89bd686d44c155ebd9ebf689b4ea
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/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.register.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/register-test-aws/src/test/java/org/opengroup/osdu/register/util/AwsTestUtils.java b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/util/AwsTestUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..9338a22c91f590fa3b8932cb7589848520813879
--- /dev/null
+++ b/testing/register-test-aws/src/test/java/org/opengroup/osdu/register/util/AwsTestUtils.java
@@ -0,0 +1,60 @@
+// 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.register.util;
+
+
+import org.apache.commons.lang3.StringUtils;
+
+public class AwsTestUtils extends TestUtils{
+
+
+
+    AwsCognitoClient client = new AwsCognitoClient();
+
+    @Override
+    public synchronized String getOpsAccessToken() throws Exception {
+        if (opsToken==null || StringUtils.isEmpty(opsToken) ) {
+            opsToken= client.getToken(AwsConfig.getAWSCognitoUser(),AwsConfig.getAWSCognitoPassword(),"bearer");
+        }
+        return  opsToken;
+    }
+
+    @Override
+    public synchronized String getAdmAccessToken() throws Exception {
+        if (admToken==null || StringUtils.isEmpty(admToken)) {
+            admToken=client.getToken(AwsConfig.getAWSCognitoUser(),AwsConfig.getAWSCognitoPassword(),"bearer");
+        }
+        return admToken;
+    }
+
+    @Override
+    public synchronized String getEditorAccessToken() throws Exception {
+        if (editorToken==null || StringUtils.isEmpty(editorToken)) {
+            editorToken=client.getToken(AwsConfig.getAWSCognitoUser(),AwsConfig.getAWSCognitoPassword(),"bearer");
+        }
+        return editorToken;
+    }
+
+    @Override
+    public synchronized String getNoDataAccessToken() throws Exception {
+        if (noAccessToken==null || StringUtils.isEmpty(noAccessToken)) {
+            noAccessToken=client.getToken(AwsConfig.getAWSCognitoNoAccessUser(),AwsConfig.getAWSCognitoPassword(),"bearer");
+        }
+        return  noAccessToken;
+    }
+
+
+
+}
diff --git a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/CreateActionApiTest.java b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/CreateActionApiTest.java
index 7d59bf6419c35fd3bbe9860aa4477e199eafe183..f145e50e366eb878c11d1bce0e3070a9a3a6f29c 100644
--- a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/CreateActionApiTest.java
+++ b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/CreateActionApiTest.java
@@ -16,6 +16,7 @@
 
 package org.opengroup.osdu.register.action;
 
+import com.google.common.base.Strings;
 import com.google.gson.Gson;
 import org.opengroup.osdu.register.model.Action;
 import org.opengroup.osdu.register.util.Config;
@@ -38,7 +39,17 @@ public abstract class CreateActionApiTest extends CreateApiTestTemplate {
 
     @Override
     protected void validate20XResponse(ClientResponse response, RestDescriptor descriptor) {
-        String url = Config.Instance().securePushUrl + "api/register/v1/test/challenge";
+       // String url = Config.Instance().securePushUrl + "api/register/v1/test/challenge";
+
+        String url = "";
+        String pushPath = System.getProperty("REGISTER_CUSTOM_PUSH_URL", System.getenv("REGISTER_CUSTOM_PUSH_URL"));
+        if( Strings.isNullOrEmpty(pushPath)) {
+            url= Config.Instance().securePushUrl + "api/register/v1/test/challenge";
+        }
+        else
+        {
+            url = pushPath;
+        }
         String body = response.getEntity(String.class);
         Action action = new Gson().fromJson(body, Action.class);
         assertEquals("My test listener.", action.description);
diff --git a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/CreateActionDescriptor.java b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/CreateActionDescriptor.java
index 6e803addf13160abdeff7ed03f0bc856c4d0d63e..7d12040c3e5634f6859c38db440c67f23135956a 100644
--- a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/CreateActionDescriptor.java
+++ b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/CreateActionDescriptor.java
@@ -16,6 +16,7 @@
 
 package org.opengroup.osdu.register.action;
 
+import com.google.common.base.Strings;
 import org.opengroup.osdu.register.util.Config;
 import org.opengroup.osdu.register.util.RestDescriptor;
 
@@ -32,7 +33,16 @@ public class CreateActionDescriptor extends RestDescriptor {
 
     @Override
     public String getValidBody() {
-        String url = Config.Instance().securePushUrl + "api/register/v1/test/challenge";
+        String url = "";
+        String pushPath = System.getProperty("REGISTER_CUSTOM_PUSH_URL", System.getenv("REGISTER_CUSTOM_PUSH_URL"));
+        if( Strings.isNullOrEmpty(pushPath)) {
+            url= Config.Instance().securePushUrl + "api/register/v1/test/challenge";
+        }
+        else
+        {
+            url = pushPath;
+        }
+
         return "{\n" +
                 "\t\"id\": \"" + getArg() + "\",\n" +
                 "\t\"name\": \"My listener\",\n" +
diff --git a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/GetActionByIdApiTest.java b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/GetActionByIdApiTest.java
index 30ca21f435e8b3df39c1550b6239d33bc938407c..fea3d578790a0f69aa48fd606c782306ca0996be 100644
--- a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/GetActionByIdApiTest.java
+++ b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/action/GetActionByIdApiTest.java
@@ -16,6 +16,7 @@
 
 package org.opengroup.osdu.register.action;
 
+import com.google.common.base.Strings;
 import com.google.gson.Gson;
 import org.opengroup.osdu.register.model.Action;
 import org.opengroup.osdu.register.util.Config;
@@ -40,7 +41,17 @@ public abstract class GetActionByIdApiTest extends RetrieveApiTestTemplate {
 
     @Override
     protected void validate20XResponse(ClientResponse response, RestDescriptor descriptor) {
-        String url = Config.Instance().securePushUrl + "api/register/v1/test/challenge";
+       // String url = Config.Instance().securePushUrl + "api/register/v1/test/challenge";
+
+        String url = "";
+        String pushPath = System.getProperty("REGISTER_CUSTOM_PUSH_URL", System.getenv("REGISTER_CUSTOM_PUSH_URL"));
+        if( Strings.isNullOrEmpty(pushPath)) {
+            url= Config.Instance().securePushUrl + "api/register/v1/test/challenge";
+        }
+        else
+        {
+            url = pushPath;
+        }
         String body = response.getEntity(String.class);
         Action action = new Gson().fromJson(body, Action.class);
         assertEquals("My test listener.", action.description);
diff --git a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/CreateSubscriberApiTest.java b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/CreateSubscriberApiTest.java
index 8ea68f6d074ace1630406f1ad25beb24e0fc6250..abb318c6988808fcbfb33007246afe094082fc11 100644
--- a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/CreateSubscriberApiTest.java
+++ b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/CreateSubscriberApiTest.java
@@ -51,7 +51,17 @@ public abstract class CreateSubscriberApiTest extends CreateApiTestTemplate {
 
     @Override
     protected void validate20XResponse(ClientResponse response, RestDescriptor descriptor) {
-        String url = Config.Instance().PushUrl + "api/register/v1/test/challenge/1";
+        //String url = Config.Instance().PushUrl + "api/register/v1/test/challenge/1";
+
+        String url = "";
+        String pushPath = System.getProperty("REGISTER_CUSTOM_PUSH_URL1", System.getenv("REGISTER_CUSTOM_PUSH_URL1"));
+        if( Strings.isNullOrEmpty(pushPath)) {
+            url = Config.Instance().PushUrl + "api/register/v1/test/challenge/1";
+        }
+        else
+        {
+            url = pushPath;
+        }
         String body = response.getEntity(String.class);
         Subscriber subscriber = new Gson().fromJson(body, Subscriber.class);
         assertEquals("My test listener.", subscriber.description);
diff --git a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/CreateSubscriberDescriptor.java b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/CreateSubscriberDescriptor.java
index eba8d44b899ffed089d2e140063c1beb739a36d1..5fd5b8430b0952e7c0380727e2103f212b4f667e 100644
--- a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/CreateSubscriberDescriptor.java
+++ b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/CreateSubscriberDescriptor.java
@@ -16,6 +16,7 @@
 
 package org.opengroup.osdu.register.subscriber;
 
+import com.google.common.base.Strings;
 import org.opengroup.osdu.register.util.Config;
 import org.opengroup.osdu.register.util.RestDescriptor;
 import org.opengroup.osdu.register.util.TestPayloadReader;
@@ -35,7 +36,17 @@ public class CreateSubscriberDescriptor extends RestDescriptor {
 
     @Override
     public String getValidBody() {
-        String url = Config.Instance().PushUrl + "api/register/v1/test/challenge/1";
+        //String url = Config.Instance().PushUrl + "api/register/v1/test/challenge/1";
+
+        String url = "";
+        String pushPath = System.getProperty("REGISTER_CUSTOM_PUSH_URL1", System.getenv("REGISTER_CUSTOM_PUSH_URL1"));
+        if( Strings.isNullOrEmpty(pushPath)) {
+            url = Config.Instance().PushUrl + "api/register/v1/test/challenge/1";
+        }
+        else
+        {
+            url = pushPath;
+        }
         String secret = Config.Instance().SUBSCRIBER_SECRET;
         return "{\n" +
                 "\t\"id\": \"" + getArg() + "\",\n" +
diff --git a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/QuerySubscriberTest.java b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/QuerySubscriberTest.java
index b9ab5f57e8ed447322770b09a0776f10a034b387..d0bfc519d330166d5adde3cfa33feb484021473c 100644
--- a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/QuerySubscriberTest.java
+++ b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/subscriber/QuerySubscriberTest.java
@@ -16,6 +16,7 @@
 
 package org.opengroup.osdu.register.subscriber;
 
+import com.google.common.base.Strings;
 import com.google.gson.Gson;
 import org.junit.Before;
 import org.opengroup.osdu.register.model.Subscriber;
@@ -100,7 +101,18 @@ public abstract class QuerySubscriberTest extends BaseTestTemplate {
 
         List<Subscriber> subscribers = subscriberList.stream().filter(f -> f.id.equalsIgnoreCase(getId())).collect(Collectors.toList());
         assertEquals(1, subscribers.size());
-        String url = Config.Instance().PushUrl + "api/register/v1/test/challenge/1";
+        //String url = Config.Instance().PushUrl + "api/register/v1/test/challenge/1";
+
+
+        String url = "";
+        String pushPath = System.getProperty("REGISTER_CUSTOM_PUSH_URL1", System.getenv("REGISTER_CUSTOM_PUSH_URL1"));
+        if( Strings.isNullOrEmpty(pushPath)) {
+            url = Config.Instance().PushUrl + "api/register/v1/test/challenge/1";
+        }
+        else
+        {
+            url = pushPath;
+        }
         assertEquals(1, subscribers.size());
         assertEquals(url, subscribers.get(0).pushEndpoint);
     }
diff --git a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/util/BaseTestTemplate.java b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/util/BaseTestTemplate.java
index 31f730eb242486ed0a98de753f9a3e2a48f1a2ad..0f8fe16d735e203ac0114eae4a4ac8aa3c08c18a 100644
--- a/testing/register-test-core/src/main/java/org/opengroup/osdu/register/util/BaseTestTemplate.java
+++ b/testing/register-test-core/src/main/java/org/opengroup/osdu/register/util/BaseTestTemplate.java
@@ -20,6 +20,7 @@ import com.sun.jersey.api.client.ClientResponse;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public abstract class BaseTestTemplate extends TestBase {
 
@@ -73,7 +74,8 @@ public abstract class BaseTestTemplate extends TestBase {
         assertEquals(error(response.getEntity(String.class)), 401, response.getStatus());
     }
 
-    @Test
+
+   @Test
     public void should_return20X_when_usingCredentialsWithPermissionOps() throws Exception {
         should_return20X_when_usingCredentialsWithPermission(testUtils.getOpsAccessToken());
     }
@@ -91,7 +93,7 @@ public abstract class BaseTestTemplate extends TestBase {
         assertEquals("[true]", response.getHeaders().getFirst("Access-Control-Allow-Credentials"));
         assertEquals("DENY", response.getHeaders().getFirst("X-Frame-Options"));
         assertEquals("1; mode=block", response.getHeaders().getFirst("X-XSS-Protection"));
-        assertEquals("nosniff", response.getHeaders().getFirst("X-Content-Type-Options"));
+        assertTrue(( response.getHeaders().getFirst("X-Content-Type-Options").equals("nosniff")) || ( response.getHeaders().getFirst("X-Content-Type-Options").equals("[nosniff]")));
         assertEquals("[no-cache, no-store, must-revalidate]", response.getHeaders().getFirst("Cache-Control"));
         assertEquals("[default-src 'self']", response.getHeaders().getFirst("Content-Security-Policy"));
         assertEquals("[max-age=31536000; includeSubDomains]", response.getHeaders().getFirst("Strict-Transport-Security"));
@@ -104,15 +106,15 @@ public abstract class BaseTestTemplate extends TestBase {
         ClientResponse response = descriptor.runOptions(getId(), testUtils.getOpsAccessToken());
         assertEquals(error(response.getEntity(String.class)), 200, response.getStatus());
     }
-
-    @Test
+   //Commenting this test since API Gateway will always block http
+   /* @Test
     public void should_return307_when_makingHttpRequest() throws Exception {
         if (Config.Instance().isLocalHost())
             return;    //localhost we expect to be able to use http so we shortcut the test
 
         ClientResponse response = descriptor.runHttp(getId(), testUtils.getOpsAccessToken());
         assertEquals(error(response.getEntity(String.class)), 307, response.getStatus());
-    }
+    }*/
 
     @Test
     public void should_return20XResponseCode_when_makingValidHttpsRequest() throws Exception {