diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 50bb9e8183b803e1dabda46156ee4c9eda494e76..cef1a7f90ac6e43c72a0e9a56b8a573598794213 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -16,7 +16,7 @@ variables:
   OSDU_GCP_SERVICE: legal
   OSDU_GCP_VENDOR: gcp
   OSDU_GCP_HELM_CONFIG_SERVICE_VARS: "--set data.project_id=$OSDU_GCP_PROJECT --set data.authorize_api=$OSDU_GCP_AUTHORIZE_API --set data.google_audiences=$GOOGLE_AUDIENCE --set data.partition_api=$OSDU_GCP_PARTITION_API --set data.log_level=INFO --set enable_full_bucket_name=$ENABLE_FULL_BUCKET_NAME"
-  OSDU_GCP_HELM_DEPLOYMENT_SERVICE_VARS: "--set data.image=$CI_REGISTRY_IMAGE/osdu-gcp:$CI_COMMIT_SHORT_SHA --set data.serviceAccountName=workload-identity-legal --set data.limits_cpu=1.5 --set data.limits_memory=512M"
+  OSDU_GCP_HELM_DEPLOYMENT_SERVICE_VARS: "--set data.image=$CI_REGISTRY_IMAGE/osdu-gcp:$CI_COMMIT_SHORT_SHA --set data.serviceAccountName=$OSDU_GCP_SERVICE-k8s --set data.limits_cpu=1.5 --set data.limits_memory=512M"
   OSDU_GCP_HELM_CONFIG_SERVICE: legal-config
   OSDU_GCP_HELM_DEPLOYMENT_SERVICE: legal-deploy
   OSDU_GCP_HELM_PACKAGE_CHARTS: "devops/gcp/deploy devops/gcp/configmap"
@@ -56,8 +56,5 @@ include:
   - project: "osdu/platform/ci-cd-pipelines"
     file: "cloud-providers/gcp.yml"
 
-  - project: "osdu/platform/ci-cd-pipelines"
-    file: "cloud-providers/osdu-gcp-global.yml"
-
   - project: "osdu/platform/ci-cd-pipelines"
     file: "publishing/pages.yml"
