diff --git a/api-tests/CMakeLists.txt b/api-tests/CMakeLists.txt
index 1e65e5f..1897373 100644
--- a/api-tests/CMakeLists.txt
+++ b/api-tests/CMakeLists.txt
@@ -1,5 +1,6 @@
 #/** @file
 # * Copyright (c) 2019-2022, Arm Limited or its affiliates. All rights reserved.
+# * Copyright 2023 NXP
 # * SPDX-License-Identifier : Apache-2.0
 # *
 # * Licensed under the Apache License, Version 2.0 (the "License");
@@ -647,6 +648,7 @@
 endif()
 
 # Build PAL NSPE LIB
+include(${PSA_ROOT_DIR}/platform/targets/common/nspe/pal_nspe.cmake)
 include(${PSA_ROOT_DIR}/platform/targets/${TARGET}/target.cmake)
 # Build VAL NSPE LIB
 #add_definitions(-DVAL_NSPE_BUILD)
diff --git a/api-tests/docs/porting_guide_dev_apis.md b/api-tests/docs/porting_guide_dev_apis.md
index 0860454..dfb90ec 100644
--- a/api-tests/docs/porting_guide_dev_apis.md
+++ b/api-tests/docs/porting_guide_dev_apis.md
@@ -66,6 +66,8 @@
 | 12 | uint32_t pal_compute_hash(int32_t cose_alg_id, struct q_useful_buf buffer_for_hash, struct q_useful_buf_c *hash, struct q_useful_buf_c protected_headers, struct q_useful_buf_c payload);                                                                | Computes hash for the requested data                       | cose_alg_id    : Algorithm ID<br/>buffer_for_hash  : Temp buffer for calculating hash<br/><br/>hash  : Pointer to store the hash<br/> buffer_for_hash  : Temp buffer for calculating hash<br/>protected_headers : data to be hashed<br/>payload  : Payload data<br/>                             |
 | 13 | uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id, struct q_useful_buf_c token_hash, struct q_useful_buf_c signature);                                                                | Function call to verify the signature using the public key              | cose_algorithm_id    : Algorithm ID<br/>token_hash  : Data that needs to be verified<br/>signature  : Signature to be verified against<br/>                             |
 | 14 | int pal_system_reset(void) | Resets the system | None |
+| 15 | pal_set_custom_test_list(char *custom_test_list); | Sets the custom test list buffer | custom_test_list : Custom test list buffer<br/>                             |
+| 16 | pal_is_test_enabled(test_id_t test_id); | Tells if a test is enabled on platform | test_id : Test ID<br/>                             |
 
 ## License
 Arm PSA test suite is distributed under Apache v2.0 License.
diff --git a/api-tests/platform/targets/common/nspe/pal_nspe.cmake b/api-tests/platform/targets/common/nspe/pal_nspe.cmake
new file mode 100755
index 0000000..97a7e2f
--- /dev/null
+++ b/api-tests/platform/targets/common/nspe/pal_nspe.cmake
@@ -0,0 +1,21 @@
+#/** @file
+# * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved.
+# * Copyright 2023 NXP
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# *  http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+# PAL C source files part of NSPE library
+list(APPEND PAL_SRC_C_NSPE
+	${PSA_ROOT_DIR}/platform/targets/common/nspe/pal_weak.c)
diff --git a/api-tests/platform/targets/common/nspe/pal_weak.c b/api-tests/platform/targets/common/nspe/pal_weak.c
new file mode 100755
index 0000000..fa2159a
--- /dev/null
+++ b/api-tests/platform/targets/common/nspe/pal_weak.c
@@ -0,0 +1,34 @@
+/** @file
+ * Copyright (c) 2023, Arm Limited or its affiliates. All rights reserved.
+ * Copyright 2023 NXP
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#include "pal_common.h"
+
+__attribute__((weak)) void pal_set_custom_test_list(char *custom_test_list)
+{
+	(void)custom_test_list;
+
+	return;
+}
+
+__attribute__((weak)) bool_t pal_is_test_enabled(test_id_t test_id)
+{
+	(void)test_id;
+
+	return 1;
+}
+
diff --git a/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_driver_intf.c b/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_driver_intf.c
index 1dcfeaa..3830192 100755
--- a/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_driver_intf.c
+++ b/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_driver_intf.c
@@ -1,5 +1,6 @@
 /** @file
  * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * Copyright 2023 NXP
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -38,6 +39,15 @@
 #define NVMEM_SIZE (1024)
 static uint8_t g_nvmem[NVMEM_SIZE];
 
+/* The custom test list is a buffer in which all enabled test names are concatenated.
+ * The test name template is <TEST_NAME_PREFIX><id><TEST_NAME_SUFFIX>, where <id>
+ * is the test identifier.
+ */
+#define TEST_NAME_PREFIX "test_"
+#define TEST_NAME_SUFFIX ";"
+
+char *g_custom_test_list = NULL;
+
 /**
     @brief    - Check that an nvmem access is within the bounds of the nvmem
     @param    - base    : Base address of nvmem (must be zero)
@@ -198,3 +208,31 @@
 {
     return PAL_STATUS_UNSUPPORTED_FUNC;
 }
+
+/**
+ *   @brief    - Sets the custom test list buffer
+ *   @param    - custom_test_list : Custom test list buffer 
+     @return   - void
+**/
+void pal_set_custom_test_list(char *custom_test_list)
+{
+    g_custom_test_list = custom_test_list;
+}
+
+/**
+ *   @brief    - Tells if a test is enabled on platform
+ *   @param    - test_id : Test ID
+ *   @return   - TRUE/FALSE
+**/
+bool_t pal_is_test_enabled(test_id_t test_id)
+{
+    char test_id_str[16] = { 0 };
+
+    if (!g_custom_test_list)
+        return 1;
+
+    if (sprintf(test_id_str, "%s%d%s", TEST_NAME_PREFIX, test_id, TEST_NAME_SUFFIX) <= 0)
+        return 0;
+
+    return strstr(g_custom_test_list, test_id_str)?1:0;
+}
diff --git a/api-tests/val/nspe/pal_interfaces_ns.h b/api-tests/val/nspe/pal_interfaces_ns.h
index 55f8796..a1a8529 100644
--- a/api-tests/val/nspe/pal_interfaces_ns.h
+++ b/api-tests/val/nspe/pal_interfaces_ns.h
@@ -1,5 +1,6 @@
 /** @file
  * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright 2023 NXP
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -126,4 +127,18 @@
  *   @return   - SUCCESS/FAILURE
 **/
 int pal_system_reset(void);
