diff --git a/deployments/psa-api-test/arch_test_runner.c b/deployments/psa-api-test/arch_test_runner.c
index 8fd3dac..b5cd69c 100644
--- a/deployments/psa-api-test/arch_test_runner.c
+++ b/deployments/psa-api-test/arch_test_runner.c
@@ -5,163 +5,180 @@
  */
 
 #include <ctype.h>
-#include <stdint.h>
+#include <rpc_caller.h>
 #include <stdbool.h>
+#include <stdint.h>
 #include <stdio.h>
-#include <string.h>
 #include <stdlib.h>
-#include "service_under_test.h"
+#include <string.h>
 
-#define TEST_ID_OFFSET      (5)
+#include "psa_api_test_common.h"
+#include "trace.h"
+
+#define TEST_ID_OFFSET	    (5)
 #define TEST_POSTFIX_OFFSET (8)
 #define TEST_ENTRY_LENGTH   (9)
 
-
 int32_t val_entry(void);
-extern size_t val_get_test_list(uint32_t *test_id_list, size_t size);
-extern void pal_set_custom_test_list(char *custom_test_list);
+size_t val_get_test_list(uint32_t *test_id_list, size_t size);
+void pal_set_custom_test_list(char *custom_test_list);
 
 /* Returns whether option_switch is in the argv list and provide its index in the array */
 static bool option_selected(const char *option_switch, int argc, char *argv[], int *index)
 {
-    bool selected = false;
-    *index = 0;
+	bool selected = false;
+	*index = 0;
 
-    for (int i = 1; (i < argc) && !selected; ++i) {
+	for (int i = 1; (i < argc) && !selected; ++i) {
+		selected = (strcmp(argv[i], option_switch) == 0);
+		*index = i;
+	}
 
-        selected = (strcmp(argv[i], option_switch) == 0);
-        *index = i;
-    }
-
-    return selected;
+	return selected;
 }
 
 /* Print the supported command line arguments */
 static void print_help(void)
 {
-    printf("Supported command line arguments:\n\n");
-    printf("\t -l: Print list of tests.\n");
-    printf("\t -t <test_list>: Run only the listed tests (e.g: test_201;test_202;). test_list = ^(test_[0-9]{3};)+ \n");
-    printf("\t -v: Verbose mode.\n");
-    printf("\t -h: Print this help message.\n");
-    printf("\n");
+	EMSG("Supported command line arguments:\n");
+	EMSG("\t -l: Print list of tests.");
+	EMSG("\t -t <test_list>: Run only the listed tests (e.g: test_201;test_202;). test_list = ^(test_[0-9]{3};)+");
+	EMSG("\t -c: <service name>: Crypto service name");
+	EMSG("\t -a: <service name>: Initial attestation service name");
+	EMSG("\t -p: <service name>: Protected Storage service name");
+	EMSG("\t -i: <service name>: Internal Trusted Storage service name");
+	EMSG("\t -v: Verbose mode.");
+	EMSG("\t -h: Print this help message.\n");
 }
 
 /* Prints the list of selectable psa-api tests */
 static void print_psa_api_tests(void)
 {
-    /* Request the number of tests to find out the size of the area needed to store the test ID-s. */
-    size_t n_test = val_get_test_list(NULL, 0);
+	/*
+	 * Request the number of tests to find out the size
+	 * of the area needed to store the test ID-s.
+	 */
+	size_t n_test = val_get_test_list(NULL, 0);
 
-    uint32_t *test_id_list = (uint32_t *)calloc(n_test, sizeof(uint32_t));
+	uint32_t *test_id_list = (uint32_t *)calloc(n_test, sizeof(uint32_t));
 
-    if (test_id_list) {
-        n_test = val_get_test_list(test_id_list, n_test);
+	if (test_id_list) {
+		n_test = val_get_test_list(test_id_list, n_test);
 
-        printf("Available psa-api tests:\n");
-        for (int i = 0; i < n_test; i++) {
-                printf("\t test_%d;\n", test_id_list[i]);
-        }
+		EMSG("Available psa-api tests:");
+		for (int i = 0; i < n_test; i++)
+			EMSG("\t test_%d;", test_id_list[i]);
 
-        free(test_id_list);
-    }
-    else {
-        printf("Could not allocate enough memory to store the list of tests\n");
-    }
+		free(test_id_list);
+	} else {
+		EMSG("Could not allocate enough memory to store the list of tests");
+	}
 }
 
 /* Check if the received test list string is formatted as expected */
