diff --git a/osm_nbi/instance_topics.py b/osm_nbi/instance_topics.py
index 4a4f4c3..b3eca02 100644
--- a/osm_nbi/instance_topics.py
+++ b/osm_nbi/instance_topics.py
@@ -177,33 +177,29 @@
                     additional_params[k] = "!!yaml " + safe_dump(v)
 
         if descriptor:
-            # check that enough parameters are supplied for the initial-config-primitive
-            # TODO: check for cloud-init
-            if member_vnf_index:
-                if kdu_name:
-                    initial_primitives = None
-                elif vdu_id:
-                    vdud = next(x for x in descriptor["vdu"] if x["id"] == vdu_id)
-                    initial_primitives = deep_get(vdud, ("vdu-configuration", "initial-config-primitive"))
-                else:
-                    vnf_configurations = get_iterable(descriptor.get("vnf-configuration"))
+            for df in descriptor.get("df", []):
+                # check that enough parameters are supplied for the initial-config-primitive
+                # TODO: check for cloud-init
+                if member_vnf_index:
                     initial_primitives = []
-                    for vnfc in vnf_configurations:
-                        for primitive in get_iterable(vnfc.get("initial-config-primitive")):
-                            initial_primitives.append(primitive)
-            else:
-                initial_primitives = deep_get(descriptor, ("ns-configuration", "initial-config-primitive"))
+                    if "lcm-operations-configuration" in df \
+                       and "operate-vnf-op-config" in df["lcm-operations-configuration"]:
+                        for config in df["lcm-operations-configuration"]["operate-vnf-op-config"].get("day1-2", []):
+                            for primitive in get_iterable(config.get("initial-config-primitive")):
+                                initial_primitives.append(primitive)
+                else:
+                    initial_primitives = deep_get(descriptor, ("ns-configuration", "initial-config-primitive"))
 
-            for initial_primitive in get_iterable(initial_primitives):
-                for param in get_iterable(initial_primitive.get("parameter")):
-                    if param["value"].startswith("<") and param["value"].endswith(">"):
-                        if param["value"] in ("<rw_mgmt_ip>", "<VDU_SCALE_INFO>", "<ns_config_info>"):
-                            continue
-                        if not additional_params or param["value"][1:-1] not in additional_params:
-                            raise EngineException("Parameter '{}' needed for vnfd[id={}]:vnf-configuration:"
-                                                  "initial-config-primitive[name={}] not supplied".
-                                                  format(param["value"], descriptor["id"],
-                                                         initial_primitive["name"]))
+                for initial_primitive in get_iterable(initial_primitives):
+                    for param in get_iterable(initial_primitive.get("parameter")):
+                        if param["value"].startswith("<") and param["value"].endswith(">"):
+                            if param["value"] in ("<rw_mgmt_ip>", "<VDU_SCALE_INFO>", "<ns_config_info>"):
+                                continue
+                            if not additional_params or param["value"][1:-1] not in additional_params:
+                                raise EngineException("Parameter '{}' needed for vnfd[id={}]:day1-2 configuration:"
+                                                      "initial-config-primitive[name={}] not supplied".
+                                                      format(param["value"], descriptor["id"],
+                                                             initial_primitive["name"]))
 
         return additional_params or None, other_params or None
 
@@ -532,6 +528,7 @@
             vnfr_descriptor["kdur"].append(kdur)
 
         vnfd_mgmt_cp = vnfd.get("mgmt-cp")
+
         for vdu in vnfd.get("vdu", ()):
             additional_params, vdu_params = self._format_additional_params(
                 ns_request, vnf_index, vdu_id=vdu["id"], descriptor=vnfd)
@@ -696,18 +693,28 @@
             indata["member_vnf_index"] = indata.pop("vnf_member_index")  # for backward compatibility
         if indata.get("member_vnf_index"):
             vnfd = self._get_vnfd_from_vnf_member_index(indata["member_vnf_index"], nsr["_id"])
+            try:
+                configs = vnfd.get("df")[0]["lcm-operations-configuration"]["operate-vnf-op-config"]["day1-2"]
+            except Exception:
+                configs = []
+
             if indata.get("vdu_id"):
                 self._check_valid_vdu(vnfd, indata["vdu_id"])
-                # TODO: Change the [0] as vdu-configuration is now a list
-                descriptor_configuration = vnfd.get("vdu-configuration", [{}])[0].get("config-primitive")
+                descriptor_configuration = utils.find_in_list(
+                    configs,
+                    lambda config: config["id"] == indata["vdu_id"]
+                ).get("config-primitive")
             elif indata.get("kdu_name"):
                 self._check_valid_kdu(vnfd, indata["kdu_name"])
-                # TODO: Change the [0] as kdu-configuration is now a list
-                kdud = next((k for k in vnfd["kdu"] if k["name"] == indata["kdu_name"]), None)
-                descriptor_configuration = deep_get(kdud, ("kdu-configuration", "config-primitive"))
+                descriptor_configuration = utils.find_in_list(
+                    configs,
+                    lambda config: config["id"] == indata.get("kdu_name")
+                ).get("config-primitive")
             else:
-                # TODO: Change the [0] as vnf-configuration is now a list
-                descriptor_configuration = vnfd.get("vnf-configuration", [{}])[0].get("config-primitive")
+                descriptor_configuration = utils.find_in_list(
+                    configs,
+                    lambda config: config["id"] == vnfd["id"]
+                ).get("config-primitive")
         else:  # use a NSD
             descriptor_configuration = nsd.get("ns-configuration", {}).get("config-primitive")
 
