<artifactId>sdc-tosca</artifactId>
        <name>sdc-sdc-tosca</name>
        <description>SDC Tosca Parser JAR file for use by consumers</description>
-       <version>1.4.11-SNAPSHOT</version>
+       <version>1.4.12-SNAPSHOT</version>
        <packaging>jar</packaging>
 
        <properties>
 
         return topologyTemplateQuery.getNodeTemplateType() == SdcTypes.SERVICE;
     }
 
-    private List<NodeTemplate> getInternalTopologyTemplates(List<NodeTemplate> nodeTemplateList, boolean searchTypeOnly) {
+    private List<NodeTemplate> getInternalTopologyTemplates(List<NodeTemplate> nodeTemplateList, boolean isRecursive) {
         return nodeTemplateList
             .stream()
-            .map(child->getTopologyTemplatesByQuery(child, searchTypeOnly))
+            .map(child->getTopologyTemplatesByQuery(child, isRecursive))
             .flatMap(List::stream)
             .collect(Collectors.toList());
     }
 
-    private List<NodeTemplate> getTopologyTemplatesByQuery(NodeTemplate current, boolean searchTypeOnly) {
+    private List<NodeTemplate> getTopologyTemplatesByQuery(NodeTemplate current, boolean isRecursive) {
         List<NodeTemplate> topologyTemplateList = Lists.newArrayList();
 
-        boolean isTopologyTemplateFound = searchTypeOnly ?
-                topologyTemplateQuery.isSameSdcType(current.getMetaData()) : topologyTemplateQuery.isMatchingSearchCriteria(current);
+        boolean isTopologyTemplateFound = isRecursive ?
+                SdcTypes.isComplex(current.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE))
+                : topologyTemplateQuery.isMatchingSearchCriteria(current);
         if (isTopologyTemplateFound) {
             topologyTemplateList.add(current);
-            if (!isServiceSearch()) {
+            if (!isRecursive) {
                 //recursion stop condition
                 return topologyTemplateList;
             }
         }
-        if (SdcTypes.isComplex(current.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)) && current.getSubMappingToscaTemplate() != null) {
-            //search the node template inside a given topology template
+        if (SdcTypes.isComplex(current.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)) &&
+               current.getSubMappingToscaTemplate() != null) {
+           //search the node template inside a given topology template
             topologyTemplateList.addAll(current.getSubMappingToscaTemplate().getNodeTemplates()
                     .stream()
-                    .map(nt->getTopologyTemplatesByQuery(nt, searchTypeOnly))
+                    .map(nt->getTopologyTemplatesByQuery(nt, isRecursive))
                     .flatMap(List::stream)
                     .collect(Collectors.toList()));
         }
 
         assertEquals("jenny vTSBC vlan VNF 0#abstract_rtp_msc#rtp_msc_rtp_msc_avpn_port_0_vlan_subinterface_rtp_msc_avpn", entities.get(7).getPath());
     }
 
+    @Test
+    public void getCpsFromVfRecursively() {
+        EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.CP)
+                .build();
+        TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF)
+                .build();
+
+        List<IEntityDetails> entities = helper.getEntity(entityQuery, topologyTemplateQuery, true);
+
+        assertEquals(16, entities.size());
+        assertEquals("jenny vTSBC vlan VNF 0#abstract_rtp_msc", entities.get(2).getPath());
+        assertEquals("jenny vTSBC vlan VNF 0#abstract_rtp_msc#rtp_msc_rtp_msc_avpn_port_0_vlan_subinterface_rtp_msc_avpn", entities.get(7).getPath());
+    }
+
     @Test
     public void getCpByUuidsFromCVFCRecursively() {
         EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.CP)