-static bool is_test_list_wrong(char* test_list)
+static bool is_test_list_wrong(char *test_list)
 {
-    size_t len = strlen(test_list);
+	size_t len = strlen(test_list);
 
-    for (unsigned i = 0; i < len; i += TEST_ENTRY_LENGTH) {
+	for (unsigned int i = 0; i < len; i += TEST_ENTRY_LENGTH) {
+		/* Report error when the test entry is not properly finished */
+		if (i + TEST_ENTRY_LENGTH > len) {
+			EMSG("Expecting \"test_xxx;\" test entry at the %dth character, got \"%s\" instead.",
+			     i, &test_list[i]);
+			return true;
+		}
 
-        /* Report error when the test entry is not properly finished */
-        if (i + TEST_ENTRY_LENGTH > len) {
-            printf("Expecting \"test_xxx;\" test entry at the %dth character, got \"%s\" instead.\n", i, &test_list[i]);
-            return true;
-        }
+		/* Report error at incorrect test entry prefix */
+		if (memcmp(&test_list[i], "test_", TEST_ID_OFFSET)) {
+			EMSG("Expecting \"test_\" at the %dth character, got \"%.5s\" instead.", i,
+			     &test_list[i]);
+			return true;
+		}
 
-        /* Report error at incorrect test entry prefix */
-        if (memcmp(&test_list[i], "test_", TEST_ID_OFFSET)) {
-            printf("Expecting \"test_\" at the %dth character, got \"%.5s\" instead.\n", i, &test_list[i]);
-            return true;
-        }
+		/* Report error if the test ID is incorrect */
+		if (!(isdigit(test_list[i + TEST_ID_OFFSET]) &&
+		      isdigit(test_list[i + TEST_ID_OFFSET + 1]) &&
+		      isdigit(test_list[i + TEST_ID_OFFSET + 2]))) {
+			EMSG("Expecting three digits at %dth character, got \"%.3s\" instead.",
+			     i + TEST_ID_OFFSET, &test_list[i + TEST_ID_OFFSET]);
+			return true;
+		}
 
-        /* Report error if the test ID is incorrect */
-        if (!(isdigit(test_list[i + TEST_ID_OFFSET]) &&
-              isdigit(test_list[i + TEST_ID_OFFSET + 1]) &&
-              isdigit(test_list[i + TEST_ID_OFFSET + 2]))) {
-            printf("Expecting three digits at the %dth character, got \"%.3s\" instead.\n",
-                i + TEST_ID_OFFSET,
-                &test_list[i + TEST_ID_OFFSET]);
-            return true;
-        }
+		/* Report error at incorrect test entry postfix */
+		if (test_list[i + TEST_POSTFIX_OFFSET] != ';') {
+			EMSG("Expecting ; at the %dth character, got \"%.1s\" instead.",
+			     i + TEST_POSTFIX_OFFSET, &test_list[i + TEST_POSTFIX_OFFSET]);
+			return true;
+		}
+	}
 
-        /* Report error at incorrect test entry postfix */
-        if (test_list[i + TEST_POSTFIX_OFFSET] != ';') {
-            printf("Expecting ; at the %dth character, got \"%.1s\" instead.\n",
-                i + TEST_POSTFIX_OFFSET,
-                &test_list[i + TEST_POSTFIX_OFFSET]);
-            return true;
-        }
-    }
-
-    return false;
+	return false;
 }
 
 /* Entry point */
 int main(int argc, char *argv[])
 {
-    int rval = -1;
-    int option_index = 0;
+	int rval = -1;
+	int option_index = 0;
+	char *service_name_crypto = NULL;
+	char *service_name_iat = NULL;
+	char *service_name_ps = NULL;
+	char *service_name_its = NULL;
 
-     /* Print available tests */
-    if (option_selected("-l", argc, argv, &option_index)) {
-        print_psa_api_tests();
-        return 0;
-    }
+	/* Print available tests */
+	if (option_selected("-l", argc, argv, &option_index)) {
+		print_psa_api_tests();
+		return 0;
+	}
 
-    /* Create custom test list */
-    if (option_selected("-t", argc, argv, &option_index)) {
-        /* Avoid overindexing of argv and detect if the option is followed by another option */
-        char *test_list_values = argv[option_index + 1];
-        if ((option_index >= argc) || (test_list_values[0] == '-')) {
-            printf("Testlist string is expected after -t argument!\n");
-            return -1;
-        }
+	/* Create custom test list */
+	if (option_selected("-t", argc, argv, &option_index)) {
+		/*
+		 * Avoid overindexing of argv and detect if the
+		 * option is followed by another option
+		 */
+		char *test_list_values = argv[option_index + 1];
 
-        if (is_test_list_wrong(test_list_values)) {
-            printf("Testlist string is not valid!\n");
-            print_psa_api_tests();
-            return -1;
-        }
+		if ((option_index >= argc) || (test_list_values[0] == '-')) {
+			EMSG("Testlist string is expected after -t argument!");
+			return -1;
+		}
 
-        /* Filter tests */
-        pal_set_custom_test_list(test_list_values);
-    }
+		if (is_test_list_wrong(test_list_values)) {
+			EMSG("Testlist string is not valid!");
+			print_psa_api_tests();
+			return -1;
+		}
 
-    /* Print help */
-    if (option_selected("-h", argc, argv, &option_index)) {
-        print_help();
-        return 0;
-    }
+		/* Filter tests */
+		pal_set_custom_test_list(test_list_values);
+	}
 
-    /* Locate service under test */
-    rval = locate_service_under_test();
+	/* Print help */
+	if (option_selected("-h", argc, argv, &option_index)) {
+		print_help();
+		return 0;
+	}
 
-    /* Run tests */
-    if (!rval) {
+	/* Process optional service names */
+	if (option_selected("-c", argc, argv, &option_index))
+		service_name_crypto = argv[option_index + 1];
 
-        rval = val_entry();
+	if (option_selected("-a", argc, argv, &option_index))
+		service_name_iat = argv[option_index + 1];
 
-        relinquish_service_under_test();
-    }
-    else {
+	if (option_selected("-p", argc, argv, &option_index))
+		service_name_ps = argv[option_index + 1];
 
-        printf("Failed to locate service under test.  Error code: %d\n", rval);
-    }
+	if (option_selected("-i", argc, argv, &option_index))
+		service_name_its = argv[option_index + 1];
 
-    return rval;
+	rval = test_setup(service_name_crypto, service_name_iat, service_name_ps, service_name_its);
+
+	if (!rval)
+		rval = val_entry();
+
+	test_teardown();
+
+	return rval;
 }
