diff --git a/services/std_svc/spm/spm_main.c b/services/std_svc/spm/spm_main.c
index d740a8dc997325521272072215315c4c297784c3..aa7bd04b02574009ff8866c4700ed6a6ac2fa26e 100644
--- a/services/std_svc/spm/spm_main.c
+++ b/services/std_svc/spm/spm_main.c
@@ -328,9 +328,6 @@ int32_t spm_setup(void)
 		/* Initialize context of the SP */
 		INFO("Secure Partition %u context setup start...\n", i);
 
-		/* Assign translation tables context. */
-		ctx->xlat_ctx_handle = spm_sp_xlat_context_alloc();
-
 		/* Save location of the image in physical memory */
 		ctx->image_base = (uintptr_t)sp_base;
 		ctx->image_size = sp_size;
diff --git a/services/std_svc/spm/spm_private.h b/services/std_svc/spm/spm_private.h
index 8b98e8c0d34b4b9af4daab9a51c72ee64ce3342b..740fee58b089ee2f06ee9b8b9fb7729ceb4c75d4 100644
--- a/services/std_svc/spm/spm_private.h
+++ b/services/std_svc/spm/spm_private.h
@@ -100,7 +100,7 @@ void spm_exceptions_xlat_init_context(void);
 uint64_t *spm_exceptions_xlat_get_base_table(void);
 
 /* Functions related to the translation tables management */
-xlat_ctx_t *spm_sp_xlat_context_alloc(void);
+void spm_sp_xlat_context_alloc(sp_context_t *sp_ctx);
 void sp_map_memory_regions(sp_context_t *sp_ctx);
 
 /* Functions to handle Secure Partition contexts */
diff --git a/services/std_svc/spm/spm_setup.c b/services/std_svc/spm/spm_setup.c
index 6cbbc5b22ecf34b58a28d3e0a86eb54950db7cd0..2ed44d134b0fb5ce05d3f861a3066993a95b062b 100644
--- a/services/std_svc/spm/spm_setup.c
+++ b/services/std_svc/spm/spm_setup.c
@@ -60,6 +60,9 @@ void spm_sp_setup(sp_context_t *sp_ctx)
 	 * ------------------------
 	 */
 
+	/* Assign translation tables context. */
+	spm_sp_xlat_context_alloc(sp_ctx);
+
 	sp_map_memory_regions(sp_ctx);
 
 	/*
diff --git a/services/std_svc/spm/spm_xlat.c b/services/std_svc/spm/spm_xlat.c
index 58d61fc347af1585c092b66083a11be59dfc1e73..1619f9720aab5602101dd98f0d9d51dcfd094b91 100644
--- a/services/std_svc/spm/spm_xlat.c
+++ b/services/std_svc/spm/spm_xlat.c
@@ -50,17 +50,6 @@ static OBJECT_POOL(sp_xlat_tables_pool, sp_xlat_tables,
 	XLAT_TABLE_ENTRIES * sizeof(uint64_t),
 	(PLAT_SP_IMAGE_MAX_XLAT_TABLES + 1) * PLAT_SPM_MAX_PARTITIONS);
 
-/* Allocate base translation tables. */
-static uint64_t sp_xlat_base_tables
-	[GET_NUM_BASE_LEVEL_ENTRIES(PLAT_VIRT_ADDR_SPACE_SIZE)]
-	[PLAT_SPM_MAX_PARTITIONS]
-	__aligned(GET_NUM_BASE_LEVEL_ENTRIES(PLAT_VIRT_ADDR_SPACE_SIZE)
-		  * sizeof(uint64_t))
-	__section(PLAT_SP_IMAGE_XLAT_SECTION_NAME);
-static OBJECT_POOL(sp_xlat_base_tables_pool, sp_xlat_base_tables,
-	GET_NUM_BASE_LEVEL_ENTRIES(PLAT_VIRT_ADDR_SPACE_SIZE) * sizeof(uint64_t),
-	PLAT_SPM_MAX_PARTITIONS);
-
 /* Allocate arrays. */
 static int sp_xlat_mapped_regions[PLAT_SP_IMAGE_MAX_XLAT_TABLES]
 	[PLAT_SPM_MAX_PARTITIONS];
@@ -73,13 +62,13 @@ static OBJECT_POOL(sp_xlat_ctx_pool, sp_xlat_ctx, sizeof(xlat_ctx_t),
 	PLAT_SPM_MAX_PARTITIONS);
 
 /* Get handle of Secure Partition translation context */
-xlat_ctx_t *spm_sp_xlat_context_alloc(void)
+void spm_sp_xlat_context_alloc(sp_context_t *sp_ctx)
 {
 	xlat_ctx_t *ctx = pool_alloc(&sp_xlat_ctx_pool);
 
 	struct mmap_region *mmap = pool_alloc(&sp_mmap_regions_pool);
 
-	uint64_t *base_table = pool_alloc(&sp_xlat_base_tables_pool);
+	uint64_t *base_table = pool_alloc(&sp_xlat_tables_pool);
 	uint64_t **tables = pool_alloc_n(&sp_xlat_tables_pool,
 					PLAT_SP_IMAGE_MAX_XLAT_TABLES);
 
@@ -91,7 +80,7 @@ xlat_ctx_t *spm_sp_xlat_context_alloc(void)
 			       PLAT_SP_IMAGE_MAX_XLAT_TABLES, base_table,
 			       EL1_EL0_REGIME, mapped_regions);
 
-	return ctx;
+	sp_ctx->xlat_ctx_handle = ctx;
 };
 
 /*******************************************************************************