diff --git a/provider/storage-aws/src/main/resources/application.properties b/provider/storage-aws/src/main/resources/application.properties
index d4dfdaabab5dd796c1c269350f0aee86f1a0398c..622f233db92cd837a4fc73854c1a9805e3f38ac1 100644
--- a/provider/storage-aws/src/main/resources/application.properties
+++ b/provider/storage-aws/src/main/resources/application.properties
@@ -61,7 +61,6 @@ POLICY_API=${POLICY_BASE_URL}/api/policy/v1
 POLICY_ID=storage
 PARTITION_API=${PARTITION_BASE_URL}/api/partition/v1
 opa.opa-endpoint=${OPA_URL}
-opa.enabled=${OPA_ENABLED}
 
 spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration
 # https://community.opengroup.org/osdu/platform/system/storage/-/issues/122
@@ -83,4 +82,7 @@ server.tomcat.threads.max=${TOMCAT_THREADS_MAX:300}
 #Collaboration context feature flag name : properties specific
 collaborations-enabled=true
 
+featureFlag.strategy=appProperty
+featureFlag.opa.enabled=${OPA_ENABLED:false}
+
 
diff --git a/provider/storage-azure/src/main/resources/application.properties b/provider/storage-azure/src/main/resources/application.properties
index ab10532779c003f690da4805ed9c9b7a6c7e0299..8ca281c130acf2306b58138ab3b1282e8f4b94b9 100644
--- a/provider/storage-azure/src/main/resources/application.properties
+++ b/provider/storage-azure/src/main/resources/application.properties
@@ -104,7 +104,6 @@ management.server.port=8081
 service.policy.enabled=true
 POLICY_API=${policy_service_endpoint}
 opa.opa-endpoint=${opa_endpoint}
-opa.enabled=${opa_enabled}
 
 #Temporary record id length restriction
 record-id.max.length=1024
@@ -125,6 +124,8 @@ azure.pubsub.publish=true
 
 #Collaboration context featureflag name:partition specific
 featureFlag.strategy=dataPartition
+featureFlag.opa.enabled=${OPA_ENABLED:false}
+
 collaborationFilter.excludedPaths=info,liveness_check,swagger,swagger-ui/swagger-ui.css,swagger-ui/swagger-ui-standalone-preset.js,api-docs,api-docs.yaml,api-docs/swagger-config
 
 # To enable the full server path url in OpenAPI Swagger
diff --git a/provider/storage-gc/docs/anthos/README.md b/provider/storage-gc/docs/anthos/README.md
index a861f51d1ad0a29af3d6eb926dd8beb67f0848dd..3afb8034045d1c987824692fe6e935448a7af7b7 100644
--- a/provider/storage-gc/docs/anthos/README.md
+++ b/provider/storage-gc/docs/anthos/README.md
@@ -53,6 +53,7 @@ Must have:
 | `POLICY_ID`                                | ex `search`                                   | policeId from ex `http://localhost:8080/api/policy/v1/policies`. Look at `POLICY_API` | no         | -                                   |
 | `PARTITION_API`                            | ex `http://localhost:8081/api/partition/v1`   | Partition service endpoint                                                            | no         | -                                   |
 | `PARTITION_PROPERTIES_STORAGE_BUCKET_NAME` | ex `storage.bucket.name`                      | Name of partition property for storage bucket name value                              | yes        | -                                   |
+| `SYSTEM_PARTITION_ID`                      | ex `system`                                   | System partition ID                                                                   |
 
 These variables define service behavior, and are used to switch between `Reference` or `Google Cloud` environments, their overriding and usage in mixed mode was not tested.
 Usage of spring profiles is preferred.
diff --git a/provider/storage-gc/docs/gc/README.md b/provider/storage-gc/docs/gc/README.md
index 486f2677d3d828a0d15ef82fba206e3dfad3047c..95909d8d3091751162b9ff069f1aa8bc366e4ed9 100644
--- a/provider/storage-gc/docs/gc/README.md
+++ b/provider/storage-gc/docs/gc/README.md
@@ -46,6 +46,7 @@ Defined in default application property file but possible to override:
 | `PARTITION_API`                            | ex `http://localhost:8081/api/partition/v1`   | Partition service endpoint                                                            | no         | -                                                            |
 | `GOOGLE_APPLICATION_CREDENTIALS`           | ex `/path/to/directory/service-key.json`      | Service account credentials, you only need this if running locally                    | yes        | <https://console.cloud.google.com/iam-admin/serviceaccounts> |
 | `PARTITION_PROPERTIES_STORAGE_BUCKET_NAME` | ex `storage.bucket.name`                      | Name of partition property for storage bucket name value                              | yes        | -                                                            |
+| `SYSTEM_PARTITION_ID`                      | ex `system`                                   | System partition ID                                                                   |
 
 These variables define service behavior, and are used to switch between `Reference` or `Google Cloud` environments, their overriding and usage in mixed mode was not tested.
 Usage of spring profiles is preferred.
diff --git a/provider/storage-gc/pom.xml b/provider/storage-gc/pom.xml
index 2f2e94f8311d5d365498a0a92abc14b2474120d0..0407e106ddd7221c3f0a035b63fa01745c07051b 100644
--- a/provider/storage-gc/pom.xml
+++ b/provider/storage-gc/pom.xml
@@ -59,7 +59,7 @@
     <dependency>
       <groupId>org.opengroup.osdu</groupId>
       <artifactId>core-lib-gc-spring6</artifactId>
-      <version>0.26.0</version>
+      <version>0.27.0-rc3</version>
     </dependency>
     <!--    Mappers    -->
     <dependency>
@@ -130,6 +130,7 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
     </dependency>
+
   </dependencies>
 
   <build>