diff --git a/deployments/psa-api-test/crypto/arm-linux/CMakeLists.txt b/deployments/psa-api-test/crypto/arm-linux/CMakeLists.txt
index 2ef6303..8e72bc4 100644
--- a/deployments/psa-api-test/crypto/arm-linux/CMakeLists.txt
+++ b/deployments/psa-api-test/crypto/arm-linux/CMakeLists.txt
@@ -18,6 +18,14 @@
 add_executable(${PROJECT_NAME})
 target_include_directories(${PROJECT_NAME} PRIVATE "${TOP_LEVEL_INCLUDE_DIRS}")
 
+set(TRACE_PREFIX "PSACRYPTO" CACHE STRING "Trace prefix")
+add_components(TARGET ${PROJECT_NAME}
+	BASE_DIR ${TS_ROOT}
+	COMPONENTS
+		"components/common/trace"
+		"environments/arm-linux"
+)
+
 #-------------------------------------------------------------------------------
 #  Extend with components that are common across all deployments of
 #  psa-api-test/crypto
diff --git a/deployments/psa-api-test/crypto/crypto-api-test.cmake b/deployments/psa-api-test/crypto/crypto-api-test.cmake
index 9cc97e3..8d4f5e1 100644
--- a/deployments/psa-api-test/crypto/crypto-api-test.cmake
+++ b/deployments/psa-api-test/crypto/crypto-api-test.cmake
@@ -1,5 +1,5 @@
 #-------------------------------------------------------------------------------
-# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+# Copyright (c) 2021-2023, Arm Limited and Contributors. All rights reserved.
 #
 # SPDX-License-Identifier: BSD-3-Clause
 #
@@ -29,16 +29,15 @@
 #  Crypto specific components
 #
 #-------------------------------------------------------------------------------
