import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import org.onap.aai.domain.yang.GenericVnf;
+import org.onap.aai.domain.yang.RelatedToProperty;
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.aai.domain.yang.RelationshipData;
+import org.onap.policy.aai.AaiCqResponse;
 import org.onap.policy.controlloop.actor.guard.DecisionOperation;
 import org.onap.policy.controlloop.actor.guard.GuardActor;
 import org.onap.policy.controlloop.actor.so.VfModuleCreate;
 import org.onap.policy.controlloop.actorserviceprovider.Operation;
 import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
+import org.onap.policy.controlloop.actorserviceprovider.TargetType;
+import org.onap.policy.drools.apps.controller.usecases.UsecasesConstants;
 
 /**
  * Wrapper for a Guard operation. Note: this makes a clone of the operation parameters,
 public class GuardStep2 extends Step2 {
     public static final String PAYLOAD_KEY_TARGET_ENTITY = "target";
     public static final String PAYLOAD_KEY_VF_COUNT = "vfCount";
+    public static final String PAYLOAD_KEY_VNF_NAME = "generic-vnf.vnf-name";
+    public static final String PAYLOAD_KEY_VNF_ID = "generic-vnf.vnf-id";
+    public static final String PAYLOAD_KEY_VNF_TYPE = "generic-vnf.vnf-type";
+    public static final String PAYLOAD_KEY_NF_NAMING_CODE = "generic-vnf.nf-naming-code";
+    public static final String PAYLOAD_KEY_VSERVER_ID = "vserver.vserver-id";
+    public static final String PAYLOAD_KEY_CLOUD_REGION_ID = "cloud-region.cloud-region-id";
 
     private final Operation policyOper;
 
             names.add(OperationProperties.DATA_VF_COUNT);
         }
 
+        // Only get filter properties if the vserver-name exists, which is needed to call cq
+        if (event.getAai().get("vserver.vserver-name") != null) {
+            names.add(UsecasesConstants.AAI_DEFAULT_GENERIC_VNF);
+            names.add(OperationProperties.AAI_DEFAULT_CLOUD_REGION);
+        }
+
         return names;
     }
 
 
         params.getPayload().put(PAYLOAD_KEY_VF_COUNT, count);
     }
+
+    @Override
+    protected void loadCloudRegion(String propName) {
+        // PNF does not support guard filters
+        if (TargetType.PNF.equals(params.getTargetType())) {
+            return;
+        }
+
+        params.getPayload().put(PAYLOAD_KEY_CLOUD_REGION_ID, getCloudRegion().getCloudRegionId());
+    }
+
+    @Override
+    protected void loadDefaultGenericVnf(String propName) {
+        // PNF does not support guard filters
+        if (TargetType.PNF.equals(params.getTargetType())) {
+            return;
+        }
+
+        // add in properties needed for filters
+        String targetEntity = getTargetEntity();
+        params.getPayload().put(PAYLOAD_KEY_VNF_ID, targetEntity);
+
+        AaiCqResponse cq = this.getCustomQueryData();
+        GenericVnf vnf = cq.getGenericVnfByVnfId(targetEntity);
+        if (vnf == null) {
+            return;
+        }
+        params.getPayload().put(PAYLOAD_KEY_VNF_NAME, vnf.getVnfName());
+        params.getPayload().put(PAYLOAD_KEY_VNF_TYPE, vnf.getVnfType());
+        params.getPayload().put(PAYLOAD_KEY_NF_NAMING_CODE, vnf.getNfNamingCode());
+
+        String vserverName = getEnrichment(OperationProperties.ENRICHMENT_VSERVER_NAME);
+
+        params.getPayload().put(PAYLOAD_KEY_VSERVER_ID, findServerId(vnf, vserverName));
+    }
+
+    private String findServerId(GenericVnf vnf, String vserverName) {
+        for (Relationship relationship : vnf.getRelationshipList().getRelationship()) {
+            if (!"vserver".equals(relationship.getRelatedTo())) {
+                continue;
+            }
+            String vserverId = findServerId(relationship, vserverName);
+            if (vserverId != null) {
+                return vserverId;
+            }
+        }
+        return null;
+    }
+
+    private String findServerId(Relationship relationship, String vserverName) {
+        for (RelatedToProperty to : relationship.getRelatedToProperty()) {
+            if ("vserver.vserver-name".equals(to.getPropertyKey()) && vserverName.equals(to.getPropertyValue())) {
+                // Found the right relationship server-name, now find the server-id
+                for (RelationshipData data : relationship.getRelationshipData()) {
+                    if (PAYLOAD_KEY_VSERVER_ID.equals(data.getRelationshipKey())) {
+                        return data.getRelationshipValue();
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
 }
 
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.when;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.onap.aai.domain.yang.CloudRegion;
+import org.onap.aai.domain.yang.GenericVnf;
+import org.onap.aai.domain.yang.RelatedToProperty;
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.aai.domain.yang.RelationshipData;
+import org.onap.aai.domain.yang.RelationshipList;
+import org.onap.aai.domain.yang.Vserver;
+import org.onap.policy.aai.AaiCqResponse;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.actor.guard.DecisionOperation;
 import org.onap.policy.controlloop.actor.guard.GuardActor;
 import org.onap.policy.controlloop.actor.so.VfModuleCreate;
 import org.onap.policy.controlloop.actorserviceprovider.Operation;
 import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
+import org.onap.policy.controlloop.actorserviceprovider.TargetType;
 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.controlloop.eventmanager.StepContext;
+import org.onap.policy.drools.apps.controller.usecases.UsecasesConstants;
 
 public class GuardStep2Test {
+    private static final String SOME_OTHER_VALUE = "some-other-value";
+    private static final String SOME_OTHER_KEY = "some-other-key";
     private static final String CL_NAME = "my-closed-loop";
     private static final String MASTER_ACTOR = "master-actor";
     private static final String MASTER_OPERATION = "master-operation";
     private static final String MY_TARGET = "my-target";
+    private static final String MY_NAME = "my-name";
+    private static final String MY_TYPE = "my-type";
+    private static final String MY_CODE = "my-code";
+    private static final String MY_SERVER = "my-server";
+    private static final String MY_SERVER2 = "my-server-2";
+    private static final String MY_SERVERNAME = "my-server-name";
+    private static final String MY_REGION = "my-region";
     private static final UUID REQ_ID = UUID.randomUUID();
     private static final int VF_COUNT = 10;
 
     private VirtualControlLoopEvent event;
     @Mock
     private Operation policyOper;
+    @Mock
+    private AaiCqResponse customQuery;
+    @Mock
+    private GenericVnf genericVnf;
+    @Mock
+    private CloudRegion cloudRegion;
+    @Mock Vserver theVserver;
+
+    TargetType target;
+    Map<String, String> aai = new HashMap<>();
 
     private ControlLoopOperationParams params;
     private Step2 master;
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
+        aai.put("vserver.vserver-name", MY_SERVERNAME);
         when(event.getRequestId()).thenReturn(REQ_ID);
+        when(event.getAai()).thenReturn(aai);
 
         when(context.getEvent()).thenReturn(event);
 
+        when(genericVnf.getVnfId()).thenReturn(MY_TARGET);
+        when(genericVnf.getVnfName()).thenReturn(MY_NAME);
+        when(genericVnf.getVnfType()).thenReturn(MY_TYPE);
+        when(genericVnf.getNfNamingCode()).thenReturn(MY_CODE);
+
+        RelationshipList relList = new RelationshipList();
+        when(genericVnf.getRelationshipList()).thenReturn(relList);
+
+        relList.getRelationship().add(new Relationship());
+
+        Relationship relationship = new Relationship();
+        relList.getRelationship().add(relationship);
+        relationship.setRelatedTo("vserver");
+
+        relationship.getRelatedToProperty().add(new RelatedToProperty());
+
+        // property key mismatch
+        RelatedToProperty relProp = new RelatedToProperty();
+        relationship.getRelatedToProperty().add(relProp);
+        relProp.setPropertyKey(SOME_OTHER_KEY);
+        relProp.setPropertyValue(MY_NAME);
+
+        // property value mismatch
+        relProp = new RelatedToProperty();
+        relationship.getRelatedToProperty().add(relProp);
+        relProp.setPropertyKey("vserver.vserver-name");
+        relProp.setPropertyValue(SOME_OTHER_VALUE);
+
+        // matching property
+        relProp = new RelatedToProperty();
+        relationship.getRelatedToProperty().add(relProp);
+        relProp.setPropertyKey("vserver.vserver-name");
+        relProp.setPropertyValue(MY_SERVERNAME);
+
+        // data key mismatch
+        RelationshipData relData = new RelationshipData();
+        relationship.getRelationshipData().add(relData);
+        relData.setRelationshipKey(SOME_OTHER_KEY);
+        relData.setRelationshipValue(SOME_OTHER_VALUE);
+
+        // matching data
+        relData = new RelationshipData();
+        relationship.getRelationshipData().add(relData);
+        relData.setRelationshipKey(GuardStep2.PAYLOAD_KEY_VSERVER_ID);
+        relData.setRelationshipValue(MY_SERVER2);
+
+        when(customQuery.getGenericVnfByVnfId(MY_TARGET)).thenReturn(genericVnf);
+
+        when(theVserver.getVserverId()).thenReturn(MY_SERVER);
+        when(customQuery.getVserver()).thenReturn(theVserver);
+
+        when(cloudRegion.getCloudRegionId()).thenReturn(MY_REGION);
+        when(customQuery.getDefaultCloudRegion()).thenReturn(cloudRegion);
+
         when(stepContext.getProperty(OperationProperties.AAI_TARGET_ENTITY)).thenReturn(MY_TARGET);
+        when(stepContext.getProperty(AaiCqResponse.CONTEXT_KEY)).thenReturn(customQuery);
+        //when(stepContext.getProperty(VSERVER_VSERVER_NAME)).thenReturn()
+
         when(stepContext.contains(OperationProperties.DATA_VF_COUNT)).thenReturn(true);
         when(stepContext.getProperty(OperationProperties.DATA_VF_COUNT)).thenReturn(VF_COUNT);
 
-
-        params = ControlLoopOperationParams.builder().actor(MASTER_ACTOR).operation(MASTER_OPERATION)
-                        .targetEntity(MY_TARGET).context(context).build();
+        // @formatter:off
+        params = ControlLoopOperationParams.builder()
+                    .actor(MASTER_ACTOR)
+                    .operation(MASTER_OPERATION)
+                    .targetEntity(MY_TARGET)
+                    .context(context)
+                    .targetType(target)
+                    .build();
+        // @formatter:on
 
         master = new Step2(stepContext, params, event) {
             @Override
     public void testGetPropertyNames() {
         // unmatching property names
         when(policyOper.getPropertyNames()).thenReturn(List.of("propA", "propB"));
-        assertThat(step.getPropertyNames()).isEmpty();
+        assertThat(step.getPropertyNames())
+                .containsAll(List.of(UsecasesConstants.AAI_DEFAULT_GENERIC_VNF,
+                        OperationProperties.AAI_DEFAULT_CLOUD_REGION));
 
         // matching property names
-        when(policyOper.getPropertyNames()).thenReturn(List.of("propA", OperationProperties.DATA_VF_COUNT, "propB"));
-        assertThat(step.getPropertyNames()).isEqualTo(List.of(OperationProperties.DATA_VF_COUNT));
+        when(policyOper.getPropertyNames())
+                .thenReturn(List.of("propA", OperationProperties.DATA_VF_COUNT, "propB"));
+        assertThat(step.getPropertyNames()).containsAll(List.of(OperationProperties.DATA_VF_COUNT,
+                UsecasesConstants.AAI_DEFAULT_GENERIC_VNF,
+                OperationProperties.AAI_DEFAULT_CLOUD_REGION));
     }
 
     @Test
         assertThat(step.getParams().getPayload()).containsEntry(GuardStep2.PAYLOAD_KEY_TARGET_ENTITY, MY_TARGET);
     }
 
+    @Test
+    public void testLoadDefaultGenericVnf() {
+        step.loadDefaultGenericVnf(OperationProperties.AAI_VNF);
+        assertThat(step.getParams().getPayload())
+                .containsEntry(GuardStep2.PAYLOAD_KEY_VNF_ID, MY_TARGET)
+                .containsEntry(GuardStep2.PAYLOAD_KEY_VNF_NAME, MY_NAME)
+                .containsEntry(GuardStep2.PAYLOAD_KEY_VNF_TYPE, MY_TYPE)
+                .containsEntry(GuardStep2.PAYLOAD_KEY_NF_NAMING_CODE, MY_CODE)
+                .containsEntry(GuardStep2.PAYLOAD_KEY_VSERVER_ID, MY_SERVER2);
+    }
+
+    @Test
+    public void testLoadCloudRegion() {
+        step.loadCloudRegion(OperationProperties.AAI_DEFAULT_CLOUD_REGION);
+        assertThat(step.getParams().getPayload()).containsEntry(GuardStep2.PAYLOAD_KEY_CLOUD_REGION_ID, MY_REGION);
+    }
+
     /**
      * Tests loadVfCount() when the policy operation is NOT "VF Module Create".
      */