diff --git a/provider/storage-gc/src/main/appengine/app.yaml b/provider/storage-gc/src/main/appengine/app.yaml
deleted file mode 100644
index f4c4d0f834d69ad569b8ba472432ad37c975d833..0000000000000000000000000000000000000000
--- a/provider/storage-gc/src/main/appengine/app.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-service: os-storage
-runtime: java
-env: flex
-
-resources:
-  cpu: 2
-  memory_gb: 6
-
-automatic_scaling:
-  min_num_instances: 2
-  max_num_instances: 5
-  cool_down_period_sec: 120
-  cpu_utilization:
-    target_utilization: 0.7
-
-env_variables:
-  SPRING_PROFILES_ACTIVE: 'ENVIRONMENT'
diff --git a/provider/storage-gc/src/main/resources/application.properties b/provider/storage-gc/src/main/resources/application.properties
index c8d6bc8efce3051424f2e16a2562d8f63a0c23de..bfac3eefea2a6b9a8ca162ef8acda8bb02a2841b 100644
--- a/provider/storage-gc/src/main/resources/application.properties
+++ b/provider/storage-gc/src/main/resources/application.properties
@@ -14,7 +14,6 @@ logging.level.org.springframework.web=${LOG_LEVEL:INFO}
 osdu.spring.config.enableEncodedSpecialCharacters=true
 
 # Security config
-service.policy.enabled=true
 opa.opa-endpoint=${OPA_ENDPOINT:notused}
 opa.enabled=true
 
@@ -58,3 +57,7 @@ management.server.port=${MANAGEMENT_SERVER_PORT:8081}
 management.endpoints.web.base-path=${MANAGEMENT_ENDPOINTS_WEB_BASE:/}
 management.endpoints.web.exposure.include=health
 management.health.probes.enabled=true
+
+featureFlag.strategy=systemPartition
+featureFlag.opa.enabled=false
+SYSTEM_PARTITION_ID=system
diff --git a/provider/storage-ibm/src/main/resources/application.properties b/provider/storage-ibm/src/main/resources/application.properties
index ac7c7528b0c3e433a2862d4db6ae2e872a5044ec..3df280e6d5be56c5d9eef1e6b07631ca79120e39 100644
--- a/provider/storage-ibm/src/main/resources/application.properties
+++ b/provider/storage-ibm/src/main/resources/application.properties
@@ -34,7 +34,9 @@ amqphub.amqp10jms.username=admin
 amqphub.amqp10jms.password=admin
 
 OPA_API=notused
-opa.enabled=false
 
 #Collaboration context feature flag name : properties specific
 collaborations-enabled=false
+
+featureFlag.strategy=appProperty
+featureFlag.opa.enabled=${OPA_ENABLED:false}
\ No newline at end of file
diff --git a/storage-core-plus/src/main/resources/application.properties b/storage-core-plus/src/main/resources/application.properties
index 97cef4cab4756dd3aa5bc7a6abb23de188d75c87..6d10f2d9f1820886c64fdc587b20ecae2f5f6a85 100644
--- a/storage-core-plus/src/main/resources/application.properties
+++ b/storage-core-plus/src/main/resources/application.properties
@@ -61,3 +61,7 @@ management.server.port=${MANAGEMENT_SERVER_PORT:8081}
 management.endpoints.web.base-path=${MANAGEMENT_ENDPOINTS_WEB_BASE:/}
 management.endpoints.web.exposure.include=health
 management.health.probes.enabled=true
+
+
+featureFlag.strategy=appProperty
+featureFlag.opa.enabled=${OPA_ENABLED:false}
diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/service/BatchServiceImpl.java b/storage-core/src/main/java/org/opengroup/osdu/storage/service/BatchServiceImpl.java
index 1ea3c3ae7318feb99c4839a3c3140f698be9f22f..fe4c594a00a17b376a4ecc92e0260a880f63e2fe 100644
--- a/storage-core/src/main/java/org/opengroup/osdu/storage/service/BatchServiceImpl.java
+++ b/storage-core/src/main/java/org/opengroup/osdu/storage/service/BatchServiceImpl.java
@@ -18,6 +18,7 @@ import com.google.common.base.Strings;
 import com.google.gson.*;
 import org.apache.http.HttpStatus;
 import org.opengroup.osdu.core.common.crs.CrsConverterClientFactory;
+import org.opengroup.osdu.core.common.feature.IFeatureFlag;
 import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.crs.RecordsAndStatuses;
 import org.opengroup.osdu.core.common.model.http.AppException;
@@ -35,12 +36,13 @@ import org.opengroup.osdu.storage.provider.interfaces.ICloudStorage;
 import org.opengroup.osdu.storage.provider.interfaces.IRecordsMetadataRepository;
 import org.opengroup.osdu.storage.util.CollaborationUtil;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 
 import java.util.*;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
