diff --git a/include/plat/arm/common/fconf_arm_sp_getter.h b/include/plat/arm/common/fconf_arm_sp_getter.h
index 57fd92edf54af67ede565eeae7acee45786856ef..38c30fbf9b6ea73645cf4f4ceda046e156e709f5 100644
--- a/include/plat/arm/common/fconf_arm_sp_getter.h
+++ b/include/plat/arm/common/fconf_arm_sp_getter.h
@@ -13,6 +13,8 @@
 /* arm_sp getter */
 #define arm__sp_getter(prop)	arm_sp.prop
 
+#define ARM_SP_MAX_SIZE		U(0x10000)
+
 struct arm_sp_t {
 	unsigned int		number_of_sp;
 	union uuid_helper_t	uuids[MAX_SP_IDS];
@@ -23,4 +25,6 @@ int fconf_populate_arm_sp(uintptr_t config);
 
 extern struct arm_sp_t arm_sp;
 
+extern bl_mem_params_node_t sp_mem_params_descs[MAX_SP_IDS];
+
 #endif /* FCONF_ARM_SP_GETTER_H */
diff --git a/plat/arm/common/arm_bl2_setup.c b/plat/arm/common/arm_bl2_setup.c
index dd392085df519a7f18d2d769dc5dbe99da80e1ea..136e65a1f7fa2c4c747f97f1fea4da63fee8148f 100644
--- a/plat/arm/common/arm_bl2_setup.c
+++ b/plat/arm/common/arm_bl2_setup.c
@@ -205,6 +205,13 @@ int arm_bl2_handle_post_image_load(unsigned int image_id)
  ******************************************************************************/
 int arm_bl2_plat_handle_post_image_load(unsigned int image_id)
 {
+#if defined(SPD_spmd)
+	/* For Secure Partitions we don't need post processing */
+	if ((image_id >= (MAX_NUMBER_IDS - MAX_SP_IDS)) &&
+		(image_id < MAX_NUMBER_IDS)) {
+		return 0;
+	}
+#endif
 	return arm_bl2_handle_post_image_load(image_id);
 }
 
diff --git a/plat/arm/common/arm_image_load.c b/plat/arm/common/arm_image_load.c
index 2faaa76c4319be2213daa0a49624a7e5a069ef87..593199d46782d2532dc3fb2609af58038595bdc0 100644
--- a/plat/arm/common/arm_image_load.c
+++ b/plat/arm/common/arm_image_load.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2016-2020, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -7,6 +7,9 @@
 #include <assert.h>
 #include <common/bl_common.h>
 #include <common/desc_image_load.h>
+#if defined(SPD_spmd)
+#include <plat/arm/common/fconf_arm_sp_getter.h>
+#endif
 #include <plat/arm/common/plat_arm.h>
 #include <plat/common/platform.h>
 
@@ -29,12 +32,62 @@ void plat_flush_next_bl_params(void)
 		next_bl_params_cpy_ptr);
 }
 