-add_components(
-	TARGET "${PROJECT_NAME}"
-	BASE_DIR ${TS_ROOT}
-	COMPONENTS
-		"components/service/crypto/include"
-		"components/service/crypto/client/psa"
+target_sources(${PROJECT_NAME} PRIVATE
+	${TS_ROOT}/deployments/psa-api-test/crypto/crypto.c
 )
 
-target_sources(${PROJECT_NAME} PRIVATE
-	${TS_ROOT}/deployments/psa-api-test/crypto/crypto_locator.c
+add_components(TARGET ${PROJECT_NAME}
+	BASE_DIR ${TS_ROOT}
+	COMPONENTS
+		"components/service/common/include"
+		"components/service/crypto/include"
 )
 
 #-------------------------------------------------------------------------------
diff --git a/deployments/psa-api-test/crypto/crypto.c b/deployments/psa-api-test/crypto/crypto.c
new file mode 100644
index 0000000..9cbc67b
--- /dev/null
+++ b/deployments/psa-api-test/crypto/crypto.c
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "../psa_api_test_common.h"
+#include "libpsa.h"
+#include "trace.h"
+
+psa_status_t test_setup(const char *service_name_crypto, const char *service_name_iat,
+			const char *service_name_ps, const char *service_name_its)
+{
+	psa_status_t psa_status = PSA_ERROR_GENERIC_ERROR;
+
+	if (!service_name_crypto)
+		service_name_crypto = "sn:trustedfirmware.org:crypto:0";
+
+	psa_status = libpsa_init_crypto_context(service_name_crypto);
+	if (psa_status) {
+		EMSG("libpsa_init_crypto_context failed: %d\n", psa_status);
+		return psa_status;
+	}
+
+	psa_status = psa_crypto_init();
+	if (psa_status) {
+		EMSG("psa_crypto_init failed: %d\n", psa_status);
+		return psa_status;
+	}
+
+	return PSA_SUCCESS;
+}
+
+void test_teardown(void)
+{
+	libpsa_deinit_crypto_context();
+}
diff --git a/deployments/psa-api-test/crypto/crypto_locator.c b/deployments/psa-api-test/crypto/crypto_locator.c
deleted file mode 100644
index c57a501..0000000
--- a/deployments/psa-api-test/crypto/crypto_locator.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <stddef.h>
-#include <service_locator.h>
-#include <service/crypto/client/psa/psa_crypto_client.h>
-#include <protocols/rpc/common/packed-c/encoding.h>
-#include "../service_under_test.h"
-
-/* RPC context */
-static struct rpc_caller_session *session = NULL;
-static struct service_context *attestation_service_context = NULL;
-
-int locate_service_under_test(void)
-{
-	int status = -1;
-
-	if (!session && !attestation_service_context) {
-
-		service_locator_init();
-
-		attestation_service_context =
-			service_locator_query("sn:trustedfirmware.org:crypto:0");
-
-		if (attestation_service_context) {
-
-			session = service_context_open(attestation_service_context);
-
-			if (session) {
-
-				psa_crypto_client_init(session);
-
-				status = 0;
-			}
-			else {
-
-				status = -1;
-				relinquish_service_under_test();
-			}
-		}
-	}
-
-	return status;
-}
-
-int relinquish_service_under_test(void)
-{
-	psa_crypto_client_deinit();
-
-	if (attestation_service_context && session) {
-
-		service_context_close(attestation_service_context, session);
-		session = NULL;
-	}
-
-	if (attestation_service_context) {
-
-		service_context_relinquish(attestation_service_context);
-		attestation_service_context = NULL;
-	}
-
-	return 0;
-}
diff --git a/deployments/psa-api-test/crypto/linux-pc/CMakeLists.txt b/deployments/psa-api-test/crypto/linux-pc/CMakeLists.txt
index b99604a..d9ad385 100644
--- a/deployments/psa-api-test/crypto/linux-pc/CMakeLists.txt
+++ b/deployments/psa-api-test/crypto/linux-pc/CMakeLists.txt
@@ -20,6 +20,12 @@
 add_executable(${PROJECT_NAME})
 target_include_directories(${PROJECT_NAME} PRIVATE "${TOP_LEVEL_INCLUDE_DIRS}")
 
+set(TRACE_PREFIX "PSACRYPTO" CACHE STRING "Trace prefix")
+add_components(TARGET ${PROJECT_NAME}
+	BASE_DIR ${TS_ROOT}
+	COMPONENTS "environments/linux-pc"
+)
+
 #-------------------------------------------------------------------------------
 #  Extend with components that are common across all deployments of
 #  psa-api-test/crypto
diff --git a/deployments/psa-api-test/initial_attestation/arm-linux/CMakeLists.txt b/deployments/psa-api-test/initial_attestation/arm-linux/CMakeLists.txt
index da8e185..fa75297 100644
--- a/deployments/psa-api-test/initial_attestation/arm-linux/CMakeLists.txt
+++ b/deployments/psa-api-test/initial_attestation/arm-linux/CMakeLists.txt
@@ -18,6 +18,14 @@
 add_executable(${PROJECT_NAME})
 target_include_directories(${PROJECT_NAME} PRIVATE "${TOP_LEVEL_INCLUDE_DIRS}")
 
+set(TRACE_PREFIX "PSAIAT" CACHE STRING "Trace prefix")
+add_components(TARGET ${PROJECT_NAME}
+	BASE_DIR ${TS_ROOT}
+	COMPONENTS
+		"components/common/trace"
+		"environments/arm-linux"
+)
+
 #-------------------------------------------------------------------------------
 #  Extend with components that are common across all deployments of
 #  psa-api-test/initial_attestation
diff --git a/deployments/psa-api-test/initial_attestation/iat-api-test.cmake b/deployments/psa-api-test/initial_attestation/iat-api-test.cmake
index 4d1d2b1..807faf6 100644
--- a/deployments/psa-api-test/initial_attestation/iat-api-test.cmake
+++ b/deployments/psa-api-test/initial_attestation/iat-api-test.cmake
@@ -28,30 +28,18 @@
 #  Attestation specific components.
 #
 #-------------------------------------------------------------------------------
-add_components(
-	TARGET "${PROJECT_NAME}"
+target_sources(${PROJECT_NAME} PRIVATE
+	${TS_ROOT}/deployments/psa-api-test/initial_attestation/iat.c
+)
+
+add_components(TARGET ${PROJECT_NAME}
 	BASE_DIR ${TS_ROOT}
 	COMPONENTS
+		"components/service/common/include"
 		"components/service/attestation/include"
-		"components/service/attestation/client/psa"
-		"components/service/attestation/client/provision"
+		"components/service/crypto/include"
 )
 
-target_sources(${PROJECT_NAME} PRIVATE
-	${TS_ROOT}/deployments/psa-api-test/initial_attestation/iat_locator.c
-)
-
-#-------------------------------------------------------------------------------
-#  Add external components used specifically for attestation tests
-#
-#-------------------------------------------------------------------------------
-
-# MbedTLS used for token verification
-set(MBEDTLS_USER_CONFIG_FILE "${TS_ROOT}/external/MbedTLS/config/crypto_posix.h"
-	CACHE STRING "Configuration file for mbedcrypto")
-include(${TS_ROOT}/external/MbedTLS/MbedTLS.cmake)
-target_link_libraries(${PROJECT_NAME} PRIVATE MbedTLS::mbedcrypto)
-
 # Use Mbed TLS to provide the psa crypto api interface files
 set(PSA_CRYPTO_API_INCLUDE ${MBEDTLS_PUBLIC_INCLUDE_PATH})
 
diff --git a/deployments/psa-api-test/initial_attestation/iat.c b/deployments/psa-api-test/initial_attestation/iat.c
new file mode 100644
index 0000000..eb03dc7
--- /dev/null
+++ b/deployments/psa-api-test/initial_attestation/iat.c
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "../psa_api_test_common.h"
+#include "libpsa.h"
+#include "trace.h"
+
+psa_status_t test_setup(const char *service_name_crypto, const char *service_name_iat,
+			const char *service_name_ps, const char *service_name_its)
+{
+	psa_status_t psa_status = PSA_ERROR_GENERIC_ERROR;
+
+	if (!service_name_crypto)
+		service_name_crypto = "sn:trustedfirmware.org:crypto:0";
+
+	if (!service_name_iat)
+		service_name_iat = "sn:trustedfirmware.org:attestation:0";
+
+	psa_status = libpsa_init_crypto_context(service_name_crypto);
+	if (psa_status) {
+		EMSG("libpsa_init_crypto_context failed: %d\n", psa_status);
+		return psa_status;
+	}
+
+	psa_status = libpsa_init_attestation_context(service_name_iat);
+	if (psa_status) {
+		EMSG("libpsa_init_attestation_context failed: %d\n", psa_status);
+		return psa_status;
+	}
+
+	psa_status = psa_crypto_init();
+	if (psa_status) {
+		EMSG("psa_crypto_init failed: %d\n", psa_status);
+		return psa_status;
+	}
+
+	return PSA_SUCCESS;
+}
+
+void test_teardown(void)
+{
+	libpsa_deinit_crypto_context();
+	libpsa_deinit_attestation_context();
+}
diff --git a/deployments/psa-api-test/initial_attestation/iat_locator.c b/deployments/psa-api-test/initial_attestation/iat_locator.c
deleted file mode 100644
index 1852fea..0000000
--- a/deployments/psa-api-test/initial_attestation/iat_locator.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <stddef.h>
-#include <psa/crypto.h>
-#include <service_locator.h>
-#include <service/attestation/client/psa/iat_client.h>
-#include <service/attestation/client/provision/attest_provision_client.h>
-#include <protocols/rpc/common/packed-c/encoding.h>
-#include "../service_under_test.h"
-
-/* RPC context */
-static struct rpc_caller_session *session = NULL;
-static struct service_context *attestation_service_context = NULL;
-
-int locate_service_under_test(void)
-{
-	int status = -1;
-
-	/* Attestation tests depend on PSA crypto so ensure library is initialised */
-	psa_status_t psa_status = psa_crypto_init();
-
-	if ((psa_status == PSA_SUCCESS) && !session && !attestation_service_context) {
-
-		service_locator_init();
-
-		attestation_service_context =
-			service_locator_query("sn:trustedfirmware.org:attestation:0");
-
-		if (attestation_service_context) {
-
-			session = service_context_open(attestation_service_context);
-
-			if (session) {
-
-				psa_iat_client_init(session);
-				attest_provision_client_init(session);
-
-				status = 0;
-			}
-			else {
-
-				status = -1;
-				relinquish_service_under_test();
-			}
-		}
-	}
-
-	return status;
-}
-
-int relinquish_service_under_test(void)
-{
-	psa_iat_client_deinit();
-	attest_provision_client_deinit();
-
-	if (attestation_service_context && session) {
-
-		service_context_close(attestation_service_context, session);
-		session = NULL;
-	}
-
-	if (attestation_service_context) {
-
-		service_context_relinquish(attestation_service_context);
-		attestation_service_context = NULL;
-	}
-
-	return 0;
-}
diff --git a/deployments/psa-api-test/initial_attestation/linux-pc/CMakeLists.txt b/deployments/psa-api-test/initial_attestation/linux-pc/CMakeLists.txt
index b7e7a76..7c13eef 100644
--- a/deployments/psa-api-test/initial_attestation/linux-pc/CMakeLists.txt
+++ b/deployments/psa-api-test/initial_attestation/linux-pc/CMakeLists.txt
@@ -19,6 +19,12 @@
 add_executable(${PROJECT_NAME})
 target_include_directories(${PROJECT_NAME} PRIVATE "${TOP_LEVEL_INCLUDE_DIRS}")
 
+set(TRACE_PREFIX "PSAIAT" CACHE STRING "Trace prefix")
+add_components(TARGET ${PROJECT_NAME}
+	BASE_DIR ${TS_ROOT}
+	COMPONENTS "environments/linux-pc"
+)
+
 #-------------------------------------------------------------------------------
 #  Extend with components that are common across all deployments of
 #  psa-api-test/initial_attestation
diff --git a/deployments/psa-api-test/internal_trusted_storage/arm-linux/CMakeLists.txt b/deployments/psa-api-test/internal_trusted_storage/arm-linux/CMakeLists.txt
index 5ccd665..80f6c8e 100644
--- a/deployments/psa-api-test/internal_trusted_storage/arm-linux/CMakeLists.txt
+++ b/deployments/psa-api-test/internal_trusted_storage/arm-linux/CMakeLists.txt
@@ -18,6 +18,14 @@
 add_executable(${PROJECT_NAME})
 target_include_directories(${PROJECT_NAME} PRIVATE "${TOP_LEVEL_INCLUDE_DIRS}")
 
+set(TRACE_PREFIX "PSAITS" CACHE STRING "Trace prefix")
+add_components(TARGET ${PROJECT_NAME}
+	BASE_DIR ${TS_ROOT}
+	COMPONENTS
+		"components/common/trace"
+		"environments/arm-linux"
+)
+
 #-------------------------------------------------------------------------------
 #  Extend with components that are common across all deployments of
 #  psa-api-test/internal_trusted_storage
diff --git a/deployments/psa-api-test/internal_trusted_storage/its-api-test.cmake b/deployments/psa-api-test/internal_trusted_storage/its-api-test.cmake
index d373e19..f23faa9 100644
--- a/deployments/psa-api-test/internal_trusted_storage/its-api-test.cmake
+++ b/deployments/psa-api-test/internal_trusted_storage/its-api-test.cmake
@@ -22,17 +22,15 @@
 #  Internal trusted storage specific components
 #
 #-------------------------------------------------------------------------------
-add_components(
-	TARGET "${PROJECT_NAME}"
-	BASE_DIR ${TS_ROOT}
-	COMPONENTS
-		"components/service/secure_storage/include"
-		"components/service/secure_storage/frontend/psa/its"
-		"components/service/secure_storage/backend/secure_storage_client"
+target_sources(${PROJECT_NAME} PRIVATE
+	${TS_ROOT}/deployments/psa-api-test/internal_trusted_storage/its.c
 )
 
-target_sources(${PROJECT_NAME} PRIVATE
-	${TS_ROOT}/deployments/psa-api-test/internal_trusted_storage/its_locator.c
+add_components(TARGET ${PROJECT_NAME}
+	BASE_DIR ${TS_ROOT}
+	COMPONENTS
+		"components/service/common/include"
+		"components/service/secure_storage/include"
 )
 
 #-------------------------------------------------------------------------------
diff --git a/deployments/psa-api-test/internal_trusted_storage/its.c b/deployments/psa-api-test/internal_trusted_storage/its.c
new file mode 100644
index 0000000..9f3860b
--- /dev/null
+++ b/deployments/psa-api-test/internal_trusted_storage/its.c
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "../psa_api_test_common.h"
+#include "libpsa.h"
+#include "trace.h"
+
+psa_status_t test_setup(const char *service_name_crypto, const char *service_name_iat,
+			const char *service_name_ps, const char *service_name_its)
+{
+	psa_status_t psa_status = PSA_ERROR_GENERIC_ERROR;
+
+	if (!service_name_its)
+		service_name_its = "sn:trustedfirmware.org:internal-trusted-storage:0";
+
+	psa_status = libpsa_init_its_context(service_name_its);
+	if (psa_status) {
+		EMSG("libpsa_init_its_context failed: %d\n", psa_status);
+		return psa_status;
+	}
+
+	return psa_status;
+}
+
+void test_teardown(void)
+{
+	libpsa_deinit_its_context();
+}
diff --git a/deployments/psa-api-test/internal_trusted_storage/its_locator.c b/deployments/psa-api-test/internal_trusted_storage/its_locator.c
deleted file mode 100644
index 7119d21..0000000
--- a/deployments/psa-api-test/internal_trusted_storage/its_locator.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <stddef.h>
-#include <service_locator.h>
-#include <service/secure_storage/frontend/psa/its/its_frontend.h>
-#include <service/secure_storage/backend/secure_storage_client/secure_storage_client.h>
-#include <protocols/rpc/common/packed-c/encoding.h>
-#include "../service_under_test.h"
-
-/* RPC context */
-static struct rpc_caller_session *session = NULL;
-static struct service_context *ps_service_context = NULL;
-static struct secure_storage_client storage_client;
-
-int locate_service_under_test(void)
-{
-	int status = -1;
-
-	service_locator_init();
-
-	if (!session && !ps_service_context) {
-
-		ps_service_context =
-			service_locator_query("sn:trustedfirmware.org:internal-trusted-storage:0");
-
-		if (ps_service_context) {
-
-			session =
-				service_context_open(ps_service_context);
-
-			if (session) {
-
-				struct storage_backend *storage_backend = NULL;
-				status = -1;
-
-				storage_backend = secure_storage_client_init(&storage_client, session);
-
-				if (storage_backend) {
-
-					psa_its_frontend_init(storage_backend);
-					status = 0;
-				}
-			}
-
-			if (status < 0) relinquish_service_under_test();
-		}
-	}
-
-	return status;
-}
-
-int relinquish_service_under_test(void)
-{
-	psa_its_frontend_init(NULL);
-	secure_storage_client_deinit(&storage_client);
-
-	if (ps_service_context && session) {
-
-		service_context_close(ps_service_context, session);
-		session = NULL;
-	}
-
-	if (ps_service_context) {
-
-		service_context_relinquish(ps_service_context);
-		ps_service_context = NULL;
-	}
-
-	return 0;
-}
diff --git a/deployments/psa-api-test/internal_trusted_storage/linux-pc/CMakeLists.txt b/deployments/psa-api-test/internal_trusted_storage/linux-pc/CMakeLists.txt
index a123e30..506d1b0 100644
--- a/deployments/psa-api-test/internal_trusted_storage/linux-pc/CMakeLists.txt
+++ b/deployments/psa-api-test/internal_trusted_storage/linux-pc/CMakeLists.txt
@@ -20,6 +20,13 @@
 add_executable(${PROJECT_NAME})
 target_include_directories(${PROJECT_NAME} PRIVATE "${TOP_LEVEL_INCLUDE_DIRS}")
 
+set(TRACE_PREFIX "PSAITS" CACHE STRING "Trace prefix")
+include(${TS_ROOT}/environments/linux-pc/env.cmake)
+add_components(TARGET ${PROJECT_NAME}
+	BASE_DIR ${TS_ROOT}
+	COMPONENTS "environments/linux-pc"
+)
+
 #-------------------------------------------------------------------------------
 #  Extend with components that are common across all deployments of
 #  psa-api-test/internal_trusted_storage
diff --git a/deployments/psa-api-test/protected_storage/arm-linux/CMakeLists.txt b/deployments/psa-api-test/protected_storage/arm-linux/CMakeLists.txt
index 412833f..8ff1ce6 100644
--- a/deployments/psa-api-test/protected_storage/arm-linux/CMakeLists.txt
+++ b/deployments/psa-api-test/protected_storage/arm-linux/CMakeLists.txt
@@ -18,6 +18,14 @@
 add_executable(${PROJECT_NAME})
 target_include_directories(${PROJECT_NAME} PRIVATE "${TOP_LEVEL_INCLUDE_DIRS}")
 
+set(TRACE_PREFIX "PSAPS" CACHE STRING "Trace prefix")
+add_components(TARGET ${PROJECT_NAME}
+	BASE_DIR ${TS_ROOT}
+	COMPONENTS
+		"components/common/trace"
+		"environments/arm-linux"
+)
+
 #-------------------------------------------------------------------------------
 #  Extend with components that are common across all deployments of
 #  psa-api-test/protected_storage
diff --git a/deployments/psa-api-test/protected_storage/linux-pc/CMakeLists.txt b/deployments/psa-api-test/protected_storage/linux-pc/CMakeLists.txt
index 2131d34..ebfca44 100644
--- a/deployments/psa-api-test/protected_storage/linux-pc/CMakeLists.txt
+++ b/deployments/psa-api-test/protected_storage/linux-pc/CMakeLists.txt
@@ -20,6 +20,13 @@
 add_executable(${PROJECT_NAME})
 target_include_directories(${PROJECT_NAME} PRIVATE "${TOP_LEVEL_INCLUDE_DIRS}")
 
+set(TRACE_PREFIX "PSAPS" CACHE STRING "Trace prefix")
+include(${TS_ROOT}/environments/linux-pc/env.cmake)
+add_components(TARGET ${PROJECT_NAME}
+	BASE_DIR ${TS_ROOT}
+	COMPONENTS "environments/linux-pc"
+)
+
 #-------------------------------------------------------------------------------
 #  Extend with components that are common across all deployments of
 #  psa-api-test/protected_storage
diff --git a/deployments/psa-api-test/protected_storage/ps-api-test.cmake b/deployments/psa-api-test/protected_storage/ps-api-test.cmake
index 9fa88fe..75bc974 100644
--- a/deployments/psa-api-test/protected_storage/ps-api-test.cmake
+++ b/deployments/psa-api-test/protected_storage/ps-api-test.cmake
@@ -22,17 +22,15 @@
 #  Protected storage specific components
 #
 #-------------------------------------------------------------------------------
-add_components(
-	TARGET "${PROJECT_NAME}"
-	BASE_DIR ${TS_ROOT}
-	COMPONENTS
-		"components/service/secure_storage/include"
-		"components/service/secure_storage/frontend/psa/ps"
-		"components/service/secure_storage/backend/secure_storage_client"
+target_sources(${PROJECT_NAME} PRIVATE
+	${TS_ROOT}/deployments/psa-api-test/protected_storage/ps.c
 )
 
-target_sources(${PROJECT_NAME} PRIVATE
-	${TS_ROOT}/deployments/psa-api-test/protected_storage/ps_locator.c
+add_components(TARGET ${PROJECT_NAME}
+	BASE_DIR ${TS_ROOT}
+	COMPONENTS
+		"components/service/common/include"
+		"components/service/secure_storage/include"
 )
 
 #-------------------------------------------------------------------------------
diff --git a/deployments/psa-api-test/protected_storage/ps.c b/deployments/psa-api-test/protected_storage/ps.c
new file mode 100644
index 0000000..c20a860
--- /dev/null
+++ b/deployments/psa-api-test/protected_storage/ps.c
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "../psa_api_test_common.h"
+#include "libpsa.h"
+#include "trace.h"
+
+psa_status_t test_setup(const char *service_name_crypto, const char *service_name_iat,
+			const char *service_name_ps, const char *service_name_its)
+{
+	psa_status_t psa_status = PSA_ERROR_GENERIC_ERROR;
+
+	if (!service_name_ps)
+		service_name_ps = "sn:trustedfirmware.org:protected-storage:0";
+
+	psa_status = libpsa_init_ps_context(service_name_ps);
+	if (psa_status) {
+		EMSG("libpsa_init_ps_context failed: %d\n", psa_status);
+		return psa_status;
+	}
+
+	return psa_status;
+}
+
+void test_teardown(void)
+{
+	libpsa_deinit_ps_context();
+}
diff --git a/deployments/psa-api-test/protected_storage/ps_locator.c b/deployments/psa-api-test/protected_storage/ps_locator.c
deleted file mode 100644
index aba8547..0000000
--- a/deployments/psa-api-test/protected_storage/ps_locator.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <stddef.h>
-#include <service_locator.h>
-#include <service/secure_storage/frontend/psa/ps/ps_frontend.h>
-#include <service/secure_storage/backend/secure_storage_client/secure_storage_client.h>
-#include <protocols/rpc/common/packed-c/encoding.h>
-#include "../service_under_test.h"
-
-/* RPC context */
-static struct rpc_caller_session *session = NULL;
-static struct service_context *ps_service_context = NULL;
-static struct secure_storage_client storage_client;
-
-int locate_service_under_test(void)
-{
-	int status = -1;
-
-	if (!session && !ps_service_context) {
-
-		service_locator_init();
-
-		ps_service_context =
-			service_locator_query("sn:trustedfirmware.org:protected-storage:0");
-
-		if (ps_service_context) {
-
-			session = service_context_open(ps_service_context);
-
-			if (session) {
-
-				struct storage_backend *storage_backend = NULL;
-
-				storage_backend = secure_storage_client_init(&storage_client,  session);
-
-				if (storage_backend) {
-
-					psa_ps_frontend_init(storage_backend);
-					status = 0;
-				}
-			}
-
-			if (status < 0) relinquish_service_under_test();
-		}
-	}
-
-	return status;
-}
-
-int relinquish_service_under_test(void)
-{
-	psa_ps_frontend_init(NULL);
-	secure_storage_client_deinit(&storage_client);
-
-	if (ps_service_context && session) {
-
-		service_context_close(ps_service_context, session);
-		session = NULL;
-	}
-
-	if (ps_service_context) {
-
-		service_context_relinquish(ps_service_context);
-		ps_service_context = NULL;
-	}
-
-	return 0;
-}
\ No newline at end of file
diff --git a/deployments/psa-api-test/psa-api-test.cmake b/deployments/psa-api-test/psa-api-test.cmake
index 739ed26..ba2a74e 100644
--- a/deployments/psa-api-test/psa-api-test.cmake
+++ b/deployments/psa-api-test/psa-api-test.cmake
@@ -1,5 +1,5 @@
 #-------------------------------------------------------------------------------
-# Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
+# Copyright (c) 2021-2023, Arm Limited and Contributors. All rights reserved.
 #
 # SPDX-License-Identifier: BSD-3-Clause
 #
@@ -11,45 +11,31 @@
 #-------------------------------------------------------------------------------
 
 #-------------------------------------------------------------------------------
-#  Use libts for locating and accessing services. An appropriate version of
-#  libts will be imported for the environment in which service tests are
-#  deployed.
-#-------------------------------------------------------------------------------
-include(${TS_ROOT}/deployments/libts/libts-import.cmake)
-target_link_libraries(${PROJECT_NAME} PRIVATE libts::ts)
-
-#-------------------------------------------------------------------------------
 #  Components that are common across all deployments
 #
 #-------------------------------------------------------------------------------
-add_components(
-	TARGET "${PROJECT_NAME}"
-	BASE_DIR ${TS_ROOT}
-	COMPONENTS
-		"components/common/tlv"
-		"components/service/common/client"
-		"components/service/common/include"
-)
 
 target_sources(${PROJECT_NAME} PRIVATE
 	${TS_ROOT}/deployments/psa-api-test/arch_test_runner.c
 )
 
 #-------------------------------------------------------------------------------
+#  Use libpsa for locating PSA services. An appropriate version of
+#  libpsa will be imported for the environment. Making sure the link order is
+#  correct.
+#-------------------------------------------------------------------------------
+include(${TS_ROOT}/deployments/libpsa/libpsa-import.cmake)
+target_link_libraries( ${PROJECT_NAME} PRIVATE libpsa::psa)
+
+target_link_libraries(${PROJECT_NAME} PRIVATE val_nspe test_combine pal_nspe)
+
+#-------------------------------------------------------------------------------
 #  Export project header paths for arch tests
 #
 #-------------------------------------------------------------------------------
 get_target_property(_include_paths ${PROJECT_NAME} INCLUDE_DIRECTORIES)
 list(APPEND PSA_ARCH_TESTS_EXTERNAL_INCLUDE_PATHS ${_include_paths})
-
-#-------------------------------------------------------------------------------
-#  Components used from external projects
-#
-#-------------------------------------------------------------------------------
-
-# psa-arch-tests
 include(${TS_ROOT}/external/psa_arch_tests/psa_arch_tests.cmake)
-target_link_libraries(${PROJECT_NAME} PRIVATE val_nspe test_combine pal_nspe)
 
 #-------------------------------------------------------------------------------
 #  Define install content.
diff --git a/deployments/psa-api-test/psa_api_test_common.h b/deployments/psa-api-test/psa_api_test_common.h
new file mode 100644
index 0000000..568cf10
--- /dev/null
+++ b/deployments/psa-api-test/psa_api_test_common.h
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef COMMON_H
+#define COMMON_H
+
+#include "psa/error.h"
+
+psa_status_t test_setup(const char *service_name_crypto, const char *service_name_iat,
+			const char *service_name_ps, const char *service_name_its);
+void test_teardown(void);
+
+#endif /* COMMON_H */
diff --git a/deployments/psa-api-test/service_under_test.h b/deployments/psa-api-test/service_under_test.h
deleted file mode 100644
index 834384e..0000000
--- a/deployments/psa-api-test/service_under_test.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#ifndef SERVICE_UNDER_TEST_H
-#define SERVICE_UNDER_TEST_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * Locate and open an RPC session for the service under test.  Concrete
- * implementations of this function will locate a specific service and
- * associate an RPC Caller with the singleton PSA API client used by
- * the API tests.
- */
-int locate_service_under_test(void);
-
-/**
- * Reliquish the RPC session when the test run is complete.
- */
-int relinquish_service_under_test(void);
-
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* SERVICE_UNDER_TEST_H */