+
+/**
+ *   @brief    - Sets the custom test list buffer
+ *   @param    - custom_test_list : Custom test list buffer 
+     @return   - void
+**/
+void pal_set_custom_test_list(char *custom_test_list);
+
+/**
+ *   @brief    - Tells if a test is enabled on platform
+ *   @param    - test_id : Test ID
+ *   @return   - TRUE/FALSE
+**/
+bool_t pal_is_test_enabled(test_id_t test_id);
 #endif
diff --git a/api-tests/val/nspe/val_dispatcher.c b/api-tests/val/nspe/val_dispatcher.c
index 13a3671..cf91ede 100644
--- a/api-tests/val/nspe/val_dispatcher.c
+++ b/api-tests/val/nspe/val_dispatcher.c
@@ -1,5 +1,6 @@
 /** @file
  * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
+ * Copyright 2023 NXP
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -68,37 +69,37 @@
 **/
 val_status_t val_test_load(test_id_t *test_id, test_id_t test_id_prev)
 {
-    int             i;
     val_test_info_t test_list[] = {
 #include "test_entry_list.inc"
                                   {VAL_INVALID_TEST_ID, NULL}
                                   };
+    val_test_info_t *test_info = &test_list[0];
 
-    for (i = 0; i < (int)(sizeof(test_list)/sizeof(test_list[0])); i++)
+    if (test_id_prev != VAL_INVALID_TEST_ID)
     {
-        if (test_id_prev == VAL_INVALID_TEST_ID)
+        for(; test_info->test_id != VAL_INVALID_TEST_ID; test_info++)
         {
-            *test_id = test_list[i].test_id;
-            g_test_info_addr = (addr_t) test_list[i].entry_addr;
-            return VAL_STATUS_SUCCESS;
+            if (test_info->test_id == test_id_prev)
+            {
+                test_info++;
+                break;
+            }
         }
-        else if (test_id_prev == test_list[i].test_id)
+    }
+
+    for(; test_info->test_id != VAL_INVALID_TEST_ID; test_info++)
+    {
+        if (pal_is_test_enabled(VAL_GET_TEST_NUM(test_info->test_id)))
         {
-            *test_id = test_list[i+1].test_id;
-            g_test_info_addr = (addr_t) test_list[i+1].entry_addr;
-            return VAL_STATUS_SUCCESS;
-        }
-        else if (test_list[i].test_id == VAL_INVALID_TEST_ID)
-        {
-            val_print(PRINT_DEBUG, "\n\nNo more valid tests found. Exiting.", 0);
-            *test_id = VAL_INVALID_TEST_ID;
+            *test_id = test_info->test_id;
+            g_test_info_addr = (addr_t) test_info->entry_addr;
             return VAL_STATUS_SUCCESS;
         }
     }
 
+    val_print(PRINT_DEBUG, "\n\nNo more valid tests found. Exiting.", 0);
     *test_id = VAL_INVALID_TEST_ID;
-    val_print(PRINT_ERROR, "\n\nError: No more valid tests found. Exiting.", 0);
-    return VAL_STATUS_LOAD_ERROR;
+    return VAL_STATUS_SUCCESS;
 }
 
 /**