+#if defined(SPD_spmd)
+/*******************************************************************************
+ * This function appends Secure Partitions to list of loadable images.
+ ******************************************************************************/
+void plat_add_sp_images_load_info(struct bl_load_info *load_info)
+{
+	bl_load_info_node_t *node_info = load_info->head;
+	unsigned int index = 0;
+
+	if (sp_mem_params_descs[index].image_id == 0) {
+		ERROR("No Secure Partition Image available\n");
+		return;
+	}
+
+	/* Traverse through the bl images list */
+	do {
+		node_info = node_info->next_load_info;
+	} while (node_info->next_load_info != NULL);
+
+	for (; index < MAX_SP_IDS; index++) {
+		/* Populate the image information */
+		node_info->image_id = sp_mem_params_descs[index].image_id;
+		node_info->image_info = &sp_mem_params_descs[index].image_info;
+
+		if ((index + 1U) == MAX_SP_IDS) {
+			INFO("Reached Max number of SPs\n");
+			return;
+		}
+
+		if (sp_mem_params_descs[index + 1U].image_id == 0) {
+			return;
+		}
+
+		node_info->next_load_info =
+			&sp_mem_params_descs[index + 1U].load_node_mem;
+		node_info = node_info->next_load_info;
+
+	}
+}
+#endif
+
 /*******************************************************************************
  * This function returns the list of loadable images.
  ******************************************************************************/
 struct bl_load_info *plat_get_bl_image_load_info(void)
 {
+#if defined(SPD_spmd)
+	bl_load_info_t *bl_load_info;
+
+	bl_load_info = get_bl_load_info_from_mem_params_desc();
+	plat_add_sp_images_load_info(bl_load_info);
+
+	return bl_load_info;
+#else
 	return get_bl_load_info_from_mem_params_desc();
+#endif
 }
 
 /*******************************************************************************
diff --git a/plat/arm/common/fconf/arm_fconf_sp.c b/plat/arm/common/fconf/arm_fconf_sp.c
index 0e5cfff95304f7da65dc3aefb78f163637be0a0c..bb88aff6f747a9bf23ae4f37a9d1fa530b727e6d 100644
--- a/plat/arm/common/fconf/arm_fconf_sp.c
+++ b/plat/arm/common/fconf/arm_fconf_sp.c
@@ -7,6 +7,7 @@
 #include <assert.h>
 
 #include <common/debug.h>
+#include <common/desc_image_load.h>
 #include <common/fdt_wrappers.h>
 #include <drivers/io/io_storage.h>
 #include <lib/object_pool.h>
@@ -19,12 +20,16 @@
 
 #ifdef IMAGE_BL2
 
+bl_mem_params_node_t sp_mem_params_descs[MAX_SP_IDS];
+
 struct arm_sp_t arm_sp;
 
 int fconf_populate_arm_sp(uintptr_t config)
 {
 	int sp_node, node, err;
 	union uuid_helper_t uuid_helper;
+	unsigned int index = 0;
+	const unsigned int sp_start_index = MAX_NUMBER_IDS - MAX_SP_IDS;
 
 	/* As libfdt use void *, we can't avoid this cast */
 	const void *dtb = (void *)config;
@@ -46,10 +51,10 @@ int fconf_populate_arm_sp(uintptr_t config)
 			return -1;
 		}
 
-		arm_sp.uuids[arm_sp.number_of_sp] = uuid_helper;
+		arm_sp.uuids[index] = uuid_helper;
 
 		err = fdtw_read_cells(dtb, sp_node, "load-address", 1,
-			&arm_sp.load_addr[arm_sp.number_of_sp]);
+			&arm_sp.load_addr[index]);
 		if (err < 0) {
 			ERROR("FCONF: cannot read SP load address\n");
 			return -1;
@@ -61,11 +66,28 @@ int fconf_populate_arm_sp(uintptr_t config)
 			uuid_helper.word[1],
 			uuid_helper.word[2],
 			uuid_helper.word[3],
-			arm_sp.load_addr[arm_sp.number_of_sp]);
-
-		arm_sp.number_of_sp++;
-
-		if (arm_sp.number_of_sp >= MAX_SP_IDS) {
+			arm_sp.load_addr[index]);
+
+		/* Add SP information in mem param descriptor */
+		sp_mem_params_descs[index].image_id = sp_start_index + index;
+		SET_PARAM_HEAD(&sp_mem_params_descs[index].image_info,
+					PARAM_IMAGE_BINARY, VERSION_2, 0);
+		sp_mem_params_descs[index].image_info.image_max_size =
+							ARM_SP_MAX_SIZE;
+		sp_mem_params_descs[index].next_handoff_image_id =
+							INVALID_IMAGE_ID;
+		sp_mem_params_descs[index].image_info.image_base =
+							arm_sp.load_addr[index];
+
+		/* Add SP information in IO policies structure */
+		policies[sp_start_index + index].image_spec =
+						(uintptr_t)&arm_sp.uuids[index];
+		policies[sp_start_index + index].dev_handle = &fip_dev_handle;
+		policies[sp_start_index + index].check = open_fip;
+
+		index++;
+
+		if (index >= MAX_SP_IDS) {
 			ERROR("FCONF: reached max number of SPs\n");
 			return -1;
 		}
@@ -76,6 +98,7 @@ int fconf_populate_arm_sp(uintptr_t config)
 		return sp_node;
 	}
 
+	arm_sp.number_of_sp = index;
 	return 0;
 }