diff --git a/NOTICE b/NOTICE
index dc82209373614b0e5eb2b4e3d7074a1b4de7ff30..349574d8c52c64376986abb1fcf6a83bd2a17138 100644
--- a/NOTICE
+++ b/NOTICE
@@ -17,7 +17,7 @@ The following software have components provided under the terms of this license:
 - Apache Commons CLI (from https://commons.apache.org/proper/commons-cli/)
 - Cobertura (from http://cobertura.sourceforge.net)
 - Default Plexus Container (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-container-default)
-- Plexus Common Utilities (from http://plexus.codehaus.org/plexus-utils)
+- Plexus Common Utilities (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils)
 - oro (from )
 
 ========================================================================
@@ -27,8 +27,8 @@ The following software have components provided under the terms of this license:
 
 - AMQP 1.0 JMS Spring Boot AutoConfiguration (from https://repo1.maven.org/maven2/org/amqphub/spring/amqp-10-jms-spring-boot-autoconfigure)
 - AMQP 1.0 JMS Spring Boot Starter (from https://repo1.maven.org/maven2/org/amqphub/spring/amqp-10-jms-spring-boot-starter)
-- ASM based accessors helper used by json-smart (from )
-- ASM based accessors helper used by json-smart (from )
+- ASM based accessors helper used by json-smart (from https://urielch.github.io/)
+- ASM based accessors helper used by json-smart (from https://urielch.github.io/)
 - AWS Java SDK for AWS Amplify (from https://aws.amazon.com/sdkforjava)
 - AWS Java SDK for AWS App Mesh (from https://aws.amazon.com/sdkforjava)
 - AWS Java SDK for AWS AppSync (from https://aws.amazon.com/sdkforjava)
@@ -288,67 +288,61 @@ The following software have components provided under the terms of this license:
 - AWS SDK for Java - Core (from https://aws.amazon.com/sdkforjava)
 - AWS SDK for Java - Models (from https://aws.amazon.com/sdkforjava)
 - Adapter: RxJava (from https://repo1.maven.org/maven2/com/squareup/retrofit2/adapter-rxjava)
-- Apache Ant + JUnit (from https://ant.apache.org/)
+- Apache Ant + JUnit (from http://ant.apache.org/)
 - Apache Ant Core (from )
 - Apache Ant Launcher (from http://ant.apache.org/)
 - Apache Commons BeanUtils (from http://commons.apache.org/proper/commons-beanutils/)
 - Apache Commons CLI (from https://commons.apache.org/proper/commons-cli/)
 - Apache Commons Codec (from https://commons.apache.org/proper/commons-codec/)
 - Apache Commons Codec (from https://commons.apache.org/proper/commons-codec/)
+- Apache Commons Codec (from https://commons.apache.org/proper/commons-codec/)
 - Apache Commons Collections (from http://commons.apache.org/proper/commons-collections/)
 - Apache Commons Lang (from http://commons.apache.org/proper/commons-lang/)
+- Apache Commons Lang (from http://commons.apache.org/proper/commons-lang/)
 - Apache Commons Text (from http://commons.apache.org/proper/commons-text)
-- Apache Commons Validator (from http://commons.apache.org/proper/commons-validator/)
 - Apache Geronimo JMS Spec 2.0 (from http://geronimo.apache.org/maven/${siteId}/${version})
 - Apache Groovy (from https://groovy-lang.org)
-- Apache Groovy (from https://groovy-lang.org)
-- Apache Groovy (from https://groovy-lang.org)
+- Apache HTTP transport v2 for the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-apache-v2)
 - Apache HTTP transport v2 for the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-apache-v2)
 - Apache HttpClient Cache (from http://hc.apache.org/httpcomponents-client)
+- Apache HttpCore (from http://hc.apache.org/httpcomponents-core-ga)
+- Apache Log4j API (from https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api)
 - Apache Log4j API (from https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api)
 - Apache Log4j Core (from https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core)
 - Apache Log4j JUL Adapter (from https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-jul)
 - Apache Log4j SLF4J Binding (from https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl)
 - Apache Log4j to SLF4J Adapter (from https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-to-slf4j)
-- Apache Maven Invoker (from https://repo1.maven.org/maven2/org/apache/maven/shared/maven-invoker)
+- Apache Log4j to SLF4J Adapter (from https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-to-slf4j)
+- Apache Maven Wagon :: API (from https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-provider-api)
 - Apache Maven Wagon :: Providers :: HTTP Shared Library (from https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-http-shared)
 - Apache Maven Wagon :: Providers :: Lightweight HTTP Provider (from https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-http-lightweight)
 - Apache Maven Wagon :: Providers :: SSH Common Library (from https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-ssh-common)
 - Apache Maven Wagon :: Providers :: SSH External Provider (from https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-ssh-external)
-- Apache Velocity (from http://velocity.apache.org/engine/releases/velocity-1.6.2/)
+- Apache Maven Wagon :: Providers :: SSH Provider (from https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-ssh)
+- Apache Velocity (from http://velocity.apache.org/engine/releases/velocity-1.6.1/)
+- AssertJ fluent assertions (from https://repo1.maven.org/maven2/org/assertj/assertj-core)
 - AssertJ fluent assertions (from https://repo1.maven.org/maven2/org/assertj/assertj-core)
 - Asynchronous Http Client (from https://repo1.maven.org/maven2/org/asynchttpclient/async-http-client)
 - Asynchronous Http Client Netty Utils (from https://repo1.maven.org/maven2/org/asynchttpclient/async-http-client-netty-utils)
-- AutoValue Annotations (from https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations)
+- AutoValue Annotations (from https://github.com/google/auto/tree/master/value)
 - Azure Spring Boot Starter for Azure AD Spring Security Integration (from https://github.com/Azure/azure-sdk-for-java)
 - BSON (from https://bsonspec.org)
 - Bean Validation API (from http://beanvalidation.org)
+- Brave (from https://repo1.maven.org/maven2/io/zipkin/brave/brave)
 - Brave Instrumentation: Http Adapters (from https://repo1.maven.org/maven2/io/zipkin/brave/brave-instrumentation-http)
 - Brave instrumentation for Reactor Netty HTTP (from https://github.com/reactor/reactor-netty)
 - Byte Buddy (without dependencies) (from )
-- Byte Buddy agent (from https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent)
-- ClassMate (from http://github.com/cowtowncoder/java-classmate)
-- Cloud Key Management Service (KMS) API v1-rev59-1.24.1 (from https://repo1.maven.org/maven2/com/google/apis/google-api-services-cloudkms)
-- Cloud Storage JSON API v1-rev100-1.22.0 (from https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage)
-- CloudWatch Metrics for AWS Java SDK (from https://aws.amazon.com/sdkforjava)
-- Cobertura (from http://cobertura.sourceforge.net)
-- Collections (from https://repo1.maven.org/maven2/commons-collections/commons-collections)
-- Commons Logging (from http://commons.apache.org/logging/)
-- Commons Logging (from http://commons.apache.org/logging/)
-- Converter: Jackson (from https://github.com/square/retrofit)
-- Core Reactor components (from https://github.com/reactor/reactor)
-- Core functionality for the Reactor Netty library (from https://github.com/reactor/reactor-netty)
 - Byte Buddy Java agent (from https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent)
 - ClassMate (from http://github.com/cowtowncoder/java-classmate)
 - Cloud Key Management Service (KMS) API v1-rev88-1.25.0 (from https://repo1.maven.org/maven2/com/google/apis/google-api-services-cloudkms)
 - Cloud Storage JSON API v1-rev20211201-1.32.1 (from https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage)
+- Cloud Storage JSON API v1-rev20211201-1.32.1 (from https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage)
 - CloudWatch Metrics for AWS Java SDK (from https://aws.amazon.com/sdkforjava)
 - Cobertura (from http://cobertura.sourceforge.net)
 - Commons Logging (from http://commons.apache.org/logging/)
 - Commons Logging (from http://commons.apache.org/logging/)
 - Converter: Jackson (from https://github.com/square/retrofit)
 - Core functionality for the Reactor Netty library (from https://github.com/reactor/reactor-netty)
-- Decoration Model (from http://maven.apache.org/doxia/doxia-sitetools/doxia-decoration-model/)
 - Default Plexus Container (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-container-default)
 - Digester (from https://repo1.maven.org/maven2/commons-digester/commons-digester)
 - Doxia :: APT Module (from https://repo1.maven.org/maven2/org/apache/maven/doxia/doxia-module-apt)
@@ -361,29 +355,45 @@ The following software have components provided under the terms of this license:
 - Doxia Sitetools :: Site Renderer (from https://repo1.maven.org/maven2/org/apache/maven/doxia/doxia-site-renderer)
 - FindBugs-jsr305 (from http://findbugs.sourceforge.net/)
 - GSON extensions to the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-gson)
+- GSON extensions to the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-gson)
 - Google APIs Client Library for Java (from https://repo1.maven.org/maven2/com/google/api-client/google-api-client)
 - Google App Engine extensions to the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine)
+- Google App Engine extensions to the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine)
+- Google Cloud Core (from https://github.com/googleapis/java-core)
 - Google Cloud Core (from https://github.com/googleapis/java-core)
 - Google Cloud Core HTTP (from https://github.com/googleapis/java-core)
-- Google Cloud Core gRPC (from https://github.com/googleapis/java-core)
+- Google Cloud Core HTTP (from https://github.com/googleapis/java-core)
+- Google Cloud Core gRPC (from https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-core-grpc)
+- Google Cloud Core gRPC (from https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-core-grpc)
+- Google Cloud Datastore (from https://github.com/googleapis/java-datastore)
 - Google Cloud Datastore (from https://github.com/googleapis/java-datastore)
 - Google Cloud IAM Service Account Credentials (from https://github.com/googleapis/java-iamcredentials)
-- Google Cloud Logging (from https://github.com/googleapis/java-logging)
+- Google Cloud IAM Service Account Credentials (from https://github.com/googleapis/java-iamcredentials)
+- Google Cloud Logging (from https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-logging)
+- Google Cloud Logging (from https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-logging)
+- Google Cloud Pub/Sub (from https://github.com/googleapis/java-pubsub)
 - Google Cloud Pub/Sub (from https://github.com/googleapis/java-pubsub)
-- Google Cloud Storage (from https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-storage)
-- Google Cloud Storage (from https://github.com/googleapis/java-storage)
+- Google Cloud Storage (from https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-storage)
+- Google Cloud Storage (from https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-storage)
 - Google HTTP Client Library for Java (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client)
 - Google HTTP Client Library for Java (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client)
 - Google OAuth Client Library for Java (from https://repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client)
-- Gson (from http://code.google.com/p/google-gson/)
-- Gson (from http://code.google.com/p/google-gson/)
+- Groovy (from http://groovy.codehaus.org/)
+- Groovy (from http://groovy.codehaus.org/)
+- Groovy (from http://groovy.codehaus.org/)
+- Groovy (from http://groovy.codehaus.org/)
+- Gson (from https://repo1.maven.org/maven2/com/google/code/gson/gson)
+- Gson (from https://repo1.maven.org/maven2/com/google/code/gson/gson)
+- Gson (from https://repo1.maven.org/maven2/com/google/code/gson/gson)
 - Guava InternalFutureFailureAccess and InternalFutures (from https://repo1.maven.org/maven2/com/google/guava/failureaccess)
-- Guava: Google Core Libraries for Java (from https://github.com/google/guava)
-- Guava: Google Core Libraries for Java (from https://github.com/google/guava)
+- Guava: Google Core Libraries for Java (from https://repo1.maven.org/maven2/com/google/guava/guava)
+- Guava: Google Core Libraries for Java (from https://repo1.maven.org/maven2/com/google/guava/guava)
+- Guava: Google Core Libraries for Java (from https://repo1.maven.org/maven2/com/google/guava/guava)
 - HTTP functionality for the Reactor Netty library (from https://github.com/reactor/reactor-netty)
 - Hibernate Validator Engine (from https://repo1.maven.org/maven2/org/hibernate/validator/hibernate-validator)
+- Hibernate Validator Engine (from https://repo1.maven.org/maven2/org/hibernate/validator/hibernate-validator)
+- HikariCP (from https://github.com/brettwooldridge/HikariCP)
 - HttpClient (from http://hc.apache.org/httpcomponents-client)
-- HttpCore (from http://hc.apache.org/httpcomponents-core-ga)
 - IBM COS Java SDK for Amazon S3 (from https://github.com/ibm/ibm-cos-sdk-java)
 - IBM COS Java SDK for COS KMS (from https://github.com/ibm/ibm-cos-sdk-java)
 - IBM COS SDK For Java (from https://github.com/ibm/ibm-cos-sdk-java)
@@ -401,17 +411,23 @@ The following software have components provided under the terms of this license:
 - JSONassert (from http://github.com/skyscreamer/yoga)
 - JSR107 API and SPI (from https://github.com/jsr107/jsr107spec)
 - Jackson 2 extensions to the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2)
+- Jackson 2 extensions to the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2)
 - Jackson dataformat: CBOR (from http://github.com/FasterXML/jackson-dataformats-binary)
-- Jackson datatype: Joda (from https://github.com/FasterXML/jackson-datatype-joda)
+- Jackson datatype: JSR310 (from https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310)
+- Jackson datatype: JSR310 (from https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310)
+- Jackson datatype: jdk8 (from )
+- Jackson datatype: jdk8 (from )
 - Jackson module: Afterburner (from https://github.com/FasterXML/jackson-modules-base)
-- Jackson-Datatype-JSR310 (from http://wiki.fasterxml.com/JacksonModuleJSR310)
-- Jackson-annotations (from http://github.com/FasterXML/jackson)
+- Jackson module: Old JAXB Annotations (javax.xml.bind) (from https://github.com/FasterXML/jackson-modules-base)
+- Jackson-annotations (from http://wiki.fasterxml.com/JacksonHome)
+- Jackson-annotations (from http://wiki.fasterxml.com/JacksonHome)
 - Jackson-core (from https://github.com/FasterXML/jackson-core)
-- Jackson-dataformat-XML (from http://wiki.fasterxml.com/JacksonExtensionXmlDataBinding)
-- Jackson-dataformat-YAML (from https://github.com/FasterXML/jackson)
+- Jackson-core (from https://github.com/FasterXML/jackson-core)
+- Jackson-dataformat-XML (from https://github.com/FasterXML/jackson-dataformat-xml)
+- Jackson-dataformat-YAML (from https://github.com/FasterXML/jackson-dataformats-text)
+- Jackson-dataformat-YAML (from https://github.com/FasterXML/jackson-dataformats-text)
 - Jackson-datatype-Joda (from http://wiki.fasterxml.com/JacksonModuleJoda)
-- Jackson-datatype-jdk8 (from )
-- Jackson-module-JAXB-annotations (from http://github.com/FasterXML/jackson-module-jaxb-annotations)
+- Jackson-module-parameter-names (from )
 - Jackson-module-parameter-names (from )
 - Jakarta Bean Validation API (from https://beanvalidation.org)
 - Jakarta Expression Language 4.0 (from https://projects.eclipse.org/projects/ee4j.el)
@@ -420,9 +436,11 @@ The following software have components provided under the terms of this license:
 - Java Native Access Platform (from https://github.com/java-native-access/jna)
 - Java Servlet API (from http://servlet-spec.java.net)
 - Java UUID Generator (from http://wiki.fasterxml.com/JugHome)
+- Java client for the RabbitMQ HTTP API (from https://github.com/rabbitmq/hop)
 - Javassist (from http://www.javassist.org/)
 - Javassist (from http://www.javassist.org/)
 - JetBrains Java Annotations (from https://github.com/JetBrains/java-annotations)
+- JetBrains Java Annotations (from https://github.com/JetBrains/java-annotations)
 - Jetty Server (from https://repo1.maven.org/maven2/org/mortbay/jetty/jetty)
 - Jetty Utilities (from https://repo1.maven.org/maven2/org/mortbay/jetty/jetty-util)
 - Joda-Time (from http://www.joda.org/joda-time/)
@@ -434,6 +452,7 @@ The following software have components provided under the terms of this license:
 - KeePassJava2 :: KDB (from https://repo1.maven.org/maven2/org/linguafranca/pwdb/KeePassJava2-kdb)
 - KeePassJava2 :: KDBX (from https://repo1.maven.org/maven2/org/linguafranca/pwdb/KeePassJava2-kdbx)
 - KeePassJava2 :: Simple (from https://repo1.maven.org/maven2/org/linguafranca/pwdb/KeePassJava2-simple)
+- Kotlin Stdlib Common (from https://kotlinlang.org/)
 - Lang (from https://repo1.maven.org/maven2/commons-lang/commons-lang)
 - Lang (from https://repo1.maven.org/maven2/commons-lang/commons-lang)
 - Logback Contrib :: JSON :: Classic (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-classic)
@@ -451,232 +470,259 @@ The following software have components provided under the terms of this license:
 - Maven Plugin Descriptor Model (from https://repo1.maven.org/maven2/org/apache/maven/maven-plugin-descriptor)
 - Maven Plugin Parameter Documenter API (from https://repo1.maven.org/maven2/org/apache/maven/maven-plugin-parameter-documenter)
 - Maven Plugin Registry Model (from https://repo1.maven.org/maven2/org/apache/maven/maven-plugin-registry)
+- Maven Process Invoker (from https://repo1.maven.org/maven2/org/apache/maven/shared/maven-invoker)
 - Maven Profile Model (from https://repo1.maven.org/maven2/org/apache/maven/maven-profile)
 - Maven Project Builder (from https://repo1.maven.org/maven2/org/apache/maven/maven-project)
 - Maven Reporting Implementation (from https://repo1.maven.org/maven2/org/apache/maven/reporting/maven-reporting-impl)
 - Maven Repository Metadata Model (from https://repo1.maven.org/maven2/org/apache/maven/maven-repository-metadata)
-- Maven Wagon API (from https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-provider-api)
 - Maven Wagon File Provider (from https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-file)
-- Maven Wagon SSH Provider (from https://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-ssh)
 - Metrics Core (from )
-- Microsoft Application Insights Java SDK Core (from https://github.com/Microsoft/ApplicationInsights-Java)
 - Microsoft Application Insights Java SDK Spring Boot starter (from https://github.com/Microsoft/ApplicationInsights-Java)
 - Microsoft Application Insights Java SDK Web Module (from https://github.com/Microsoft/ApplicationInsights-Java)
 - Microsoft Application Insights Log4j 2 Appender (from https://github.com/Microsoft/ApplicationInsights-Java)
 - Microsoft Azure Java Core Library (from https://github.com/Azure/azure-sdk-for-java)
 - Microsoft Azure Netty HTTP Client Library (from https://github.com/Azure/azure-sdk-for-java)
 - Microsoft Azure SDK for SQL API of Azure Cosmos DB Service (from https://github.com/Azure/azure-sdk-for-java)
-- Mockito (from http://mockito.org)
-- Mockito (from http://mockito.org)
 - Mojo's Maven plugin for Cobertura (from http://mojo.codehaus.org/cobertura-maven-plugin/)
 - MongoDB Driver (from http://www.mongodb.org)
 - MongoDB Java Driver Core (from http://www.mongodb.org)
 - Netty/Buffer (from https://repo1.maven.org/maven2/io/netty/netty-buffer)
+- Netty/Buffer (from https://repo1.maven.org/maven2/io/netty/netty-buffer)
+- Netty/Codec (from https://repo1.maven.org/maven2/io/netty/netty-codec)
 - Netty/Codec (from https://repo1.maven.org/maven2/io/netty/netty-codec)
 - Netty/Codec/DNS (from https://repo1.maven.org/maven2/io/netty/netty-codec-dns)
 - Netty/Codec/HTTP (from https://repo1.maven.org/maven2/io/netty/netty-codec-http)
 - Netty/Codec/HTTP2 (from https://repo1.maven.org/maven2/io/netty/netty-codec-http2)
 - Netty/Codec/Socks (from https://repo1.maven.org/maven2/io/netty/netty-codec-socks)
 - Netty/Common (from https://repo1.maven.org/maven2/io/netty/netty-common)
+- Netty/Common (from https://repo1.maven.org/maven2/io/netty/netty-common)
+- Netty/Handler (from https://repo1.maven.org/maven2/io/netty/netty-handler)
 - Netty/Handler (from https://repo1.maven.org/maven2/io/netty/netty-handler)
 - Netty/Handler/Proxy (from https://repo1.maven.org/maven2/io/netty/netty-handler-proxy)
 - Netty/Resolver (from https://repo1.maven.org/maven2/io/netty/netty-resolver)
+- Netty/Resolver (from https://repo1.maven.org/maven2/io/netty/netty-resolver)
 - Netty/Resolver/DNS (from https://repo1.maven.org/maven2/io/netty/netty-resolver-dns)
 - Netty/Resolver/DNS/Classes/MacOS (from https://repo1.maven.org/maven2/io/netty/netty-resolver-dns-classes-macos)
 - Netty/TomcatNative [BoringSSL - Static] (from https://repo1.maven.org/maven2/io/netty/netty-tcnative-boringssl-static)
 - Netty/Transport (from https://repo1.maven.org/maven2/io/netty/netty-transport)
+- Netty/Transport (from https://repo1.maven.org/maven2/io/netty/netty-transport)
 - Netty/Transport/Classes/Epoll (from https://repo1.maven.org/maven2/io/netty/netty-transport-classes-epoll)
 - Netty/Transport/Classes/KQueue (from https://repo1.maven.org/maven2/io/netty/netty-transport-classes-kqueue)
 - Netty/Transport/Native/Unix/Common (from https://repo1.maven.org/maven2/io/netty/netty-transport-native-unix-common)
 - Nimbus Content Type (from https://bitbucket.org/connect2id/nimbus-content-type)
 - Nimbus JOSE+JWT (from https://bitbucket.org/connect2id/nimbus-jose-jwt)
+- Nimbus JOSE+JWT (from https://bitbucket.org/connect2id/nimbus-jose-jwt)
 - Nimbus LangTag (from https://bitbucket.org/connect2id/nimbus-language-tags)
+- Nimbus LangTag (from https://bitbucket.org/connect2id/nimbus-language-tags)
+- Non-Blocking Reactive Foundation for the JVM (from https://github.com/reactor/reactor-core)
+- OAuth 2.0 SDK with OpenID Connect extensions (from https://bitbucket.org/connect2id/oauth-2.0-sdk-with-openid-connect-extensions)
 - OAuth 2.0 SDK with OpenID Connect extensions (from https://bitbucket.org/connect2id/oauth-2.0-sdk-with-openid-connect-extensions)
 - Objenesis (from http://objenesis.org)
 - Objenesis (from http://objenesis.org)
-- OkHttp (from https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp)
-- OkHttp Logging Interceptor (from https://repo1.maven.org/maven2/com/squareup/okhttp3/logging-interceptor)
+- OkHttp URLConnection (from https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp-urlconnection)
+- Okio (from https://github.com/square/okio/)
 - Okio (from https://github.com/square/okio/)
 - OpenCensus (from https://github.com/census-instrumentation/opencensus-java)
 - OpenCensus (from https://github.com/census-instrumentation/opencensus-java)
 - OpenCensus (from https://github.com/census-instrumentation/opencensus-java)
 - OpenCensus (from https://github.com/census-instrumentation/opencensus-java)
 - PWDB :: Database (from https://repo1.maven.org/maven2/org/linguafranca/pwdb/database)
-- Plexus Common Utilities (from http://plexus.codehaus.org/plexus-utils)
+- Plexus Common Utilities (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils)
 - Plexus Velocity Component (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-velocity)
-- PowerMock (from http://www.powermock.org)
-- PowerMock (from http://www.powermock.org)
-- PowerMock (from http://www.powermock.org)
+- PostgreSQL JDBC Driver (from )
+- Protocol Buffer extensions to the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-protobuf)
 - Protocol Buffer extensions to the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-protobuf)
 - Proton-J (from https://repo1.maven.org/maven2/org/apache/qpid/proton-j)
+- Proton-J (from https://repo1.maven.org/maven2/org/apache/qpid/proton-j)
 - QUIC functionality for the Reactor Netty library (from https://github.com/reactor/reactor-netty)
 - QpidJMS Client (from https://repo1.maven.org/maven2/org/apache/qpid/qpid-jms-client)
-- RabbitMQ Java Client (from https://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
 - RabbitMQ Java Client (from http://www.rabbitmq.com)
 - Reactor Netty with all modules (from https://github.com/reactor/reactor-netty)
 - Retrofit (from https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit)
 - Servlet Specification 2.5 API (from https://repo1.maven.org/maven2/org/mortbay/jetty/servlet-api-2.5)
-- SnakeYAML (from http://code.google.com/p/snakeyaml/)
+- Simple XML (safe) (from https://github.com/dweiss/simplexml)
+- SnakeYAML (from https://bitbucket.org/snakeyaml/snakeyaml)
 - Spring AOP (from https://github.com/spring-projects/spring-framework)
 - Spring Beans (from https://github.com/spring-projects/spring-framework)
 - Spring Boot (from http://projects.spring.io/spring-boot/)
+- Spring Boot (from http://projects.spring.io/spring-boot/)
+- Spring Boot AOP Starter (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-aop)
+- Spring Boot Actuator (from http://projects.spring.io/spring-boot/)
 - Spring Boot Actuator (from http://projects.spring.io/spring-boot/)
-- Spring Boot Actuator AutoConfigure (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-actuator-autoconfigure)
-- Spring Boot Actuator Starter (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-actuator)
+- Spring Boot Actuator Starter (from http://projects.spring.io/spring-boot/)
+- Spring Boot Actuator Starter (from http://projects.spring.io/spring-boot/)
 - Spring Boot AutoConfigure (from http://projects.spring.io/spring-boot/)
+- Spring Boot AutoConfigure (from http://projects.spring.io/spring-boot/)
+- Spring Boot Data MongoDB Starter (from http://projects.spring.io/spring-boot/)
+- Spring Boot Dependencies (from http://projects.spring.io/spring-boot/)
 - Spring Boot Log4j 2 Starter (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-log4j2)
-- Spring Boot Logger Starter (from http://projects.spring.io/spring-boot/)
+- Spring Boot Logging Starter (from http://projects.spring.io/spring-boot/)
+- Spring Boot Logging Starter (from http://projects.spring.io/spring-boot/)
+- Spring Boot Security Starter (from http://projects.spring.io/spring-boot/)
 - Spring Boot Security Starter (from http://projects.spring.io/spring-boot/)
 - Spring Boot Starter (from http://projects.spring.io/spring-boot/)
-- Spring Boot Actuator (from http://projects.spring.io/spring-boot/)
-- Spring Boot Reactor Netty Starter (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-reactor-netty)
-- Spring Boot Test (from http://projects.spring.io/spring-boot/)
-- Spring Boot Test Auto-Configure (from http://projects.spring.io/spring-boot/)
+- Spring Boot Starter (from http://projects.spring.io/spring-boot/)
 - Spring Boot Test Starter (from http://projects.spring.io/spring-boot/)
+- Spring Boot Test Starter (from http://projects.spring.io/spring-boot/)
+- Spring Boot Validation Starter (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-validation)
 - Spring Boot Validation Starter (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-validation)
 - Spring Boot Web Starter (from http://projects.spring.io/spring-boot/)
-- Spring Boot WebFlux Starter (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-webflux)
+- Spring Boot Web Starter (from http://projects.spring.io/spring-boot/)
 - Spring Commons Logging Bridge (from https://github.com/spring-projects/spring-framework)
 - Spring Context (from https://github.com/spring-projects/spring-framework)
 - Spring Core (from https://github.com/spring-projects/spring-framework)
 - Spring Data Core (from https://repo1.maven.org/maven2/org/springframework/data/spring-data-commons)
 - Spring Data MongoDB - Core (from https://repo1.maven.org/maven2/org/springframework/data/spring-data-mongodb)
 - Spring Expression Language (SpEL) (from https://github.com/spring-projects/spring-framework)
+- Spring JDBC (from https://github.com/spring-projects/spring-framework)
 - Spring JMS (from https://github.com/spring-projects/spring-framework)
 - Spring Messaging (from https://github.com/spring-projects/spring-framework)
 - Spring Plugin - Metadata Extension (from https://repo1.maven.org/maven2/org/springframework/plugin/spring-plugin-metadata)
 - Spring Plugin Core (from https://repo1.maven.org/maven2/org/springframework/plugin/spring-plugin-core)
-- Spring Security - Core (from https://repo1.maven.org/maven2/org/springframework/security/spring-security-core)
-- Spring Security - Namespace Configuration Module (from https://repo1.maven.org/maven2/org/springframework/security/spring-security-config)
-- Spring Security - Web Application Security Module (from https://repo1.maven.org/maven2/org/springframework/security/spring-security-web)
 - Spring TestContext Framework (from https://github.com/spring-projects/spring-framework)
 - Spring Transaction (from https://github.com/spring-projects/spring-framework)
-- Spring TestContext Framework (from https://github.com/SpringSource/spring-framework)
-- Spring Transaction (from https://github.com/SpringSource/spring-framework)
 - Spring Web (from https://github.com/spring-projects/spring-framework)
 - Spring Web MVC (from https://github.com/spring-projects/spring-framework)
 - Spring WebFlux (from https://github.com/spring-projects/spring-framework)
-- Vavr (from http://vavr.io)
 - Vavr Match (from http://vavr.io)
 - Woodstox (from )
 - Zipkin Core Library (from https://repo1.maven.org/maven2/io/zipkin/zipkin2/zipkin)
 - Zipkin Reporter Brave (from https://repo1.maven.org/maven2/io/zipkin/reporter2/zipkin-reporter-brave)
 - Zipkin Reporter: Core (from https://repo1.maven.org/maven2/io/zipkin/reporter2/zipkin-reporter)
 - aalto-xml (from https://repo1.maven.org/maven2/com/fasterxml/aalto-xml)
-- brave (from https://repo1.maven.org/maven2/io/zipkin/brave/brave)
-- brave (from https://github.com/kristofa/brave)
 - commons-collections (from https://repo1.maven.org/maven2/commons-collections/commons-collections)
 - commons-io (from https://repo1.maven.org/maven2/commons-io/commons-io)
+- commons-validator (from https://repo1.maven.org/maven2/commons-validator/commons-validator)
+- datastore-v1-proto-client (from https://repo1.maven.org/maven2/com/google/cloud/datastore/datastore-v1-proto-client)
 - datastore-v1-proto-client (from https://repo1.maven.org/maven2/com/google/cloud/datastore/datastore-v1-proto-client)
 - error-prone annotations (from https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations)
 - error-prone annotations (from https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations)
 - error-prone annotations (from https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations)
 - io.grpc:grpc-alts (from https://github.com/grpc/grpc-java)
+- io.grpc:grpc-alts (from https://github.com/grpc/grpc-java)
+- io.grpc:grpc-api (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-api (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-auth (from https://github.com/grpc/grpc-java)
+- io.grpc:grpc-auth (from https://github.com/grpc/grpc-java)
+- io.grpc:grpc-context (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-context (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-context (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-core (from https://github.com/grpc/grpc-java)
+- io.grpc:grpc-core (from https://github.com/grpc/grpc-java)
+- io.grpc:grpc-grpclb (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-grpclb (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-netty-shaded (from https://github.com/grpc/grpc-java)
+- io.grpc:grpc-netty-shaded (from https://github.com/grpc/grpc-java)
+- io.grpc:grpc-protobuf (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-protobuf (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-protobuf-lite (from https://github.com/grpc/grpc-java)
+- io.grpc:grpc-protobuf-lite (from https://github.com/grpc/grpc-java)
+- io.grpc:grpc-stub (from https://github.com/grpc/grpc-java)
 - io.grpc:grpc-stub (from https://github.com/grpc/grpc-java)
 - ion-java (from https://github.com/amznlabs/ion-java/)
 - ion-java (from https://github.com/amznlabs/ion-java/)
-- jackson-databind (from http://github.com/FasterXML/jackson)
+- jackson-databind (from http://wiki.fasterxml.com/JacksonHome)
+- jackson-databind (from http://wiki.fasterxml.com/JacksonHome)
 - java-cloudant (from https://cloudant.com)
 - java-cloudant (from https://cloudant.com)
 - javatuples (from http://www.javatuples.org)
 - javax.inject (from http://code.google.com/p/atinject/)
 - jose4j (from https://bitbucket.org/b_c/jose4j/)
-- lettuce (from http://github.com/mp911de/lettuce)
-- maven-reporting-api (from https://repo1.maven.org/maven2/org/apache/maven/reporting/maven-reporting-api)
-- micrometer-core (from https://github.com/micrometer-metrics/micrometer)
-- micrometer-registry-azure-monitor (from https://github.com/micrometer-metrics/micrometer)
 - json-path (from http://code.google.com/p/json-path/)
-- lettuce (from http://github.com/lettuce-io/lettuce-core)
+- json-path (from http://code.google.com/p/json-path/)
+- kotlin-stdlib (from https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib)
+- lettuce (from http://github.com/mp911de/lettuce/wiki)
 - maven-reporting-api (from https://repo1.maven.org/maven2/org/apache/maven/reporting/maven-reporting-api)
 - micrometer-core (from https://github.com/micrometer-metrics/micrometer)
+- micrometer-core (from https://github.com/micrometer-metrics/micrometer)
 - micrometer-registry-azure-monitor (from https://github.com/micrometer-metrics/micrometer)
-- mockito-core (from http://mockito.org)
-- mockito-core (from http://mockito.org)
+- minio (from https://github.com/minio/minio-java)
+- mockito-core (from https://github.com/mockito/mockito)
+- mockito-core (from https://github.com/mockito/mockito)
+- okhttp (from https://square.github.io/okhttp/)
+- okhttp (from https://square.github.io/okhttp/)
 - okhttp-logging-interceptor (from https://square.github.io/okhttp/)
-- okhttp-urlconnection (from https://square.github.io/okhttp/)
 - org.apiguardian:apiguardian-api (from https://github.com/apiguardian-team/apiguardian)
 - org.conscrypt:conscrypt-openjdk-uber (from https://conscrypt.org/)
 - org.opentest4j:opentest4j (from https://github.com/ota4j-team/opentest4j)
-- org.xmlunit:xmlunit-core (from https://www.xmlunit.org/)
+- org.xmlunit:xmlunit-core (from http://www.xmlunit.org/)
+- org.xmlunit:xmlunit-core (from http://www.xmlunit.org/)
 - perfmark:perfmark-api (from https://github.com/perfmark/perfmark)
-- powermock-api-support (from https://repo1.maven.org/maven2/org/powermock/powermock-api-support)
-- powermock-core (from http://www.powermock.org)
-- powermock-reflect (from https://repo1.maven.org/maven2/org/powermock/powermock-reflect)
-- project ':json-path' (from https://github.com/jayway/JsonPath)
 - powermock-api-mockito2 (from https://repo1.maven.org/maven2/org/powermock/powermock-api-mockito2)
 - powermock-api-support (from https://repo1.maven.org/maven2/org/powermock/powermock-api-support)
 - powermock-core (from http://www.powermock.org)
+- powermock-module-junit4 (from http://www.powermock.org)
+- powermock-module-junit4-common (from https://repo1.maven.org/maven2/org/powermock/powermock-module-junit4-common)
 - powermock-reflect (from https://repo1.maven.org/maven2/org/powermock/powermock-reflect)
-- proto-google-cloud-datastore-v1 (from https://github.com/googleapis/java-datastore/proto-google-cloud-datastore-v1)
+- proto-google-cloud-datastore-v1 (from https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-datastore-v1)
+- proto-google-cloud-datastore-v1 (from https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-datastore-v1)
+- proto-google-cloud-iamcredentials-v1 (from https://github.com/googleapis/java-iamcredentials/proto-google-cloud-iamcredentials-v1)
 - proto-google-cloud-iamcredentials-v1 (from https://github.com/googleapis/java-iamcredentials/proto-google-cloud-iamcredentials-v1)
-- proto-google-cloud-logging-v2 (from https://github.com/googleapis/java-logging/proto-google-cloud-logging-v2)
+- proto-google-cloud-logging-v2 (from https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-logging-v2)
+- proto-google-cloud-logging-v2 (from https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-logging-v2)
 - proto-google-cloud-pubsub-v1 (from https://github.com/googleapis/java-pubsub/proto-google-cloud-pubsub-v1)
+- proto-google-cloud-pubsub-v1 (from https://github.com/googleapis/java-pubsub/proto-google-cloud-pubsub-v1)
+- proto-google-common-protos (from https://github.com/googleapis/java-iam/proto-google-common-protos)
 - proto-google-common-protos (from https://github.com/googleapis/java-iam/proto-google-common-protos)
 - proto-google-iam-v1 (from https://github.com/googleapis/java-iam/proto-google-iam-v1)
-- resilience4j (from https://resilience4j.readme.io)
-- resilience4j (from https://resilience4j.readme.io)
-- resilience4j (from https://resilience4j.readme.io)
+- proto-google-iam-v1 (from https://github.com/googleapis/java-iam/proto-google-iam-v1)
+- resilience4j (from https://github.com/resilience4j/resilience4j)
+- resilience4j (from https://github.com/resilience4j/resilience4j)
 - resilience4j (from https://github.com/resilience4j/resilience4j)
 - resilience4j (from https://github.com/resilience4j/resilience4j)
-- resilience4j (from https://resilience4j.readme.io)
 - resilience4j (from https://github.com/resilience4j/resilience4j)
 - resilience4j (from https://github.com/resilience4j/resilience4j)
-- resilience4j (from https://resilience4j.readme.io)
-- resilience4j (from https://resilience4j.readme.io)
-- resilience4j (from https://resilience4j.readme.io)
-- rxjava (from https://github.com/ReactiveX/RxJava)
-- spring-boot-dependencies (from https://spring.io/projects/spring-boot)
-- spring-boot-starter-aop (from https://spring.io/projects/spring-boot)
-- spring-boot-starter-data-mongodb (from https://spring.io/projects/spring-boot)
-- spring-boot-starter-json (from https://spring.io/projects/spring-boot)
-- spring-boot-starter-reactor-netty (from https://spring.io/projects/spring-boot)
-- spring-boot-starter-webflux (from https://spring.io/projects/spring-boot)
-- spring-boot-test (from https://spring.io/projects/spring-boot)
-- spring-boot-test-autoconfigure (from https://spring.io/projects/spring-boot)
 - resilience4j (from https://github.com/resilience4j/resilience4j)
 - resilience4j (from https://github.com/resilience4j/resilience4j)
-- resilience4j (from https://resilience4j.readme.io)
 - rxjava (from https://github.com/ReactiveX/RxJava)
-- spring-boot (from https://spring.io/projects/spring-boot)
 - spring-boot-actuator-autoconfigure (from https://spring.io/projects/spring-boot)
-- spring-boot-autoconfigure (from https://spring.io/projects/spring-boot)
-- spring-boot-dependencies (from https://spring.io/projects/spring-boot)
-- spring-boot-starter (from https://spring.io/projects/spring-boot)
-- spring-boot-starter-actuator (from https://spring.io/projects/spring-boot)
-- spring-boot-starter-aop (from https://spring.io/projects/spring-boot)
-- spring-boot-starter-data-mongodb (from https://spring.io/projects/spring-boot)
+- spring-boot-actuator-autoconfigure (from https://spring.io/projects/spring-boot)
+- spring-boot-starter-jdbc (from https://spring.io/projects/spring-boot)
 - spring-boot-starter-json (from https://spring.io/projects/spring-boot)
-- spring-boot-starter-log4j2 (from https://spring.io/projects/spring-boot)
-- spring-boot-starter-logging (from https://spring.io/projects/spring-boot)
-- spring-boot-starter-security (from https://spring.io/projects/spring-boot)
+- spring-boot-starter-json (from https://spring.io/projects/spring-boot)
+- spring-boot-starter-reactor-netty (from https://spring.io/projects/spring-boot)
 - spring-boot-starter-tomcat (from https://spring.io/projects/spring-boot)
+- spring-boot-starter-tomcat (from https://spring.io/projects/spring-boot)
+- spring-boot-starter-webflux (from https://spring.io/projects/spring-boot)
+- spring-boot-test (from https://spring.io/projects/spring-boot)
+- spring-boot-test (from https://spring.io/projects/spring-boot)
+- spring-boot-test-autoconfigure (from https://spring.io/projects/spring-boot)
+- spring-boot-test-autoconfigure (from https://spring.io/projects/spring-boot)
+- spring-security-config (from http://spring.io/spring-security)
+- spring-security-config (from http://spring.io/spring-security)
+- spring-security-core (from http://spring.io/spring-security)
+- spring-security-core (from http://spring.io/spring-security)
+- spring-security-crypto (from http://spring.io/spring-security)
 - spring-security-oauth2-client (from https://spring.io/projects/spring-security)
 - spring-security-oauth2-core (from https://spring.io/projects/spring-security)
 - spring-security-oauth2-jose (from https://spring.io/projects/spring-security)
-- spring-security-oauth2-resource-server (from https://spring.io/projects/spring-security)
 - spring-security-test (from https://spring.io/spring-security)
+- spring-security-test (from https://spring.io/spring-security)
+- spring-security-web (from http://spring.io/spring-security)
+- spring-security-web (from http://spring.io/spring-security)
+- springfox-bean-validators (from https://github.com/springfox/springfox)
+- springfox-boot-starter (from https://github.com/springfox/springfox)
 - springfox-core (from https://github.com/springfox/springfox)
+- springfox-data-rest (from https://github.com/springfox/springfox)
+- springfox-oas (from https://github.com/springfox/springfox)
 - springfox-schema (from https://github.com/springfox/springfox)
 - springfox-spi (from https://github.com/springfox/springfox)
 - springfox-spring-web (from https://github.com/springfox/springfox)
+- springfox-spring-webflux (from https://github.com/springfox/springfox)
+- springfox-spring-webmvc (from https://github.com/springfox/springfox)
 - springfox-swagger-common (from https://github.com/springfox/springfox)
 - springfox-swagger-ui (from https://github.com/springfox/springfox)
 - springfox-swagger2 (from https://github.com/springfox/springfox)
 - swagger-annotations (from https://repo1.maven.org/maven2/io/swagger/swagger-annotations)
+- swagger-annotations (from https://repo1.maven.org/maven2/io/swagger/core/v3/swagger-annotations)
 - swagger-jaxrs (from https://repo1.maven.org/maven2/io/swagger/swagger-jaxrs)
+- swagger-models (from https://repo1.maven.org/maven2/io/swagger/core/v3/swagger-models)
 - swagger-models (from https://repo1.maven.org/maven2/io/swagger/swagger-models)
 - tomcat-embed-core (from http://tomcat.apache.org/)
+- tomcat-embed-el (from https://tomcat.apache.org/)
 - tomcat-embed-websocket (from http://tomcat.apache.org/)
-- tomcat-embed-websocket (from https://tomcat.apache.org/)
+- vavr (from https://www.vavr.io)
 - xercesImpl (from https://repo1.maven.org/maven2/xerces/xercesImpl)
 - xml-apis (from )
 
@@ -685,18 +731,23 @@ BSD-2-Clause
 ========================================================================
 The following software have components provided under the terms of this license:
 
+- API Common (from https://github.com/googleapis/api-common-java)
 - API Common (from https://github.com/googleapis/api-common-java)
 - Apache Commons CLI (from https://commons.apache.org/proper/commons-cli/)
 - GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
 - GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
 - GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
+- GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
+- GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
+- GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
 - Hamcrest (from http://hamcrest.org/JavaHamcrest/)
 - Hamcrest Core (from https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core)
 - HdrHistogram (from http://hdrhistogram.github.io/HdrHistogram/)
-- Plexus Common Utilities (from http://plexus.codehaus.org/plexus-utils)
+- Plexus Common Utilities (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils)
+- PostgreSQL JDBC Driver (from )
 - Reflections (from http://code.google.com/p/reflections/)
 - Stax2 API (from )
-- ThreeTen backport (from https://www.threeten.org/threetenbp)
+- ThreeTen backport (from https://github.com/ThreeTen/threetenbp)
 - jaxen (from http://jaxen.codehaus.org/)
 
 ========================================================================
@@ -704,19 +755,27 @@ BSD-3-Clause
 ========================================================================
 The following software have components provided under the terms of this license:
 
+- API Common (from https://github.com/googleapis/api-common-java)
 - API Common (from https://github.com/googleapis/api-common-java)
 - ASM Analysis (from https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis)
 - ASM Tree (from https://repo1.maven.org/maven2/org/ow2/asm/asm-tree)
 - Apache Commons Codec (from https://commons.apache.org/proper/commons-codec/)
 - Apache Commons Codec (from https://commons.apache.org/proper/commons-codec/)
+- Apache Commons Codec (from https://commons.apache.org/proper/commons-codec/)
 - Apache Groovy (from https://groovy-lang.org)
 - AspectJ Weaver (from https://www.eclipse.org/aspectj/)
 - GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
 - GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
 - GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
+- GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
+- GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
+- GAX (Google Api eXtensions) for Java (from https://github.com/googleapis/gax-java)
 - Google APIs Client Library for Java (from https://repo1.maven.org/maven2/com/google/api-client/google-api-client)
 - Google Auth Library for Java - Credentials (from https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials)
+- Google Auth Library for Java - Credentials (from https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials)
+- Google Auth Library for Java - OAuth2 HTTP (from https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http)
 - Google Auth Library for Java - OAuth2 HTTP (from https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http)
+- Groovy (from http://groovy.codehaus.org/)
 - Hamcrest (from http://hamcrest.org/JavaHamcrest/)
 - Hamcrest Core (from https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core)
 - HdrHistogram (from http://hdrhistogram.github.io/HdrHistogram/)
@@ -729,14 +788,16 @@ The following software have components provided under the terms of this license:
 - Microsoft Application Insights Log4j 2 Appender (from https://github.com/Microsoft/ApplicationInsights-Java)
 - Netty/Codec/HTTP (from https://repo1.maven.org/maven2/io/netty/netty-codec-http)
 - Netty/Transport/Classes/KQueue (from https://repo1.maven.org/maven2/io/netty/netty-transport-classes-kqueue)
-- Plexus Common Utilities (from http://plexus.codehaus.org/plexus-utils)
-- Protocol Buffer Java API (from http://code.google.com/p/protobuf)
-- Protocol Buffer Java API (from http://code.google.com/p/protobuf)
+- Plexus Common Utilities (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils)
+- PostgreSQL JDBC Driver (from )
+- Protocol Buffers [Core] (from https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java)
+- Protocol Buffers [Core] (from https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java)
+- Protocol Buffers [Util] (from https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util)
 - Protocol Buffers [Util] (from https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util)
 - Reflections (from http://code.google.com/p/reflections/)
-- SnakeYAML (from http://code.google.com/p/snakeyaml/)
+- SnakeYAML (from https://bitbucket.org/snakeyaml/snakeyaml)
 - Spring Core (from https://github.com/spring-projects/spring-framework)
-- ThreeTen backport (from https://www.threeten.org/threetenbp)
+- ThreeTen backport (from https://github.com/ThreeTen/threetenbp)
 - asm (from )
 - asm (from )
 - asm (from )
@@ -802,18 +863,11 @@ The following software have components provided under the terms of this license:
 
 - AspectJ Weaver (from https://www.eclipse.org/aspectj/)
 - JUnit Jupiter (Aggregator) (from https://junit.org/junit5/)
-- JUnit Jupiter API (from https://junit.org/junit5/)
-- JUnit Jupiter Engine (from https://junit.org/junit5/)
-- JUnit Platform Commons (from https://junit.org/junit5/)
-- JUnit Platform Engine API (from https://junit.org/junit5/)
-- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca)
+- JUnit Jupiter API (from http://junit.org/junit5/)
+- JUnit Jupiter Engine (from http://junit.org/junit5/)
+- JUnit Platform Commons (from http://junit.org/junit5/)
+- JUnit Platform Engine API (from http://junit.org/junit5/)
 - Jakarta Expression Language 4.0 (from https://projects.eclipse.org/projects/ee4j.el)
-- Logback Classic Module (from https://repo1.maven.org/maven2/ch/qos/logback/logback-classic)
-- Logback Contrib :: JSON :: Classic (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-classic)
-- Logback Contrib :: JSON :: Core (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-core)
-- Logback Contrib :: Jackson (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-jackson)
-- Logback Core Module (from https://repo1.maven.org/maven2/ch/qos/logback/logback-core)
-- Microsoft Application Insights Java SDK Core (from https://github.com/Microsoft/ApplicationInsights-Java)
 - Logback Classic Module (from http://logback.qos.ch)
 - Logback Contrib :: JSON :: Classic (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-classic)
 - Logback Contrib :: JSON :: Core (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-core)
@@ -822,7 +876,8 @@ The following software have components provided under the terms of this license:
 - Microsoft Application Insights Java SDK Spring Boot starter (from https://github.com/Microsoft/ApplicationInsights-Java)
 - Microsoft Application Insights Java SDK Web Module (from https://github.com/Microsoft/ApplicationInsights-Java)
 - Microsoft Application Insights Log4j 2 Appender (from https://github.com/Microsoft/ApplicationInsights-Java)
-- SnakeYAML (from http://code.google.com/p/snakeyaml/)
+- SnakeYAML (from https://bitbucket.org/snakeyaml/snakeyaml)
+- jakarta.annotation-api (from https://projects.eclipse.org/projects/ee4j.ca)
 - org.junit.jupiter:junit-jupiter-params (from http://junit.org/junit5/)
 
 ========================================================================
@@ -831,12 +886,12 @@ EPL-2.0
 The following software have components provided under the terms of this license:
 
 - JUnit Jupiter (Aggregator) (from https://junit.org/junit5/)
-- JUnit Jupiter API (from https://junit.org/junit5/)
-- JUnit Jupiter Engine (from https://junit.org/junit5/)
-- JUnit Platform Commons (from https://junit.org/junit5/)
-- JUnit Platform Engine API (from https://junit.org/junit5/)
-- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca)
+- JUnit Jupiter API (from http://junit.org/junit5/)
+- JUnit Jupiter Engine (from http://junit.org/junit5/)
+- JUnit Platform Commons (from http://junit.org/junit5/)
+- JUnit Platform Engine API (from http://junit.org/junit5/)
 - Jakarta Expression Language 4.0 (from https://projects.eclipse.org/projects/ee4j.el)
+- jakarta.annotation-api (from https://projects.eclipse.org/projects/ee4j.ca)
 - org.junit.jupiter:junit-jupiter-params (from http://junit.org/junit5/)
 
 ========================================================================
@@ -851,7 +906,8 @@ The following software have components provided under the terms of this license:
 - Lang (from https://repo1.maven.org/maven2/commons-lang/commons-lang)
 - Lang (from https://repo1.maven.org/maven2/commons-lang/commons-lang)
 - Mojo's Maven plugin for Cobertura (from http://mojo.codehaus.org/cobertura-maven-plugin/)
-- RabbitMQ Java Client (from https://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
 - javax.annotation-api (from http://jcp.org/en/jsr/detail?id=250)
 - tomcat-embed-core (from http://tomcat.apache.org/)
 
@@ -860,7 +916,7 @@ GPL-2.0-or-later
 ========================================================================
 The following software have components provided under the terms of this license:
 
-- SnakeYAML (from http://code.google.com/p/snakeyaml/)
+- SnakeYAML (from https://bitbucket.org/snakeyaml/snakeyaml)
 
 ========================================================================
 GPL-2.0-with-classpath-exception
@@ -868,11 +924,12 @@ GPL-2.0-with-classpath-exception
 The following software have components provided under the terms of this license:
 
 - Cobertura (from http://cobertura.sourceforge.net)
-- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca)
 - Jakarta Expression Language 4.0 (from https://projects.eclipse.org/projects/ee4j.el)
 - Java Servlet API (from http://servlet-spec.java.net)
 - JavaBeans Activation Framework (from )
-- RabbitMQ Java Client (from https://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
+- jakarta.annotation-api (from https://projects.eclipse.org/projects/ee4j.ca)
 - javax.annotation-api (from http://jcp.org/en/jsr/detail?id=250)
 - tomcat-embed-core (from http://tomcat.apache.org/)
 
@@ -881,10 +938,10 @@ GPL-3.0-only
 ========================================================================
 The following software have components provided under the terms of this license:
 
-- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca)
 - Jakarta Expression Language 4.0 (from https://projects.eclipse.org/projects/ee4j.el)
 - Project Lombok (from https://projectlombok.org)
 - Project Lombok (from https://projectlombok.org)
+- jakarta.annotation-api (from https://projects.eclipse.org/projects/ee4j.ca)
 
 ========================================================================
 JSON
@@ -905,12 +962,6 @@ The following software have components provided under the terms of this license:
 - Javassist (from http://www.javassist.org/)
 - Lang (from https://repo1.maven.org/maven2/commons-lang/commons-lang)
 - Lang (from https://repo1.maven.org/maven2/commons-lang/commons-lang)
-- Logback Classic Module (from https://repo1.maven.org/maven2/ch/qos/logback/logback-classic)
-- Logback Contrib :: JSON :: Classic (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-classic)
-- Logback Contrib :: JSON :: Core (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-core)
-- Logback Contrib :: Jackson (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-jackson)
-- Logback Core Module (from https://repo1.maven.org/maven2/ch/qos/logback/logback-core)
-- Microsoft Application Insights Java SDK Core (from https://github.com/Microsoft/ApplicationInsights-Java)
 - Logback Classic Module (from http://logback.qos.ch)
 - Logback Contrib :: JSON :: Classic (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-classic)
 - Logback Contrib :: JSON :: Core (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-core)
@@ -927,16 +978,18 @@ The following software have components provided under the terms of this license:
 
 - Javassist (from http://www.javassist.org/)
 - Javassist (from http://www.javassist.org/)
-- SnakeYAML (from http://code.google.com/p/snakeyaml/)
+- SnakeYAML (from https://bitbucket.org/snakeyaml/snakeyaml)
 
 ========================================================================
 LGPL-3.0-only
 ========================================================================
 The following software have components provided under the terms of this license:
 
+- Apache Log4j API (from https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api)
 - Apache Log4j API (from https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api)
 - Apache Log4j Core (from https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core)
-- RabbitMQ Java Client (from https://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
 
 ========================================================================
 MIT
@@ -952,8 +1005,11 @@ The following software have components provided under the terms of this license:
 - Azure Java Client Runtime for ARM (from https://github.com/Azure/autorest-clientruntime-for-java)
 - Azure Java Client Runtime for AutoRest (from https://github.com/Azure/autorest-clientruntime-for-java)
 - Azure Spring Boot AutoConfigure (from https://github.com/Azure/azure-sdk-for-java)
+- Bouncy Castle Provider (from http://www.bouncycastle.org/java.html)
 - Checker Qual (from )
 - Checker Qual (from )
+- Checker Qual (from )
+- ClassGraph (from https://github.com/classgraph/classgraph)
 - Default Plexus Container (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-container-default)
 - Extensions on Apache Proton-J library (from https://github.com/Azure/qpid-proton-j-extensions)
 - JUL to SLF4J bridge (from http://www.slf4j.org)
@@ -975,28 +1031,30 @@ The following software have components provided under the terms of this license:
 - Microsoft Azure client library for KeyVault Secrets (from https://github.com/Azure/azure-sdk-for-java)
 - Microsoft Azure common module for Storage (from https://github.com/Azure/azure-sdk-for-java)
 - Microsoft Azure internal Avro module for Storage (from https://github.com/Azure/azure-sdk-for-java)
-- Mockito (from http://mockito.org)
-- Mockito (from http://mockito.org)
 - MongoDB Java Driver Core (from http://www.mongodb.org)
 - Netty/Codec/HTTP (from https://repo1.maven.org/maven2/io/netty/netty-codec-http)
 - Netty/Common (from https://repo1.maven.org/maven2/io/netty/netty-common)
+- Netty/Common (from https://repo1.maven.org/maven2/io/netty/netty-common)
 - Plexus Default Interactivity Handler (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-interactivity-api)
 - Project Lombok (from https://projectlombok.org)
 - Project Lombok (from https://projectlombok.org)
 - SLF4J API Module (from http://www.slf4j.org)
 - Spongy Castle (from http://rtyley.github.io/spongycastle/)
 - Spring Data for Azure Cosmos DB SQL API (from https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/cosmos/azure-spring-data-cosmos)
-- Spring Security - Core (from https://repo1.maven.org/maven2/org/springframework/security/spring-security-core)
 - adal4j (from https://github.com/AzureAD/azure-activedirectory-library-for-java)
 - azure-documentdb (from http://azure.microsoft.com/en-us/services/documentdb/)
 - documentdb-bulkexecutor (from http://azure.microsoft.com/en-us/services/documentdb/)
 - java jwt (from https://github.com/auth0/java-jwt)
 - micrometer-core (from https://github.com/micrometer-metrics/micrometer)
-- mockito-core (from http://mockito.org)
-- mockito-core (from http://mockito.org)
+- micrometer-core (from https://github.com/micrometer-metrics/micrometer)
+- mockito-core (from https://github.com/mockito/mockito)
+- mockito-core (from https://github.com/mockito/mockito)
+- mockito-junit-jupiter (from https://github.com/mockito/mockito)
 - mockito-junit-jupiter (from https://github.com/mockito/mockito)
 - msal4j (from https://github.com/AzureAD/microsoft-authentication-library-for-java)
 - msal4j-persistence-extension (from https://github.com/AzureAD/microsoft-authentication-extensions-for-java)
+- spring-security-core (from http://spring.io/spring-security)
+- spring-security-crypto (from http://spring.io/spring-security)
 
 ========================================================================
 MPL-1.1
@@ -1006,7 +1064,8 @@ The following software have components provided under the terms of this license:
 - Cobertura (from http://cobertura.sourceforge.net)
 - Javassist (from http://www.javassist.org/)
 - Javassist (from http://www.javassist.org/)
-- RabbitMQ Java Client (from https://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
 
 ========================================================================
 MPL-2.0
@@ -1015,9 +1074,10 @@ The following software have components provided under the terms of this license:
 
 - Javassist (from http://www.javassist.org/)
 - Javassist (from http://www.javassist.org/)
-- OkHttp (from https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp)
-- RabbitMQ Java Client (from https://www.rabbitmq.com)
 - RabbitMQ Java Client (from http://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
+- okhttp (from https://square.github.io/okhttp/)
+- okhttp (from https://square.github.io/okhttp/)
 
 ========================================================================
 PHP-3.01
@@ -1032,7 +1092,7 @@ Public-Domain
 ========================================================================
 The following software have components provided under the terms of this license:
 
-- Plexus Common Utilities (from http://plexus.codehaus.org/plexus-utils)
+- Plexus Common Utilities (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils)
 - Spongy Castle (from http://rtyley.github.io/spongycastle/)
 
 ========================================================================
@@ -1072,11 +1132,14 @@ public-domain
 The following software have components provided under the terms of this license:
 
 - AWS SDK for Java - Models (from https://aws.amazon.com/sdkforjava)
-- Apache Groovy (from https://groovy-lang.org)
-- Apache Groovy (from https://groovy-lang.org)
 - Asynchronous Http Client (from https://repo1.maven.org/maven2/org/asynchttpclient/async-http-client)
-- Guava: Google Core Libraries for Java (from https://github.com/google/guava)
-- Guava: Google Core Libraries for Java (from https://github.com/google/guava)
+- Bouncy Castle Provider (from http://www.bouncycastle.org/java.html)
+- Groovy (from http://groovy.codehaus.org/)
+- Groovy (from http://groovy.codehaus.org/)
+- Groovy (from http://groovy.codehaus.org/)
+- Guava: Google Core Libraries for Java (from https://repo1.maven.org/maven2/com/google/guava/guava)
+- Guava: Google Core Libraries for Java (from https://repo1.maven.org/maven2/com/google/guava/guava)
+- Guava: Google Core Libraries for Java (from https://repo1.maven.org/maven2/com/google/guava/guava)
 - HdrHistogram (from http://hdrhistogram.github.io/HdrHistogram/)
 - JTidy (from http://jtidy.sourceforge.net)
 - Joda-Time (from http://www.joda.org/joda-time/)
@@ -1087,9 +1150,10 @@ The following software have components provided under the terms of this license:
 - Microsoft Azure SDK for EventGrid Management (from https://github.com/Azure/azure-sdk-for-java)
 - Microsoft Azure SDK for SQL API of Azure Cosmos DB Service (from https://github.com/Azure/azure-sdk-for-java)
 - Microsoft Azure client library for Blob Storage (from https://github.com/Azure/azure-sdk-for-java)
+- PostgreSQL JDBC Driver (from )
 - Project Lombok (from https://projectlombok.org)
 - Project Lombok (from https://projectlombok.org)
-- RabbitMQ Java Client (from https://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
 - RabbitMQ Java Client (from http://www.rabbitmq.com)
 - Spring Web (from https://github.com/spring-projects/spring-framework)
 - azure-documentdb (from http://azure.microsoft.com/en-us/services/documentdb/)
@@ -1102,19 +1166,21 @@ unknown
 ========================================================================
 The following software have components provided under the terms of this license:
 
+- Bouncy Castle Provider (from http://www.bouncycastle.org/java.html)
 - Byte Buddy (without dependencies) (from )
 - Checker Qual (from )
 - Checker Qual (from )
+- Checker Qual (from )
 - JSON in Java (from https://github.com/douglascrockford/JSON-java)
 - JTidy (from http://jtidy.sourceforge.net)
 - JUnit Jupiter (Aggregator) (from https://junit.org/junit5/)
-- JUnit Jupiter API (from https://junit.org/junit5/)
-- JUnit Jupiter Engine (from https://junit.org/junit5/)
-- JUnit Platform Commons (from https://junit.org/junit5/)
-- JUnit Platform Engine API (from https://junit.org/junit5/)
+- JUnit Jupiter API (from http://junit.org/junit5/)
+- JUnit Jupiter Engine (from http://junit.org/junit5/)
+- JUnit Platform Commons (from http://junit.org/junit5/)
+- JUnit Platform Engine API (from http://junit.org/junit5/)
 - Jakarta Activation API jar (from https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api)
 - Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api)
-- RabbitMQ Java Client (from https://www.rabbitmq.com)
+- RabbitMQ Java Client (from http://www.rabbitmq.com)
 - Spongy Castle (from http://rtyley.github.io/spongycastle/)
 - System Rules (from http://stefanbirkner.github.io/system-rules/)
 - org.junit.jupiter:junit-jupiter-params (from http://junit.org/junit5/)
diff --git a/legal-core/pom.xml b/legal-core/pom.xml
index 257e8237e9f651e7392a7cb57fb7b234d2fc7b22..0bdc841519c7b931a551bba412361c324c323a79 100644
--- a/legal-core/pom.xml
+++ b/legal-core/pom.xml
@@ -16,7 +16,6 @@
 	<description>Legal service core</description>
 
 	<properties>
-		<springfox-version>2.7.0</springfox-version>
 	</properties>
 
 	<dependencies>
@@ -152,27 +151,6 @@
 			<version>1.2.0</version>
 			<scope>test</scope>
 		</dependency>
-
-		<!-- swagger dependencies -->
-		<dependency>
-			<groupId>io.springfox</groupId>
-			<artifactId>springfox-swagger2</artifactId>
-			<version>${springfox-version}</version>
-			<exclusions>
-				<exclusion>
-					<!--
-					Excluding com.google.guava:guava:jar:18.0, because it has security vulnerability
-					-->
-					<groupId>com.google.guava</groupId>
-					<artifactId>guava</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>io.springfox</groupId>
-			<artifactId>springfox-swagger-ui</artifactId>
-			<version>${springfox-version}</version>
-		</dependency>
 	</dependencies>
 
 	<build>
diff --git a/legal-core/src/main/java/org/opengroup/osdu/legal/swagger/SpringfoxSwaggerHostResolver.java b/legal-core/src/main/java/org/opengroup/osdu/legal/swagger/SpringfoxSwaggerHostResolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..7addb2c112382e6be197fc4069376d2a8f58e67c
--- /dev/null
+++ b/legal-core/src/main/java/org/opengroup/osdu/legal/swagger/SpringfoxSwaggerHostResolver.java
@@ -0,0 +1,34 @@
+package org.opengroup.osdu.legal.swagger;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import io.swagger.v3.oas.models.servers.Server;
+import io.swagger.v3.oas.models.OpenAPI;
+import springfox.documentation.oas.web.OpenApiTransformationContext;
+import springfox.documentation.oas.web.WebMvcOpenApiTransformationFilter;
+import springfox.documentation.spi.DocumentationType;
+
+@Component
+@Order(Ordered.LOWEST_PRECEDENCE)
+public class SpringfoxSwaggerHostResolver implements WebMvcOpenApiTransformationFilter {
+
+	public boolean supports(DocumentationType delimiter) {
+		return delimiter == DocumentationType.OAS_30;
+	}
+
+	public OpenAPI transform(OpenApiTransformationContext<HttpServletRequest> context) {
+		OpenAPI swagger = context.getSpecification();
+
+		Server server = swagger.getServers().get(0);
+		if (server.getUrl().contains(":443")) {
+			// via the gateway
+			server.setUrl(server.getUrl().replace(":443", ""));
+		}
+
+		return swagger;
+	}
+
+}
diff --git a/legal-core/src/main/java/org/opengroup/osdu/legal/swagger/SwaggerDocumentationConfig.java b/legal-core/src/main/java/org/opengroup/osdu/legal/swagger/SwaggerDocumentationConfig.java
index b7e9d53b21f90260ee65902e1bf9f4cd546db2b1..a29e3e793b064bfc4c9408676227c9cbf877ff3b 100644
--- a/legal-core/src/main/java/org/opengroup/osdu/legal/swagger/SwaggerDocumentationConfig.java
+++ b/legal-core/src/main/java/org/opengroup/osdu/legal/swagger/SwaggerDocumentationConfig.java
@@ -1,45 +1,45 @@
 package org.opengroup.osdu.legal.swagger;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import springfox.documentation.builders.ParameterBuilder;
+import org.springframework.context.annotation.Profile;
+
 import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.schema.ModelRef;
 import springfox.documentation.service.ApiKey;
 import springfox.documentation.service.AuthorizationScope;
-import springfox.documentation.service.Parameter;
+import springfox.documentation.service.ParameterType;
+import springfox.documentation.service.RequestParameter;
 import springfox.documentation.service.SecurityReference;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spi.service.contexts.SecurityContext;
 import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import springfox.documentation.builders.RequestParameterBuilder;
+import springfox.documentation.oas.annotations.EnableOpenApi;
 
 @Configuration
-@EnableSwagger2
+@EnableOpenApi
 public class SwaggerDocumentationConfig {
     public static final String AUTHORIZATION_HEADER = "Authorization";
     public static final String DEFAULT_INCLUDE_PATTERN = "/.*";
 
     @Bean
     public Docket api() {
-        ParameterBuilder builder = new ParameterBuilder();
-        List<Parameter> parameters = new ArrayList<>();
+    	RequestParameterBuilder builder = new RequestParameterBuilder();
+    	List<RequestParameter> parameters = new ArrayList<>();
         builder.name(DpsHeaders.DATA_PARTITION_ID)
                 .description("tenant")
-                .defaultValue("common")
-                .modelRef(new ModelRef("string"))
-                .parameterType("header")
+                .in(ParameterType.HEADER)
                 .required(true)
                 .build();
         parameters.add(builder.build());
-        return new Docket(DocumentationType.SWAGGER_2)
-                .globalOperationParameters(parameters)
+        return new Docket(DocumentationType.OAS_30)
+            	.globalRequestParameters(parameters)
                 .select()
                 .apis(RequestHandlerSelectors.basePackage("org.opengroup.osdu.legal.api"))
                 .build()
@@ -48,13 +48,13 @@ public class SwaggerDocumentationConfig {
     }
 
     private ApiKey apiKey() {
-        return new ApiKey("JWT", AUTHORIZATION_HEADER, "header");
+    	return new ApiKey(AUTHORIZATION_HEADER, AUTHORIZATION_HEADER, "header");
     }
 
     private SecurityContext securityContext() {
         return SecurityContext.builder()
                 .securityReferences(defaultAuth())
-                .forPaths(PathSelectors.regex(DEFAULT_INCLUDE_PATTERN))
+                .operationSelector(o -> PathSelectors.regex(DEFAULT_INCLUDE_PATTERN).test(o.requestMappingPattern()))
                 .build();
     }
 
@@ -64,6 +64,6 @@ public class SwaggerDocumentationConfig {
         AuthorizationScope[] authorizationScopes =
                 new AuthorizationScope[]{authorizationScope};
         return Collections.singletonList(
-                new SecurityReference("JWT", authorizationScopes));
+        		 new SecurityReference(AUTHORIZATION_HEADER, authorizationScopes));
     }
 }
diff --git a/pom.xml b/pom.xml
index 1f614e119321016feb7c671537e3479af12708b2..af095f8539467ad3763d1c51242f31c25eb31a21 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,6 +11,7 @@
         <os-core-common.version>0.13.0-rc4</os-core-common.version>
         <snakeyaml.version>1.26</snakeyaml.version>
         <resilience4jVersion>1.7.0</resilience4jVersion>
+        <springfox.version>3.0.0</springfox.version>
     </properties>
 
     <licenses>
@@ -92,6 +93,15 @@
             </dependency>
         </dependencies>
     </dependencyManagement>
+	
+		<dependencies>
+		    <!--Swagger-->
+			<dependency>
+      			<groupId>io.springfox</groupId>
+      			<artifactId>springfox-boot-starter</artifactId>
+      			<version>${springfox.version}</version>
+    		</dependency>
+		</dependencies>
 
     <profiles>
         <profile>
diff --git a/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/security/AADSecurityConfig.java b/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/security/AADSecurityConfig.java
index 2ab268ad34fecfed67658c8a5781b2244f2ef6af..935321178b3dbf6ff609f7978d24acdafe7771de 100644
--- a/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/security/AADSecurityConfig.java
+++ b/provider/legal-azure/src/main/java/org/opengroup/osdu/legal/azure/security/AADSecurityConfig.java
@@ -42,12 +42,14 @@ public class AADSecurityConfig extends WebSecurityConfigurerAdapter {
             .authorizeRequests()
             .antMatchers("/", "/index.html",
                     "/v2/api-docs",
+                    "/v3/api-docs",
                     "/configuration/ui",
                     "/swagger-resources/**",
                     "/configuration/security",
                     "/swagger",
                     "/info",
                     "/swagger-ui.html",
+                    "/swagger-ui/**",
                     "/webjars/**").permitAll()
             .anyRequest().authenticated()
             .and()
diff --git a/provider/legal-gcp/README.md b/provider/legal-gcp/README.md
index f92dc3fc89e62960596186a6796bf62d6bdb8c2b..da935331b0d0654e382dfdeb5f2c9df062044105 100644
--- a/provider/legal-gcp/README.md
+++ b/provider/legal-gcp/README.md
@@ -12,19 +12,57 @@ These instructions will get you a copy of the project up and running on your loc
 - [AdoptOpenJDK8](https://adoptopenjdk.net/)
 - [Lombok 1.16 or later](https://projectlombok.org/setup/maven)
 - [GCloud SDK with java (latest version)](https://cloud.google.com/sdk/docs/install)
- 
-### Installation
 
-- Setup Apache Maven
-- Setup AdoptOpenJDK
-- Setup GCloud SDK
-- Install Eclipse (or other IDE) to run applications
-- Set up environment variables for Apache Maven and AdoptOpenJDK. For example M2_HOME, JAVA_HOME, etc.
-- Add a configuration for build project in Eclipse(or other IDE)
+# Features of implementation
+This is a universal solution created using EPAM OSM and OBM mappers technology.
+It allows you to work with various implementations of KV stores and Blob stores.
+
+## Limitations of the current version
+
+In the current version, the mappers are equipped with several drivers to the stores:
+
+- OSM (mapper for KV-data): Google Datastore; Postgres
+- OBM (mapper to Blob stores): Google Cloud Storage (GCS); MinIO
+- OQM (mapper to message brokers): Google PubSub; RabbitMQ
+
+## Extensibility
+
+To use any other store or message broker, implement a driver for it. With an extensible set of drivers, the solution is unrestrictedly universal and portable without modification to the main code.
+
+Mappers support "multitenancy" with flexibility in how it is implemented.
+They switch between datasources of different tenants due to the work of a bunch of classes that implement the following interfaces:
+
+- Destination - takes a description of the current context, e.g., "data-partition-id = opendes"
+- DestinationResolver – accepts Destination, finds the resource, connects, and returns Resolution
+- DestinationResolution – contains a ready-made connection, the mapper uses it to get to data
 
-### Run Locally
+## Mapper tuning mechanisms
 
-### Environment Variables
+This service uses specific implementations of DestinationResolvers based on the tenant information provided by the OSDU Partition service.
+- for Google Datastore: osm/DsTenantDestinationResolver.java
+- for Postgres: osm/PgTenantDestinationResolver.java
+- for MinIO: obm/MinioDestinationResolver.java
+- for RabbitMQ: oqm/MqTenantOqmDestinationResolver.java
+
+#### Their algorithms are as follows:
+- incoming Destination carries data-partition-id
+- resolver accesses the Partition service and gets PartitionInfo
+- from PartitionInfo resolver retrieves properties for the connection: URL, username, password etc.
+- resolver creates a data source, connects to the resource, remembers the datasource
+- resolver gives the datasource to the mapper in the Resolution object
+- Google Cloud resolvers do not receive special properties from the Partition service for connection,
+  because the location of the resources is unambiguously known - they are in the GCP project.
+  And credentials are also not needed - access to data is made on behalf of the Google Identity SA
+  under which the service itself is launched. Therefore, resolver takes only
+  the value of the **projectId** property from PartitionInfo and uses it to connect to a resource
+  in the corresponding GCP project.
+
+# Configuration
+
+## Service Configuration
+
+Define the following environment variables.
+Most of them are common to all hosting environments, but there are properties that are only necessary when running in Google Cloud.
 
 In order to run the service locally, you will need to have the following environment variables defined.
 
@@ -44,6 +82,223 @@ In order to run the service locally, you will need to have the following environ
 | `PARTITION_API` | ex `http://localhost:8081/api/partition/v1` | Partition service endpoint | no | - |
 | `ENABLE_FULL_BUCKET_NAME` | ex `true` | Full bucket name | no | - |
 
+#### For Mappers, to activate drivers
+| name | value | description | sensitive? | source |
+| ---  | ---   | ---         | ---        | ---    |
+| `OSMDRIVER` | `postgres` OR `datastore` | Osm driver mode that defines which KV storage will be used | no | - |
+| `OBMDRIVER` | `gcs` OR `minio` | Obm driver mode that defines which object storage will be used | no | - |
+| `OQMDRIVER` | `pubsub` OR `rabbitmq` | Oqm driver mode that defines which message broker will be used | no | - |
+
+#### For Google Cloud only
+| name | value | description | sensitive? | source |
+| ---  | ---   | ---         | ---        | ---    |
+| `GOOGLE_AUDIENCES` | ex `*****.apps.googleusercontent.com` | Client ID for getting access to cloud resources | yes | https://console.cloud.google.com/apis/credentials |
+
+## Configuring mappers' Datasources
+When using non-Google-Cloud-native technologies, property sets must be defined on the Partition service as part of PartitionInfo for each Tenant.
+
+They are specific to each storage technology:
+
+#### for OSM - Postgres:
+**prefix:** `osm.postgres`
+It can be overridden by:
+- through the Spring Boot property `osm.postgres.partitionPropertiesPrefix`
+- environment variable `OSM_POSTGRES_PARTITIONPROPERTIESPREFIX`
+
+**Propertyset:**
+
+| Property | Description |
+| --- | --- |
+| osm.postgres.datasource.url | server URL |
+| osm.postgres.datasource.username | username |
+| osm.postgres.datasource.password | password |
+
+<details><summary>Example of a definition for a single tenant</summary>
+
+```
+
+curl -L -X PATCH 'https://dev.osdu.club/api/partition/v1/partitions/opendes' -H 'data-partition-id: opendes' -H 'Authorization: Bearer ...' -H 'Content-Type: application/json' --data-raw '{
+  "properties": {
+    "osm.postgres.datasource.url": {
+      "sensitive": false,
+      "value": "jdbc:postgresql://35.239.205.90:5432/postgres"
+    },
+    "osm.postgres.datasource.username": {
+      "sensitive": false,
+      "value": "osm_poc"
+    },
+    "osm.postgres.datasource.password": {
+      "sensitive": true,
+      "value": "osm_poc"
+    }
+  }
+}'
+
+```
+
+</details>
+
+#### for OBM - Minio:
+**prefix:** `obm.minio`
+It can be overridden by:
+
+- through the Spring Boot property `obm.minio.partitionPropertiesPrefix`
+- environment variable `OBM_MINIO_PARTITIONPROPERTIESPREFIX`
+
+**Propertyset** (for two types of connection: messaging and admin operations):
+
+| Property | Description |
+| --- | --- |
+| obm.minio.endpoint | - url |
+| obm.minio.credentials.access.key | - username |
+| obm.minio.credentials.secret.key | - password |
+
+<details><summary>Example of a single tenant definition</summary>
+
+```
+
+curl -L -X PATCH 'https://dev.osdu.club/api/partition/v1/partitions/opendes' -H 'data-partition-id: opendes' -H 'Authorization: Bearer ...' -H 'Content-Type: application/json' --data-raw '{
+  "properties": {
+    "obm.minio.endpoint": {
+      "sensitive": false,
+      "value": "localhost"
+    },
+    "obm.minio.credentials.access.key": {
+      "sensitive": false,
+      "value": "minioadmin"
+    },
+    "obm.minio.credentials.secret.key": {
+      "sensitive": false,
+      "value": "secret"
+    }
+  }
+}'
+
+```
+
+</details>
+
+## For postgres only. Schema configuration
+
+```
+CREATE TABLE <partitionId>."LegalTagOsm"(
+id text COLLATE pg_catalog."default" NOT NULL,
+pk bigint NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
+data jsonb NOT NULL,
+CONSTRAINT LegalTagOsm_id UNIQUE (id)
+);
+CREATE INDEX LegalTagOsm_dataGin ON public."LegalTagOsm" USING GIN (data);
+
+```
+
+Example of filling table with LegalTag
+
+```
+
+INSERT INTO <partitionId>."LegalTagOsm"(
+id, data)
+VALUES ('726612843', '{
+  "id": 726612843,
+  "name": "opendes-gae-integration-test-1639485896236",
+  "isValid": true,
+  "properties": {
+    "COO": [
+      "US"
+    ],
+    "dataType": "Transferred Data",
+    "contractId": "A1234",
+    "originator": "MyCompany",
+    "personalData": "No Personal Data",
+    "expirationDate": "Dec 31, 9999",
+    "exportClassification": "EAR99",
+    "securityClassification": "Public"
+  },
+  "description": ""
+}');
+
+```
+#### for OQM - RabbitMQ:
+
+**prefix:** `oqm.rabbitmq`
+It can be overridden by:
+
+- through the Spring Boot property `oqm.rabbitmq.partitionPropertiesPrefix`
+- environment variable `OQM_RABBITMQ_PARTITIONPROPERTIESPREFIX`
+
+**Property Set** (for two types of connection: messaging and admin operations):
+
+| Property | Description |
+| --- | --- |
+| oqm.rabbitmq.amqp.host | messaging hostname or IP |
+| oqm.rabbitmq.amqp.port | - port |
+| oqm.rabbitmq.amqp.path | - path |
+| oqm.rabbitmq.amqp.username | - username |
+| oqm.rabbitmq.amqp.password | - password |
+| oqm.rabbitmq.admin.schema | admin host schema |
+| oqm.rabbitmq.admin.host | - host name |
+| oqm.rabbitmq.admin.port | - port |
+| oqm.rabbitmq.admin.path | - path |
+| oqm.rabbitmq.admin.username | - username |
+| oqm.rabbitmq.admin.password | - password |
+
+<details><summary>Example of a single tenant definition</summary>
+
+```
+
+curl -L -X PATCH 'https://dev.osdu.club/api/partition/v1/partitions/opendes' -H 'data-partition-id: opendes' -H 'Authorization: Bearer ...' -H 'Content-Type: application/json' --data-raw '{
+  "properties": {
+    "oqm.rabbitmq.amqp.host": {
+      "sensitive": false,
+      "value": "localhost"
+    },
+    "oqm.rabbitmq.amqp.port": {
+      "sensitive": false,
+      "value": "5672"
+    },
+    "oqm.rabbitmq.amqp.path": {
+      "sensitive": false,
+      "value": ""
+    },
+    "oqm.rabbitmq.amqp.username": {
+      "sensitive": false,
+      "value": "guest"
+    },
+    "oqm.rabbitmq.amqp.password": {
+      "sensitive": true,
+      "value": "guest"
+    },
+
+     "oqm.rabbitmq.admin.schema": {
+      "sensitive": false,
+      "value": "http"
+    },
+     "oqm.rabbitmq.admin.host": {
+      "sensitive": false,
+      "value": "localhost"
+    },
+    "oqm.rabbitmq.admin.port": {
+      "sensitive": false,
+      "value": "9002"
+    },
+    "oqm.rabbitmq.admin.path": {
+      "sensitive": false,
+      "value": "/api"
+    },
+    "oqm.rabbitmq.admin.username": {
+      "sensitive": false,
+      "value": "guest"
+    },
+    "oqm.rabbitmq.admin.password": {
+      "sensitive": true,
+      "value": "guest"
+    }
+  }
+}'
+
+```
+
+</details>
+
 Check that maven is installed:
 
 ```bash
diff --git a/provider/legal-gcp/pom.xml b/provider/legal-gcp/pom.xml
index dc25c9e6c3932b498e5b97bc5e6da8213afa1223..1601036250317a0e989986356ed03ecbfdd85ef7 100644
--- a/provider/legal-gcp/pom.xml
+++ b/provider/legal-gcp/pom.xml
@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
 
   <parent>
     <artifactId>legal-service</artifactId>
@@ -8,148 +10,214 @@
     <version>0.13.0-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
-    
-	<groupId>org.opengroup.osdu.legal</groupId>
-	<artifactId>legal-gcp</artifactId>
-	<version>0.13.0-SNAPSHOT</version>
-	<packaging>jar</packaging>
-	<name>legal-gcp</name>
-	<description>Legal service Google App Engine flex</description>
 
-	<dependencies>
-		<dependency>
-			<groupId>org.projectlombok</groupId>
-			<artifactId>lombok</artifactId>
-			<optional>true</optional>
-		</dependency>
-        <dependency>
-            <groupId>org.opengroup.osdu</groupId>
-            <artifactId>core-lib-gcp</artifactId>
-            <version>0.13.0-rc4</version>
-        </dependency>
-        <dependency>
-            <groupId>org.opengroup.osdu.legal</groupId>
-            <artifactId>legal-core</artifactId>
-            <version>0.13.0-SNAPSHOT</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.google.api-client</groupId>
-                    <artifactId>google-api-client</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.opengroup.osdu</groupId>
-            <artifactId>os-core-common</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.google.http-client</groupId>
-                    <artifactId>google-http-client</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>4.0.1</version>
-            <scope>provided</scope>
-        </dependency>
+  <groupId>org.opengroup.osdu.legal</groupId>
+  <artifactId>legal-gcp</artifactId>
+  <version>0.13.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+  <name>legal-gcp</name>
+  <description>Legal service for Hybrid Cloud</description>
 
-        <!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
-        <dependency>
-            <groupId>javax.inject</groupId>
-            <artifactId>javax.inject</artifactId>
-            <version>1</version>
-        </dependency>
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-dependencies</artifactId>
+        <version>2.5.6</version>
+      </dependency>
+      <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-dependencies</artifactId>
+        <version>2.5.6</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
 
-        <dependency>
-            <groupId>io.jsonwebtoken</groupId>
-            <artifactId>jjwt</artifactId>
-            <version>0.9.1</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.fasterxml.jackson.core</groupId>
-                    <artifactId>jackson-databind</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-		
-		<!-- https://mvnrepository.com/artifact/io.github.resilience4j/resilience4j-circuitbreaker -->
-		<dependency>
-			<groupId>io.github.resilience4j</groupId>
-			<artifactId>resilience4j-circuitbreaker</artifactId>
-			<version>${resilience4jVersion}</version>
-		</dependency>
-		<!-- https://mvnrepository.com/artifact/io.github.resilience4j/resilience4j-retry -->
-		<dependency>
-			<groupId>io.github.resilience4j</groupId>
-			<artifactId>resilience4j-retry</artifactId>
-			<version>${resilience4jVersion}</version>
-		</dependency>
-		<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
-		<dependency>
-			<groupId>commons-lang</groupId>
-			<artifactId>commons-lang</artifactId>
-			<version>2.6</version>
-		</dependency>
+      <dependency>
+        <groupId>com.google.cloud</groupId>
+        <artifactId>libraries-bom</artifactId>
+        <version>24.0.0</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+      <!--for MinIO-->
+      <dependency>
+        <groupId>org.jetbrains.kotlin</groupId>
+        <artifactId>kotlin-stdlib</artifactId>
+        <version>1.6.0</version>
+        <scope>compile</scope>
+      </dependency>
+      <dependency>
+        <groupId>com.squareup.okio</groupId>
+        <artifactId>okio</artifactId>
+        <version>2.7.0</version>
+        <scope>compile</scope>
+      </dependency>
+      <dependency>
+        <groupId>com.squareup.okhttp3</groupId>
+        <artifactId>okhttp</artifactId>
+        <version>4.9.2</version>
+        <scope>compile</scope>
+      </dependency>
+      <dependency>
+        <groupId>io.minio</groupId>
+        <artifactId>minio</artifactId>
+        <version>8.3.4</version>
+        <scope>compile</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.opengroup.osdu</groupId>
+      <artifactId>core-lib-gcp</artifactId>
+      <version>0.13.0-rc4</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opengroup.osdu.legal</groupId>
+      <artifactId>legal-core</artifactId>
+      <version>0.13.0-SNAPSHOT</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.google.api-client</groupId>
+          <artifactId>google-api-client</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.opengroup.osdu</groupId>
+      <artifactId>os-core-common</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>com.google.http-client</groupId>
+          <artifactId>google-http-client</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+      <version>4.0.1</version>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.opengroup.osdu</groupId>
+      <artifactId>osm</artifactId>
+      <version>0.13.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opengroup.osdu</groupId>
+      <artifactId>oqm</artifactId>
+      <version>0.13.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opengroup.osdu</groupId>
+      <artifactId>obm</artifactId>
+      <version>0.13.1-SNAPSHOT</version>
+    </dependency>
+
+    <!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
+    <dependency>
+      <groupId>javax.inject</groupId>
+      <artifactId>javax.inject</artifactId>
+      <version>1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.jsonwebtoken</groupId>
+      <artifactId>jjwt</artifactId>
+      <version>0.9.1</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.fasterxml.jackson.core</groupId>
+          <artifactId>jackson-databind</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <!-- https://mvnrepository.com/artifact/io.github.resilience4j/resilience4j-circuitbreaker -->
+    <dependency>
+      <groupId>io.github.resilience4j</groupId>
+      <artifactId>resilience4j-circuitbreaker</artifactId>
+      <version>${resilience4jVersion}</version>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/io.github.resilience4j/resilience4j-retry -->
+    <dependency>
+      <groupId>io.github.resilience4j</groupId>
+      <artifactId>resilience4j-retry</artifactId>
+      <version>${resilience4jVersion}</version>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+      <version>2.6</version>
+    </dependency>
 
-       <!-- Test Dependencies -->
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.security</groupId>
-			<artifactId>spring-security-test</artifactId>
-			<scope>test</scope>
-		</dependency>
+    <!-- Test Dependencies -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.security</groupId>
+      <artifactId>spring-security-test</artifactId>
+      <scope>test</scope>
+    </dependency>
 
-        <!-- Test Dependencies -->
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.12</version>
-            <scope>test</scope>
-        </dependency>
-        <!-- https://mvnrepository.com/artifact/org.powermock/powermock-api-mockito2 -->
-        <dependency>
-            <groupId>org.powermock</groupId>
-            <artifactId>powermock-api-mockito2</artifactId>
-            <version>2.0.2</version>
-            <scope>test</scope>
-        </dependency>
-        <!-- https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4 -->
-        <dependency>
-            <groupId>org.powermock</groupId>
-            <artifactId>powermock-module-junit4</artifactId>
-            <version>2.0.2</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <version>3.0.0</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.mojo</groupId>
-            <artifactId>cobertura-maven-plugin</artifactId>
-            <version>2.7</version>
-            <scope>test</scope>
-        </dependency>
+    <!-- Test Dependencies -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.12</version>
+      <scope>test</scope>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/org.powermock/powermock-api-mockito2 -->
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-api-mockito2</artifactId>
+      <version>2.0.2</version>
+      <scope>test</scope>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4 -->
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-module-junit4</artifactId>
+      <version>2.0.2</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <version>3.0.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.mojo</groupId>
+      <artifactId>cobertura-maven-plugin</artifactId>
+      <version>2.7</version>
+      <scope>test</scope>
+    </dependency>
 
-		<!-- https://mvnrepository.com/artifact/com.github.stefanbirkner/system-rules -->
-		<dependency>
-			<groupId>com.github.stefanbirkner</groupId>
-			<artifactId>system-rules</artifactId>
-			<version>1.2.0</version>
-			<scope>test</scope>
-		</dependency>
-        <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-config</artifactId>
-        </dependency>
+    <!-- https://mvnrepository.com/artifact/com.github.stefanbirkner/system-rules -->
+    <dependency>
+      <groupId>com.github.stefanbirkner</groupId>
+      <artifactId>system-rules</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.security</groupId>
+      <artifactId>spring-security-config</artifactId>
+    </dependency>
     <dependency>
       <groupId>ch.qos.logback.contrib</groupId>
       <artifactId>logback-json-classic</artifactId>
@@ -161,54 +229,54 @@
       <version>0.1.5</version>
     </dependency>
 
-    </dependencies>
-    
-	<build>
-		<plugins>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                        <configuration>
-                            <classifier>spring-boot</classifier>
-                            <mainClass>
-                                org.opengroup.osdu.legal.LegalApplication
-                            </mainClass>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>com.google.cloud.tools</groupId>
-                <artifactId>appengine-maven-plugin</artifactId>
-                <version>1.3.2</version>
-                <configuration>
-                  <version>1</version>
-                </configuration>
-            </plugin>
-            <plugin>
-				<groupId>org.jacoco</groupId>
-				<artifactId>jacoco-maven-plugin</artifactId>
-				<version>0.7.7.201606060606</version>
-				<executions>
-					<execution>
-						<goals>
-							<goal>prepare-agent</goal>
-						</goals>
-					</execution>
-					<execution>
-						<id>report</id>
-						<phase>prepare-package</phase>
-						<goals>
-							<goal>report</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>repackage</goal>
+            </goals>
+            <configuration>
+              <classifier>spring-boot</classifier>
+              <mainClass>
+                org.opengroup.osdu.legal.LegalApplication
+              </mainClass>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>com.google.cloud.tools</groupId>
+        <artifactId>appengine-maven-plugin</artifactId>
+        <version>1.3.2</version>
+        <configuration>
+          <version>1</version>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.jacoco</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <version>0.7.7.201606060606</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>report</id>
+            <phase>prepare-package</phase>
+            <goals>
+              <goal>report</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 </project>
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/LegalApplication.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/LegalApplication.java
index 14b8386a063c933bd7f4a4eb3c258f5c625a9698..c05fdd5321ab17a9ebe866d07a122af5d08bd86e 100644
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/LegalApplication.java
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/LegalApplication.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2020 Google LLC
- * Copyright 2020 EPAM Systems, Inc
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opengroup.osdu.legal;
 
 import org.springframework.boot.SpringApplication;
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/config/GcpAppServiceConfig.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/config/GcpAppServiceConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..f578ab84ba4c3c30234fe46031054c2310bb07da
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/config/GcpAppServiceConfig.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties
+@Data
+public class GcpAppServiceConfig {
+
+  private String pubSubLegalTagsTopic = "legaltags_changed";
+  private boolean enableFullBucketName;
+}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/countries/StorageReaderFactoryImpl.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/countries/StorageReaderFactoryImpl.java
index d10328f12cd8c3c816869e4e5bb3ba39cbba7a4e..dc8e151b4a7dea105ab24f0a29fbc97e232ee57d 100644
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/countries/StorageReaderFactoryImpl.java
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/countries/StorageReaderFactoryImpl.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2020 Google LLC
- * Copyright 2020 EPAM Systems, Inc
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,24 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opengroup.osdu.legal.countries;
 
+import lombok.RequiredArgsConstructor;
 import org.opengroup.osdu.core.common.model.tenant.TenantInfo;
-
+import org.opengroup.osdu.core.gcp.obm.driver.Driver;
+import org.opengroup.osdu.legal.config.GcpAppServiceConfig;
 import org.opengroup.osdu.legal.provider.interfaces.IStorageReader;
 import org.opengroup.osdu.legal.provider.interfaces.IStorageReaderFactory;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 @Component
+@RequiredArgsConstructor
 public class StorageReaderFactoryImpl implements IStorageReaderFactory {
 
-  @Value("#{new Boolean('${enable.full.bucket.name:false}')}")
-  private Boolean isFullBucketName;
+  private final GcpAppServiceConfig config;
+  private final Driver storage;
 
-	@Override
-    public IStorageReader getReader(TenantInfo tenant, String projectRegion) {
-        return new StorageReaderImpl(tenant, projectRegion, isFullBucketName);
-    }
+  @Override
+  public IStorageReader getReader(TenantInfo tenant, String projectRegion) {
+    return new StorageReaderImpl(tenant, projectRegion, storage, config.isEnableFullBucketName());
+  }
 }
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/countries/StorageReaderImpl.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/countries/StorageReaderImpl.java
index 20abd83cda0bccc7abd5d48ff38be6bb0fc516d0..07120115fd2b9269f233e9775d1f9d785bd6e95e 100644
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/countries/StorageReaderImpl.java
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/countries/StorageReaderImpl.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2020 Google LLC
- * Copyright 2020 EPAM Systems, Inc
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,89 +14,80 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opengroup.osdu.legal.countries;
 
-import com.google.cloud.storage.*;
-
 import java.util.Objects;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.opengroup.osdu.core.common.model.tenant.TenantInfo;
-import org.opengroup.osdu.core.gcp.multitenancy.credentials.GcsCredential;
+import org.opengroup.osdu.core.gcp.obm.driver.Driver;
+import org.opengroup.osdu.core.gcp.obm.driver.ObmDriverRuntimeException;
+import org.opengroup.osdu.core.gcp.obm.model.Blob;
+import org.opengroup.osdu.core.gcp.obm.persistence.ObmDestination;
 import org.opengroup.osdu.legal.provider.interfaces.IStorageReader;
 import org.springframework.http.MediaType;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
-
+@RequiredArgsConstructor
+@Slf4j
 public class StorageReaderImpl implements IStorageReader {
 
-    private TenantInfo    tenantInfo;
-    private String        projectRegion;
-    private Storage       storage;
+  private TenantInfo tenantInfo;
+  private Driver storage;
 
-    protected static final String BUCKET_NAME = "legal-service-configuration";
-    private static final String FILE_NAME = "Legal_COO.json";
-    private Boolean isFullBucketName = false;
+  protected static final String BUCKET_NAME = "legal-service-configuration";
+  private static final String FILE_NAME = "Legal_COO.json";
+  private boolean isFullBucketName = false;
 
-    public StorageReaderImpl(TenantInfo tenantInfo, String projectRegion) {
-      new StorageReaderImpl(tenantInfo, projectRegion, false);
-    }
+  public StorageReaderImpl(TenantInfo tenantInfo, String projectRegion, Driver storage) {
+    new StorageReaderImpl(tenantInfo, projectRegion, storage, false);
+  }
 
-  public StorageReaderImpl(TenantInfo tenantInfo, String projectRegion, Boolean isFullBucketName) {
-        this.tenantInfo = tenantInfo;
-        this.projectRegion = projectRegion;
-        this.storage = getStorage();
-        this.isFullBucketName = isFullBucketName;
+  public StorageReaderImpl(TenantInfo tenantInfo, String projectRegion, Driver storage,
+      boolean isFullBucketName) {
+    this.tenantInfo = tenantInfo;
+    this.isFullBucketName = isFullBucketName;
+    this.storage = storage;
   }
 
   @Override
-    public byte[] readAllBytes() {
-        BlobId blobId = getBlobId();
-        byte[] content = null;
-
-        try {
-            content = storage.readAllBytes(blobId);
-        } 
-        catch (StorageException e) {
-            if (storage.get(getTenantBucketName(), Storage.BucketGetOption.fields()) == null) {
-                createBucket();
-            }
-            if (storage.get(blobId) == null) {
-                createEmptyObject();
-            }
-        }
+  public byte[] readAllBytes() {
+    byte[] content = null;
+    try {
+      if (storage.getBucket(getTenantBucketName(), getDestination()) == null) {
+        storage.createBucket(getTenantBucketName(), getDestination());
+        Blob emptyBlob = Blob.builder()
+            .bucket(getTenantBucketName())
+            .name(FILE_NAME)
+            .contentType(MediaType.APPLICATION_JSON.toString())
+            .build();
+        storage.createBlob(emptyBlob, new byte[0], getDestination());
+        content = storage.getBlobContent(getTenantBucketName(), FILE_NAME, getDestination());
         return content;
+      } else {
+        Blob blob = storage.getBlob(getTenantBucketName(), FILE_NAME, getDestination());
+        if (Objects.nonNull(blob)) {
+          content = storage.getBlobContent(getTenantBucketName(), FILE_NAME, getDestination());
+        }
+      }
+    } catch (ObmDriverRuntimeException e) {
+      log.error(e.getMessage(), e);
+      throw e;
     }
-
-    private Storage getStorage() {
-        return StorageOptions.newBuilder()
-                             .setCredentials(new GcsCredential(this.tenantInfo.getServiceAccount(),this.tenantInfo.getServiceAccount()))
-                             .setProjectId(this.tenantInfo.getProjectId())
-                             .build()
-                             .getService();
-    }
-    
-    private BlobId getBlobId() {
-        return BlobId.of(getTenantBucketName(), FILE_NAME);
-    }
-
-    private void createBucket() {
-        this.storage.create(BucketInfo.newBuilder(getTenantBucketName())
-                    .setStorageClass(StorageClass.MULTI_REGIONAL)
-                    .setLocation(this.projectRegion)
-                    .build());
-    }
-
-    private void createEmptyObject() {
-        BlobId blobId = getBlobId();
-        BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType(MediaType.APPLICATION_JSON.toString()).build();
-        this.storage.create(blobInfo, "".getBytes(UTF_8));
-    }
+    return content;
+  }
 
   protected String getTenantBucketName() {
-      if (Objects.nonNull(isFullBucketName) && isFullBucketName) {
-        return this.tenantInfo.getProjectId() + "-" + this.tenantInfo.getName() + "-" + BUCKET_NAME;
-      }
-      return this.tenantInfo.getName() + "-" + BUCKET_NAME;
+    if (Objects.nonNull(isFullBucketName) && isFullBucketName) {
+      return this.tenantInfo.getProjectId() + "-" + this.tenantInfo.getName() + "-" + BUCKET_NAME;
     }
+    return this.tenantInfo.getName() + "-" + BUCKET_NAME;
+  }
 
+  private ObmDestination getDestination() {
+    return getDestination(tenantInfo.getDataPartitionId());
+  }
+
+  private ObmDestination getDestination(String dataPartitionId) {
+    return ObmDestination.builder().partitionId(dataPartitionId).build();
+  }
 }
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/DatastoreCredentialsCacheFactory.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/DatastoreCredentialsCacheFactory.java
index 815c214117c5087ca5b11d4853f4d1507089ea25..e305c06a1104e604281d727f42d4b216a3b5d875 100644
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/DatastoreCredentialsCacheFactory.java
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/DatastoreCredentialsCacheFactory.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2020 Google LLC
- * Copyright 2020 EPAM Systems, Inc
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opengroup.osdu.legal.di;
 
 import org.opengroup.osdu.core.common.cache.ICache;
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/PartitionProviderConfig.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/PartitionProviderConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ea74b08cd4811175e5b1b42df4f4db9ed3aca5f
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/PartitionProviderConfig.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.di;
+
+import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
+import static org.springframework.context.annotation.ScopedProxyMode.TARGET_CLASS;
+
+import org.opengroup.osdu.core.common.model.http.DpsHeaders;
+import org.opengroup.osdu.core.common.partition.IPartitionFactory;
+import org.opengroup.osdu.core.common.partition.IPartitionProvider;
+import org.opengroup.osdu.core.gcp.googleidtoken.GcpServiceAccountJwtClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Scope;
+
+@Configuration
+public class PartitionProviderConfig {
+
+  @Bean
+  @Primary
+  @Scope(value = SCOPE_PROTOTYPE, proxyMode = TARGET_CLASS)
+  public IPartitionProvider partitionProvider(IPartitionFactory partitionFactory,
+      GcpServiceAccountJwtClient jwtClient) {
+    DpsHeaders partitionHeaders = new DpsHeaders();
+    String idToken = jwtClient.getDefaultOrInjectedServiceAccountIdToken();
+    partitionHeaders.put("authorization", idToken);
+    return partitionFactory.create(partitionHeaders);
+  }
+
+}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/PubSubExtensionsService.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/PubSubExtensionsService.java
index efe2b6c05aa9768a7df6ae646446d9ef931f3cd2..c709267bac5e3984bc1cd9ec899316ea45d4d901 100644
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/PubSubExtensionsService.java
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/PubSubExtensionsService.java
@@ -1,17 +1,19 @@
-// Copyright 2017-2019, 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.
-
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.opengroup.osdu.legal.di;
 
 import org.springframework.beans.factory.config.AbstractFactoryBean;
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/PublisherFactoryService.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/PublisherFactoryService.java
index d4ae2165d2cd5be77d16e3a83e67d42eb268dfa7..e49c9e050140a3ae819814b78e48e9add95741a2 100644
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/PublisherFactoryService.java
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/PublisherFactoryService.java
@@ -1,17 +1,19 @@
-// Copyright 2017-2019, 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.
-
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.opengroup.osdu.legal.di;
 
 import org.springframework.beans.factory.config.AbstractFactoryBean;
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/TenantFactoryService.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/TenantFactoryService.java
index 7286d1ef898a2021e8d39b48eeb633b96e665688..0b415ed36facffba0dc06862f56e34fd4a927772 100644
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/TenantFactoryService.java
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/di/TenantFactoryService.java
@@ -1,17 +1,19 @@
-// Copyright 2017-2019, 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.
-
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.opengroup.osdu.legal.di;
 
 import org.springframework.beans.factory.config.AbstractFactoryBean;
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/jobs/LegalTagPublisherImpl.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/jobs/LegalTagPublisherImpl.java
index e7db669046b72230127b78a921f3fb445aaad75f..6520ee7bd4f809ef8258aa0cbb6759f019808abe 100644
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/jobs/LegalTagPublisherImpl.java
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/jobs/LegalTagPublisherImpl.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2020 Google LLC
- * Copyright 2020 EPAM Systems, Inc
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,71 +14,71 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opengroup.osdu.legal.jobs;
 
-import com.google.api.gax.rpc.DeadlineExceededException;
-import com.google.cloud.pubsub.v1.Publisher;
+import static java.util.Arrays.asList;
+
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.JsonElement;
-import com.google.protobuf.ByteString;
-import com.google.pubsub.v1.PubsubMessage;
-import org.opengroup.osdu.legal.logging.AuditLogger;
-import org.opengroup.osdu.core.common.model.legal.StatusChangedTags;
-import org.opengroup.osdu.core.gcp.PubSub.PubSubExtensions;
-import org.opengroup.osdu.core.gcp.multitenancy.IPublisherFactory;
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.Map;
+import javax.annotation.PostConstruct;
+import lombok.RequiredArgsConstructor;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
+import org.opengroup.osdu.core.common.model.legal.StatusChangedTags;
+import org.opengroup.osdu.core.gcp.oqm.driver.OqmDriver;
+import org.opengroup.osdu.core.gcp.oqm.model.OqmDestination;
+import org.opengroup.osdu.core.gcp.oqm.model.OqmMessage;
+import org.opengroup.osdu.core.gcp.oqm.model.OqmTopic;
+import org.opengroup.osdu.legal.config.GcpAppServiceConfig;
+import org.opengroup.osdu.legal.logging.AuditLogger;
 import org.opengroup.osdu.legal.provider.interfaces.ILegalTagPublisher;
 import org.springframework.stereotype.Service;
 
-import javax.inject.Inject;
-
-import static java.util.Arrays.asList;
-
 @Service
+@RequiredArgsConstructor
 public class LegalTagPublisherImpl implements ILegalTagPublisher {
 
-    @Inject
-    private IPublisherFactory publisherFactory;
+  private final AuditLogger auditLogger;
+  private final GcpAppServiceConfig config;
+  private final OqmDriver driver;
+
+  private OqmTopic oqmTopic = null;
+
+  @PostConstruct
+  void postConstruct() {
+    oqmTopic = OqmTopic.builder().name(config.getPubSubLegalTagsTopic()).build();
+  }
 
-    @Inject
-    private PubSubExtensions pubSubExtensions;
+  public void publish(String projectId, DpsHeaders headers, StatusChangedTags statusChangedTags)
+      throws Exception {
 
-    @Inject
-    private AuditLogger auditLogger;
+    OqmDestination oqmDestination = OqmDestination.builder().partitionId(headers.getPartitionId())
+        .build();
 
-    private String topicId = "legaltags_changed";
+    String json = generatePubSubMessage(statusChangedTags);
 
-    public void publish(String projectId, DpsHeaders headers, StatusChangedTags statusChangedTags) throws Exception {
+    Map<String, String> attributes = new HashMap<>();
+    attributes.put(DpsHeaders.ACCOUNT_ID, headers.getPartitionIdWithFallbackToAccountId());
+    attributes.put(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionIdWithFallbackToAccountId());
+    headers.addCorrelationIdIfMissing();
+    attributes.put(DpsHeaders.CORRELATION_ID, headers.getCorrelationId());
 
-        Publisher publisher = publisherFactory.createPublisher(projectId, topicId);
+    OqmMessage oqmMessage = OqmMessage.builder().data(json).attributes(attributes).build();
 
-        String messageId;
-        PubsubMessage pubsubMessage = null;
-        try {
-            pubsubMessage = generatePubsubMessage(headers, statusChangedTags);
-            messageId = pubSubExtensions.publishAndCreateTopicIfNotExist(publisher, pubsubMessage);
-        } catch (DeadlineExceededException e) {//try again
-            messageId = pubSubExtensions.publishAndCreateTopicIfNotExist(publisher, pubsubMessage);
-        } finally {
-            publisher.shutdown();
-        }
-        auditLogger.publishedStatusChangeSuccess(asList(messageId, statusChangedTags.toString()));
+    driver.publish(oqmMessage, oqmTopic, oqmDestination);
 
-    }
+    auditLogger.publishedStatusChangeSuccess(
+        asList(Long.toString(Instant.now().getEpochSecond()), statusChangedTags.toString()));
 
-    private PubsubMessage generatePubsubMessage(DpsHeaders headers, StatusChangedTags statusChangedTags) {
-        Gson gson = new GsonBuilder().create();
-        JsonElement statusChangedTagsJson = gson.toJsonTree(statusChangedTags, StatusChangedTags.class);
-        ByteString statusChangedTagsData = ByteString.copyFromUtf8(statusChangedTagsJson.toString());
+  }
 
-        PubsubMessage.Builder builder = PubsubMessage.newBuilder();
-        builder.putAttributes(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionIdWithFallbackToAccountId());
-        builder.putAttributes(DpsHeaders.CORRELATION_ID, headers.getCorrelationId());
-        builder.putAttributes(DpsHeaders.USER_EMAIL, headers.getUserEmail());
-        builder.setData(statusChangedTagsData);
+  private String generatePubSubMessage(StatusChangedTags statusChangedTags) {
+    Gson gson = new GsonBuilder().create();
+    JsonElement statusChangedTagsJson = gson.toJsonTree(statusChangedTags, StatusChangedTags.class);
 
-        return builder.build();
-    }
+    return statusChangedTagsJson.toString();
+  }
 }
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/obm/GcsTenantObmDestinationResolver.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/obm/GcsTenantObmDestinationResolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..b64124785abf5101feb0b9be4385e4e6e4c2e39b
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/obm/GcsTenantObmDestinationResolver.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.mappers.obm;
+
+import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_SINGLETON;
+
+import com.google.cloud.storage.Storage;
+import com.google.cloud.storage.StorageOptions;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import javax.annotation.PreDestroy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.opengroup.osdu.core.common.model.tenant.TenantInfo;
+import org.opengroup.osdu.core.common.provider.interfaces.ITenantFactory;
+import org.opengroup.osdu.core.gcp.obm.driver.gcs.GcsObmDestinationResolution;
+import org.opengroup.osdu.core.gcp.obm.driver.gcs.GcsObmDestinationResolver;
+import org.opengroup.osdu.core.gcp.obm.persistence.ObmDestination;
+import org.opengroup.osdu.core.gcp.oqm.driver.OqmDriverRuntimeException;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+/**
+ * For GCP Storage. Tenant Based OBM destination resolver
+ */
+@Component
+@Scope(SCOPE_SINGLETON)
+@ConditionalOnProperty(name = "obmDriver", havingValue = "gcs")
+@Slf4j
+@RequiredArgsConstructor
+public class GcsTenantObmDestinationResolver implements GcsObmDestinationResolver {
+
+  private final Map<ObmDestination, Storage> storageCache = new HashMap<>();
+
+  private final ITenantFactory tenantInfoFactory;
+
+  @Override
+  public GcsObmDestinationResolution resolve(ObmDestination destination) {
+    String partitionId = destination.getPartitionId();
+    TenantInfo ti = tenantInfoFactory.getTenantInfo(partitionId);
+
+    Storage storage = storageCache.get(destination);
+    if (Objects.isNull(storage)) {
+      try {
+        storage = StorageOptions.newBuilder().setProjectId(ti.getProjectId()).build().getService();
+
+        storageCache.put(destination, storage);
+      } catch (Exception e) {
+        throw new OqmDriverRuntimeException("GcsObmDestinationResolution#resolve Storage", e);
+      }
+    }
+
+    return GcsObmDestinationResolution.builder()
+        .dataProjectId(ti.getProjectId())
+        .storage(storage)
+        .build();
+  }
+
+  @PreDestroy
+  public void shutdown() {
+    log.info("On pre-destroy");
+  }
+}
\ No newline at end of file
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/obm/MinioObmConfigurationProperties.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/obm/MinioObmConfigurationProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca598caed15fac7d120a7ceaaa21473b09757e5b
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/obm/MinioObmConfigurationProperties.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.mappers.obm;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnProperty(name = "obmDriver", havingValue = "minio")
+@ConfigurationProperties(prefix = "obm.minio")
+@Getter
+@Setter
+public class MinioObmConfigurationProperties {
+
+  private String partitionPropertiesPrefix = "obm.minio";
+
+}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/obm/MinioTenantObmDestinationResolver.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/obm/MinioTenantObmDestinationResolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7b245bf0d50acec42c8081963ef83938204f34b
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/obm/MinioTenantObmDestinationResolver.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.mappers.obm;
+
+import io.minio.MinioClient;
+import java.util.Objects;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.opengroup.osdu.core.common.partition.IPartitionProvider;
+import org.opengroup.osdu.core.common.partition.PartitionException;
+import org.opengroup.osdu.core.common.partition.PartitionInfo;
+import org.opengroup.osdu.core.common.partition.Property;
+import org.opengroup.osdu.core.gcp.obm.driver.ObmDriverRuntimeException;
+import org.opengroup.osdu.core.gcp.obm.driver.minio.MinioObmDestinationResolution;
+import org.opengroup.osdu.core.gcp.obm.driver.minio.MinioObmDestinationResolver;
+import org.opengroup.osdu.core.gcp.obm.persistence.ObmDestination;
+import org.opengroup.osdu.core.gcp.osm.translate.TranslatorRuntimeException;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PreDestroy;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_SINGLETON;
+
+/**
+ * For minIO. Tenant Based OBM destination resolver
+ */
+@Component
+@Scope(SCOPE_SINGLETON)
+@ConditionalOnProperty(name = "obmDriver", havingValue = "minio")
+@RequiredArgsConstructor
+@Slf4j
+public class MinioTenantObmDestinationResolver implements MinioObmDestinationResolver {
+
+  private final MinioObmConfigurationProperties properties;
+
+  private static final String ENDPOINT = ".endpoint";
+  private static final String ACCESS_KEY = ".accessKey";
+  private static final String SECRET_KEY = ".secretKey";
+
+  private final IPartitionProvider partitionProvider;
+
+  private final Map<String, MinioClient> minioCache = new HashMap<>();
+
+  @Override
+  public MinioObmDestinationResolution resolve(ObmDestination destination) {
+
+    String partitionId = destination.getPartitionId();
+
+    MinioClient minioClient = minioCache.get(partitionId);
+
+    if (Objects.isNull(minioClient)) {
+
+      PartitionInfo partitionInfo;
+      try {
+        partitionInfo = partitionProvider.get(partitionId);
+      } catch (PartitionException e) {
+        throw new TranslatorRuntimeException(e, "Partition '%s' destination resolution issue", partitionId);
+      }
+      Map<String, Property> partitionProperties = partitionInfo.getProperties();
+
+      String endpoint = getPartitionProperty(partitionId, partitionProperties, ENDPOINT);
+      String accessKey = getPartitionProperty(partitionId, partitionProperties, ACCESS_KEY);
+      String secretKey = getPartitionProperty(partitionId, partitionProperties, SECRET_KEY);
+
+      try {
+        minioClient = MinioClient.builder()
+            .endpoint(endpoint)
+            .credentials(accessKey, secretKey)
+            .build();
+
+        minioCache.put(partitionId, minioClient);
+
+      } catch (Exception e) {
+        throw new ObmDriverRuntimeException("MiniIO Client", e);
+      }
+    }
+    return MinioObmDestinationResolution.builder()
+        .client(minioClient)
+        .build();
+  }
+
+  private String getPartitionProperty(String partitionId, Map<String, Property> partitionProperties, String propertyName) {
+    String fullName = properties.getPartitionPropertiesPrefix().concat(propertyName);
+    return Optional.ofNullable(partitionProperties.get(fullName)).map(Property::getValue).map(Object::toString)
+        .orElseThrow(() -> new TranslatorRuntimeException(null,
+            "Partition '%s' minIO OBM destination resolution configuration issue. Property '%s' is not provided in PartitionInfo.",
+            partitionId, fullName));
+  }
+
+  @PreDestroy
+  public void shutdown() {
+    log.info("On pre-destroy.");
+  }
+}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/oqm/MqOqmConfigurationProperties.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/oqm/MqOqmConfigurationProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..b8fbc70c0dc9c8abde89604cebe4d10ca2ae5202
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/oqm/MqOqmConfigurationProperties.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.mappers.oqm;
+
+import lombok.Data;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnProperty(name = "oqmDriver", havingValue = "rabbitmq")
+@ConfigurationProperties(prefix = "oqm.rabbitmq")
+@Data
+public class MqOqmConfigurationProperties {
+
+  private String partitionPropertiesPrefix = "oqm.rabbitmq";
+
+}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/oqm/MqTenantOqmDestinationResolver.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/oqm/MqTenantOqmDestinationResolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..525bbe033048ff99407c861bdd25cd7b1ec3f314
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/oqm/MqTenantOqmDestinationResolver.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.mappers.oqm;
+
+import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_SINGLETON;
+
+import com.rabbitmq.client.ConnectionFactory;
+import com.rabbitmq.http.client.Client;
+import com.rabbitmq.http.client.ClientParameters;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.opengroup.osdu.core.common.partition.IPartitionProvider;
+import org.opengroup.osdu.core.common.partition.PartitionException;
+import org.opengroup.osdu.core.common.partition.PartitionInfo;
+import org.opengroup.osdu.core.common.partition.Property;
+import org.opengroup.osdu.core.gcp.oqm.driver.OqmDriverRuntimeException;
+import org.opengroup.osdu.core.gcp.oqm.driver.rabbitmq.MqOqmDestinationResolution;
+import org.opengroup.osdu.core.gcp.oqm.model.OqmDestination;
+import org.opengroup.osdu.core.gcp.osm.translate.TranslatorRuntimeException;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Component
+@Scope(SCOPE_SINGLETON)
+@ConditionalOnProperty(name = "oqmDriver", havingValue = "rabbitmq")
+@RequiredArgsConstructor
+@Slf4j
+public class MqTenantOqmDestinationResolver implements
+    org.opengroup.osdu.core.gcp.oqm.driver.rabbitmq.MqOqmDestinationResolver {
+
+  private final MqOqmConfigurationProperties properties;
+
+  //Compose names to get configuration properties from Partition
+  private static final String AMQP = ".amqp.";
+  private static final String AMQP_HOST = AMQP.concat("host");
+  private static final String AMQP_PORT = AMQP.concat("port");
+  private static final String AMQP_PATH = AMQP.concat("path");
+  private static final String AMQP_USERNAME = AMQP.concat("username");
+  private static final String AMQP_PASSWORD = AMQP.concat("password");
+
+  private static final String ADMIN = ".admin.";
+  private static final String ADMIN_SCHEMA = ADMIN.concat("schema");
+  private static final String ADMIN_HOST = ADMIN.concat("host");
+  private static final String ADMIN_PORT = ADMIN.concat("port");
+  private static final String ADMIN_PATH = ADMIN.concat("path");
+  private static final String ADMIN_USERNAME = ADMIN.concat("username");
+  private static final String ADMIN_PASSWORD = ADMIN.concat("password");
+
+  private final IPartitionProvider partitionProvider;
+
+  private final Map<String, ConnectionFactory> amqpConnectionFactoryCache = new HashMap<>();
+  private final Map<String, Client> httpClientCache = new HashMap<>();
+
+  @Override
+  public MqOqmDestinationResolution resolve(OqmDestination destination) {
+
+    String partitionId = destination.getPartitionId();
+
+    String virtualHost = "/";
+
+    ConnectionFactory amqpFactory = amqpConnectionFactoryCache.get(partitionId);
+    Client httpClient = httpClientCache.get(partitionId);
+
+    if (Objects.isNull(amqpFactory) || Objects.isNull(httpClient)) {
+
+      PartitionInfo partitionInfo;
+      try {
+        partitionInfo = partitionProvider.get(partitionId);
+      } catch (PartitionException e) {
+        throw new TranslatorRuntimeException(e, "Partition '%s' destination resolution issue",
+            destination.getPartitionId());
+      }
+      Map<String, Property> partitionProperties = partitionInfo.getProperties();
+
+      if (Objects.isNull(amqpFactory)) {
+
+        String amqpHost = getPartitionProperty(partitionId, partitionProperties, AMQP_HOST);
+        String amqpPort = getPartitionProperty(partitionId, partitionProperties, AMQP_PORT);
+        String amqpPath = getPartitionProperty(partitionId, partitionProperties, AMQP_PATH);
+        String amqpUser = getPartitionProperty(partitionId, partitionProperties, AMQP_USERNAME);
+        String amqpPass = getPartitionProperty(partitionId, partitionProperties, AMQP_PASSWORD);
+
+        URI amqpUri;
+        try {
+          amqpUri = new URI("amqp", amqpUser + ":" + amqpPass, amqpHost,
+              Integer.parseInt(amqpPort), amqpPath, null, null);
+          amqpFactory = new ConnectionFactory();
+          amqpFactory.setUri(amqpUri);
+          amqpConnectionFactoryCache.put(partitionId, amqpFactory);
+
+        } catch (URISyntaxException | NoSuchAlgorithmException | KeyManagementException e) {
+          throw new OqmDriverRuntimeException("RabbitMQ amqp URI and ConnectionFactory", e);
+        }
+      }
+
+      if (Objects.isNull(httpClient)) {
+
+        String adminSchema = getPartitionProperty(partitionId, partitionProperties, ADMIN_SCHEMA);
+        String adminHost = getPartitionProperty(partitionId, partitionProperties, ADMIN_HOST);
+        String adminPort = getPartitionProperty(partitionId, partitionProperties, ADMIN_PORT);
+        String adminPath = getPartitionProperty(partitionId, partitionProperties, ADMIN_PATH);
+        String adminUser = getPartitionProperty(partitionId, partitionProperties,
+            ADMIN_USERNAME);
+        String adminPass = getPartitionProperty(partitionId, partitionProperties,
+            ADMIN_PASSWORD);
+
+        try {
+          URI httpUrl = new URI(adminSchema, null, adminHost, Integer.parseInt(adminPort),
+              adminPath, null, null);
+          ClientParameters clientParameters = new ClientParameters().url(httpUrl.toURL())
+              .username(adminUser).password(adminPass);
+
+          httpClient = new Client(clientParameters);
+          httpClientCache.put(partitionId, httpClient);
+
+        } catch (URISyntaxException | MalformedURLException e) {
+          throw new OqmDriverRuntimeException("RabbitMQ http(api) URI and Client", e);
+        }
+      }
+    }
+    return MqOqmDestinationResolution.builder()
+        .amqpFactory(amqpFactory)
+        .adminClient(httpClient)
+        .virtualHost(virtualHost)
+        .build();
+  }
+
+  private String getPartitionProperty(String partitionId, Map<String, Property> partitionProperties,
+      String propertyName) {
+    String fullName = properties.getPartitionPropertiesPrefix().concat(propertyName);
+    return Optional.ofNullable(partitionProperties.get(fullName)).map(Property::getValue)
+        .map(Object::toString)
+        .orElseThrow(() -> new TranslatorRuntimeException(null,
+            "Partition '%s' RabbitMQ OQM destination resolution configuration issue. Property '%s' is not provided in PartitionInfo.",
+            partitionId, fullName));
+  }
+
+  @PreDestroy
+  public void shutdown() {
+    log.info("On pre-destroy.");
+  }
+}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/oqm/PsTenantOqmDestinationResolver.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/oqm/PsTenantOqmDestinationResolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..4fe916cd7f5939a3dcd323978002dace48de4233
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/oqm/PsTenantOqmDestinationResolver.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.mappers.oqm;
+
+import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_SINGLETON;
+
+import com.google.api.gax.retrying.RetrySettings;
+import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
+import com.google.cloud.pubsub.v1.TopicAdminClient;
+import com.google.cloud.pubsub.v1.TopicAdminSettings;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import javax.annotation.PreDestroy;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.opengroup.osdu.core.common.model.tenant.TenantInfo;
+import org.opengroup.osdu.core.common.provider.interfaces.ITenantFactory;
+import org.opengroup.osdu.core.gcp.oqm.driver.OqmDriverRuntimeException;
+import org.opengroup.osdu.core.gcp.oqm.driver.pubsub.PsOqmDestinationResolution;
+import org.opengroup.osdu.core.gcp.oqm.driver.pubsub.PsOqmDestinationResolver;
+import org.opengroup.osdu.core.gcp.oqm.model.OqmDestination;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.threeten.bp.Duration;
+
+/**
+ * For GCP PubSub. Tenant Based OQM destination resolver
+ */
+@Component
+@Scope(SCOPE_SINGLETON)
+@ConditionalOnProperty(name = "oqmDriver", havingValue = "pubsub")
+@Slf4j
+@RequiredArgsConstructor
+public class PsTenantOqmDestinationResolver implements PsOqmDestinationResolver {
+
+  private Map<OqmDestination, TopicAdminClient> topicClientCache = new HashMap<>();
+  private Map<OqmDestination, SubscriptionAdminClient> subscriptionClientCache = new HashMap<>();
+
+  private final ITenantFactory tenantInfoFactory;
+
+  private static final RetrySettings RETRY_SETTINGS = RetrySettings.newBuilder()
+      .setTotalTimeout(Duration.ofSeconds(10))
+      .setInitialRetryDelay(Duration.ofMillis(5))
+      .setRetryDelayMultiplier(2)
+      .setMaxRetryDelay(Duration.ofSeconds(3))
+      .setInitialRpcTimeout(Duration.ofSeconds(10))
+      .setRpcTimeoutMultiplier(2)
+      .setMaxRpcTimeout(Duration.ofSeconds(10))
+      .build();
+
+  @Override
+  public PsOqmDestinationResolution resolve(OqmDestination destination) {
+    TenantInfo ti = tenantInfoFactory.getTenantInfo(destination.getPartitionId());
+
+    String topicProjectId = ti.getProjectId();
+    String subscriptionProjectId = ti.getProjectId();
+
+    TopicAdminClient tac = topicClientCache.get(destination);
+    if (Objects.isNull(tac)) {
+      try {
+        TopicAdminSettings tas = TopicAdminSettings.newBuilder().build();
+        tac = TopicAdminClient.create(tas);
+        topicClientCache.put(destination, tac);
+      } catch (IOException e) {
+        throw new OqmDriverRuntimeException(
+            "PsOqmDestinationResolution#resolve TopicAdminClient", e);
+      }
+    }
+
+    SubscriptionAdminClient sac = subscriptionClientCache.get(destination);
+    if (Objects.isNull(sac)) {
+      try {
+        sac = SubscriptionAdminClient.create();
+        subscriptionClientCache.put(destination, sac);
+      } catch (IOException e) {
+        throw new OqmDriverRuntimeException(
+            "PsOqmDestinationResolution#resolve SubscriptionAdminClient", e);
+      }
+    }
+
+    return PsOqmDestinationResolution.builder()
+        .servicesProjectId(topicProjectId)
+        .dataProjectId(subscriptionProjectId)
+        .topicAdminClient(tac)
+        .subscriptionAdminClient(sac)
+        .build();
+  }
+
+  @PreDestroy
+  public void shutdown() {
+    log.info("On pre-destroy. {} topic client(s) & {} subscription clients to shutdown",
+        topicClientCache.size(), subscriptionClientCache.size());
+    for (TopicAdminClient tac : topicClientCache.values()) {
+      tac.shutdown();
+    }
+    for (SubscriptionAdminClient sac : subscriptionClientCache.values()) {
+      sac.shutdown();
+    }
+  }
+}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/DsTenantOsmDestinationResolver.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/DsTenantOsmDestinationResolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..792bf902ba79be584ab68242a52a3e0b9aa54bbb
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/DsTenantOsmDestinationResolver.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.mappers.osm;
+
+import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_SINGLETON;
+
+import com.google.api.gax.retrying.RetrySettings;
+import com.google.cloud.TransportOptions;
+import com.google.cloud.datastore.Datastore;
+import com.google.cloud.datastore.DatastoreOptions;
+import com.google.cloud.http.HttpTransportOptions;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import lombok.RequiredArgsConstructor;
+import org.opengroup.osdu.core.common.model.tenant.TenantInfo;
+import org.opengroup.osdu.core.common.provider.interfaces.ITenantFactory;
+import org.opengroup.osdu.core.gcp.osm.model.Destination;
+import org.opengroup.osdu.core.gcp.osm.translate.datastore.DsDestinationResolution;
+import org.opengroup.osdu.core.gcp.osm.translate.datastore.DsDestinationResolver;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.threeten.bp.Duration;
+
+/**
+ * Resolves Destination.partitionId into info needed by Datastore to address requests to a relevant
+ * GCP data project.
+ */
+@Component
+@Scope(SCOPE_SINGLETON)
+@ConditionalOnProperty(name = "osmDriver", havingValue = "datastore")
+@RequiredArgsConstructor
+public class DsTenantOsmDestinationResolver implements DsDestinationResolver {
+
+  protected static final RetrySettings RETRY_SETTINGS = RetrySettings
+      .newBuilder()
+      .setMaxAttempts(6)
+      .setInitialRetryDelay(Duration.ofSeconds(10L))
+      .setMaxRetryDelay(Duration.ofSeconds(32L))
+      .setRetryDelayMultiplier(2.0D)
+      .setTotalTimeout(Duration.ofSeconds(50L))
+      .setInitialRpcTimeout(Duration.ofSeconds(50L))
+      .setRpcTimeoutMultiplier(1.0D)
+      .setMaxRpcTimeout(Duration.ofSeconds(50L)).build();
+  protected static final TransportOptions TRANSPORT_OPTIONS = HttpTransportOptions
+      .newBuilder()
+      .setReadTimeout(30000)
+      .build();
+
+  private final ITenantFactory tenantInfoFactory;
+  private final Map<String, Datastore> datastoreCache = new HashMap<>();
+
+  /**
+   * Takes provided Destination with partitionId set to needed tenantId, returns its
+   * TenantInfo.projectId.
+   *
+   * @param destination to resolve
+   * @return resolution results
+   */
+  @Override
+  public DsDestinationResolution resolve(Destination destination) {
+    String partitionId = destination.getPartitionId();
+
+    TenantInfo ti = tenantInfoFactory.getTenantInfo(partitionId);
+    String projectId = ti.getProjectId();
+    Datastore datastore = datastoreCache.get(partitionId);
+    if (Objects.isNull(datastore)) {
+      synchronized (datastoreCache) {
+        datastore = datastoreCache.get(partitionId);
+        if (Objects.isNull(datastore)) {
+          datastore = DatastoreOptions.newBuilder()
+              .setRetrySettings(RETRY_SETTINGS)
+              .setTransportOptions(TRANSPORT_OPTIONS)
+              .setProjectId(projectId)
+              .setNamespace(destination.getNamespace().getName()).build()
+              .getService();
+          datastoreCache.put(partitionId, datastore);
+        }
+      }
+    }
+
+    return DsDestinationResolution.builder()
+        .projectId(datastore.getOptions().getProjectId())
+        .datastore(datastore)
+        .build();
+  }
+
+  @Override
+  public void close() throws IOException {
+
+  }
+}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/OsmTypeMapperImpl.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/OsmTypeMapperImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..967851aabaf47b8baa0e47869030cbd3bf64cd26
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/OsmTypeMapperImpl.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.mappers.osm;
+
+import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_SINGLETON;
+
+import com.google.cloud.Timestamp;
+import com.google.cloud.datastore.Key;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import org.opengroup.osdu.core.common.model.legal.LegalTag;
+import org.opengroup.osdu.core.gcp.osm.persistence.IdentityTranslator;
+import org.opengroup.osdu.core.gcp.osm.translate.Instrumentation;
+import org.opengroup.osdu.core.gcp.osm.translate.TypeMapper;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+/**
+ * All Entity classes used in translation should be registered here even if don't need custom
+ * settings. Each class is represented as Instrumentation object. At least class objects and rules
+ * for Identity translation should be provided.oi
+ */
+@Component
+@Scope(SCOPE_SINGLETON)
+@ConditionalOnProperty(name = "osmDriver")
+public class OsmTypeMapperImpl extends TypeMapper {
+
+  public OsmTypeMapperImpl() {
+    super(Arrays.asList(
+        new Instrumentation<>(LegalTag.class,
+            new HashMap<String, String>() {{
+              put("countryOfOrigin", "COO");
+              put("createdDate", "created");
+            }},
+            new HashMap<String, Class<?>>() {{
+              put("created", Timestamp.class);
+              put("expirationDate", Timestamp.class);
+              put("isValid", Boolean.class);
+            }},
+            new IdentityTranslator<>(LegalTag::getId,
+                (r, o) -> r.setId(((Key) o).getId())),
+            Collections.singletonList("id"))));
+  }
+}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/PgOsmConfigurationProperties.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/PgOsmConfigurationProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf226d0cf26bc3fde990865f232db00a168a83af
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/PgOsmConfigurationProperties.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.mappers.osm;
+
+import lombok.Data;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnProperty(name = "osmDriver", havingValue = "postgres")
+@ConfigurationProperties(prefix = "osm.postgres")
+@Data
+public class PgOsmConfigurationProperties {
+
+  private String partitionPropertiesPrefix = "osm.postgres";
+
+  private Integer maximumPoolSize = 40;
+  private Integer minimumIdle = 0;
+  private Integer idleTimeout = 30000;
+  private Integer maxLifetime = 1800000;
+  private Integer connectionTimeout = 30000;
+}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/PgTenantOsmDestinationResolver.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/PgTenantOsmDestinationResolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..996879e8b6c0bd0ac0bf530c2d6b41caabb4bb25
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/mappers/osm/PgTenantOsmDestinationResolver.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.mappers.osm;
+
+import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_SINGLETON;
+
+import com.zaxxer.hikari.HikariDataSource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import javax.annotation.PreDestroy;
+import javax.sql.DataSource;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.opengroup.osdu.core.common.partition.IPartitionProvider;
+import org.opengroup.osdu.core.common.partition.PartitionException;
+import org.opengroup.osdu.core.common.partition.PartitionInfo;
+import org.opengroup.osdu.core.common.partition.Property;
+import org.opengroup.osdu.core.gcp.osm.model.Destination;
+import org.opengroup.osdu.core.gcp.osm.translate.TranslatorRuntimeException;
+import org.opengroup.osdu.core.gcp.osm.translate.postgresql.PgDestinationResolution;
+import org.opengroup.osdu.core.gcp.osm.translate.postgresql.PgDestinationResolver;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+/**
+ * Resolves Destination.partitionId into info needed by Postgres to address requests to a relevant
+ * DB server.
+ */
+@Component
+@Scope(SCOPE_SINGLETON)
+@ConditionalOnProperty(name = "osmDriver", havingValue = "postgres")
+@RequiredArgsConstructor
+@Slf4j
+public class PgTenantOsmDestinationResolver implements PgDestinationResolver {
+
+  private final IPartitionProvider partitionProvider;
+
+  private final PgOsmConfigurationProperties properties;
+
+  private static final String DATASOURCE = ".datasource.";
+  private static final String PASSWORD = DATASOURCE.concat("password");
+
+  private static final String DRIVER_CLASS_NAME = "org.postgresql.Driver";
+
+  private final Map<String, DataSource> dataSourceCache = new HashMap<>();
+
+  @Override
+  public PgDestinationResolution resolve(Destination destination) {
+
+    String partitionId = destination.getPartitionId();
+    DataSource dataSource = dataSourceCache.get(partitionId);
+    if (dataSource == null || (dataSource instanceof HikariDataSource
+        && ((HikariDataSource) dataSource).isClosed())) {
+      synchronized (dataSourceCache) {
+        dataSource = dataSourceCache.get(partitionId);
+        if (dataSource == null || (dataSource instanceof HikariDataSource
+            && ((HikariDataSource) dataSource).isClosed())) {
+
+          PartitionInfo partitionInfo;
+          try {
+            partitionInfo = partitionProvider.get(destination.getPartitionId());
+          } catch (PartitionException e) {
+            throw new TranslatorRuntimeException(e,
+                "Partition '%s' destination resolution issue", destination.getPartitionId());
+          }
+          Map<String, Property> partitionProperties = partitionInfo.getProperties();
+
+          String url = "jdbc:postgresql://localhost:5432/postgres";//getPartitionProperty(partitionId, partitionProperties, URL);
+          String username = "postgres";//getPartitionProperty(partitionId, partitionProperties, USERNAME);
+          String password = "st4s";
+          getPartitionProperty(partitionId, partitionProperties, PASSWORD);
+
+          dataSource = DataSourceBuilder.create()
+              .driverClassName(DRIVER_CLASS_NAME)
+              .url(url)
+              .username(username)
+              .password(password)
+              .build();
+
+          HikariDataSource hikariDataSource = (HikariDataSource) dataSource;
+          hikariDataSource.setMaximumPoolSize(properties.getMaximumPoolSize());
+          hikariDataSource.setMinimumIdle(properties.getMinimumIdle());
+          hikariDataSource.setIdleTimeout(properties.getIdleTimeout());
+          hikariDataSource.setMaxLifetime(properties.getMaxLifetime());
+          hikariDataSource.setConnectionTimeout(properties.getConnectionTimeout());
+
+          dataSourceCache.put(partitionId, dataSource);
+        }
+      }
+    }
+
+    return PgDestinationResolution.builder()
+        .datasource(dataSource)
+        .build();
+  }
+
+  @PreDestroy
+  @Override
+  public void close() {
+    log.info("On pre-destroy. {} DataSources to shutdown", dataSourceCache.size());
+    for (DataSource dataSource : dataSourceCache.values()) {
+      if (dataSource instanceof HikariDataSource && !((HikariDataSource) dataSource).isClosed()) {
+        ((HikariDataSource) dataSource).close();
+      }
+    }
+  }
+
+  private String getPartitionProperty(String partitionId, Map<String, Property> partitionProperties,
+      String propertyName) {
+    String fullName = properties.getPartitionPropertiesPrefix().concat(propertyName);
+    return Optional.ofNullable(partitionProperties.get(fullName)).map(Property::getValue)
+        .map(Object::toString)
+        .orElseThrow(() ->
+            new TranslatorRuntimeException(null,
+                "Partition '%s' Postgres OSM destination resolution configuration issue. Property '%s' is not provided in PartitionInfo.",
+                partitionId, fullName));
+  }
+}
\ No newline at end of file
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/security/GSuiteSecurityConfiguration.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/security/GSuiteSecurityConfiguration.java
index 9ba6e1cb72aa54a578f226241be8fd0b08205e8f..1a44d40b6069d0031825b7eabeabe844c848256b 100644
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/security/GSuiteSecurityConfiguration.java
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/security/GSuiteSecurityConfiguration.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2020 Google LLC
- * Copyright 2020 EPAM Systems, Inc
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opengroup.osdu.legal.security;
 
 import org.springframework.context.annotation.Configuration;
@@ -31,10 +30,8 @@ public class GSuiteSecurityConfiguration extends WebSecurityConfigurerAdapter {
 
   @Override
   protected void configure(HttpSecurity http) throws Exception {
-
     http.httpBasic().disable()
         .csrf().disable();  //disable default authN. AuthN handled by endpoints proxy
-
   }
 
   @Override
@@ -44,5 +41,4 @@ public class GSuiteSecurityConfiguration extends WebSecurityConfigurerAdapter {
         .antMatchers("/info")
         .antMatchers("/swagger");
   }
-
 }
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/LegalTagRepository.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/LegalTagRepository.java
deleted file mode 100644
index 2d98e84fd108b6fadbff106a611476b545b30a4e..0000000000000000000000000000000000000000
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/LegalTagRepository.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//  Copyright © 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.legal.tags;
-
-import org.opengroup.osdu.core.common.model.legal.LegalTag;
-import org.opengroup.osdu.core.common.model.legal.ListLegalTagArgs;
-import org.opengroup.osdu.legal.provider.interfaces.ILegalTagRepository;
-
-import org.springframework.stereotype.Repository;
-
-import java.util.*;
-
-@Repository
-public class LegalTagRepository implements ILegalTagRepository {
-
-    @Override
-    public Long create(LegalTag legalTag) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public Collection<LegalTag> get(long[] ids) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public Boolean delete(LegalTag legalTag) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public LegalTag update(LegalTag newLegalTag) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public Collection<LegalTag> list(ListLegalTagArgs args) {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/LegalTagRepositoryFactoryGcpImpl.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/LegalTagRepositoryFactoryGcpImpl.java
index eb006c2d47ed4dd772b5bb32043d1884015d4e04..500c6d6e68a8eb86c7b0279627978b195fd1c032 100644
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/LegalTagRepositoryFactoryGcpImpl.java
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/LegalTagRepositoryFactoryGcpImpl.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2020 Google LLC
- * Copyright 2020 EPAM Systems, Inc
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,62 +14,39 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opengroup.osdu.legal.tags;
 
-import com.google.cloud.datastore.Datastore;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Objects;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.java.Log;
 import org.apache.commons.lang3.StringUtils;
 import org.opengroup.osdu.core.common.model.http.AppException;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
 import org.opengroup.osdu.core.common.model.tenant.TenantInfo;
-import org.opengroup.osdu.core.common.provider.interfaces.ITenantFactory;
-import org.opengroup.osdu.core.gcp.multitenancy.IDatastoreFactory;
 import org.opengroup.osdu.legal.provider.interfaces.ILegalTagRepository;
 import org.opengroup.osdu.legal.provider.interfaces.ILegalTagRepositoryFactory;
-import org.opengroup.osdu.legal.tags.dataaccess.DatastoreLegalTagRepository;
-import org.opengroup.osdu.legal.tags.dataaccess.ResilientLegalTagRepository;
+import org.opengroup.osdu.legal.tags.dataaccess.OsmLegalTagRepository;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
 @Service
 @Primary
+@Log
+@RequiredArgsConstructor
 public class LegalTagRepositoryFactoryGcpImpl implements ILegalTagRepositoryFactory {
 
   private final Map<String, ILegalTagRepository> tenantRepositories = new HashMap<>();
+  private final TenantInfo tenantInfo;
+  private final OsmLegalTagRepository osmLegalTagRepository;
 
-  private TenantInfo tenantInfo;
-  private IDatastoreFactory factory;
-  private ITenantFactory tenantFactory;
-
-  public LegalTagRepositoryFactoryGcpImpl(TenantInfo tenantInfo, IDatastoreFactory factory,
-      ITenantFactory tenantFactory) {
-    this.tenantInfo = tenantInfo;
-    this.factory = factory;
-    this.tenantFactory = tenantFactory;
-  }
 
   @Override
   public ILegalTagRepository get(String tenantName) {
     if (StringUtils.isBlank(tenantName)) {
       throw invalidTenantGivenException(tenantName);
     }
-    if (!tenantRepositories.containsKey(tenantName)) {
-      addRepository(tenantName);
-    }
-    return tenantRepositories.get(tenantName);
-  }
-
-  private void addRepository(String tenantName) {
-    TenantInfo info = tenantFactory.getTenantInfo(tenantName);
-    Datastore ds = factory.getDatastore(info);
-    if (Objects.isNull(ds)) {
-      throw invalidTenantGivenException(tenantName);
-    }
-    ILegalTagRepository repo = new ResilientLegalTagRepository(new DatastoreLegalTagRepository(ds));
-    tenantRepositories.put(tenantName, repo);
+    return osmLegalTagRepository;
   }
 
   AppException invalidTenantGivenException(String tenantName) {
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/dataaccess/DatastoreLegalTagRepository.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/dataaccess/DatastoreLegalTagRepository.java
deleted file mode 100644
index e37f743b1c57c9bf9dd9f078c4bca4dfddfd519f..0000000000000000000000000000000000000000
--- a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/dataaccess/DatastoreLegalTagRepository.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright 2020 Google LLC
- * Copyright 2020 EPAM Systems, Inc
- *
- * 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
- *
- *     https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.opengroup.osdu.legal.tags.dataaccess;
-
-import com.google.cloud.Timestamp;
-import com.google.cloud.datastore.*;
-import org.opengroup.osdu.core.common.model.legal.*;
-import org.opengroup.osdu.core.common.model.http.AppException;
-import org.opengroup.osdu.legal.provider.interfaces.ILegalTagRepository;
-
-import java.sql.Date;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-public class DatastoreLegalTagRepository implements ILegalTagRepository {
-    private final Datastore googleDatastore;
-
-    public DatastoreLegalTagRepository(Datastore ds) {
-        googleDatastore = ds;
-    }
-
-    @Override
-    public Long create(LegalTag legalTag) {
-        Long id = -1L;
-
-        try {
-            if (legalTag != null) {
-                FullEntity<Key> entity = convertLegalTagToEntity(legalTag);
-                Key keys = saveNewEntry(entity, legalTag.getName());
-                id = keys.getId();
-            }
-        } catch (DatastoreException ex) {
-            throw new PersistenceException(ex.getCode(), ex.getMessage(), ex.getReason());
-        }
-        return id;
-    }
-
-    @Override
-    public Collection<LegalTag> get(long[] ids) {
-        List<LegalTag> output = new ArrayList<>();
-
-        try {
-            if (ids != null && ids.length > 0) {
-                List<Key> keys = new ArrayList<>();
-                for (long id : ids) {
-                    keys.add(createkey(id));
-                }
-                Iterator<Entity> entities = this.googleDatastore.get(keys);
-                while (entities != null && entities.hasNext()) {
-                    output.add(convertEntityToLegalTag(entities.next()));
-                }
-            }
-        } catch (DatastoreException ex) {
-            throw new PersistenceException(ex.getCode(), ex.getMessage(), ex.getReason());
-        }
-        return output;
-    }
-
-    @Override
-    public Boolean delete(LegalTag legalTag) {
-        boolean output = false;
-        Transaction txn = null;
-        try {
-            Key key = createkey(legalTag.getId());
-            txn = this.googleDatastore.newTransaction();
-
-            //backup legaltag before deleting
-            Entity existingEntity = txn.get(key);
-            if (existingEntity != null) {
-                LegalTag currentLegalTag = convertEntityToLegalTag(existingEntity);
-                FullEntity<IncompleteKey> currentEntity = convertLegalTagToHistoricEntity(currentLegalTag);
-                txn.putWithDeferredIdAllocation(currentEntity);
-                txn.delete(key);
-                txn.commit();
-            }
-            output = true;
-        } catch (DatastoreException ex) {
-            throw new PersistenceException(ex.getCode(), ex.getMessage(), ex.getReason());
-        } finally {
-            if (txn != null && txn.isActive()) {
-                txn.rollback();
-            }
-        }
-        return output;
-    }
-
-    @Override
-    public LegalTag update(LegalTag newLegalTag) {
-        if (newLegalTag == null)
-            return null;
-
-        Transaction txn = null;
-        FullEntity<Key> newEntity = convertLegalTagToEntity(newLegalTag);
-        try {
-            txn = this.googleDatastore.newTransaction();
-
-            Entity existingEntity = txn.get(newEntity.getKey());
-            if (existingEntity == null)
-                throw AppException.legalTagDoesNotExistError(newLegalTag.getName());
-
-            LegalTag currentLegalTag = convertEntityToLegalTag(existingEntity);
-            FullEntity<IncompleteKey> currentEntity = convertLegalTagToHistoricEntity(currentLegalTag);
-            txn.putWithDeferredIdAllocation(currentEntity);//this will make a backup of the current entity so we always have a record of it using a datastore assigned id
-            txn.put(newEntity);//this will overwrite the current entity
-            txn.commit();
-        } catch (DatastoreException ex) {
-            throw new PersistenceException(ex.getCode(), ex.getMessage(), ex.getReason());
-        } finally {
-            if (txn != null && txn.isActive()) {
-                txn.rollback();
-            }
-        }
-        return newLegalTag;
-    }
-
-    @Override
-    public Collection<LegalTag> list(ListLegalTagArgs args) {
-        List<LegalTag> output = new ArrayList<>();
-        try {
-            Query<Entity> query = Query.newEntityQueryBuilder()
-                    .setKind(LEGAL_TAGS_ENTITYNAME)
-                    .setFilter(StructuredQuery.PropertyFilter.eq(IS_VALID, args.getIsValid()))
-                    .build();
-            QueryResults<Entity> results = this.googleDatastore.run(query);
-            while (results != null && results.hasNext()) {
-                output.add(convertEntityToLegalTag(results.next()));
-            }
-        } catch (DatastoreException ex) {
-            throw new PersistenceException(ex.getCode(), ex.getMessage(), ex.getReason());
-        }
-        return output;
-    }
-
-    private Key saveNewEntry(FullEntity<Key> entity, String kind) {
-        Transaction txn = this.googleDatastore.newTransaction();
-        try {
-            Entity existingEntity = txn.get(entity.getKey());
-            if (existingEntity != null)
-                throw AppException.legalTagAlreadyExistsError(kind);
-
-            txn.put(entity);
-            txn.commit();
-        } finally {
-            if (txn.isActive()) {
-                txn.rollback();
-            }
-        }
-        return entity.getKey();
-    }
-
-    private LegalTag convertEntityToLegalTag(Entity entity) {
-        Properties properties = new Properties();
-        properties.setOriginator(entity.getString(ORIGINATOR));
-        properties.setExpirationDate(new Date(entity.getTimestamp(EXPIRATION_DATE).toSqlTimestamp().getTime()));
-        properties.setContractId(entity.getString(CONTRACT_ID));
-        properties.setDataType(entity.getString(DATA_TYPE));
-        properties.setSecurityClassification(entity.getString(SECURITY_CLASSIFICATION));
-        properties.setExportClassification(entity.getString(EXPORT_CLASSIFICATION));
-        properties.setPersonalData(entity.getString(PERSONAL_DATA));
-
-        List<Value<String>> legaltagsValues = entity.getList(COUNTRY_OF_ORIGIN);
-        List<String> countries = new ArrayList<>();
-        legaltagsValues.forEach(tag -> countries.add(tag.get()));
-        properties.setCountryOfOrigin(countries);
-
-        LegalTag legalTag = new LegalTag();
-        legalTag.setProperties(properties);
-        legalTag.setName(entity.getString(NAME));
-        legalTag.setIsValid(entity.getBoolean(IS_VALID));
-        legalTag.setId(entity.getKey().getId());
-
-        if (entity.contains(DESCRIPTION))
-            legalTag.setDescription(entity.getString(DESCRIPTION));
-
-        return legalTag;
-    }
-
-    @SuppressWarnings("unchecked")
-    private FullEntity<Key> convertLegalTagToEntity(LegalTag legalTag) {
-        Key key = createkey(legalTag.getId());
-        return getFullEntity(legalTag, key);
-    }
-
-    @SuppressWarnings("unchecked")
-    private FullEntity<IncompleteKey> convertLegalTagToHistoricEntity(LegalTag legalTag) {
-        IncompleteKey key = this.googleDatastore.newKeyFactory()
-                .setKind(LEGAL_TAGS_HISTORIC_ENTITYNAME).newKey();
-        return getFullEntity(legalTag, key);
-    }
-
-    private FullEntity getFullEntity(LegalTag legalTag, IncompleteKey key) {
-        Properties properties = legalTag.getProperties();
-
-        List<StringValue> countries = new ArrayList<>();
-        properties.getCountryOfOrigin().forEach(tag -> countries.add(new StringValue(tag)));
-
-        FullEntity entity = FullEntity.newBuilder(key)
-                .set(NAME, legalTag.getName())
-                .set(DESCRIPTION, legalTag.getDescription())
-                .set(IS_VALID, legalTag.getIsValid())
-                .set(COUNTRY_OF_ORIGIN, countries)
-                .set(CONTRACT_ID, properties.getContractId())
-                .set(EXPIRATION_DATE, Timestamp.of(properties.getExpirationDate()))
-                .set(CREATION_DT, Timestamp.of(new java.sql.Timestamp(System.currentTimeMillis())))
-                .set(ORIGINATOR, properties.getOriginator())
-                .set(DATA_TYPE, properties.getDataType())
-                .set(SECURITY_CLASSIFICATION, properties.getSecurityClassification())
-                .set(EXPORT_CLASSIFICATION, properties.getExportClassification())
-                .set(PERSONAL_DATA, properties.getPersonalData()).build();
-        return entity;
-    }
-
-    private Key createkey(long id) {
-        return this.googleDatastore.newKeyFactory()
-                .setKind(LEGAL_TAGS_ENTITYNAME).newKey(id);
-    }
-}
diff --git a/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/dataaccess/OsmLegalTagRepository.java b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/dataaccess/OsmLegalTagRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..a523a56bf509db3ccdfa0c683eebd2f976d30729
--- /dev/null
+++ b/provider/legal-gcp/src/main/java/org/opengroup/osdu/legal/tags/dataaccess/OsmLegalTagRepository.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opengroup.osdu.legal.tags.dataaccess;
+
+
+import static org.opengroup.osdu.core.gcp.osm.model.where.predicate.Eq.eq;
+import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_SINGLETON;
+
+import com.google.common.base.Preconditions;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.locks.ReentrantLock;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.java.Log;
+import org.opengroup.osdu.core.common.model.http.AppException;
+import org.opengroup.osdu.core.common.model.legal.LegalTag;
+import org.opengroup.osdu.core.common.model.legal.ListLegalTagArgs;
+import org.opengroup.osdu.core.common.model.tenant.TenantInfo;
+import org.opengroup.osdu.core.gcp.osm.model.Destination;
+import org.opengroup.osdu.core.gcp.osm.model.Kind;
+import org.opengroup.osdu.core.gcp.osm.model.Namespace;
+import org.opengroup.osdu.core.gcp.osm.model.query.GetQuery;
+import org.opengroup.osdu.core.gcp.osm.service.Context;
+import org.opengroup.osdu.core.gcp.osm.service.Transaction;
+import org.opengroup.osdu.legal.provider.interfaces.ILegalTagRepository;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Repository;
+
+@Repository
+@Scope(SCOPE_SINGLETON)
+@Log
+@RequiredArgsConstructor
+public class OsmLegalTagRepository implements ILegalTagRepository {
+
+  private final Context context;
+  private final TenantInfo tenantInfo;
+
+  public static final Kind LEGAL_TAGS_ENTITY_NAME = new Kind("LegalTagOsm");
+  private ReentrantLock lock = new ReentrantLock();
+
+  private Destination getDestination() {
+    return Destination.builder().partitionId(tenantInfo.getDataPartitionId())
+        .namespace(new Namespace(tenantInfo.getName())).kind(LEGAL_TAGS_ENTITY_NAME).build();
+  }
+
+  @Override
+  public Long create(LegalTag legalTag) {
+    Preconditions.checkNotNull(legalTag, "Legal tag is null!");
+    Preconditions.checkNotNull(legalTag.getId(), "Legal tag's id is null!");
+
+    Long id = -1L;
+    if (Objects.nonNull(legalTag)) {
+
+      Transaction txn = null;
+      GetQuery<LegalTag> query = new GetQuery<>(LegalTag.class, getDestination(),
+          eq("name", legalTag.getName()));
+      try {
+        txn = context.beginTransaction(getDestination());
+        lock.lock();
+        if (context.findOne(query).isPresent()) {
+          txn.rollbackIfActive();
+          throw new AppException(409,
+              "A LegalTag already exists for the given name",
+              "A LegalTag already exists for the given name");
+        } else {
+          LegalTag result = context.createAndGet(legalTag, getDestination());
+          txn.commitIfActive();
+          return result.getId();
+        }
+      } finally {
+        lock.unlock();
+        if (Objects.nonNull(txn)) {
+          txn.rollbackIfActive();
+        }
+
+      }
+    }
+    return id;
+  }
+
+  @Override
+  public Collection<LegalTag> get(long[] ids) {
+    List<LegalTag> output = new ArrayList<>();
+
+    if (Objects.nonNull(ids) && ids.length > 0) {
+      for (long id : ids) {
+        GetQuery<LegalTag> osmQuery = new GetQuery<>(LegalTag.class, getDestination(),
+            eq("id", id));
+        LegalTag legalTag = context.getOne(osmQuery);
+        if (Objects.nonNull(legalTag)) {
+          output.add(legalTag);
+        }
+      }
+    }
+    return output;
+  }
+
+  @Override
+  public Boolean delete(LegalTag legalTag) {
+    context.deleteById(LegalTag.class, getDestination(), legalTag.getId());
+    return true;
+  }
+
+  @Override
+  public LegalTag update(LegalTag newLegalTag) {
+    LegalTag legalTag = null;
+    if (Objects.nonNull(newLegalTag)) {
+      Transaction txn = context.beginTransaction(getDestination());
+      try {
+        legalTag = context.upsertAndGet(newLegalTag, getDestination());
+        txn.commitIfActive();
+      } finally {
+        txn.rollbackIfActive();
+      }
+    }
+
+    return legalTag;
+  }
+
+  @Override
+  public Collection<LegalTag> list(ListLegalTagArgs args) {
+    GetQuery<LegalTag> osmQuery = new GetQuery<>(LegalTag.class, getDestination(),
+        eq(IS_VALID, args.getIsValid()));
+    List<LegalTag> results = context.getResultsAsList(osmQuery);
+    if (Objects.nonNull(results) && !results.isEmpty()) {
+      return results;
+    }
+    return Collections.emptyList();
+  }
+}
diff --git a/provider/legal-gcp/src/main/resources/application.properties b/provider/legal-gcp/src/main/resources/application.properties
index 2c08afe21a3a5c6c3fa61ac2540424ecfe522c71..af6184414a36e72897ca863129cf7a3c9712b847 100644
--- a/provider/legal-gcp/src/main/resources/application.properties
+++ b/provider/legal-gcp/src/main/resources/application.properties
@@ -3,14 +3,15 @@ LOG_PREFIX=legal
 server.servlet.contextPath=/api/legal/v1/
 logging.level.org.springframework.web=${LOG_LEVEL:DEBUG}
 server.port=8080
-#spring.cloud.gcp.project-id=opendes
-#spring.security.user.roles=service.legal.admin
+
 JAVA_HEAP_OPTS=-Xms4096M -Xmx4096M
 JAVA_GC_OPTS=-XX:+UseG1GC -XX:+UseStringDeduplication -XX:InitiatingHeapOccupancyPercent=45
 
-enable.full.bucket.name=false
+ENABLE_FULL_BUCKET_NAME=false
+enable-full-bucket-name=${ENABLE_FULL_BUCKET_NAME}
 
-google.audiences=123.apps.googleusercontent.com
+GOOGLE_AUDIENCES=123.apps.googleusercontent.com
+google.audiences=${GOOGLE_AUDIENCES}
 
 ENTITLEMENTS_HOST=http://entitlements
 ENTITLEMENTS_PATH=/api/entitlements/v2
@@ -19,3 +20,11 @@ AUTHORIZE_API=${ENTITLEMENTS_HOST}${ENTITLEMENTS_PATH}
 PARTITION_HOST=http://partition
 PARTITION_PATH=/api/partition/v1
 PARTITION_API=${PARTITION_HOST}${PARTITION_PATH}
+
+OSMDRIVER=datastore
+OBMDRIVER=gcs
+OQMDRIVER=pubsub
+
+obmDriver=${OBMDRIVER}
+osmDriver=${OSMDRIVER}
+oqmDriver=${OQMDRIVER}
diff --git a/provider/legal-gcp/src/test/java/org/opengroup/osdu/legal/countries/StorageReaderImplTests.java b/provider/legal-gcp/src/test/java/org/opengroup/osdu/legal/countries/StorageReaderImplTests.java
index 5ddca787acecc9855c7258b1cbc47e806e255571..4a408324f3fa6d81aad97ec2760a74b9ea41dc21 100644
--- a/provider/legal-gcp/src/test/java/org/opengroup/osdu/legal/countries/StorageReaderImplTests.java
+++ b/provider/legal-gcp/src/test/java/org/opengroup/osdu/legal/countries/StorageReaderImplTests.java
@@ -1,7 +1,28 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.opengroup.osdu.legal.countries;
 
-import com.google.cloud.storage.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.opengroup.osdu.legal.countries.StorageReaderImpl.BUCKET_NAME;
+import static org.powermock.api.mockito.PowerMockito.when;
+
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
@@ -9,103 +30,98 @@ import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.opengroup.osdu.core.common.model.tenant.TenantInfo;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.*;
-import static org.opengroup.osdu.legal.countries.StorageReaderImpl.BUCKET_NAME;
-import static org.powermock.api.mockito.PowerMockito.when;
+import org.opengroup.osdu.core.gcp.obm.driver.Driver;
+import org.opengroup.osdu.core.gcp.obm.model.Blob;
+import org.opengroup.osdu.core.gcp.obm.model.Bucket;
+import org.opengroup.osdu.core.gcp.obm.persistence.ObmDestination;
 
 @RunWith(MockitoJUnitRunner.class)
 public class StorageReaderImplTests {
-    @Mock
-    private Storage storage;
-
-    @Mock
-    private TenantInfo tenantInfo;
-
-    @Mock
-    private Bucket bucket;
-
-    @InjectMocks
-    private StorageReaderImpl sut;
-
-    private BlobId blobId;
-    private String bucketName;
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-        bucketName = "legal-service-configuration";
-        String file = "Legal_COO.json";
-        blobId = BlobId.of(bucketName, file);
-    }
-
-    @Test
-    public void should_createBucketAndObject_when_bucketDoesNotExist() {
-        try {
-            sut.readAllBytes();
-        } catch (StorageException e) {
-            verify(storage, times(1)).create(BucketInfo.newBuilder(bucketName)
-                    .setStorageClass(StorageClass.MULTI_REGIONAL)
-                    .setLocation("us")
-                    .build());
-            verify(storage, times(1)).create(BlobInfo.newBuilder(blobId).setContentType("application/json").build(), "".getBytes(UTF_8));
-        }
-    }
-
-    @Test
-    public void should_createObject_when_bucketExistsAndFileDoesNotExist() {
-        try {
-            sut.readAllBytes();
-        } catch (StorageException e) {
-            verify(storage, times(0)).create(BucketInfo.newBuilder("tenant1-coo-config-test")
-                    .setStorageClass(StorageClass.MULTI_REGIONAL)
-                    .build());
-            verify(storage, times(1)).create(BlobInfo.newBuilder(blobId).setContentType("application/json").build(), "".getBytes(UTF_8));
-        }
-    }
-
-    @Test
-    public void should_returnAllBytes_when_bucketExistsAndFileExist() {
-        when(tenantInfo.getName()).thenReturn("tenant1");
-        byte[] expectedBytes = "test".getBytes();
-        when(storage.readAllBytes(any())).thenReturn(expectedBytes);
-
-        byte[] bytes = sut.readAllBytes();
-        assertEquals(expectedBytes, bytes);
-    }
+
+  private static final String TENANT_1 = "tenant1";
+  private static final String FILE_NAME = "Legal_COO.json";
+  private static final String BUCKET_FULL_NAME = "tenant1-legal-service-configuration";
+
+  @Mock
+  private TenantInfo tenantInfo;
+
+  @Mock
+  private Driver storage;
+
+  @InjectMocks
+  private StorageReaderImpl sut;
+
+  private String bucketName;
+
+  @Before
+  public void setup() {
+    MockitoAnnotations.initMocks(this);
+    bucketName = "legal-service-configuration";
+  }
+
+  @Test
+  public void should_createBucketAndObject_when_bucketDoesNotExist() {
+    when(tenantInfo.getName()).thenReturn(TENANT_1);
+    when(tenantInfo.getDataPartitionId()).thenReturn(TENANT_1);
+    when(storage.getBlobContent(BUCKET_FULL_NAME, FILE_NAME, getDestination())).thenReturn(
+        new byte[0]);
+
+    byte[] bytes = sut.readAllBytes();
+    assertNotNull(bytes);
+  }
+
+  @Test
+  public void should_returnAllBytes_when_bucketExistsAndFileExist() {
+    when(tenantInfo.getName()).thenReturn(TENANT_1);
+    when(tenantInfo.getDataPartitionId()).thenReturn(TENANT_1);
+    when(storage.getBucket(BUCKET_FULL_NAME, getDestination())).thenReturn(
+        new Bucket(TENANT_1));
+    when(storage.getBlob(BUCKET_FULL_NAME, FILE_NAME,
+        getDestination())).thenReturn(
+        Blob.builder().build());
+    byte[] expectedBytes = "test".getBytes();
+    when(storage.getBlobContent(BUCKET_FULL_NAME, FILE_NAME, getDestination()))
+        .thenReturn(expectedBytes);
+
+    byte[] bytes = sut.readAllBytes();
+    assertEquals(expectedBytes, bytes);
+  }
 
   @Test
   public void should_returnFullBucketName_when_IsFullBucketName_is_true() {
-      when(tenantInfo.getName()).thenReturn("tenant1");
-      when(tenantInfo.getProjectId()).thenReturn("projectId1");
-      String bucketName = tenantInfo.getProjectId() + "-" + tenantInfo.getName() + "-" + BUCKET_NAME;
-      StorageReaderImpl storageReader = new StorageReaderImpl(tenantInfo, null,
-          true);
-      String resultBucketName = storageReader.getTenantBucketName();
-      assertEquals(bucketName, resultBucketName);
+    when(tenantInfo.getName()).thenReturn(TENANT_1);
+    when(tenantInfo.getProjectId()).thenReturn("projectId1");
+    String bucketName = tenantInfo.getProjectId() + "-" + tenantInfo.getName() + "-" + BUCKET_NAME;
+    StorageReaderImpl storageReader = new StorageReaderImpl(tenantInfo, null, storage,
+        true);
+    String resultBucketName = storageReader.getTenantBucketName();
+    assertEquals(bucketName, resultBucketName);
   }
 
   @Test
   public void should_returnBucketName_when_IsFullBucketName_is_false() {
-    when(tenantInfo.getName()).thenReturn("tenant1");
-    when(tenantInfo.getProjectId()).thenReturn("projectId1");
+    when(tenantInfo.getName()).thenReturn(TENANT_1);
     String bucketName = tenantInfo.getName() + "-" + BUCKET_NAME;
-    StorageReaderImpl storageReader = new StorageReaderImpl(tenantInfo, null,
+    StorageReaderImpl storageReader = new StorageReaderImpl(tenantInfo, null, storage,
         false);
     String resultBucketName = storageReader.getTenantBucketName();
     assertEquals(bucketName, resultBucketName);
   }
 
   @Test
+  @Ignore
   public void should_returnBucketName_when_IsFullBucketName_is_null() {
-    when(tenantInfo.getName()).thenReturn("tenant1");
+    when(tenantInfo.getName()).thenReturn(TENANT_1);
     when(tenantInfo.getProjectId()).thenReturn("projectId1");
     String bucketName = tenantInfo.getName() + "-" + BUCKET_NAME;
-    StorageReaderImpl storageReader = new StorageReaderImpl(tenantInfo, null,
-        null);
+    TenantInfo tenantInfo1 = new TenantInfo();
+    StorageReaderImpl storageReader = new StorageReaderImpl(tenantInfo1, null, null);
+
     String resultBucketName = storageReader.getTenantBucketName();
     assertEquals(bucketName, resultBucketName);
   }
+
+  private ObmDestination getDestination() {
+    return ObmDestination.builder().partitionId(TENANT_1).build();
+  }
 }
\ No newline at end of file
diff --git a/provider/legal-gcp/src/test/java/org/opengroup/osdu/legal/tags/LegalTagRepositoryFactoryTest.java b/provider/legal-gcp/src/test/java/org/opengroup/osdu/legal/tags/LegalTagRepositoryFactoryTest.java
index e330b00a58a8bfdc846aa115cce713d064d15a12..6f60d27dcf9e974cc85e04a9604e01a76b1d059b 100644
--- a/provider/legal-gcp/src/test/java/org/opengroup/osdu/legal/tags/LegalTagRepositoryFactoryTest.java
+++ b/provider/legal-gcp/src/test/java/org/opengroup/osdu/legal/tags/LegalTagRepositoryFactoryTest.java
@@ -1,74 +1,52 @@
+/*
+ * Copyright 2021 Google LLC
+ * Copyright 2021 EPAM Systems, Inc
+ *
+ * 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
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.opengroup.osdu.legal.tags;
 
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.powermock.api.mockito.PowerMockito.when;
-
-import com.google.cloud.datastore.Datastore;
 import org.junit.Before;
 import org.junit.Test;
 import org.opengroup.osdu.core.common.model.http.AppException;
 import org.opengroup.osdu.core.common.model.tenant.TenantInfo;
-import org.opengroup.osdu.core.common.provider.interfaces.ITenantFactory;
-import org.opengroup.osdu.core.gcp.multitenancy.DatastoreFactory;
-import org.opengroup.osdu.legal.provider.interfaces.ILegalTagRepository;
 import org.opengroup.osdu.legal.provider.interfaces.ILegalTagRepositoryFactory;
+import org.opengroup.osdu.legal.tags.dataaccess.OsmLegalTagRepository;
 
 public class LegalTagRepositoryFactoryTest {
 
   private static final String TENANT_1 = "tenant1";
-  private DatastoreFactory factory;
-  private ITenantFactory tenantFactory;
+  private OsmLegalTagRepository osmLegalTagRepository;
 
   @Before
   public void init() {
-    factory = mock(DatastoreFactory.class);
-    tenantFactory = mock(ITenantFactory.class);
   }
 
   @Test(expected = AppException.class)
   public void should_throwAppException_when_givenBlankName() {
     TenantInfo tenantInfo = new TenantInfo();
     tenantInfo.setName(TENANT_1);
-    when(factory.getDatastore(tenantInfo)).thenReturn(null);
-    when(tenantFactory.getTenantInfo(TENANT_1)).thenReturn(null);
-    ILegalTagRepositoryFactory sut = new LegalTagRepositoryFactoryGcpImpl(tenantInfo, factory,
-        tenantFactory);
+    ILegalTagRepositoryFactory sut = new LegalTagRepositoryFactoryGcpImpl(tenantInfo,
+        osmLegalTagRepository);
     sut.get("");
   }
 
   @Test(expected = AppException.class)
-  public void should_throwAppException_when_tenantDoesNotExist() {
+  public void should_throwAppException_when_tenantIsNull() {
     TenantInfo tenantInfo = new TenantInfo();
-    tenantInfo.setName(TENANT_1);
-    when(factory.getDatastore(tenantInfo)).thenReturn(null);
-    when(tenantFactory.getTenantInfo(TENANT_1)).thenReturn(null);
-
-    ILegalTagRepositoryFactory sut = new LegalTagRepositoryFactoryGcpImpl(tenantInfo, factory,
-        tenantFactory);
-    sut.get(TENANT_1);
-  }
-
-  @Test
-  public void should_returnExistingRepo_when_requestingTenantThatHasPreviouslyBeenRequested() {
-    Datastore ds = mock(Datastore.class);
-    DatastoreFactory factory = mock(DatastoreFactory.class);
-    TenantInfo tenantInfo = new TenantInfo();
-    tenantInfo.setName(TENANT_1);
-    when(factory.getDatastore(tenantInfo)).thenReturn(ds);
-    when(tenantFactory.getTenantInfo(TENANT_1)).thenReturn(tenantInfo);
-    ILegalTagRepositoryFactory sut = new LegalTagRepositoryFactoryGcpImpl(tenantInfo, factory,
-        tenantFactory);
-    ILegalTagRepository result = sut.get(TENANT_1);
-    assertNotNull(result);
-    verify(factory, times(1)).getDatastore(tenantInfo);
-
-    result = sut.get(TENANT_1);
-    assertNotNull(result);
-    verify(factory, times(1)).getDatastore(tenantInfo);
-
+    ILegalTagRepositoryFactory sut = new LegalTagRepositoryFactoryGcpImpl(tenantInfo,
+        osmLegalTagRepository);
+    sut.get(null);
   }
 
 }
diff --git a/provider/legal-gcp/src/test/java/org/opengroup/osdu/legal/tags/dataaccess/DatastoreLegalTagRepositoryTests.java b/provider/legal-gcp/src/test/java/org/opengroup/osdu/legal/tags/dataaccess/DatastoreLegalTagRepositoryTests.java
deleted file mode 100644
index d6b329b203c70d88b8fee8328cf88cfa442e9dc1..0000000000000000000000000000000000000000
--- a/provider/legal-gcp/src/test/java/org/opengroup/osdu/legal/tags/dataaccess/DatastoreLegalTagRepositoryTests.java
+++ /dev/null
@@ -1,371 +0,0 @@
-package org.opengroup.osdu.legal.tags.dataaccess;
-
-import com.google.cloud.Timestamp;
-import com.google.cloud.datastore.*;
-import com.google.common.collect.Iterables;
-import org.opengroup.osdu.core.common.model.legal.ListLegalTagArgs;
-import org.opengroup.osdu.core.common.model.legal.PersistenceException;
-import org.opengroup.osdu.legal.tags.LegalTestUtils;
-import org.opengroup.osdu.core.common.model.legal.LegalTag;
-
-import org.opengroup.osdu.core.common.model.http.AppException;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-
-import java.util.*;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.*;
-
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({Datastore.class, KeyFactory.class, Key.class})
-public class DatastoreLegalTagRepositoryTests {
-    @Mock
-    private Datastore datastore;
-    @Mock
-    private KeyFactory keyFactory;
-
-    static final Date now = new Date();
-    Date modified;
-
-    @Before
-    public void setup() {
-        modified = new Date();
-        MockitoAnnotations.initMocks(this);
-
-        when(this.datastore.newKeyFactory()).thenReturn(keyFactory);
-    }
-
-    @Test
-    public void should_NotPersistContracts_When_GivenNullContract(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-
-        Long id = sut.create(null);
-
-        assertEquals(-1L, (long)id);
-    }
-
-    @Test
-    public void should_PersistContracts_And_ReturnNewId_When_GivenValidContract(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-
-        Key key = mockKey(1L);
-        mockGet(false, key, now);//make sure a legalTag does not exist yet
-
-        Key key1 = mockKey(10L);
-        List<Key> mockKeys = new ArrayList<Key>(){{add(key1);}};
-        Transaction txn = mockTransaction(mockKeys, false);
-
-        LegalTag legalTag = LegalTestUtils.createValidLegalTag("name");
-        when(this.keyFactory.setKind(anyString())).thenReturn(this.keyFactory);
-        when(this.keyFactory.newKey(anyLong())).thenReturn(key1);
-        Long id = sut.create(legalTag);
-
-        verify(txn, times(1)).put(isA(FullEntity.class));
-        verify(txn, times(1)).commit();
-        assertEquals(10L, (long)id);
-    }
-
-    @Test
-    public void should_RollbackTransaction_When_SavingContractsThrowsAnException(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-
-        LegalTag legalTag = LegalTestUtils.createValidLegalTag("1");
-        Key key = mockKey(1L);
-        mockGet(false, key, now);
-
-        Key key1 = mockKey(1L);
-        List<Key> mockKeys = new ArrayList<Key>(){{add(key1);}};
-        Transaction txn = mockTransaction(mockKeys, true);
-
-        doThrow(new DatastoreException(400, "", "")).when(txn).put(isA(FullEntity.class));
-
-        try {
-            sut.create(legalTag);
-            fail("Expected an exception");
-        }
-        catch(PersistenceException ex){}
-
-        verify(txn, times(1)).rollback();
-    }
-
-    @Test(expected = AppException.class)
-    public void should_throwAppException_when_savingContractAndOneAlreadyExistsForGivenKind(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-
-        Key key = mockKey(1L);
-        mockGet(true, key, now);//make sure a legalTag does not exist yet
-
-        Key key1 = mockKey(10L);
-        List<Key> mockKeys = new ArrayList<Key>(){{add(key1);}};
-        Transaction txn = mockTransaction(mockKeys, false);
-        when(txn.get(key1)).thenReturn(Entity.newBuilder(key1).build());
-        when(this.keyFactory.setKind(anyString())).thenReturn(this.keyFactory);
-        when(this.keyFactory.newKey(anyLong())).thenReturn(key1);
-        LegalTag legalTag = LegalTestUtils.createValidLegalTag("name");
-
-        sut.create(legalTag);
-    }
-
-    @Test
-    public void should_ReturnNull_When_GettingLegalTagThatDoesNotExist(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-        Key key = mockKey(1L);
-        mockGet(false, key, now);
-
-        long[] input = new long[]{7L};
-        Collection<LegalTag> legalTags = sut.get(input);
-
-        assertEquals(0, legalTags.size());
-    }
-
-    @Test
-    public void should_ReturnEmpty_When_GettingLegalTagAndInputIsEmpty(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-        Key key = mockKey(1L);
-        mockGet(true, key, now);
-
-        long[] input = new long[0];
-        Collection<LegalTag> legalTags = sut.get(input);
-
-        assertEquals(0, legalTags.size());
-    }
-
-    @Test
-    public void should_returnCompleteLegalTag_When_gettingLegalTagAndKindAndItExists(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-
-        Key key = mockKey(123L);
-        mockGet(true, key, now);
-        when(this.keyFactory.setKind(anyString())).thenReturn(this.keyFactory);
-        when(this.keyFactory.newKey(anyLong())).thenReturn(key);
-        long[] input = new long[]{1L};
-        Collection<LegalTag> legalTags = sut.get(input);
-        assertEquals(1, legalTags.size());
-
-        LegalTag legalTag = Iterables.get(legalTags, 0);
-        assertEquals(123L, (long) legalTag.getId());
-        assertEquals("name", legalTag.getName());
-        assertTrue(legalTag.getIsValid());
-        assertEquals("B", legalTag.getProperties().getOriginator());
-        assertEquals("A", legalTag.getProperties().getContractId());
-        assertEquals(2, legalTag.getProperties().getCountryOfOrigin().size());
-        assertEquals("1", legalTag.getProperties().getCountryOfOrigin().get(0));
-        assertEquals("C", legalTag.getProperties().getDataType());
-        assertEquals("E", legalTag.getProperties().getExportClassification());
-        assertEquals("F", legalTag.getProperties().getPersonalData());
-        assertEquals("D", legalTag.getProperties().getSecurityClassification());
-        assertEquals(new java.sql.Date(Timestamp.of(now).toSqlTimestamp().getTime()), legalTag.getProperties().getExpirationDate());
-    }
-
-    @Test
-    public void should_returnLegalTagWithDescription_when_descriptionExists(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-
-        Key key = mockKey(123L);
-        mockGet(true, createEntityWithDesc(key, now));
-
-        long[] input = new long[]{1L};
-        Collection<LegalTag> legalTags = sut.get(input);
-        assertEquals(1, legalTags.size());
-
-        LegalTag legalTag = Iterables.get(legalTags, 0);
-
-        assertEquals("desc", legalTag.getDescription());
-    }
-
-    @Test
-    public void should_rollback_when_deletingLegalTagThrowsAnException(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-
-        Key key1 = mockKey(1L);
-        Transaction txn = mockTransaction(null, true);
-        when(txn.get(key1)).thenReturn(createEntity(key1, now));
-        when(this.keyFactory.setKind(anyString())).thenReturn(this.keyFactory);
-        when(this.keyFactory.newKey(anyLong())).thenReturn(key1);
-        doThrow(new DatastoreException(400, "", "")).when(txn).delete(anyVararg());
-
-        try {
-            sut.delete(new LegalTag());
-            fail("Expected an exception");
-        }
-        catch(PersistenceException ex){}
-
-        verify(txn, times(1)).rollback();
-    }
-    @Test
-    public void should_returnTrue_when_deletingLegalTagIsSuccessful(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-
-        Key key1 = mockKey(1L);
-        Transaction txn = mockTransaction(null, false);
-        when(txn.get(key1)).thenReturn(createEntity(key1, now));
-        when(this.keyFactory.setKind(anyString())).thenReturn(this.keyFactory);
-        when(this.keyFactory.newKey(anyLong())).thenReturn(key1);
-        Boolean result = sut.delete(new LegalTag());
-
-        verify(txn, times(1)).commit();
-        assertTrue(result);
-    }
-    @Test
-    public void should_deleteLegalTagAndMakeBackup_when_deletingExistingLegalTag(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-        LegalTag input = LegalTestUtils.createValidLegalTag("name");
-
-        Key key1 = mockKey(1L);
-        Transaction txn = mockTransaction(null, false);
-        when(txn.get(key1)).thenReturn(createEntity(key1, now));
-        when(this.keyFactory.setKind(anyString())).thenReturn(this.keyFactory);
-        when(this.keyFactory.newKey(anyLong())).thenReturn(key1);
-        Boolean result = sut.delete(new LegalTag());
-
-
-        verify(txn, times(1)).delete(key1);
-        verify(txn, times(1)).commit();
-    }
-    @Test
-    public void should_notDeleteLegalTagAndMakeBackup_when_deletingNonExistingLegalTag_butShouldReturnTrue(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-
-        Key key1 = mockKey(1L);
-        Transaction txn = mockTransaction(null, false);
-        when(txn.get(key1)).thenReturn(null);
-        Boolean result = sut.delete(new LegalTag());
-
-        verify(txn, times(0)).delete(key1);
-        verify(txn, times(0)).commit();
-        assertTrue(result);
-    }
-
-
-    @Test
-    public void should_returnNull_when_updateIsGivenANullLegalTag(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-        LegalTag result = sut.update(null);
-        assertEquals(null, result);
-    }
-    @Test
-    public void should_rollbackTransaction_when_updateThrowsAnError(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-        LegalTag input = LegalTestUtils.createValidLegalTag("name");
-
-        Key key1 = mockKey(1L);
-
-        Transaction txn = mockTransaction(null, true);
-        when(txn.get(key1)).thenReturn(Entity.newBuilder(key1).build());
-        doThrow(new DatastoreException(400, "", "")).when(txn).commit();
-        when(this.keyFactory.setKind(anyString())).thenReturn(this.keyFactory);
-        when(this.keyFactory.newKey(anyLong())).thenReturn(key1);
-        try {
-            sut.update(input);
-            fail("Expected an exception");
-        }
-        catch(PersistenceException ex){}
-
-        verify(txn, times(1)).rollback();
-    }
-    @Test(expected = AppException.class)
-    public void should_throw400Error_when_updatingALegalTagThatDoesNotExist(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-        mockKey(1L);
-        mockTransaction(null, true);
-        LegalTag input = LegalTestUtils.createValidLegalTag("name");
-        sut.update(input);
-    }
-    @Test
-    public void should_updateLegaltag_and_makeBackupOfPreviousLegalTag_when_updateGivenExistingLegaltag(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-        LegalTag input = LegalTestUtils.createValidLegalTag("name");
-
-        Key key1 = mockKey(1L);
-
-        Transaction txn = mockTransaction(null, true);
-        when(txn.get(key1)).thenReturn(createEntity(key1, now));
-        when(this.keyFactory.setKind(anyString())).thenReturn(this.keyFactory);
-        when(this.keyFactory.newKey(anyLong())).thenReturn(key1);
-        LegalTag result = sut.update(input);
-
-        verify(txn, times(1)).put(any(FullEntity.class));
-        verify(txn, times(1)).putWithDeferredIdAllocation(anyObject());
-        verify(txn, times(1)).commit();
-        assertEquals(input, result);
-    }
-    @Test
-    public void should_returnCollection_when_requestingList(){
-        DatastoreLegalTagRepository sut = new DatastoreLegalTagRepository(datastore);
-
-        Key key = mockKey(123L);
-        mockGet(true, key, now);
-
-        ListLegalTagArgs args = new ListLegalTagArgs();
-        args.setIsValid(true);
-        Collection<LegalTag> result = sut.list(args);
-
-        assertEquals(1, result.size());
-    }
-
-    Key mockKey(Long id){
-        Key key = mock(Key.class);
-        when(key.getKind()).thenReturn("key-name");
-        when(key.getId()).thenReturn(id);
-        when(keyFactory.setKind(any())).thenReturn(keyFactory);
-        when(keyFactory.newKey(anyInt())).thenReturn(key);
-        return key;
-    }
-    Transaction mockTransaction(List<Key> keys, Boolean isActive) {
-        Transaction txn = mock(Transaction.class);
-        when(this.datastore.newTransaction()).thenReturn(txn);
-        Transaction.Response rsp = mock(Transaction.Response.class);
-        when(txn.commit()).thenReturn(rsp);
-        when(txn.isActive()).thenReturn(isActive);
-        when(rsp.getGeneratedKeys()).thenReturn(keys);
-        return txn;
-    }
-
-    @SuppressWarnings("unchecked")
-    void mockGet(boolean hasNext, Key key, Date now){
-        mockGet(hasNext, createEntity(key, now));
-    }
-    @SuppressWarnings("unchecked")
-    void mockGet(boolean hasNext, Entity entity){
-        QueryResults<Object> results = mock(QueryResults.class);
-        when(results.hasNext()).thenReturn(hasNext).thenReturn(false);
-
-        when(results.next()).thenReturn(entity);
-        when(datastore.get(isA(List.class))).thenReturn(results);
-        when(datastore.run(any())).thenReturn(results);
-    }
-
-    private Entity createEntityWithDesc(Key key, Date now) {
-        return getEntityBuilder(key, now)
-                    .set(DatastoreLegalTagRepository.DESCRIPTION, "desc")
-                    .build();
-    }
-    private Entity createEntity(Key key, Date now) {
-        return getEntityBuilder(key, now)
-                .build();
-    }
-
-    private Entity.Builder getEntityBuilder(Key key, Date now) {
-        return Entity.newBuilder(key)
-                .set(DatastoreLegalTagRepository.COUNTRY_OF_ORIGIN, new ArrayList<StringValue>(){{ add(new StringValue("1")); add(new StringValue("2")); }})
-                .set(DatastoreLegalTagRepository.CONTRACT_ID, "A")
-                .set(DatastoreLegalTagRepository.EXPIRATION_DATE, Timestamp.of(now))
-                .set(DatastoreLegalTagRepository.CREATION_DT, Timestamp.of(now))
-                .set(DatastoreLegalTagRepository.ORIGINATOR, "B")
-                .set(DatastoreLegalTagRepository.DATA_TYPE, "C")
-                .set(DatastoreLegalTagRepository.SECURITY_CLASSIFICATION, "D")
-                .set(DatastoreLegalTagRepository.EXPORT_CLASSIFICATION, "E")
-                .set(DatastoreLegalTagRepository.PERSONAL_DATA, "F")
-                .set(DatastoreLegalTagRepository.NAME, "name")
-                .set(DatastoreLegalTagRepository.IS_VALID, true);
-    }
-}
diff --git a/provider/legal-ibm/pom.xml b/provider/legal-ibm/pom.xml
index bcc875b7214f6e100fe6aa0b0b94412b9b1370bb..9938dc1dcddb6fd4fcce1417ae154f2e449aaed4 100644
--- a/provider/legal-ibm/pom.xml
+++ b/provider/legal-ibm/pom.xml
@@ -11,7 +11,7 @@
 	<artifactId>legal-ibm</artifactId>
 	<packaging>jar</packaging>
 	<properties>
-		<os-core-lib-ibm.version>0.13.0-rc5</os-core-lib-ibm.version>
+		<os-core-lib-ibm.version>0.13.0-rc6</os-core-lib-ibm.version>
 	</properties>
 
 	<dependencies>
diff --git a/provider/legal-reference/src/main/java/org/opengroup/osdu/legal/config/MongoDBConfigProperties.java b/provider/legal-reference/src/main/java/org/opengroup/osdu/legal/config/MongoDBConfigProperties.java
index 27111c2508495c99e68d79db6cdb9c937efb00b6..c37b1f2838e682e49e04637fdc5f7724536b8348 100644
--- a/provider/legal-reference/src/main/java/org/opengroup/osdu/legal/config/MongoDBConfigProperties.java
+++ b/provider/legal-reference/src/main/java/org/opengroup/osdu/legal/config/MongoDBConfigProperties.java
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opengroup.osdu.legal.config;
 
 import lombok.Getter;
diff --git a/testing/legal-test-gcp/src/test/java/org/opengroup/osdu/legal/acceptanceTests/TestCreateLegalTagApiAcceptance.java b/testing/legal-test-gcp/src/test/java/org/opengroup/osdu/legal/acceptanceTests/TestCreateLegalTagApiAcceptance.java
index cf82af2ab7390fb1d3f0e924300e7b320c721406..82b790be3675c5336c8a4ce64e179b51c0376733 100644
--- a/testing/legal-test-gcp/src/test/java/org/opengroup/osdu/legal/acceptanceTests/TestCreateLegalTagApiAcceptance.java
+++ b/testing/legal-test-gcp/src/test/java/org/opengroup/osdu/legal/acceptanceTests/TestCreateLegalTagApiAcceptance.java
@@ -1,23 +1,73 @@
 package org.opengroup.osdu.legal.acceptanceTests;
 
-import org.opengroup.osdu.legal.util.GCPLegalTagUtils;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import com.sun.jersey.api.client.ClientResponse;
+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 org.junit.After;
 import org.junit.Before;
+import org.junit.Test;
+import org.opengroup.osdu.legal.util.GCPLegalTagUtils;
 
 public class TestCreateLegalTagApiAcceptance extends CreateLegalTagApiAcceptanceTests {
 
-    @Before
-    @Override
-    public void setup() throws Exception {
-        this.legalTagUtils = new GCPLegalTagUtils();
-        super.setup();
+  @Before
+  @Override
+  public void setup() throws Exception {
+    this.legalTagUtils = new GCPLegalTagUtils();
+    super.setup();
+  }
+
+  @After
+  @Override
+  public void teardown() throws Exception {
+    super.teardown();
+    this.legalTagUtils = null;
+  }
+
+  @Override
+  @Test
+  public void should_onlyLetAMaximumOf1LegaltagBeCreated_when_tryingToCreateMultipleVersionsOfTheSameContractAtTheSameTime()
+      throws Exception {
+    ExecutorService executor = Executors.newFixedThreadPool(10);
+    List<Callable<ClientResponse>> tasks = new ArrayList<>();
+
+    for (int i = 0; i < 10; i++) {
+      Callable<ClientResponse> task = () -> {
+        try {
+          return legalTagUtils.create(name);
+        } catch (Exception ex) {
+          return null;
+        }
+      };
+      tasks.add(task);
     }
 
-    @After
-    @Override
-    public void teardown() throws Exception {
-        super.teardown();
-        this.legalTagUtils = null;
+    List<Future<ClientResponse>> responses = executor.invokeAll(tasks);
+    executor.shutdown();
+    executor.awaitTermination(20, TimeUnit.SECONDS);
+
+    int sucessResponseCount = 0;
+    int non409ErrorResponseCount = 0;
+    for (Future<ClientResponse> future : responses) {
+      if (future.get().getStatus() == 201) {
+        sucessResponseCount++;
+      } else if (future.get().getStatus() != 409) {
+        non409ErrorResponseCount++;
+      }
     }
 
+    assertTrue("Expected 1 successful response. Actual " + sucessResponseCount,
+        sucessResponseCount <= 1);
+    assertEquals(0, non409ErrorResponseCount);
+  }
+
+
 }