+import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME;
+
 
 public abstract class BatchServiceImpl implements BatchService {
 
@@ -75,8 +77,8 @@ public abstract class BatchServiceImpl implements BatchService {
     @Autowired
     private IOPAService opaService;
 
-    @Value("${opa.enabled}")
-    private boolean isOpaEnabled;
+    @Autowired
+    private IFeatureFlag featureFlag;
 
     @Override
     public MultiRecordInfo getMultipleRecords(MultiRecordIds ids, Optional<CollaborationContext> collaborationContext) {
@@ -268,7 +270,7 @@ public abstract class BatchServiceImpl implements BatchService {
                 recordsMap.put(recordId, recordData);
             }
         } else {
-            if (isOpaEnabled) {
+            if (featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) {
                 List<ValidationOutputRecord> dataAuthResult = this.opaService.validateUserAccessToRecords(recordMetadataList, OperationType.view);
                 for (ValidationOutputRecord outputRecord : dataAuthResult) {
                     if (outputRecord.getErrors().isEmpty()) {
diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImpl.java b/storage-core/src/main/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImpl.java
index ba2980b514728d58d3e563667f63bf5957450b43..9cc45fd5023142c9ff1f3d621fe3b90722ca05e4 100644
--- a/storage-core/src/main/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImpl.java
+++ b/storage-core/src/main/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImpl.java
@@ -14,6 +14,7 @@
 
 package org.opengroup.osdu.storage.service;
 
+import org.opengroup.osdu.core.common.feature.IFeatureFlag;
 import org.opengroup.osdu.core.common.model.http.CollaborationContext;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
 import org.opengroup.osdu.core.common.model.indexer.OperationType;
@@ -30,7 +31,6 @@ import org.opengroup.osdu.storage.util.CollaborationUtil;
 import org.opengroup.osdu.storage.util.api.RecordUtil;
 import org.opengroup.osdu.storage.validation.api.PatchOperationValidator;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.time.Clock;
@@ -43,6 +43,7 @@ import java.util.stream.Stream;
 
 import static java.util.function.Function.identity;
 import static java.util.stream.Collectors.toList;
+import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME;
 
 @Service
 public class BulkUpdateRecordServiceImpl implements BulkUpdateRecordService {
@@ -74,8 +75,8 @@ public class BulkUpdateRecordServiceImpl implements BulkUpdateRecordService {
     @Autowired
     private IOPAService opaService;
 
-    @Value("${opa.enabled}")
-    private boolean isOpaEnabled;
+    @Autowired
+    private IFeatureFlag featureFlag;
 
     @Override
     public BulkUpdateRecordsResponse bulkUpdateRecords(RecordBulkUpdateParam recordBulkUpdateParam, String user, Optional<CollaborationContext> collaborationContext) {
@@ -98,7 +99,7 @@ public class BulkUpdateRecordServiceImpl implements BulkUpdateRecordService {
         List<String> idsWithoutVersion = new ArrayList<>(idMap.keySet());
         Map<String, RecordMetadata> existingRecords = recordRepository.get(idsWithoutVersion, collaborationContext);
         List<String> notFoundRecordIds = new ArrayList<>();
-        List<String> unauthorizedRecordIds = isOpaEnabled
+        List<String> unauthorizedRecordIds = featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)
                 ? this.validateUserAccessAndCompliancePolicyConstraints(bulkUpdateOps, idMap, existingRecords, user)
                 : this.validateUserAccessAndComplianceConstraints(bulkUpdateOps, idMap, existingRecords);
 
diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/service/DataAuthorizationService.java b/storage-core/src/main/java/org/opengroup/osdu/storage/service/DataAuthorizationService.java
index b2cfab7ce35004d284981bfb4efa2aa5476107fc..8d8c26a530a5429a1c5a29a22a59c6284e3dd91f 100644
--- a/storage-core/src/main/java/org/opengroup/osdu/storage/service/DataAuthorizationService.java
+++ b/storage-core/src/main/java/org/opengroup/osdu/storage/service/DataAuthorizationService.java
@@ -14,6 +14,7 @@
 
 package org.opengroup.osdu.storage.service;
 
+import org.opengroup.osdu.core.common.feature.IFeatureFlag;
 import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
 import org.opengroup.osdu.core.common.model.indexer.OperationType;
@@ -24,16 +25,15 @@ import org.opengroup.osdu.storage.opa.service.IOPAService;
 import org.opengroup.osdu.storage.policy.service.IPolicyService;
 import org.opengroup.osdu.storage.policy.service.PartitionPolicyStatusService;
 import org.opengroup.osdu.storage.provider.interfaces.ICloudStorage;
-import org.opengroup.osdu.storage.util.api.RecordUtil;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME;
+
 @Service
 public class DataAuthorizationService {
 
@@ -55,8 +55,8 @@ public class DataAuthorizationService {
     @Autowired
     private IOPAService opaService;
 
-    @Value("${opa.enabled}")
-    private boolean isOpaEnabled;
+    @Autowired
+    private IFeatureFlag featureFlag;
 
     @Lazy
     @Autowired
@@ -66,7 +66,7 @@ public class DataAuthorizationService {
         if (this.entitlementsService.isDataManager(this.headers)) {
             return true;
         }
-        if (isOpaEnabled) {
+        if (featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) {
             return doesUserHasAccessToData(Collections.singletonList(recordMetadata), operationType);
         }
 
@@ -77,7 +77,7 @@ public class DataAuthorizationService {
         if (this.entitlementsService.isDataManager(this.headers)) {
             return true;
         }
-        if (isOpaEnabled) {
+        if (featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) {
             return doesUserHasAccessToData(Collections.singletonList(recordMetadata), operationType);
         }
 
@@ -89,7 +89,7 @@ public class DataAuthorizationService {
         if (this.entitlementsService.isDataManager(this.headers)) {
             return true;
         }
-        if (isOpaEnabled) {
+        if (featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) {
             if (!recordMetadata.getStatus().equals(RecordState.active)) {
                 return false;
             }
diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/service/IngestionServiceImpl.java b/storage-core/src/main/java/org/opengroup/osdu/storage/service/IngestionServiceImpl.java
index 5cd9fdefbab052f2163cf8db42f671c66e422738..38ed6f81df797b9ab71574cb88b50512891e58ba 100644
--- a/storage-core/src/main/java/org/opengroup/osdu/storage/service/IngestionServiceImpl.java
+++ b/storage-core/src/main/java/org/opengroup/osdu/storage/service/IngestionServiceImpl.java
@@ -18,22 +18,16 @@ import com.google.common.base.Strings;
 import io.jsonwebtoken.lang.Collections;
 import org.apache.http.HttpStatus;
 import org.opengroup.osdu.core.common.feature.IFeatureFlag;
-import org.opengroup.osdu.core.common.model.http.CollaborationContext;
 import org.opengroup.osdu.core.common.legal.ILegalService;
 import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.http.AppException;
+import org.opengroup.osdu.core.common.model.http.CollaborationContext;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
 import org.opengroup.osdu.core.common.model.indexer.OperationType;
 import org.opengroup.osdu.core.common.model.legal.Legal;
 import org.opengroup.osdu.core.common.model.legal.LegalCompliance;
 import org.opengroup.osdu.core.common.model.storage.Record;
-import org.opengroup.osdu.core.common.model.storage.RecordData;
-import org.opengroup.osdu.core.common.model.storage.RecordIdWithVersion;
-import org.opengroup.osdu.core.common.model.storage.RecordMetadata;
-import org.opengroup.osdu.core.common.model.storage.RecordProcessing;
-import org.opengroup.osdu.core.common.model.storage.RecordState;
-import org.opengroup.osdu.core.common.model.storage.TransferBatch;
-import org.opengroup.osdu.core.common.model.storage.TransferInfo;
+import org.opengroup.osdu.core.common.model.storage.*;
 import org.opengroup.osdu.core.common.model.storage.validation.ValidationDoc;
 import org.opengroup.osdu.core.common.model.tenant.TenantInfo;
 import org.opengroup.osdu.storage.di.GcsVersionPathLimitationConfig;
@@ -47,17 +41,12 @@ import org.opengroup.osdu.storage.util.CollaborationUtil;
 import org.opengroup.osdu.storage.util.RecordBlocks;
 import org.opengroup.osdu.storage.util.api.RecordUtil;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.Set;
+
+import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME;
 
 @Service
 public class IngestionServiceImpl implements IngestionService {
@@ -95,14 +84,12 @@ public class IngestionServiceImpl implements IngestionService {
 	@Autowired
 	private RecordUtil recordUtil;
 
-	@Value("${opa.enabled}")
-	private boolean isOpaEnabled;
+	@Autowired
+	private IFeatureFlag featureFlag;
 
 	@Autowired
 	RecordBlocks recordBlocks;
 
-	@Autowired
-	IFeatureFlag featureFlag;
 
 	@Autowired
 	GcsVersionPathLimitationConfig gcsVersionPathLimitationConfig;
@@ -195,7 +182,7 @@ public class IngestionServiceImpl implements IngestionService {
 		Map<String, RecordMetadata> existingRecords = this.recordRepository.get(ids, collaborationContext);
 
 		this.validateParentsExist(existingRecords, recordParentMap);
-		if(isOpaEnabled) {
+		if(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) {
 		    this.validateUserAccessAndCompliancePolicyConstraints(inputRecords, existingRecords, recordParentMap);
 		} else {
 			this.validateUserAccessAndComplianceConstraints(inputRecords, existingRecords, recordParentMap);
diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImpl.java b/storage-core/src/main/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImpl.java
index 86eafbb397d7fc05cf37f5af6bbf4551fd087208..6884da6f8fb107075f589fc0a36f5b8116b1acdd 100644
--- a/storage-core/src/main/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImpl.java
+++ b/storage-core/src/main/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImpl.java
@@ -17,16 +17,14 @@ package org.opengroup.osdu.storage.service;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.fge.jsonpatch.JsonPatch;
 import org.apache.http.HttpStatus;
+import org.opengroup.osdu.core.common.feature.IFeatureFlag;
 import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.http.AppException;
 import org.opengroup.osdu.core.common.model.http.CollaborationContext;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
 import org.opengroup.osdu.core.common.model.indexer.OperationType;
-import org.opengroup.osdu.core.common.model.storage.MultiRecordIds;
-import org.opengroup.osdu.core.common.model.storage.MultiRecordInfo;
 import org.opengroup.osdu.core.common.model.storage.Record;
-import org.opengroup.osdu.core.common.model.storage.RecordMetadata;
-import org.opengroup.osdu.core.common.model.storage.TransferInfo;
+import org.opengroup.osdu.core.common.model.storage.*;
 import org.opengroup.osdu.storage.logging.StorageAuditLogger;
 import org.opengroup.osdu.storage.opa.model.OpaError;
 import org.opengroup.osdu.storage.opa.model.ValidationOutputRecord;
@@ -38,19 +36,14 @@ import org.opengroup.osdu.storage.util.JsonPatchUtil;
 import org.opengroup.osdu.storage.util.api.RecordUtil;
 import org.opengroup.osdu.storage.validation.api.PatchInputValidator;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Stream;
 
 import static java.util.stream.Collectors.toList;
+import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME;
 
 
 @Service
@@ -89,8 +82,8 @@ public class PatchRecordsServiceImpl implements PatchRecordsService {
     @Autowired
     private IOPAService opaService;
 
-    @Value("#{new Boolean('${opa.enabled}')}")
-    private boolean isOpaEnabled;
+    @Autowired
+    private IFeatureFlag featureFlag;
 
     private ObjectMapper objectMapper = new ObjectMapper();
 
@@ -141,7 +134,7 @@ public class PatchRecordsServiceImpl implements PatchRecordsService {
             }
         } else {
             Map<String, RecordMetadata> existingRecords = recordRepository.get(recordIds, collaborationContext);
-            if (isOpaEnabled) {
+            if (featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)) {
                 this.validateUserAccessAndCompliancePolicyConstraints(jsonPatch, existingRecords);
             } else {
                 this.validateUserAccessAndComplianceConstraints(jsonPatch, recordIds, existingRecords);
diff --git a/storage-core/src/main/java/org/opengroup/osdu/storage/util/RecordConstants.java b/storage-core/src/main/java/org/opengroup/osdu/storage/util/RecordConstants.java
index 64441cc21122d37d0adf241bbd3a4f45e7f058b7..a64933d34f380f0d56edd5600812fb7d86fdc475 100644
--- a/storage-core/src/main/java/org/opengroup/osdu/storage/util/RecordConstants.java
+++ b/storage-core/src/main/java/org/opengroup/osdu/storage/util/RecordConstants.java
@@ -33,4 +33,6 @@ public class RecordConstants {
     public static final String REGEX_VERSION_IDS = "[0-9]+(,[0-9]+)*";
     public static final int MAX_VERSION_IDS_NUMBER = 50;
 
+    public static final String OPA_FEATURE_NAME = "featureFlag.opa.enabled";
+
 }
diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/service/BatchServiceImplTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/service/BatchServiceImplTest.java
index 733a96149812caf8adfcc9e673e56dad44328fef..d79be6c04a68d033a59165df0515cb636293868c 100644
--- a/storage-core/src/test/java/org/opengroup/osdu/storage/service/BatchServiceImplTest.java
+++ b/storage-core/src/test/java/org/opengroup/osdu/storage/service/BatchServiceImplTest.java
@@ -10,6 +10,7 @@ import org.mockito.InjectMocks;
 import org.mockito.Mockito;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.opengroup.osdu.core.common.crs.CrsConverterClientFactory;
+import org.opengroup.osdu.core.common.feature.IFeatureFlag;
 import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.crs.ConvertStatus;
 import org.opengroup.osdu.core.common.model.crs.RecordsAndStatuses;
@@ -46,6 +47,7 @@ import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
+import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME;
 
 @ExtendWith(MockitoExtension.class)
 class BatchServiceImplTest {
@@ -76,6 +78,9 @@ class BatchServiceImplTest {
     @Mock
     private IOPAService opaService;
 
+    @Mock
+    private IFeatureFlag featureFlag;
+
     @InjectMocks
     BatchServiceImpl sut = mock(BatchServiceImpl.class, Mockito.CALLS_REAL_METHODS);
     private static final String ACL_OWNER = "test_acl";
@@ -177,7 +182,8 @@ class BatchServiceImplTest {
     @Test
     void fetchMultipleRecords_returnsConvertedRecords_whenFrameOfReferenceIsPresentAndRecordsAreFound() {
         ReflectionTestUtils.setField(crsConverterClientFactory, "crsApi", "crs_endpoint");
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
+
         Map<String, String> osduHeaders = new HashMap<>();
         osduHeaders.put("frame-of-reference", "units=SI;crs=wgs84;elevation=msl;azimuth=true north;dates=utc;");
 
diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImplTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImplTest.java
index 6c2da03f34eb758c5066af025fdde2cc088f1982..c9adeac47761d44bac95f4f57f5a1dff36e274e7 100644
--- a/storage-core/src/test/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImplTest.java
+++ b/storage-core/src/test/java/org/opengroup/osdu/storage/service/BulkUpdateRecordServiceImplTest.java
@@ -19,6 +19,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.opengroup.osdu.core.common.feature.IFeatureFlag;
 import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.entitlements.Acl;
 import org.opengroup.osdu.core.common.model.http.CollaborationContext;
@@ -36,7 +37,6 @@ import org.opengroup.osdu.storage.provider.interfaces.IRecordsMetadataRepository
 import org.opengroup.osdu.storage.response.BulkUpdateRecordsResponse;
 import org.opengroup.osdu.storage.util.api.RecordUtil;
 import org.opengroup.osdu.storage.validation.api.PatchOperationValidator;
-import org.springframework.test.util.ReflectionTestUtils;
 
 import java.time.Clock;
 import java.util.*;
@@ -48,6 +48,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.Mockito.*;
+import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME;
 
 @ExtendWith(MockitoExtension.class)
 public class BulkUpdateRecordServiceImplTest {
@@ -103,6 +104,9 @@ public class BulkUpdateRecordServiceImplTest {
     @InjectMocks
     private BulkUpdateRecordServiceImpl service;
 
+    @Mock
+    private IFeatureFlag featureFlag;
+
     @Test
     public void should_bulkUpdateRecords_successfully() {
         RecordMetadata recordMetadata = buildRecordMetadata();
@@ -213,7 +217,7 @@ public class BulkUpdateRecordServiceImplTest {
         }};
 
         RecordBulkUpdateParam param = buildRecordBulkUpdateParam();
-        ReflectionTestUtils.setField(service, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(recordMetadataMap);
         when(persistenceService.updateMetadata(singletonList(recordMetadataMap.get(TEST_ID)), TEST_IDS, IDS_VERSION_MAP, Optional.empty()))
                 .thenReturn(emptyList());
@@ -244,7 +248,7 @@ public class BulkUpdateRecordServiceImplTest {
         RecordBulkUpdateParam param = buildRecordBulkUpdateParam();
 
         Map<String, RecordMetadata> recordMetadataMap = new HashMap<>();
-        ReflectionTestUtils.setField(service, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(clock.millis()).thenReturn(CURRENT_MILLIS);
 
         List<OpaError> errors = new ArrayList<>();
@@ -271,7 +275,7 @@ public class BulkUpdateRecordServiceImplTest {
         }};
 
         RecordBulkUpdateParam param = buildRecordBulkUpdateParam();
-        ReflectionTestUtils.setField(service, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(recordMetadataMap);
         when(clock.millis()).thenReturn(CURRENT_MILLIS);
         when(recordUtil.updateRecordMetaDataForPatchOperations(recordMetadataMap.get(TEST_ID), param.getOps(), TEST_USER,
@@ -303,7 +307,7 @@ public class BulkUpdateRecordServiceImplTest {
         }};
 
         RecordBulkUpdateParam param = buildRecordBulkUpdateParam();
-        ReflectionTestUtils.setField(service, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(recordMetadataMap);
         when(persistenceService.updateMetadata(singletonList(recordMetadataMap.get(TEST_ID)), TEST_IDS, IDS_VERSION_MAP, Optional.empty()))
                 .thenReturn(new ArrayList<>(singletonList(TEST_ID)));
@@ -343,7 +347,7 @@ public class BulkUpdateRecordServiceImplTest {
         RecordMetadata newRecordMetadata = buildRecordMetadata();
 
         RecordBulkUpdateParam param = buildRecordBulkUpdateParam();
-        ReflectionTestUtils.setField(service, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(existingRecordMetadataMap);
         when(clock.millis()).thenReturn(CURRENT_MILLIS);
         when(recordUtil.updateRecordMetaDataForPatchOperations(existingRecordMetadataMap.get(TEST_ID), param.getOps(), TEST_USER,
@@ -390,7 +394,7 @@ public class BulkUpdateRecordServiceImplTest {
     	newRecordMetadata.setAcl(non_owner_acl);
         
         RecordBulkUpdateParam param = buildRecordBulkUpdateParam();
-        ReflectionTestUtils.setField(service, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(existingRecordMetadataMap);
         when(clock.millis()).thenReturn(CURRENT_MILLIS);
         when(recordUtil.updateRecordMetaDataForPatchOperations(existingRecordMetadataMap.get(TEST_ID), param.getOps(), TEST_USER,
@@ -434,7 +438,7 @@ public class BulkUpdateRecordServiceImplTest {
     	RecordMetadata newRecordMetadata = buildRecordMetadata();
         
         RecordBulkUpdateParam param = buildRecordBulkUpdateParam();
-        ReflectionTestUtils.setField(service, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(recordRepository.get(TEST_IDS, Optional.empty())).thenReturn(existingRecordMetadataMap);
         when(persistenceService.updateMetadata(singletonList(newRecordMetadata), TEST_IDS, IDS_VERSION_MAP, Optional.empty()))
         .thenReturn(emptyList());
diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/service/DataAuthorizationServiceTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/service/DataAuthorizationServiceTest.java
index a3ac74017a4f4839554ec5979e0c1ec07f2482e6..a8a13e79c68b52b3670b0e5640869442662a5fc8 100644
--- a/storage-core/src/test/java/org/opengroup/osdu/storage/service/DataAuthorizationServiceTest.java
+++ b/storage-core/src/test/java/org/opengroup/osdu/storage/service/DataAuthorizationServiceTest.java
@@ -6,6 +6,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.opengroup.osdu.core.common.feature.IFeatureFlag;
 import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.entitlements.Acl;
 import org.opengroup.osdu.core.common.model.http.DpsHeaders;
@@ -25,6 +26,7 @@ import java.util.Map;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.*;
+import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME;
 
 @ExtendWith(MockitoExtension.class)
 public class DataAuthorizationServiceTest {
@@ -49,6 +51,9 @@ public class DataAuthorizationServiceTest {
     @InjectMocks
     private DataAuthorizationService sut;
 
+    @Mock
+    private IFeatureFlag featureFlag;
+
     private static final Map<String, String> headerMap = new HashMap<>();
 
     @BeforeEach
@@ -64,7 +69,7 @@ public class DataAuthorizationServiceTest {
 
     @Test
     public void should_callOpaServiceInOwnerAccessValidation_when_opaIsEnabled() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         this.sut.validateOwnerAccess(this.getRecordMetadata(), OperationType.update);
 
         verify(this.opaService, times(1)).validateUserAccessToRecords(any(), any());
@@ -73,7 +78,7 @@ public class DataAuthorizationServiceTest {
 
     @Test
     public void should_callOpaServiceInViewerOrOwnerAccessValidation_when_OpaIsEnabled() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         this.sut.validateViewerOrOwnerAccess(this.getRecordMetadata(), OperationType.update);
 
         verify(this.opaService, times(1)).validateUserAccessToRecords(any(), any());
@@ -82,7 +87,7 @@ public class DataAuthorizationServiceTest {
 
     @Test
     public void should_callEntitlementService_when_policyServiceDisabled() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", false);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false);
         this.sut.validateOwnerAccess(this.getRecordMetadata(), OperationType.update);
 
         verify(this.opaService, times(0)).validateUserAccessToRecords(any(), any());
@@ -91,7 +96,7 @@ public class DataAuthorizationServiceTest {
 
     @Test
     public void should_callEntitlementServiceInViewerOrOwnerAccessValidation_when_opaIsDisabled() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", false);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false);
         this.sut.validateViewerOrOwnerAccess(this.getRecordMetadata(), OperationType.update);
 
         verify(this.opaService, times(0)).validateUserAccessToRecords(any(), any());
@@ -100,7 +105,6 @@ public class DataAuthorizationServiceTest {
 
     @Test
     public void should_returnTrue_validateOwnerAccess_when_dataManager() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", false);
         when(this.entitlementsService.isDataManager(any())).thenReturn(true);
         assertTrue(this.sut.validateOwnerAccess(this.getRecordMetadata(), OperationType.update));
 
@@ -110,7 +114,6 @@ public class DataAuthorizationServiceTest {
 
     @Test
     public void should_returnTrue_validateViewerOrOwnerAccess_when_dataManager() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
         when(this.entitlementsService.isDataManager(any())).thenReturn(true);
         assertTrue(this.sut.validateViewerOrOwnerAccess(this.getRecordMetadata(), OperationType.update));
 
@@ -120,7 +123,7 @@ public class DataAuthorizationServiceTest {
 
     @Test
     public void should_returnTrue_hasAccess_when_dataManager_False() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(this.entitlementsService.isDataManager(any())).thenReturn(false);
         assertTrue(this.sut.hasAccess(this.getRecordMetadata(), OperationType.update));
 
@@ -130,7 +133,6 @@ public class DataAuthorizationServiceTest {
 
     @Test
     public void should_returnTrue_hasAccess_when_dataManager() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
         when(this.entitlementsService.isDataManager(any())).thenReturn(true);
         assertTrue(this.sut.hasAccess(this.getRecordMetadata(), OperationType.update));
 
diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/service/IngestionServiceImplTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/service/IngestionServiceImplTest.java
index 14a54da6717732c9d57af894080e50388c5117b2..b6947c863ee24976fdcd197da22a6211c20dc48c 100644
--- a/storage-core/src/test/java/org/opengroup/osdu/storage/service/IngestionServiceImplTest.java
+++ b/storage-core/src/test/java/org/opengroup/osdu/storage/service/IngestionServiceImplTest.java
@@ -65,6 +65,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.*;
+import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME;
 
 @ExtendWith(MockitoExtension.class)
 public class IngestionServiceImplTest {
@@ -184,6 +185,7 @@ public class IngestionServiceImplTest {
         lenient().when(this.authService.hasOwnerAccess(any(),any())).thenReturn(true);
         recordBlocks = new RecordBlocks(cloudStorage, crcHashGenerator);
         sut.recordBlocks = recordBlocks;
+
     }
 
     @Test
@@ -277,6 +279,7 @@ public class IngestionServiceImplTest {
     @Test
     public void should_return403_when_updatingARecordThatDoesNotHaveWritePermissionOnOriginalRecord() {
         when(this.authService.isValidAcl(any(), any())).thenReturn(true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false);
         this.acl.setViewers(VALID_ACL);
         this.acl.setOwners(VALID_ACL);
 
@@ -751,7 +754,7 @@ public class IngestionServiceImplTest {
 
     @Test
     public void should_return401_when_updatingARecordThatFailDataAuthorizationCheck_IntegrateOPA() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(this.authService.isValidAcl(any(), any())).thenReturn(true);
 
         this.record1.setId(RECORD_ID1);
@@ -788,7 +791,7 @@ public class IngestionServiceImplTest {
     @Test
     @SuppressWarnings("unchecked")
     public void should_updateTwoRecords_when_twoRecordIDsAreAlreadyPresentInDataLake_integrateOPA() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(this.authService.isValidAcl(any(), any())).thenReturn(true);
 
         this.record1.setId(RECORD_ID1);
@@ -843,7 +846,7 @@ public class IngestionServiceImplTest {
     
     @Test
     public void should_return403_when_updatingExistingRecordThatFailDataAuthorizationCheck_IntegrateOPA() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(this.authService.isValidAcl(any(), any())).thenReturn(true);
 
         this.record1.setId(RECORD_ID1);
@@ -881,7 +884,7 @@ public class IngestionServiceImplTest {
     
     @Test
     public void should_return403_when_updatingWithNewRecordThatFailDataAuthorizationCheck_IntegrateOPA() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(this.authService.isValidAcl(any(), any())).thenReturn(true);
 
         this.record1.setId(RECORD_ID1);
@@ -920,7 +923,7 @@ public class IngestionServiceImplTest {
     
     @Test
     public void should_success_when_updatingRecordThatPassDataAuthorizationCheck_IntegrateOPA() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(this.authService.isValidAcl(any(), any())).thenReturn(true);
 
         this.record1.setId(RECORD_ID1);
@@ -962,7 +965,7 @@ public class IngestionServiceImplTest {
 
     @Test
     public void createUpdateRecords_shouldNotPerform_gcsArraySizeValidationIfFeatureFlagIsNotSet() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(this.authService.isValidAcl(any(), any())).thenReturn(true);
 
         this.record1.setId(RECORD_ID1);
@@ -1009,7 +1012,7 @@ public class IngestionServiceImplTest {
 
     @Test
     public void createUpdateRecords_shouldNotRemoveRecordsFromProcessing_ifGcsVersionPathsSizeIsLesserThanSoftLimit() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(gcsVersionPathLimitationConfig.getMaxLimit()).thenReturn(2000);
         when(gcsVersionPathLimitationConfig.getFeatureName()).thenReturn("enforce_gcsVersionPathsLimit_enabled");
         when(featureFlag.isFeatureEnabled(gcsVersionPathLimitationConfig.getFeatureName())).thenReturn(true);
@@ -1059,7 +1062,7 @@ public class IngestionServiceImplTest {
 
     @Test
     public void createUpdateRecords_shouldRemoveRecordsFromProcessing_ifGcsSizeIsGreaterThanMaxLimit() {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         when(gcsVersionPathLimitationConfig.getMaxLimit()).thenReturn(2000);
         when(gcsVersionPathLimitationConfig.getFeatureName()).thenReturn("enforce_gcsVersionPathsLimit_enabled");
         when(featureFlag.isFeatureEnabled(gcsVersionPathLimitationConfig.getFeatureName())).thenReturn(true);
diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImplTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImplTest.java
index 87dfbaf1e94740ba42bf2632b56eda8df4e7a380..c93b25eaf4e79090cb56d495e6051ded0483944b 100644
--- a/storage-core/src/test/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImplTest.java
+++ b/storage-core/src/test/java/org/opengroup/osdu/storage/service/PatchRecordsServiceImplTest.java
@@ -11,6 +11,7 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.opengroup.osdu.core.common.feature.IFeatureFlag;
 import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
 import org.opengroup.osdu.core.common.model.entitlements.Acl;
 import org.opengroup.osdu.core.common.model.http.AppException;
@@ -28,6 +29,7 @@ import org.opengroup.osdu.storage.provider.interfaces.IRecordsMetadataRepository
 import org.opengroup.osdu.storage.response.PatchRecordsResponse;
 import org.opengroup.osdu.storage.util.api.RecordUtil;
 import org.opengroup.osdu.storage.validation.api.PatchInputValidator;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.util.ReflectionTestUtils;
 
 import java.io.IOException;
@@ -43,6 +45,7 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 import static java.util.Collections.singletonList;
+import static org.opengroup.osdu.storage.util.RecordConstants.OPA_FEATURE_NAME;
 
 @ExtendWith(MockitoExtension.class)
 public class PatchRecordsServiceImplTest {
@@ -82,6 +85,9 @@ public class PatchRecordsServiceImplTest {
     @InjectMocks
     private PatchRecordsServiceImpl sut;
 
+    @Mock
+    private IFeatureFlag featureFlag;
+
     private final ObjectMapper mapper = new ObjectMapper();
     private final List<String> recordIds = new LinkedList<>(Arrays.asList(RECORD_ID1, RECORD_ID2));
 
@@ -139,7 +145,7 @@ public class PatchRecordsServiceImplTest {
 
     @Test
     public void shouldSuccessfullyPatchRecordMetaData_whenOpaIsEnabled() throws IOException {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"add\", \"path\":\"/acl/viewers/-\", \"value\":\"value\"}]"));
         Map<String, RecordMetadata> existingRecords = getExistingRecordsMetadata();
         when(recordRepository.get(recordIds, COLLABORATION_CONTEXT)).thenReturn(existingRecords);
@@ -165,7 +171,7 @@ public class PatchRecordsServiceImplTest {
 
     @Test
     public void shouldSuccessfullyPatchRecordMetaData_whenOpaIsDisabled() throws IOException {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", false);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false);
         JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"add\", \"path\":\"/acl/viewers/-\", \"value\":\"value\"}]"));
         Map<String, RecordMetadata> existingRecords = getExistingRecordsMetadata();
         when(recordRepository.get(recordIds, COLLABORATION_CONTEXT)).thenReturn(existingRecords);
@@ -197,7 +203,6 @@ public class PatchRecordsServiceImplTest {
         patchedRecord2.getAcl().setViewers(record2ViewersAcl);
         patchedRecord2.setData(Collections.singletonMap("Hello", "world"));
 
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", false);
         JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"remove\", \"path\":\"/acl/viewers/0\"}, {\"op\":\"add\", \"path\":\"/data\", \"value\":{\"Hello\" : \"world\"}}]"));
 
         MultiRecordInfo multiRecordInfo = getMultiRecordInfo();
@@ -225,6 +230,7 @@ public class PatchRecordsServiceImplTest {
 
     @Test
     public void shouldSuccessfullyPatchMetadata_ifSomeRecordsNotFound() throws IOException {
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false);
         /*
         Ensure that when one of the records is not found, the others are still updated.
          */
@@ -246,7 +252,6 @@ public class PatchRecordsServiceImplTest {
 
     @Test
     public void shouldNotPatchData_ifResultHasEmptyLegaltagsForAllRecords() throws IOException {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", false);
         JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"remove\", \"path\":\"/legal/legaltags/0\"}, {\"op\":\"add\", \"path\":\"/data\", \"value\":{\"Hello\" : \"world\"}}]"));
 
         MultiRecordInfo multiRecordInfo = getMultiRecordInfo();
@@ -270,7 +275,7 @@ public class PatchRecordsServiceImplTest {
 
     @Test
     public void shouldPatchRecordMetadataPartially_ifResultHasEmptyAclForOneRecord() throws IOException {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", false);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false);
         JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"remove\", \"path\":\"/acl/viewers/0\"}]"));
         Map<String, RecordMetadata> existingRecords = getExistingRecordsMetadata();
         String[] record1ViewersAcl = new String[]{"viewer1@company.com"};
@@ -300,7 +305,7 @@ public class PatchRecordsServiceImplTest {
 
     @Test
     public void shouldNotPatchMetadata_ifResultHasEmptyLegaltagsForAllRecords() throws IOException {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", false);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(false);
         JsonPatch jsonPatch = JsonPatch.fromJson(mapper.readTree("[{\"op\":\"remove\", \"path\":\"/legal/legaltags/0\"}]"));
         Map<String, RecordMetadata> existingRecords = getExistingRecordsMetadata();
 
@@ -368,7 +373,7 @@ public class PatchRecordsServiceImplTest {
     
     @Test
     public void shouldFailPatchExistingRecordMetaDataThatFailDataAuthorizationCheck_whenOpaIsEnabled() throws IOException {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         List<String> recordIds = singletonList(RECORD_ID1);
         
         RecordMetadata existingRecordMetadata = getRecordMetadata(RECORD_ID1);
@@ -408,7 +413,7 @@ public class PatchRecordsServiceImplTest {
     
     @Test
     public void shouldFailPatchWithNewRecordMetaDataThatFailDataAuthorizationCheck_whenOpaIsEnabled() throws IOException {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         List<String> recordIds = singletonList(RECORD_ID1);
         
         RecordMetadata existingRecordMetadata = getRecordMetadata(RECORD_ID1);
@@ -448,7 +453,7 @@ public class PatchRecordsServiceImplTest {
     
     @Test
     public void shouldSuccessPatchRecordMetaDataThatPassDataAuthorizationCheck_whenOpaIsEnabled() throws IOException {
-        ReflectionTestUtils.setField(sut, "isOpaEnabled", true);
+        when(featureFlag.isFeatureEnabled(OPA_FEATURE_NAME)).thenReturn(true);
         List<String> recordIds = singletonList(RECORD_ID1);
         
         RecordMetadata existingRecordMetadata = getRecordMetadata(RECORD_ID1);
diff --git a/storage-core/src/test/java/org/opengroup/osdu/storage/validation/BulkQueryPatchValidatorTest.java b/storage-core/src/test/java/org/opengroup/osdu/storage/validation/BulkQueryPatchValidatorTest.java
index 7c18e1d3ac160a66b57edede2ba6131c2fdad507..fa6dcef0be7561c8e8c5900d7cc9f6ba5c757b09 100644
--- a/storage-core/src/test/java/org/opengroup/osdu/storage/validation/BulkQueryPatchValidatorTest.java
+++ b/storage-core/src/test/java/org/opengroup/osdu/storage/validation/BulkQueryPatchValidatorTest.java
@@ -20,6 +20,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.opengroup.osdu.core.common.feature.IFeatureFlag;
 import org.opengroup.osdu.storage.model.RecordQueryPatch;
 import org.opengroup.osdu.storage.validation.impl.BulkQueryPatchValidator;
 
@@ -41,6 +42,9 @@ public class BulkQueryPatchValidatorTest {
     @Mock
     private ConstraintValidatorContext context;
 
+    @Mock
+    private IFeatureFlag featureFlag;
+
     private BulkQueryPatchValidator sut;
 
     @BeforeEach