diff --git a/api-specs/attestation/v1.0.2/doc/IHI0085-PSA_Attestation_API-1.0.2.pdf b/api-specs/attestation/v1.0.2/doc/IHI0085-PSA_Attestation_API-1.0.2.pdf
new file mode 100644
index 0000000..0c014aa
--- /dev/null
+++ b/api-specs/attestation/v1.0.2/doc/IHI0085-PSA_Attestation_API-1.0.2.pdf
Binary files differ
diff --git a/api-tests/CMakeLists.txt b/api-tests/CMakeLists.txt
index 40479fd..e0f1dbe 100644
--- a/api-tests/CMakeLists.txt
+++ b/api-tests/CMakeLists.txt
@@ -152,6 +152,17 @@
         1.0.1
         1.0.2
 )
+elseif("${SUITE}" STREQUAL "IPC")
+list(APPEND PSA_SPEC_VERSION
+        1.0
+        1.1
+)
+
+endif()
+
+#list of values available for connection based
+if(${SUITE} STREQUAL "IPC")
+list(APPEND PSA_STATELESS_ROT 0 1)
 endif()
 
 message(STATUS "[PSA] : ----------Process input arguments- start-------------")
@@ -272,7 +283,21 @@
                 if(${SPEC_VERSION} STREQUAL "1.0.2")
                         set(TESTSUITE_DB                        ${PSA_SUITE_DIR}/1.0.2_testsuite.db)
                 endif()
-        endif()
+        elseif(${SUITE} STREQUAL "IPC")
+                if(${SPEC_VERSION} STREQUAL "1.1")
+			if(DEFINED STATELESS_ROT_TESTS)
+				if(${STATELESS_ROT_TESTS} EQUAL 1)
+					set(TESTSUITE_DB                        ${PSA_SUITE_DIR}/stateless_rot_testsuite.db)
+				else()
+					set(TESTSUITE_DB                        ${PSA_SUITE_DIR}/testsuite.db)
+				endif()
+			else()
+                                        set(TESTSUITE_DB                        ${PSA_SUITE_DIR}/testsuite.db)
+			endif()
+		else()
+			set(TESTSUITE_DB                        ${PSA_SUITE_DIR}/testsuite.db)
+                endif()
+	endif()
 endif()
 set(PSA_TESTLIST_FILE			${CMAKE_CURRENT_BINARY_DIR}/${SUITE_LOWER}_testlist.txt)
 set(PSA_TEST_ENTRY_LIST_INC		${CMAKE_CURRENT_BINARY_DIR}/test_entry_list.inc)
@@ -419,6 +444,45 @@
 	endif()
 endif()
 
+if(DEFINED STATELESS_ROT_TESTS)
+	if(NOT ${STATELESS_ROT_TESTS} IN_LIST PSA_STATELESS_ROT)
+                 message(FATAL_ERROR "[PSA] : Error: Unsupported value for -DSTATELESS_ROT_TESTS=${STATELESS_ROT_TESTS}, supported values are : ${PSA_STATELESS_ROT}")
+        elseif(${STATELESS_ROT_TESTS} EQUAL 1)
+                 message(STATUS "[PSA] : Testing ${SUITE} for stateless rot")
+        elseif(${STATELESS_ROT_TESTS} EQUAL 0)
+                 message(STATUS "[PSA] : Testing ${SUITE} for connection based")
+        endif()
+
+	if(NOT DEFINED SPEC_VERSION)
+                message(FATAL_ERROR "[PSA] : Error: SPEC_VERSION is require for STATELESS_ROT_TESTS.")
+	elseif(${SUITE} STREQUAL "IPC")
+		if(${SPEC_VERSION} STREQUAL "1.0")
+			message(FATAL_ERROR "[PSA] : Error: STATELESS_ROT_TESTS is only valid for SPEC_VERSION=1.1.")
+		elseif(${SPEC_VERSION} STREQUAL "1.1")
+			add_definitions(-DSPEC_VERSION=11)
+			if(${STATELESS_ROT_TESTS} EQUAL 1)
+	                        add_definitions(-DSTATELESS_ROT=1)
+			elseif(${STATELESS_ROT_TESTS} EQUAL 0)
+	                        add_definitions(-DSTATELESS_ROT=0)
+			endif()
+		endif()
+	else()
+                message(FATAL_ERROR "[PSA] : Error: STATELESS_ROT_TESTS is only applicable to IPC Test Suite.")
+	endif()
+else()
+	add_definitions(-DSTATELESS_ROT=0)
+	if(DEFINED SPEC_VERSION)
+		if(${SUITE} STREQUAL "IPC")
+                	if(${SPEC_VERSION} STREQUAL "1.0")
+                        	add_definitions(-DSPEC_VERSION=10)
+	                endif()
+        	        if(${SPEC_VERSION} STREQUAL "1.1")
+        	                add_definitions(-DSPEC_VERSION=11)
+        	        endif()
+		endif()
+	endif()
+endif()
+
 message(STATUS "[PSA] : ----------Process input arguments- complete-------------")
 
 
diff --git a/api-tests/dev_apis/README.md b/api-tests/dev_apis/README.md
index 180295d..36af1cb 100644
--- a/api-tests/dev_apis/README.md
+++ b/api-tests/dev_apis/README.md
@@ -14,14 +14,14 @@
 For more information on the architecture test suite framework and methodology to run the tests, refer to the [Validation Methodology](../docs/Arm_PSA_APIs_Arch_Test_Validation_Methodology.pdf) document.
 
 ## This release
- - Code Quality : REL v1.1
+ - Code Quality : REL v1.2
  - This release contains following PSA Functional APIs tests: <br />
 
 | Test Category            | Specification Version                |
 |--------------------------|--------------------------------------|
-| Crypto                   | [PSA Crypto API 1.0-Beta3](../../api-specs/crypto/v1.0-beta3/doc/)     |
+| Crypto                   | [PSA Crypto API 1.0.0](../../api-specs/crypto/v1.0.0/doc/)     |
 | Storage (PS and ITS)     | [PSA Storage API 1.0.0](../../api-specs/storage/v1.0/doc/) |
-| Attestation              | [PSA Attestation API 1.0.0](../../api-specs/attestation/v1.0/doc/)  |
+| Attestation              | [PSA Attestation API 1.0.2](../../api-specs/attestation/v1.0.2/doc/)  |
 
 
 ##  Release Tags
@@ -30,6 +30,7 @@
 
 | Release version | Release tag  | PSA Crypto API | PSA Storage API | PSA Attestation API |
 |-----------------|---------------|----------------|-----------------|---------------------|
+| REL v1.2 | [v21.07_API1.2_ADAC_ALPHA](https://github.com/ARM-software/psa-arch-tests/tree//api-tests/dev_apis) | 1.0.0  | 1.0.0 | 1.0.2 |
 | REL v1.1 | [v20.11_API1.1](https://github.com/ARM-software/psa-arch-tests/tree/v20.11_API1.1/api-tests/dev_apis) | 1.0-Beta3  | 1.0.0 | 1.0.0 |
 | REL v1.0 | [v20.03_API1.0](https://github.com/ARM-software/psa-arch-tests/tree/v20.03_API1.0/api-tests/dev_apis) | 1.0-Beta3  | 1.0.0 | 1.0.0 |
 | v0.9 | [v19.06_API0.9](https://github.com/ARM-software/psa-arch-tests/tree/v19.06_API0.9/api-tests/dev_apis) | 1.0-Beta2 | 1.0-Beta2 | 1.0-Beta0 |
@@ -63,8 +64,8 @@
 
 -   -G"<generator_name>" : "Unix Makefiles" to generate Makefiles for Linux and Cygwin. "MinGW Makefiles" to generate Makefiles for cmd.exe on Windows  <br />
 -   -DTARGET=<platform_name> is the same as the name of the target-specific directory created in the **platform/targets/** directory. The current release has been tested on **tgt_dev_apis_tfm_an521**, **tgt_dev_apis_tfm_musca_b1** and **tgt_dev_apis_tfm_musca_a** platforms. Refer [Test_failure analysis](../docs/test_failure_analysis.md) document to know the reason for any known test fail.<br />
--   -DTOOLCHAIN=<tool_chain> Compiler toolchain to be used for test suite compilation. Supported values are GNUARM (GNU Arm Embedded), ARMCLANG (ARM Compiler 6.x) and HOST_GCC. Default is GNUARM.<br />
--   -DCPU_ARCH=<cpu_architecture_version> is the Arm Architecture version name for which the tests should be compiled. Supported CPU arch are armv8m_ml, armv8m_bl and armv7m. Default is empty. This option is unused when TOOLCHAIN type is HOST_GCC.<br />
+-   -DTOOLCHAIN=<tool_chain> Compiler toolchain to be used for test suite compilation. Supported values are GNUARM (GNU Arm Embedded), ARMCLANG (ARM Compiler 6.x) , HOST_GCC and GCC_LINUX . Default is GNUARM.<br />
+-   -DCPU_ARCH=<cpu_architecture_version> is the Arm Architecture version name for which the tests should be compiled. Supported CPU arch are armv8m_ml, armv8m_bl, armv7m and armv8a. Default is empty. This option is unused when TOOLCHAIN type is HOST_GCC.<br />
 -   -DSUITE=<suite_name> is the test suite name. Supported values are CRYPTO, INITIAL_ATTESTATION, STORAGE(INTERNAL_TRUSTED_STORAGE and PROTECTED_STORAGE), INTERNAL_TRUSTED_STORAGE and PROTECTED_STORAGE .<br />
 -   -DVERBOSE=<verbose_level>. Print verbosity level. Default is 3. Supported print levels are 1(INFO & above), 2(DEBUG & above), 3(TEST & above), 4(WARN & ERROR) and 5(ERROR).
 -   -DBUILD=<BUILD_DIR> : To select the build directory to keep output files. Default is BUILD/ inside current directory.
@@ -74,6 +75,8 @@
 -   -DSPEC_VERSION=<spec_version> is test suite specification version. Which will build for given specified spec_version. Supported values for CRYPTO test suite are 1.0-BETA1, 1.0-BETA2, 1.0-BETA3 , for INITIAL_ATTESATATION test suite are 1.0-BETA0, 1.0.0, 1.0.1, 1.0.2, for STORAGE, INTERNAL_TRUSTED_STORAGE, PROTECTED_STORAGE test suite are 1.0-BETA2, 1.0 . Default is empty. <br/>
      If -DSPEC_VERSION option is not given it will build for latest version of testsuite.
      For every spec version corresponds test list will be in spec_version_testsuite.db file in api-tests/dev_apis/test_suite_name/ folder.
+-   -DCOMPILER_NAME=<compiler_name> Compiler name to be use for selecting compiler. Supported values are gcc. By defualt it will take gcc if not specified.
+     Note: -DCOMPILER_NAME only applicable for linux i.e. -DTOOLCHAIN=GCC_LINUX and DTARGET=tgt_dev_apis_linux.
 -   -DPSA_INCLUDE_PATHS="<include_path1>;<include_path2>;...;<include_pathn>" is an additional directory to be included into the compiler search path.You must provide Functional APIs header files implementation to the test suite build system using this option. For example, to compile Crypto tests, the include path must point to the path where **psa/crypto.h** is located in your build system. Bydefault, PSA_INCLUDE_PATHS accepts absolute path. However, relative path can be provided using below format:<br />
 ```
     -DPSA_INCLUDE_PATHS=`readlink -f <relative_include_path>`
diff --git a/api-tests/dev_apis/crypto/1.0.0_testsuite.db b/api-tests/dev_apis/crypto/1.0.0_testsuite.db
new file mode 100644
index 0000000..562cedf
--- /dev/null
+++ b/api-tests/dev_apis/crypto/1.0.0_testsuite.db
@@ -0,0 +1,87 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+
+#List of tests to be compiled and run as part of crypto suite
+
+(START)
+
+test_c001
+test_c002
+test_c003
+test_c004
+test_c005
+test_c006
+test_c007
+test_c008
+test_c009
+test_c010
+test_c011
+test_c012
+test_c013
+test_c014
+test_c015
+test_c016
+test_c017
+test_c018
+test_c019
+test_c020
+test_c021
+test_c022
+test_c023
+test_c024
+test_c025
+test_c026
+test_c027
+test_c028
+test_c029
+test_c030
+test_c031
+test_c032
+test_c033
+test_c034
+test_c035
+test_c036
+test_c037
+test_c038
+test_c039
+test_c040
+test_c041
+test_c042
+test_c043
+test_c044
+test_c045
+test_c046
+test_c047
+test_c048
+test_c049
+test_c050
+test_c051
+test_c052
+test_c053
+test_c054
+test_c055
+test_c056
+test_c057
+test_c058
+test_c059
+test_c060
+test_c061
+test_c062
+test_c063
+
+(END)
diff --git a/api-tests/dev_apis/crypto/test_c041/test_entry_c041.c b/api-tests/dev_apis/crypto/test_c041/test_entry_c041.c
index 2e10d6d..0f2dc92 100644
--- a/api-tests/dev_apis/crypto/test_c041/test_entry_c041.c
+++ b/api-tests/dev_apis/crypto/test_c041/test_entry_c041.c
@@ -20,7 +20,7 @@
 #include "test_c041.h"
 
 #define TEST_NUM  VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 41)
-#define TEST_DESC "Testing crypto asymmetric APIs | UT: psa_asymmetric_sign\n"
+#define TEST_DESC "Testing crypto asymmetric APIs | UT: psa_sign_hash\n"
 
 TEST_PUBLISH(TEST_NUM, test_entry);
 val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c042/test_entry_c042.c b/api-tests/dev_apis/crypto/test_c042/test_entry_c042.c
index 1a930bf..eb23d27 100644
--- a/api-tests/dev_apis/crypto/test_c042/test_entry_c042.c
+++ b/api-tests/dev_apis/crypto/test_c042/test_entry_c042.c
@@ -20,7 +20,7 @@
 #include "test_c042.h"
 
 #define TEST_NUM  VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 42)
-#define TEST_DESC "Testing crypto asymmetric APIs | UT: psa_asymmetric_verify\n"
+#define TEST_DESC "Testing crypto asymmetric APIs | UT: psa_verify_hash\n"
 
 TEST_PUBLISH(TEST_NUM, test_entry);
 val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c050/test_entry_c050.c b/api-tests/dev_apis/crypto/test_c050/test_entry_c050.c
index 2d8c99f..355d887 100644
--- a/api-tests/dev_apis/crypto/test_c050/test_entry_c050.c
+++ b/api-tests/dev_apis/crypto/test_c050/test_entry_c050.c
@@ -20,7 +20,7 @@
 #include "test_c050.h"
 
 #define TEST_NUM  VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 50)
-#define TEST_DESC "Testing crypto key management APIs | UT: psa_open_key\n"
+#define TEST_DESC "Testing crypto key management APIs | UT: psa_sign_message\n"
 
 TEST_PUBLISH(TEST_NUM, test_entry);
 val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c051/test_entry_c051.c b/api-tests/dev_apis/crypto/test_c051/test_entry_c051.c
index aa73a08..9f4e7a2 100644
--- a/api-tests/dev_apis/crypto/test_c051/test_entry_c051.c
+++ b/api-tests/dev_apis/crypto/test_c051/test_entry_c051.c
@@ -20,7 +20,7 @@
 #include "test_c051.h"
 
 #define TEST_NUM  VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 51)
-#define TEST_DESC "Testing crypto key management APIs | UT: psa_close_key\n"
+#define TEST_DESC "Testing crypto key management APIs | UT: psa_verify_message\n"
 
 TEST_PUBLISH(TEST_NUM, test_entry);
 val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c058/test_entry_c058.c b/api-tests/dev_apis/crypto/test_c058/test_entry_c058.c
index 6febb42..22fe94f 100644
--- a/api-tests/dev_apis/crypto/test_c058/test_entry_c058.c
+++ b/api-tests/dev_apis/crypto/test_c058/test_entry_c058.c
@@ -20,7 +20,7 @@
 #include "test_c058.h"
 
 #define TEST_NUM  VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 58)
-#define TEST_DESC "Testing crypto AEAD APIs | UT: psa_aead_update_test\n"
+#define TEST_DESC "Testing crypto AEAD APIs | UT: psa_aead_update\n"
 
 TEST_PUBLISH(TEST_NUM, test_entry);
 val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c062/test_entry_c062.c b/api-tests/dev_apis/crypto/test_c062/test_entry_c062.c
index d7cff4a..98de3cf 100644
--- a/api-tests/dev_apis/crypto/test_c062/test_entry_c062.c
+++ b/api-tests/dev_apis/crypto/test_c062/test_entry_c062.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +20,7 @@
 #include "test_c062.h"
 
 #define TEST_NUM  VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 62)
-#define TEST_DESC "Testing crypto hash functions APIs\n"
+#define TEST_DESC "Testing crypto hash functions APIs | UT: psa_hash_suspend\n"
 
 TEST_PUBLISH(TEST_NUM, test_entry);
 val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c063/test_entry_c063.c b/api-tests/dev_apis/crypto/test_c063/test_entry_c063.c
index 4049d97..6bddba5 100644
--- a/api-tests/dev_apis/crypto/test_c063/test_entry_c063.c
+++ b/api-tests/dev_apis/crypto/test_c063/test_entry_c063.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +20,7 @@
 #include "test_c063.h"
 
 #define TEST_NUM  VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 63)
-#define TEST_DESC "Testing crypto hash functions APIs\n"
+#define TEST_DESC "Testing crypto hash functions APIs | UT: psa_hash_resume\n"
 
 TEST_PUBLISH(TEST_NUM, test_entry);
 val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/testsuite.db b/api-tests/dev_apis/crypto/testsuite.db
index a322098..7e4f8b4 100644
--- a/api-tests/dev_apis/crypto/testsuite.db
+++ b/api-tests/dev_apis/crypto/testsuite.db
@@ -1,5 +1,5 @@
 #/** @file
-# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
+# * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
 # * SPDX-License-Identifier : Apache-2.0
 # *
 # * Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/api-tests/docs/Arm_PSA-M_Functional_API_Test_Suite_Validation_Methodology.pdf b/api-tests/docs/Arm_PSA-M_Functional_API_Test_Suite_Validation_Methodology.pdf
new file mode 100644
index 0000000..90f44d9
--- /dev/null
+++ b/api-tests/docs/Arm_PSA-M_Functional_API_Test_Suite_Validation_Methodology.pdf
Binary files differ
diff --git a/api-tests/docs/Arm_PSA_APIs_Arch_Test_Validation_Methodology.pdf b/api-tests/docs/Arm_PSA_APIs_Arch_Test_Validation_Methodology.pdf
deleted file mode 100644
index 123d593..0000000
--- a/api-tests/docs/Arm_PSA_APIs_Arch_Test_Validation_Methodology.pdf
+++ /dev/null
Binary files differ
diff --git a/api-tests/docs/sw_requirements.md b/api-tests/docs/sw_requirements.md
index 7c7f8f1..2809434 100644
--- a/api-tests/docs/sw_requirements.md
+++ b/api-tests/docs/sw_requirements.md
@@ -6,7 +6,7 @@
 - Host Operating System     : Ubuntu 16.04, Windows 10
 - Scripting tools           : Python 3.7.1
 - Host Compiler toolchain   : GCC 5.4.0 (Linux Host) or MinGW 6.3.0 (Windows Host)
-- Cross Compiler toolchain  : GNU Arm Embedded Toolchain 7.3.1 or Arm Compiler 6.11
+- Cross Compiler toolchain  : GNU Arm Embedded Toolchain 7.3.1 or Arm Compiler 6.14
 - Build tools               : CMake 3.15
 
 **Note**: To compile the test suite code, at least one of the above supported compiler toolchains
@@ -45,4 +45,4 @@
 
 --------------
 
-*Copyright (c) 2018-2020, Arm Limited and Contributors. All rights reserved.*
+*Copyright (c) 2018-2021, Arm Limited and Contributors. All rights reserved.*
diff --git a/api-tests/docs/test_failure_analysis.md b/api-tests/docs/test_failure_analysis.md
index bb48229..81c10fc 100644
--- a/api-tests/docs/test_failure_analysis.md
+++ b/api-tests/docs/test_failure_analysis.md
@@ -2,8 +2,8 @@
 # Test failure analysis document
 
 This file contains list of failures identified when testing the release
-on tgt_dev_apis_tfm_an521, tgt_dev_apis_tfm_musca_a and  tgt_dev_apis_tfm_musca_b1
-targets with TFM commit Hash - cea100b1e09fe53fd1ed6818b8129ef51daa0822.
+on tgt_dev_apis_tfm_an521 and  tgt_dev_apis_tfm_musca_b1
+targets with TFM commit Hash - d0f6ceb0559af6ef08f4624eeac079cc07a1f077.
 The reason for each failing test is listed here in this file.
 
 ## Known Failures
@@ -11,11 +11,16 @@
 | Test | Fail description                                                                | Github issue |
 |------|---------------------------------------------------------------------------------| ------------ |
 |test_c021 | psa_key_derivation_output_key returns incorrect error code | https://github.com/ARMmbed/mbed-crypto/issues/175 |
+|test_c026 | psa_sign_message not supported | https://jira.arm.com/browse/IOTPSW-4100 |
+|test_c027 | psa_mac_update not supported | https://jira.arm.com/browse/IOTPSW-4100 |
+|test_c028 | PSA_KEY_USAGE_SIGN_MESSAGE not found | https://jira.arm.com/browse/IOTPSW-4100 |
+|test_c029 | PSA_KEY_USAGE_VERIFY_MESSAGE not supported | https://jira.arm.com/browse/IOTPSW-4100 |
+|test_c030 | PSA_KEY_USAGE_VERIFY_MESSAGE not supported | https://jira.arm.com/browse/IOTPSW-4100 |
 |test_c046 | psa_mac_compute is unimplemented in TFM/mbed-crypto. So the test has not been verified.	| https://github.com/ARMmbed/mbed-crypto/issues/381 |
 |test_c047 | psa_mac_verify is unimplemented in TFM/mbed-crypto. So the test has not been verified.		| https://github.com/ARMmbed/mbed-crypto/issues/381 |
 |test_c048 | psa_cipher_encrypt is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
 |test_c049 | psa_cipher_decrypt is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
-|test_c050 | Persistent key storage is unavailable in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/382 |
+|test_c051 | PSA_KEY_USAGE_VERIFY_MESSAGE not supported | https://jira.arm.com/browse/IOTPSW-4100 |
 |test_c052 | psa_aead_encrypt_setup is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
 |test_c053 | psa_aead_decrypt_setup is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
 |test_c054 | psa_aead_generate_nonce is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
@@ -26,6 +31,8 @@
 |test_c059 | psa_aead_finish is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
 |test_c060 | psa_aead_abort is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
 |test_c061 | psa_aead_verify is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
+|test_c062 | psa_hash_suspend is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://jira.arm.com/browse/IOTPSW-4100 |
+|test_c063 | psa_hash_resume is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://jira.arm.com/browse/IOTPSW-4100 |
 
 ## License
 
@@ -33,4 +40,4 @@
 
 --------------
 
-*Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.*
+*Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.*
diff --git a/api-tests/ff/README.md b/api-tests/ff/README.md
index 371a968..24a2813 100644
--- a/api-tests/ff/README.md
+++ b/api-tests/ff/README.md
@@ -23,13 +23,14 @@
 For more information on architecture test suite specification, refer to the [Validation Methodology](../docs/Arm_PSA_APIs_Arch_Test_Validation_Methodology.pdf) document.
 
 ## This release
- - Code Quality : REL v1.1
- - This release contains the PSA-FF tests that are written for the PSA FF 1.0 specification.
+ - Code Quality : REL v1.2
+ - This release contains the PSA-FF tests that are written for the PSA FF 1.1 Extensions specification.
 
 ##  Release Tags
 
 | Release version | Release tag  | PSA FF specification version |
 |-----------------|---------------|----------------|
+| REL v1.2 | [v21.07_API1.2_ADAC_ALPHA](https://github.com/ARM-software/psa-arch-tests/tree//api-tests/ff) | 1.1-Alpha0 |
 | REL v1.1 | [v20.11_API1.1](https://github.com/ARM-software/psa-arch-tests/tree/v20.11_API1.1/api-tests/ff) | 1.0 |
 | REL v1.0 | [v20.03_API1.0](https://github.com/ARM-software/psa-arch-tests/tree/v20.03_API1.0/api-tests/ff) | 1.0 |
 | v0.9 | [v19.06_API0.9](https://github.com/ARM-software/psa-arch-tests/tree/v19.06_API0.9/api-tests/ff) | 1.0-Beta1 |
@@ -85,11 +86,23 @@
 -   -DWATCHDOG_AVAILABLE=<0|1>: Test harness may require to access watchdog timer to recover system hang. 0 means skip watchdog programming in the test suite and 1 means program the watchdog. Default is 1. Note, If the system under test doesn't support the reboot of the system when it encounters the panic situation, a watchdog must be available to the tests if INCLUDE_PANIC_TESTS set to 1.
 -   -DSUITE_TEST_RANGE="<test_start_number>;<test_end_number>" is to select range of tests for build. All tests under -DSUITE are considered by default if not specified.
 -   -DTFM_PROFILE=<profile_small/profile_medium> is to work with TFM defined Pofile Small/Medium definitions. Supported values are profile_small and profile_medium. Unless specified Default Profile is used.
+-   -DSPEC_VERSION=<spec_version> is test suite specification version. Which will build for given specified spec_version. Supported values for FF test suite are 1.0 and 1.1 . Default is empty. <br/>
+     If -DSPEC_VERSION option is not given it will build for latest version of testsuite.
+     For spec version corresponds test list will be in testsuite.db file in api-tests/ff/ipc/ folder.
+     Note: For FF 1.1 make sure to do the manifests changes and use SPEC_VERSION=1.1 .
+-   -DSTATELESS_ROT_TESTS=<stateless_rot> is the flag for enabling stateless rot service for FF suite. Supported values are 0 and 1. 0 for connection based services and 1 for stateless rot services.
+     Note: For using STATELESS ROT service must use -DSPEC_VERSION = 1.1 .
 -   -DPSA_INCLUDE_PATHS="<include_path1>;<include_path2>;...;<include_pathn>" is an additional directory to be included into the compiler search path. To compile IPC tests, the include path must point to the path where **psa/client.h**, **psa/service.h**,  **psa/lifecycle.h** and test partition manifest output files(**psa_manifest/sid.h**, **psa_manifest/pid.h** and **psa_manifest/<manifestfilename>.h**) are located in your build system. Bydefault, PSA_INCLUDE_PATHS accepts absolute path. However, relative path can be provided using below format:<br />
 ```
     -DPSA_INCLUDE_PATHS=`readlink -f <relative_include_path>`
 ```
 
+For using FF-1.1 do the following manifests changes in api-tests/platform/manifests files.
+	Change "psa_framework_version" attribute from 1.0 to 1.1 in all manifests files.
+	Add "model": "IPC" attribute in manifests files.
+	Add "connection_based" attribute in all services of manifest file. Give value true or false accroding to your requirement. True for connection based services and false for stateless rot services.
+	Replace signal to name in irq attribute of manifest file.
+
 To compile IPC tests for **tgt_ff_tfm_an521** platform, execute the following commands:
 ```
     cd api-tests
@@ -148,4 +161,4 @@
 
 --------------
 
-*Copyright (c) 2018-2020, Arm Limited and Contributors. All rights reserved.*
+*Copyright (c) 2018-2021, Arm Limited and Contributors. All rights reserved.*
diff --git a/api-tests/ff/ipc/stateless_rot_testsuite.db b/api-tests/ff/ipc/stateless_rot_testsuite.db
new file mode 100644
index 0000000..b549418
--- /dev/null
+++ b/api-tests/ff/ipc/stateless_rot_testsuite.db
@@ -0,0 +1,93 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+
+#List of tests to be compiled and run as part of IPC suite
+
+(START)
+
+test_i001
+test_i003
+test_i013, panic_test
+test_i014, panic_test
+test_i015, panic_test
+test_i016, panic_test
+test_i021
+test_i022, panic_test
+test_i023, panic_test
+test_i024, panic_test
+test_i025, panic_test
+test_i026, panic_test
+test_i030, panic_test
+test_i031, panic_test
+test_i032, panic_test
+test_i033, panic_test
+test_i036, panic_test
+test_i037, panic_test
+test_i038, panic_test
+test_i039, panic_test
+test_i042, panic_test
+test_i043, panic_test
+test_i044, panic_test
+test_i045, panic_test
+test_i046, panic_test
+test_i047, panic_test
+test_i048, panic_test
+test_i049, panic_test
+test_i050, panic_test
+test_i051, panic_test
+test_i052, panic_test
+test_i053, panic_test
+test_i054, panic_test
+test_i055, panic_test
+test_i056, panic_test
+test_i057, panic_test
+test_i058
+test_i059, panic_test
+test_i060, panic_test
+test_i061, panic_test
+test_i062, panic_test
+test_i063
+test_i064, panic_test
+test_i065, panic_test
+test_i066, panic_test
+test_i067
+test_i068, panic_test
+test_i069, panic_test
+test_i070, panic_test
+test_i071
+test_i072, panic_test
+test_i073, panic_test
+test_i074, panic_test
+test_i075, panic_test
+test_i076, panic_test
+test_i077, panic_test
+test_i078, panic_test
+test_i079, panic_test
+test_i080, panic_test
+test_i081, panic_test
+test_i082, panic_test
+test_i083, panic_test
+test_i084, panic_test
+test_i085, panic_test
+test_i086, panic_test
+test_i087, panic_test
+test_l088
+test_i089, panic_test
+test_i090, panic_test
+
+(END)
diff --git a/api-tests/ff/ipc/test_i003/test_i003.c b/api-tests/ff/ipc/test_i003/test_i003.c
index 9a3e20c..1e53727 100644
--- a/api-tests/ff/ipc/test_i003/test_i003.c
+++ b/api-tests/ff/ipc/test_i003/test_i003.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,6 +26,261 @@
 
 #include "test_i003.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i003_client_tests_list[] = {
+    NULL,
+    client_test_zero_length_invec,
+    client_test_zero_length_outvec,
+    client_test_call_read_and_skip,
+    client_test_call_and_write,
+    client_test_overlapping_vectors,
+    NULL,
+};
+
+int32_t client_test_zero_length_invec(caller_security_t caller __UNUSED)
+{
+   int32_t              status = VAL_STATUS_SUCCESS;
+
+   int                  data[4] = {0x11, 0x22};
+
+   val->print(PRINT_TEST, "[Check 1] Test zero length invec\n", 0);
+
+   /* Invec 0 as zero length vector
+    * Invec 1 as NULL
+    * Invec 2 as valid msg pointer which is not zero length memory pointer
+   */
+   psa_invec data1[3] = { {&data[0], 0},
+                        {NULL, 0},
+                        {&data[1], sizeof(data[1])} };
+
+   /* Outvec 0 as valid msg pointer which is not zero length memory pointer
+    * Outvec 1 to 3 are NULL
+    */
+   psa_outvec resp[1] = { {&data[2], sizeof(data[2])} };
+
+   status = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, data1, 3, resp, 1);
+
+   if (status < 0)
+   {
+       status = VAL_STATUS_CALL_FAILED;
+   }
+   else if (data[2] != data[1])
+   {
+       val->print(PRINT_ERROR, "\tExpected data=%x\n", data[1]);
+       val->print(PRINT_ERROR, "\tBut actual data=%x\n", data[2]);
+       status = VAL_STATUS_WRITE_FAILED;
+   }
+   else if (resp[0].len != sizeof(data[1]))
+   {
+       val->print(PRINT_ERROR, "\tExpected size= %x\n", sizeof(data[1]));
+       val->print(PRINT_ERROR, "\tBut actual size=%x\n", resp[0].len);
+       status = VAL_STATUS_WRITE_FAILED;
+   }
+
+   if (VAL_ERROR(status))
+   {
+       val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
+   }
+
+   return status;
+}
+
+int32_t client_test_zero_length_outvec(caller_security_t caller __UNUSED)
+{
+   int32_t              status = VAL_STATUS_SUCCESS;
+
+   int                  data[4] = {0x11};
+
+   val->print(PRINT_TEST, "[Check 2] Test zero length outvec\n", 0);
+
+   /* Test invec 1 to 3 are NULL
+    * Invec 1 should be ignored since in_len is 1
+    */
+   psa_invec data1[2] = { {&data[0], sizeof(data[0])},
+                          {&data[1], sizeof(data[1])} };
+
+   /* Test outvec 0 as zero length
+    * Test outvec 1 as NULL
+    * Test outvec 2 as valid msg pointer which is not zero length memory pointer
+   */
+   psa_outvec resp[3] = { {&data[0], 0},
+                          {NULL, 0},
+                          {&data[2], sizeof(data[2])} };
+
+   status = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, data1, 1, resp, 3);
+
+
+   if (status < 0)
+   {
+       status = VAL_STATUS_CALL_FAILED;
+   }
+   /* Compare the outvec with expected data */
+   else if (data[2] != data[0])
+   {
+       val->print(PRINT_ERROR, "\tExpected data=%x\n", data[0]);
+       val->print(PRINT_ERROR, "\tBut actual data=%x\n", data[2]);
+       status = VAL_STATUS_WRITE_FAILED;
+   }
+   /* No. of bytes written by psa_write should update the psa_outvec.len param */
+   else if (resp[2].len != sizeof(data[2]))
+   {
+       val->print(PRINT_ERROR, "\tExpected size=%x\n", sizeof(data[2]));
+       val->print(PRINT_ERROR, "\tBut actual size=%x\n", resp[2].len);
+       status = VAL_STATUS_WRITE_FAILED;
+   }
+
+   if (VAL_ERROR(status))
+   {
+       val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
+   }
+
+   return status;
+}
+
+int32_t client_test_call_read_and_skip(caller_security_t caller __UNUSED)
+{
+   int32_t              status = VAL_STATUS_SUCCESS;
+   int                  data1[2] = {0xaa, 0xbb};
+   uint64_t             data2 = 0x1122334455667788;
+   uint64_t             data3 = 0x1020304050607080;
+
+
+   val->print(PRINT_TEST, "[Check 3] Test psa_call, psa_read and psa_skip\n", 0);
+
+   /* Server test func checks the following:
+    * All iovec as input, out_len=0, inbound read, inbound skip,
+    * outbound read, outbound skip
+    */
+   psa_invec data[4] = { {&data1[0], sizeof(data1[0])},
+                         {&data1[1], sizeof(data1[1])},
+                         {&data2, sizeof(data2)},
+                         {&data3, sizeof(data3)} };
+
+   status = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, data, 4, NULL, 0);
+
+
+   if (status < 0)
+   {
+       val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
+       status = VAL_STATUS_CALL_FAILED;
+   }
+
+   return status;
+}
+
+int32_t client_test_call_and_write(caller_security_t caller __UNUSED)
+{
+   int32_t              status = VAL_STATUS_SUCCESS;
+   int                  data[4] = {0}, expected_data[4] = {0xaa, 0xbb, 0xcc, 0xeedd}, i;
+   size_t               expected_size[] = {sizeof(expected_data[0]),
+                                           sizeof(expected_data[1]),
+                                           sizeof(expected_data[2]),
+                                           2};
+
+
+   val->print(PRINT_TEST, "[Check 4] Test psa_call and psa_write\n", 0);
+
+   /* Check all iovec as output */
+   /* Check for in_len=0 */
+   /* check for iovec write using psa_write */
+   /* check for write concatenation */
+   psa_outvec resp[4] = { {&data[0], sizeof(data[0])},
+                          {&data[1], sizeof(data[1])},
+                          {&data[2], sizeof(data[2])},
+                          {&data[3], sizeof(data[3])} };
+
+   status = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, resp, 4);
+
+   if (status < 0)
+   {
+       status = VAL_STATUS_CALL_FAILED;
+   }
+
+   for (i = 0; i < 4 ; i++)
+   {
+        if (data[i] != expected_data[i])
+        {
+            val->print(PRINT_ERROR, "\tIteration= %x\n", i);
+            val->print(PRINT_ERROR, "\tExpected data=%x\n", expected_data[i]);
+            val->print(PRINT_ERROR, "\tBut actual data=%x\n", data[i]);
+            status = VAL_STATUS_WRITE_FAILED;
+        }
+        /* No. of bytes written by psa_write should update the psa_outvec.len param */
+        else if (resp[i].len != expected_size[i])
+        {
+            val->print(PRINT_ERROR, "\tIteration= %x\n", i);
+            val->print(PRINT_ERROR, "\tExpected size=%x\n", expected_size[i]);
+            val->print(PRINT_ERROR, "\tBut actual size=%x\n", resp[i].len);
+            status = VAL_STATUS_WRITE_FAILED;
+        }
+   }
+
+   if (VAL_ERROR(status))
+   {
+       val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
+   }
+
+   return status;
+}
+
+int32_t client_test_overlapping_vectors(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+
+   uint8_t            data = 0x11, expected_data[] = {0x22, 0x33};
+
+   val->print(PRINT_TEST, "[Check 6] Test overlapping vectors\n", 0);
+
+#if STATELESS_ROT != 1
+   psa_handle_t       handle = 0;
+   if (val->ipc_connect(SERVER_UNSPECIFED_VERSION_SID,
+                        SERVER_UNSPECIFED_VERSION_VERSION,
+                        &handle))
+   {
+       return VAL_STATUS_CONNECTION_FAILED;
+   }
+#endif
+
+   /* Rule- When client provides an input and output vectors which are referencing
+    * to same memory location, psa_read after psa_write to that memory location
+    * can return original or modified value.
+    *
+    * Rule- When client provides an input and output vectors which are referencing to same
+    * memory location, a psa_write(s) to both memory vectors can return either the 1st
+    * or the 2nd value written.
+    *
+    * Input [0] and output [0,1] vectors have been used to verify these rule.
+    * All of these vectors are pointing to same memory location.
+    */
+
+   psa_invec invec[1] = { {&data, sizeof(data)} } ;
+   psa_outvec outvec[2] = { {&data, sizeof(data)},
+                            {&data, sizeof(data)} };
+
+   status = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 2);
+
+   if (status < 0)
+   {
+       status = VAL_STATUS_CALL_FAILED;
+   }
+   /* data should contain either value written by 1st psa_write or 2nd */
+   else if ((data != expected_data[0]) && (data != expected_data[1]))
+   {
+       val->print(PRINT_ERROR, "\tInvalid data received=%x\n", data);
+       status = VAL_STATUS_CALL_FAILED;
+   }
+
+   if (VAL_ERROR(status))
+   {
+       val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
+   }
+
+   return status;
+}
+
+#else
+
 const client_test_t test_i003_client_tests_list[] = {
     NULL,
     client_test_zero_length_invec,
@@ -88,8 +343,8 @@
    {
        val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
    }
-
    val->ipc_close(handle);
+
    return status;
 }
 
@@ -123,6 +378,7 @@
                          {&data[2], sizeof(data[2])}};
 
    status = psa->call(handle, PSA_IPC_CALL, data1, 1, resp, 3);
+
    if (status < 0)
    {
        status = VAL_STATUS_CALL_FAILED;
@@ -148,6 +404,7 @@
    }
 
    val->ipc_close(handle);
+
    return status;
 }
 
@@ -178,6 +435,7 @@
                         {&data3, sizeof(data3)}};
 
    status = psa->call(handle, PSA_IPC_CALL, data, 4, NULL, 0);
+
    if (status < 0)
    {
        val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n",status);
@@ -185,6 +443,7 @@
    }
 
    val->ipc_close(handle);
+
    return status;
 }
 
@@ -217,6 +476,7 @@
                          {&data[3], sizeof(data[3])}};
 
    status = psa->call(handle, PSA_IPC_CALL, NULL, 0, resp, 4);
+
    if (status < 0)
    {
        status = VAL_STATUS_CALL_FAILED;
@@ -247,6 +507,7 @@
    }
 
    val->ipc_close(handle);
+
    return status;
 }
 
@@ -289,11 +550,12 @@
 int32_t client_test_overlapping_vectors(caller_security_t caller __UNUSED)
 {
    int32_t            status = VAL_STATUS_SUCCESS;
-   psa_handle_t       handle = 0;
+
    uint8_t            data = 0x11, expected_data[] = {0x22, 0x33};
 
    val->print(PRINT_TEST, "[Check 6] Test overlapping vectors\n", 0);
 
+   psa_handle_t       handle = 0;
    if (val->ipc_connect(SERVER_UNSPECIFED_VERSION_SID,
                         SERVER_UNSPECIFED_VERSION_VERSION,
                         &handle))
@@ -336,5 +598,8 @@
    }
 
    val->ipc_close(handle);
+
    return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i003/test_supp_i003.c b/api-tests/ff/ipc/test_i003/test_supp_i003.c
index cd27deb..dfe1a64 100644
--- a/api-tests/ff/ipc/test_i003/test_supp_i003.c
+++ b/api-tests/ff/ipc/test_i003/test_supp_i003.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,10 +23,375 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_call_read_and_skip(void);
+int32_t server_test_call_and_write(void);
+int32_t server_test_zero_length_invec(void);
+int32_t server_test_zero_length_outvec(void);
+int32_t server_test_overlapping_vectors(void);
+
+const server_test_t test_i003_server_tests_list[] = {
+    NULL,
+    server_test_zero_length_invec,
+    server_test_zero_length_outvec,
+    server_test_call_read_and_skip,
+    server_test_call_and_write,
+    server_test_overlapping_vectors,
+    NULL,
+};
+
+static void exit_graceful(psa_handle_t msg_handle, int status_code,
+                int print_next_args, int expected_data, int actual_data)
+{
+    if (print_next_args != 0)
+    {
+        val->print(PRINT_ERROR, "\tExpected data=%x\n", expected_data);
+        val->print(PRINT_ERROR, "\tActual data=%x\n", actual_data);
+    }
+    /* Negative status_code represents check failure and each check has
+     * uniq status_code to identify failing point
+     */
+    psa->reply(msg_handle, status_code);
+}
+
+int32_t server_test_zero_length_invec(void)
+{
+    int32_t              status = VAL_STATUS_SUCCESS;
+    psa_msg_t            msg = {0};
+    int                  data[5] = {0}, actual_data = 0x22;
+
+    if (val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
+    {
+        exit_graceful(msg.handle, -2, 0, 0, 0);
+        return VAL_STATUS_CALL_FAILED;
+    }
+
+    if (((msg.in_size[0] != 0)) ||
+        ((msg.in_size[1] != 0)) ||
+        ((msg.in_size[2] != sizeof(int))) ||
+        ((msg.in_size[3] != 0)))
+    {
+        exit_graceful(msg.handle, -3, 0, 0, 0);
+        return VAL_STATUS_MSG_INSIZE_FAILED;
+    }
+
+    if ((msg.in_size[2] <= sizeof(data[2])) &&
+        (psa->read(msg.handle, 2, &data[2], msg.in_size[2]) != msg.in_size[2]))
+    {
+        exit_graceful(msg.handle, -4, 0, 0, 0);
+        return VAL_STATUS_READ_FAILED;
+    }
+
+    if (actual_data != data[2])
+    {
+        exit_graceful(msg.handle, -5, 1, data[2], actual_data);
+        return VAL_STATUS_CALL_FAILED;
+    }
+
+    if (((msg.out_size[0] != sizeof(int))) ||
+        ((msg.out_size[1] != 0))           ||
+        ((msg.out_size[2] != 0))           ||
+        ((msg.out_size[3] != 0)))
+    {
+         exit_graceful(msg.handle, -6, 0, 0, 0);
+         return VAL_STATUS_MSG_OUTSIZE_FAILED;
+    }
+
+    psa->write(msg.handle, 0, &data[2], msg.out_size[0]);
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return status;
+}
+
+int32_t server_test_zero_length_outvec(void)
+{
+    int32_t              status = VAL_STATUS_SUCCESS;
+    psa_msg_t            msg = {0};
+    int                  data[5] = {0}, actual_data = 0x11;
+
+    if (val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
+    {
+        exit_graceful(msg.handle, -2, 0, 0, 0);
+        return VAL_STATUS_CALL_FAILED;
+    }
+
+    if (((msg.in_size[0] != sizeof(int))) ||
+        ((msg.in_size[1] != 0)) ||
+        ((msg.in_size[2] != 0)) ||
+        ((msg.in_size[3] != 0)))
+    {
+        exit_graceful(msg.handle, -3, 0, 0, 0);
+        return VAL_STATUS_MSG_INSIZE_FAILED;
+    }
+
+    if ((msg.in_size[0] <= sizeof(data[0])) &&
+        (psa->read(msg.handle, 0, &data[0], msg.in_size[0]) != msg.in_size[0]))
+    {
+        exit_graceful(msg.handle, -4, 0, 0, 0);
+        return VAL_STATUS_READ_FAILED;
+    }
+
+    if (actual_data != data[0])
+    {
+        exit_graceful(msg.handle, -5, 1, data[2], actual_data);
+        return VAL_STATUS_CALL_FAILED;
+    }
+
+    if (((msg.out_size[0] != 0))            ||
+        ((msg.out_size[1] != 0))           ||
+        ((msg.out_size[2] != sizeof(int))) ||
+        ((msg.out_size[3] != 0)))
+    {
+         exit_graceful(msg.handle, -6, 0, 0, 0);
+         return VAL_STATUS_MSG_OUTSIZE_FAILED;
+    }
+    psa->write(msg.handle, 2, &data[0], msg.out_size[2]);
+
+    /* Dummy write with zero byte. This should not overwrite previously written data */
+    psa->write(msg.handle, 2, &data[0], msg.out_size[0]);
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return status;
+}
+
+int32_t server_test_call_read_and_skip(void)
+{
+    int32_t     status = VAL_STATUS_SUCCESS;
+    int         expected_data1[2] = {0xaa, 0xbb};
+    int         expected_data2[4] = {0x7788, 0x2233, 0x2211, 0x50607080},
+                actual_data[4] = {0}, i;
+    psa_msg_t   msg = {0};
+
+    if (val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
+    {
+        exit_graceful(msg.handle, -2, 0, 0, 0);
+        return VAL_STATUS_CALL_FAILED;
+    }
+
+    /* msg.in_size should match with the size of psa_invec given to psa_call*/
+    if (((msg.in_size[0] != sizeof(int))) ||
+        ((msg.in_size[1] != sizeof(int))) ||
+        ((msg.in_size[2] != sizeof(uint64_t))) ||
+        ((msg.in_size[3] != sizeof(uint64_t))))
+    {
+        exit_graceful(msg.handle, -3, 0, 0, 0);
+        return VAL_STATUS_MSG_INSIZE_FAILED;
+    }
+
+    /* Full size read for invec 0 and invec 1 */
+    for (i = 0; i < 2 ; i++)
+    {
+       if ((msg.in_size[i] <= sizeof(actual_data[i])) &&
+           (psa->read(msg.handle, i, &actual_data[i], msg.in_size[i]) != msg.in_size[i]))
+       {
+           exit_graceful(msg.handle, -4, 0, 0, 0);
+           return VAL_STATUS_READ_FAILED;
+       }
+       if (actual_data[i] != expected_data1[i])
+       {
+           exit_graceful(msg.handle, -5, 1, expected_data1[i], actual_data[i]);
+           return VAL_STATUS_READ_FAILED;
+       }
+    }
+
+    /* Inbound read of 2 bytes from invec 2 */
+    if (psa->read(msg.handle, 2, &actual_data[0], 2) != 2)
+    {
+       exit_graceful(msg.handle, -6, 0, 0, 0);
+       return VAL_STATUS_READ_FAILED;
+    }
+    if (actual_data[0] != expected_data2[0])
+    {
+       exit_graceful(msg.handle, -7, 1, expected_data2[0], actual_data[0]);
+       return VAL_STATUS_READ_FAILED;
+    }
+
+    /* Inbound read of 3 bytes from invec 2 */
+    if (psa->skip(msg.handle, 2, 3) != 3)
+    {
+       exit_graceful(msg.handle, -8, 0, 0, 0);
+       return VAL_STATUS_SKIP_FAILED;
+    }
+
+    /* Check previous psa_skip has actually skipped 3 bytes */
+    if (psa->read(msg.handle, 2, &actual_data[0], 2) != 2)
+    {
+       exit_graceful(msg.handle, -9, 0, 0, 0);
+       return VAL_STATUS_READ_FAILED;
+    }
+
+    if (actual_data[0] != expected_data2[1])
+    {
+       exit_graceful(msg.handle, -10, 1, expected_data2[1], actual_data[0]);
+       return VAL_STATUS_READ_FAILED;
+    }
+
+    /* Outbound read of 3 bytes from invec 2
+     * Only one byte should be updated in buffer. Remaining space should be untouched
+     */
+    if (psa->read(msg.handle, 2, &actual_data[0], 3) != 1)
+    {
+       exit_graceful(msg.handle, -11, 0, 0, 0);
+       return VAL_STATUS_READ_FAILED;
+    }
+
+    if (actual_data[0] != expected_data2[2])
+    {
+       exit_graceful(msg.handle, -12, 1, expected_data2[2], actual_data[0]);
+       return VAL_STATUS_READ_FAILED;
+    }
+
+    actual_data[0] = 0xaa;
+
+    /* After outbound read, subsequent read or skip to invec 2 should return 0
+     * and memory buffer shouldn't be updated
+     */
+    if ((psa->read(msg.handle, 2, &actual_data[0], 3) != 0) ||
+        (psa->skip(msg.handle, 2, 3) != 0) || (actual_data[0] != 0xaa))
+    {
+       exit_graceful(msg.handle, -13, 0, 0, 0);
+       return VAL_STATUS_READ_FAILED;
+    }
+
+    /* Read of zero bytes should not read anything */
+    if ((psa->read(msg.handle, 3, &actual_data[0], 0) != 0) || (actual_data[0] != 0xaa))
+    {
+       exit_graceful(msg.handle, -14, 0, 0, 0);
+       return VAL_STATUS_READ_FAILED;
+    }
+
+    /* Skip of zero bytes should not skip anything */
+    if (psa->skip(msg.handle, 3, 0) != 0)
+    {
+       exit_graceful(msg.handle, -15, 0, 0, 0);
+       return VAL_STATUS_SKIP_FAILED;
+    }
+
+    /* Check effect of previous zero byte read and skip */
+    psa->read(msg.handle, 3, &actual_data[0], 4);
+    if (actual_data[0] != expected_data2[3])
+    {
+       exit_graceful(msg.handle, -16, 1, expected_data2[3], actual_data[0]);
+       return VAL_STATUS_READ_FAILED;
+    }
+
+    /* Outbound skip to invec 3 */
+    if (psa->skip(msg.handle, 3, 5) != 4)
+    {
+       exit_graceful(msg.handle, -17, 0, 0, 0);
+       return VAL_STATUS_SKIP_FAILED;
+    }
+    if (psa->skip(msg.handle, 3, 5) != 0)
+    {
+       exit_graceful(msg.handle, -18, 0, 0, 0);
+       return VAL_STATUS_SKIP_FAILED;
+    }
+
+    /* Since out_len is 0, msg.out_size should be 0 */
+    if ((msg.out_size[0] != 0)  ||
+        (msg.out_size[1] != 0) ||
+        (msg.out_size[2] != 0) ||
+        (msg.out_size[3] != 0))
+    {
+         exit_graceful(msg.handle, -14, 0, 0, 0);
+         return VAL_STATUS_MSG_OUTSIZE_FAILED;
+    }
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return status;
+}
+
+int32_t server_test_call_and_write(void)
+{
+    int32_t      status = VAL_STATUS_SUCCESS;
+    int          data[5] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee}, i;
+    psa_msg_t    msg = {0};
+
+    if (val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
+    {
+        exit_graceful(msg.handle, -2, 0, 0, 0);
+        return VAL_STATUS_CALL_FAILED;
+    }
+
+    /* msg.out_size should match with size of psa_outvec given to psa_call */
+    if (((msg.out_size[0] != sizeof(int))) ||
+        ((msg.out_size[1] != sizeof(int))) ||
+        ((msg.out_size[2] != sizeof(int))) ||
+        ((msg.out_size[3] != sizeof(int))))
+    {
+        exit_graceful(msg.handle, -3, 0, 0, 0);
+        return VAL_STATUS_MSG_OUTSIZE_FAILED;
+    }
+
+    /* Since in_len=0, all msg.in_size should be 0 */
+    if ((msg.in_size[0] != 0) ||
+        (msg.in_size[1] != 0) ||
+        (msg.in_size[2] != 0) ||
+        (msg.in_size[3] != 0))
+
+    {
+        exit_graceful(msg.handle, -4, 0, 0, 0);
+        return VAL_STATUS_MSG_INSIZE_FAILED;
+    }
+
+    for (i = 0; i < 3 ; i++)
+    {
+       psa->write(msg.handle, i, &data[i], msg.out_size[i]);
+    }
+
+    /* Zero byte write shouldn't have any effect */
+    psa->write(msg.handle, 3, &data[3], 0);
+
+    /*Using invec 3 to test write concatenation behaviour */
+    psa->write(msg.handle, 3, &data[3], 1);
+    psa->write(msg.handle, 3, &data[4], 1);
+
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return status;
+}
+
+int32_t server_test_overlapping_vectors(void)
+{
+    int32_t       status = VAL_STATUS_SUCCESS;
+    psa_msg_t     msg = {0};
+    uint8_t       wr_data[] = {0x22, 0x33},
+                  rd_data[] = {0x0, 0x0},
+                  expected_data[] = {0x11, 0x22};
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(208), status))
+    {
+        exit_graceful(msg.handle, -1, 0, 0, 0);
+        return status;
+    }
+
+     /* Performing read after write to overlapping vector. */
+    psa->write(msg.handle, 0, &wr_data[0], 1);
+    psa->read(msg.handle, 0, &rd_data[0], 1);
+
+    /* rd_data[0] should either be original value or modified value */
+    if ((rd_data[0] != expected_data[0]) && (rd_data[0] != expected_data[1]))
+    {
+        val->print(PRINT_ERROR, "\tReceived invalid data=%x\n", rd_data[0]);
+        exit_graceful(msg.handle, -2, 0, 0, 0);
+        return status;
+    }
+
+     /* Performing write after write to overlapping vector. */
+    psa->write(msg.handle, 1, &wr_data[1], 1);
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_set_rhandle(void);
 int32_t server_test_call_read_and_skip(void);
 int32_t server_test_call_and_write(void);
-int32_t server_test_zero_length_invec();
+int32_t server_test_zero_length_invec(void);
 int32_t server_test_zero_length_outvec(void);
 int32_t server_test_overlapping_vectors(void);
 
@@ -118,6 +483,7 @@
 
     status = val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
     psa->reply(msg.handle, PSA_SUCCESS);
+
     return status;
 }
 
@@ -178,6 +544,7 @@
 
     status = val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
     psa->reply(msg.handle, PSA_SUCCESS);
+
     return status;
 }
 
@@ -334,6 +701,7 @@
 
     status = val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
     psa->reply(msg.handle, PSA_SUCCESS);
+
     return status;
 }
 
@@ -393,6 +761,7 @@
 
     status = val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
     psa->reply(msg.handle, PSA_SUCCESS);
+
     return status;
 }
 
@@ -524,5 +893,8 @@
     status = val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
     val->err_check_set(TEST_CHECKPOINT_NUM(209), status);
     psa->reply(msg.handle, PSA_SUCCESS);
+
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i013/test_i013.c b/api-tests/ff/ipc/test_i013/test_i013.c
index 5bf872d..84925f9 100644
--- a/api-tests/ff/ipc/test_i013/test_i013.c
+++ b/api-tests/ff/ipc/test_i013/test_i013.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,36 @@
 
 #include "test_i013.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i013_client_tests_list[] = {
+    NULL,
+    client_test_psa_get_with_more_than_one_signal,
+    NULL,
+};
+
+int32_t client_test_psa_get_with_more_than_one_signal(caller_security_t caller __UNUSED)
+{
+
+	int32_t                 status = VAL_STATUS_SUCCESS;
+    psa_status_t            status_of_call;
+
+    val->print(PRINT_TEST, "[Check 1] Test psa_get with multiple signals\n", 0);
+
+    status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+    /* Expectation is server test should hang and control shouldn't have come here */
+    val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+    status = VAL_STATUS_SPM_FAILED;
+
+    (void)(status_of_call);
+    return status;
+
+}
+
+#else
+
 const client_test_t test_i013_client_tests_list[] = {
     NULL,
     client_test_psa_get_with_more_than_one_signal,
@@ -44,4 +74,7 @@
 
    (void)(handle);
    return VAL_STATUS_SPM_FAILED;
+
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i013/test_supp_i013.c b/api-tests/ff/ipc/test_i013/test_supp_i013.c
index 024d964..256d309 100644
--- a/api-tests/ff/ipc/test_i013/test_supp_i013.c
+++ b/api-tests/ff/ipc/test_i013/test_supp_i013.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,77 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_get_with_more_than_one_signal(void);
+
+const server_test_t test_i013_server_tests_list[] = {
+    NULL,
+    server_test_psa_get_with_more_than_one_signal,
+    NULL,
+};
+
+int32_t server_test_psa_get_with_more_than_one_signal(void)
+{
+    psa_msg_t     msg = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    if ((psa->wait(PSA_WAIT_ANY, PSA_BLOCK)) & SERVER_UNSPECIFED_VERSION_SIGNAL)
+    {
+        /* Setting boot.state before test check */
+        if (val->set_boot_flag(BOOT_EXPECTED_NS))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            /* Unblock client */
+            if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+            {
+                val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+            }
+            psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+            return VAL_STATUS_ERROR;
+        }
+
+        /* multiple signals check */
+        psa->get((SERVER_UNSPECIFED_VERSION_SIGNAL | SERVER_RELAX_VERSION_SIGNAL), &msg);
+
+        /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+        /* Resetting boot.state to catch unwanted reboot */
+        if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+        }
+
+        psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(203), VAL_STATUS_SPM_FAILED);
+    return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
 int32_t server_test_psa_get_with_more_than_one_signal(void);
 
 const server_test_t test_i013_server_tests_list[] = {
@@ -81,9 +152,13 @@
         {
             val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
         }
+
         psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+
     }
 
     val->err_check_set(TEST_CHECKPOINT_NUM(203), VAL_STATUS_SPM_FAILED);
     return VAL_STATUS_SPM_FAILED;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i014/test_i014.c b/api-tests/ff/ipc/test_i014/test_i014.c
index e01baa2..22ac59d 100644
--- a/api-tests/ff/ipc/test_i014/test_i014.c
+++ b/api-tests/ff/ipc/test_i014/test_i014.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
 
 #include "test_i014.h"
 
+#if STATELESS_ROT == 1
+
 const client_test_t test_i014_client_tests_list[] = {
     NULL,
     client_test_psa_get_called_twice,
@@ -33,7 +35,34 @@
 
 int32_t client_test_psa_get_called_twice(caller_security_t caller __UNUSED)
 {
-   psa_handle_t       handle = 0;
+
+	int32_t            status = VAL_STATUS_SUCCESS;
+   psa_status_t            status_of_call;
+
+   val->print(PRINT_TEST, "[Check 1] Test psa_get called twice\n", 0);
+
+   status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
+const client_test_t test_i014_client_tests_list[] = {
+    NULL,
+    client_test_psa_get_called_twice,
+    NULL,
+};
+
+int32_t client_test_psa_get_called_twice(caller_security_t caller __UNUSED)
+{
+	psa_handle_t       handle = 0;
 
    val->print(PRINT_TEST, "[Check 1] Test psa_get called twice\n", 0);
 
@@ -45,3 +74,5 @@
    (void)(handle);
    return VAL_STATUS_SPM_FAILED;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i015/test_i015.c b/api-tests/ff/ipc/test_i015/test_i015.c
index edfc414..14b4f52 100644
--- a/api-tests/ff/ipc/test_i015/test_i015.c
+++ b/api-tests/ff/ipc/test_i015/test_i015.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
 
 #include "test_i015.h"
 
+#if STATELESS_ROT == 1
+
 const client_test_t test_i015_client_tests_list[] = {
     NULL,
     client_test_psa_get_with_non_rot_signal,
@@ -33,6 +35,34 @@
 
 int32_t client_test_psa_get_with_non_rot_signal(caller_security_t caller __UNUSED)
 {
+
+	int32_t            status = VAL_STATUS_SUCCESS;
+   psa_status_t            status_of_call;
+
+   val->print(PRINT_TEST, "[Check 1] Test psa_get with non-RoT signal\n", 0);
+
+   status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
+const client_test_t test_i015_client_tests_list[] = {
+    NULL,
+    client_test_psa_get_with_non_rot_signal,
+    NULL,
+};
+
+int32_t client_test_psa_get_with_non_rot_signal(caller_security_t caller __UNUSED)
+{
+
    psa_handle_t       handle = 0;
 
    val->print(PRINT_TEST, "[Check 1] Test psa_get with non-RoT signal\n", 0);
@@ -45,3 +75,5 @@
    (void)(handle);
    return VAL_STATUS_SPM_FAILED;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i016/test_i016.c b/api-tests/ff/ipc/test_i016/test_i016.c
index 943d6e3..6757692 100644
--- a/api-tests/ff/ipc/test_i016/test_i016.c
+++ b/api-tests/ff/ipc/test_i016/test_i016.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
 
 #include "test_i016.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i016_client_tests_list[] = {
+    NULL,
+    client_test_psa_get_with_unasserted_signal,
+    NULL,
+};
+
+int32_t client_test_psa_get_with_unasserted_signal(caller_security_t caller __UNUSED)
+{
+
+	int32_t            status = VAL_STATUS_SUCCESS;
+   psa_status_t            status_of_call;
+
+   val->print(PRINT_TEST, "[Check 1] Test psa_get with unasserted signal\n", 0);
+
+   status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i016_client_tests_list[] = {
     NULL,
     client_test_psa_get_with_unasserted_signal,
@@ -45,3 +74,5 @@
    (void)(handle);
    return VAL_STATUS_SPM_FAILED;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i021/test_i021.c b/api-tests/ff/ipc/test_i021/test_i021.c
index 2638b76..26e6502 100644
--- a/api-tests/ff/ipc/test_i021/test_i021.c
+++ b/api-tests/ff/ipc/test_i021/test_i021.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,41 @@
 
 #include "test_i021.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i021_client_tests_list[] = {
+    NULL,
+    client_test_irq_routing,
+    NULL,
+};
+
+int32_t client_test_irq_routing(caller_security_t caller __UNUSED)
+{
+
+   driver_test_fn_id_t    driver_test_fn_id = TEST_INTR_SERVICE;
+
+   /*
+    * The interrupt related test check is captured in driver_partition.c as this is the
+    * only partition in test suite that holds the interrupt source. The interrupt test check
+    * is invoked by client by calling to DRIVER_TEST_SID RoT service of driver partition that
+    * hold the test check.
+    */
+
+   val->print(PRINT_TEST, "[Check 1] Test irq routing\n", 0);
+
+   /* Execute driver function related to TEST_INTR_SERVICE */
+   psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
+   if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, &invec, 1, NULL, 0) != PSA_SUCCESS)
+   {
+           return VAL_STATUS_SPM_FAILED;
+   }
+
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const client_test_t test_i021_client_tests_list[] = {
     NULL,
     client_test_irq_routing,
@@ -65,3 +100,5 @@
    psa->close(handle);
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i022/test_i022.c b/api-tests/ff/ipc/test_i022/test_i022.c
index 5778436..4fb0b90 100644
--- a/api-tests/ff/ipc/test_i022/test_i022.c
+++ b/api-tests/ff/ipc/test_i022/test_i022.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,23 @@
 
 #include "test_i022.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i022_client_tests_list[] = {
+    NULL,
+    client_test_psa_reply_with_invalid_handle,
+    NULL,
+};
+
+int32_t client_test_psa_reply_with_invalid_handle(caller_security_t caller __UNUSED)
+{
+   val->print(PRINT_TEST, "[Check 1] Testing psa_reply with invalid handle\n", 0);
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
 const client_test_t test_i022_client_tests_list[] = {
     NULL,
     client_test_psa_reply_with_invalid_handle,
@@ -45,3 +62,5 @@
    (void)(handle);
    return VAL_STATUS_SPM_FAILED;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i022/test_supp_i022.c b/api-tests/ff/ipc/test_i022/test_supp_i022.c
index ce4b7ab..ad22896 100644
--- a/api-tests/ff/ipc/test_i022/test_supp_i022.c
+++ b/api-tests/ff/ipc/test_i022/test_supp_i022.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,8 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
 int32_t server_test_psa_reply_with_invalid_handle(void);
 
 const server_test_t test_i022_server_tests_list[] = {
@@ -33,7 +35,73 @@
 
 int32_t server_test_psa_reply_with_invalid_handle(void)
 {
-    psa_msg_t   msg = {0};
+	psa_msg_t   msg = {0};
+    int32_t     status = VAL_STATUS_SUCCESS;
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    /* Setting boot.state before test check */
+    status = val->set_boot_flag(BOOT_EXPECTED_NS);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+        psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+        return status;
+    }
+
+    /* Call psa_reply with INVALID_HANLDE. Call should panic */
+    psa->reply(INVALID_HANDLE, PSA_ERROR_CONNECTION_REFUSED);
+
+    /* shouldn't have reached here */
+    val->print(PRINT_ERROR,
+                "\tpsa_reply with invalid handle should failed but succeed\n", 0);
+
+    /* Resetting boot.state to catch unwanted reboot */
+    status = val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+        return status;
+    }
+
+    status = VAL_STATUS_SPM_FAILED;
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
+int32_t server_test_psa_reply_with_invalid_handle(void);
+
+const server_test_t test_i022_server_tests_list[] = {
+    NULL,
+    server_test_psa_reply_with_invalid_handle,
+    NULL,
+};
+
+int32_t server_test_psa_reply_with_invalid_handle(void)
+{
+	psa_msg_t   msg = {0};
     int32_t     status = VAL_STATUS_SUCCESS;
 
    /*
@@ -93,3 +161,5 @@
     val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
     return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i023/test_i023.c b/api-tests/ff/ipc/test_i023/test_i023.c
index 76bdf99..db509f3 100644
--- a/api-tests/ff/ipc/test_i023/test_i023.c
+++ b/api-tests/ff/ipc/test_i023/test_i023.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,23 @@
 
 #include "test_i023.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i023_client_tests_list[] = {
+    NULL,
+    client_test_psa_reply_with_null_handle,
+    NULL,
+};
+
+int32_t client_test_psa_reply_with_null_handle(caller_security_t caller __UNUSED)
+{
+   val->print(PRINT_TEST, "[Check 1] Testing psa_reply with invalid handle\n", 0);
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
 const client_test_t test_i023_client_tests_list[] = {
     NULL,
     client_test_psa_reply_with_null_handle,
@@ -45,3 +62,5 @@
    (void)(handle);
    return VAL_STATUS_SPM_FAILED;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i023/test_supp_i023.c b/api-tests/ff/ipc/test_i023/test_supp_i023.c
index 02cebf9..fe0189c 100644
--- a/api-tests/ff/ipc/test_i023/test_supp_i023.c
+++ b/api-tests/ff/ipc/test_i023/test_supp_i023.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,8 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
 int32_t server_test_psa_reply_with_null_handle(void);
 
 const server_test_t test_i023_server_tests_list[] = {
@@ -33,7 +35,77 @@
 
 int32_t server_test_psa_reply_with_null_handle(void)
 {
-    psa_msg_t   msg = {0};
+
+	psa_msg_t   msg = {0};
+    int32_t     status = VAL_STATUS_SUCCESS;
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    /* Setting boot.state before test check */
+    status = val->set_boot_flag(BOOT_EXPECTED_NS);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+        psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+        return status;
+    }
+
+    /* Test check - Call psa_reply with PSA_NULL_HANDLE. Call should panic */
+    psa->reply(PSA_NULL_HANDLE, PSA_ERROR_CONNECTION_REFUSED);
+
+    /* shouldn't have reached here */
+    val->print(PRINT_ERROR,
+                "\tpsa_reply with NULL handle should failed but succeed\n", 0);
+
+    /* Resetting boot.state to catch unwanted reboot */
+    status = val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+        return status;
+    }
+
+    psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+
+    status = VAL_STATUS_SPM_FAILED;
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
+int32_t server_test_psa_reply_with_null_handle(void);
+
+const server_test_t test_i023_server_tests_list[] = {
+    NULL,
+    server_test_psa_reply_with_null_handle,
+    NULL,
+};
+
+int32_t server_test_psa_reply_with_null_handle(void)
+{
+
+	psa_msg_t   msg = {0};
     int32_t     status = VAL_STATUS_SUCCESS;
 
    /*
@@ -95,3 +167,5 @@
     val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
     return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i026/test_i026.c b/api-tests/ff/ipc/test_i026/test_i026.c
index a1cb20a..7ab4fbe 100644
--- a/api-tests/ff/ipc/test_i026/test_i026.c
+++ b/api-tests/ff/ipc/test_i026/test_i026.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,89 @@
 
 #include "test_i026.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i026_client_tests_list[] = {
+    NULL,
+    client_test_psa_call_with_iovec_more_than_max_limit,
+    NULL,
+};
+
+int32_t client_test_psa_call_with_iovec_more_than_max_limit(caller_security_t caller)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+   uint8_t            data = 0x11;
+   psa_status_t       status_of_call;
+   boot_state_t       boot_state;
+   psa_invec          invec[PSA_MAX_IOVEC] = {{&data, sizeof(data)},
+                                             {&data, sizeof(data)},
+                                             {&data, sizeof(data)},
+                                             {&data, sizeof(data)}
+                                             };
+   psa_outvec         outvec[1] = {{&data, sizeof(data)}};
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_call with IOVEC > PSA_MAX_IOVEC\n", 0);
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+   /* Setting boot.state before test check */
+   boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+   if (val->set_boot_flag(boot_state))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Test check- psa_call with IOVEC > PSA_MAX_IOVEC */
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec,
+		                                                    PSA_MAX_IOVEC, outvec, 1);
+   /*
+    * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+    * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+    * For SPE caller, it must panic.
+    */
+   if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+   {
+       return VAL_STATUS_SUCCESS;
+   }
+
+   /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   status = VAL_STATUS_SPM_FAILED;
+   return status;
+}
+
+#else
+
 const client_test_t test_i026_client_tests_list[] = {
     NULL,
     client_test_psa_call_with_iovec_more_than_max_limit,
@@ -43,7 +126,7 @@
                                              {&data, sizeof(data)},
                                              {&data, sizeof(data)}
                                              };
-   psa_outvec         outvec[1] = {{&data, sizeof(data)}};
+   psa_outvec         outvec[1] = { {&data, sizeof(data)} };
 
    val->print(PRINT_TEST,
             "[Check 1] Test psa_call with IOVEC > PSA_MAX_IOVEC\n", 0);
@@ -113,3 +196,5 @@
    psa->close(handle);
    return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i026/test_supp_i026.c b/api-tests/ff/ipc/test_i026/test_supp_i026.c
index 142b910..a9d4982 100644
--- a/api-tests/ff/ipc/test_i026/test_supp_i026.c
+++ b/api-tests/ff/ipc/test_i026/test_supp_i026.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,7 +23,9 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
-int32_t server_test_psa_call_with_iovec_more_than_max_limit();
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_iovec_more_than_max_limit(void);
 
 const server_test_t test_i026_server_tests_list[] = {
     NULL,
@@ -31,7 +33,39 @@
     NULL,
 };
 
-int32_t server_test_psa_call_with_iovec_more_than_max_limit()
+int32_t server_test_psa_call_with_iovec_more_than_max_limit(void)
+{
+    psa_msg_t       msg = {0};
+    psa_signal_t    signals;
+
+wait:
+    signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+    if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+    {
+	goto wait;
+    }
+
+    if (msg.type == PSA_IPC_CALL)
+    {
+    	/* Control shouldn't have come here */
+    	val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+	psa->reply(msg.handle, -2);
+    }
+
+    return VAL_STATUS_ERROR;
+}
+
+#else
+
+int32_t server_test_psa_call_with_iovec_more_than_max_limit(void);
+
+const server_test_t test_i026_server_tests_list[] = {
+    NULL,
+    server_test_psa_call_with_iovec_more_than_max_limit,
+    NULL,
+};
+
+int32_t server_test_psa_call_with_iovec_more_than_max_limit(void)
 {
     int32_t         status = VAL_STATUS_SUCCESS;
     psa_msg_t       msg = {0};
@@ -77,3 +111,5 @@
 
     return VAL_STATUS_ERROR;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i030/test_i030.c b/api-tests/ff/ipc/test_i030/test_i030.c
index 7f4d15b..e4861d3 100644
--- a/api-tests/ff/ipc/test_i030/test_i030.c
+++ b/api-tests/ff/ipc/test_i030/test_i030.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
 
 #include "test_i030.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i030_client_tests_list[] = {
+    NULL,
+    client_test_psa_read_with_null_handle,
+    NULL,
+};
+
+int32_t client_test_psa_read_with_null_handle(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_read with NULL handle\n", 0);
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i030_client_tests_list[] = {
     NULL,
     client_test_psa_read_with_null_handle,
@@ -58,3 +87,5 @@
    (void)(status_of_call);
    return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i030/test_supp_i030.c b/api-tests/ff/ipc/test_i030/test_supp_i030.c
index 5a74021..85e2914 100644
--- a/api-tests/ff/ipc/test_i030/test_supp_i030.c
+++ b/api-tests/ff/ipc/test_i030/test_supp_i030.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,84 @@
 
 #define NUM_OF_BYTES 4
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_null_handle(void);
+
+const server_test_t test_i030_server_tests_list[] = {
+    NULL,
+    server_test_psa_read_with_null_handle,
+    NULL,
+};
+
+int32_t server_test_psa_read_with_null_handle(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+    uint8_t         data[NUM_OF_BYTES] = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_read with PSA_NULL_HANDLE, call should panic */
+            psa->read(PSA_NULL_HANDLE, 0, (void *)data, 0);
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_read with NULL handle should failed but succeed\n", 0);
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            status = VAL_STATUS_SPM_FAILED;
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_read_with_null_handle(void);
 
 const server_test_t test_i030_server_tests_list[] = {
@@ -108,5 +186,8 @@
     status = ((val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
                ? VAL_STATUS_ERROR : status);
     psa->reply(msg.handle, PSA_SUCCESS);
+
     return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i031/test_i031.c b/api-tests/ff/ipc/test_i031/test_i031.c
index 6cfe2e2..a3a1c5b 100644
--- a/api-tests/ff/ipc/test_i031/test_i031.c
+++ b/api-tests/ff/ipc/test_i031/test_i031.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
 
 #include "test_i031.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i031_client_tests_list[] = {
+    NULL,
+    client_test_psa_read_with_invalid_handle,
+    NULL,
+};
+
+int32_t client_test_psa_read_with_invalid_handle(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_read with invalid handle\n", 0);
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i031_client_tests_list[] = {
     NULL,
     client_test_psa_read_with_invalid_handle,
@@ -55,6 +84,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i031/test_supp_i031.c b/api-tests/ff/ipc/test_i031/test_supp_i031.c
index 62af645..a525d08 100644
--- a/api-tests/ff/ipc/test_i031/test_supp_i031.c
+++ b/api-tests/ff/ipc/test_i031/test_supp_i031.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,84 @@
 
 #define NUM_OF_BYTES 4
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_invalid_handle(void);
+
+const server_test_t test_i031_server_tests_list[] = {
+    NULL,
+    server_test_psa_read_with_invalid_handle,
+    NULL,
+};
+
+int32_t server_test_psa_read_with_invalid_handle(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+    uint8_t         data[NUM_OF_BYTES] = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_read with INVALID_HANDLE, call should panic */
+            psa->read(INVALID_HANDLE, 0, (void *)data, 0);
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_read with invalid handle should failed but succeed\n", 0);
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            status = VAL_STATUS_SPM_FAILED;
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_read_with_invalid_handle(void);
 
 const server_test_t test_i031_server_tests_list[] = {
@@ -110,3 +188,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i032/test_i032.c b/api-tests/ff/ipc/test_i032/test_i032.c
index c7e9918..ac5a33b 100644
--- a/api-tests/ff/ipc/test_i032/test_i032.c
+++ b/api-tests/ff/ipc/test_i032/test_i032.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
 
 #include "test_i032.h"
 
+#if STATELESS_ROT == 1
+
 const client_test_t test_i032_client_tests_list[] = {
     NULL,
     client_test_psa_read_with_invec_equal_to_max_iovec,
@@ -34,12 +36,40 @@
 int32_t client_test_psa_read_with_invec_equal_to_max_iovec(caller_security_t caller __UNUSED)
 {
    int32_t            status = VAL_STATUS_SUCCESS;
-   psa_handle_t       handle = 0;
    psa_status_t       status_of_call;
 
    val->print(PRINT_TEST,
             "[Check 1] Test psa_read with invec_idx=PSA_MAX_IOVEC\n", 0);
 
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
+const client_test_t test_i032_client_tests_list[] = {
+    NULL,
+    client_test_psa_read_with_invec_equal_to_max_iovec,
+    NULL,
+};
+
+int32_t client_test_psa_read_with_invec_equal_to_max_iovec(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_read with invec_idx=PSA_MAX_IOVEC\n", 0);
+
+   psa_handle_t       handle = 0;
    handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
    if (!PSA_HANDLE_IS_VALID(handle))
    {
@@ -55,6 +85,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i032/test_supp_i032.c b/api-tests/ff/ipc/test_i032/test_supp_i032.c
index fe94496..b9d1d36 100644
--- a/api-tests/ff/ipc/test_i032/test_supp_i032.c
+++ b/api-tests/ff/ipc/test_i032/test_supp_i032.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,84 @@
 
 #define NUM_OF_BYTES 4
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_invec_equal_to_max_iovec(void);
+
+const server_test_t test_i032_server_tests_list[] = {
+    NULL,
+    server_test_psa_read_with_invec_equal_to_max_iovec,
+    NULL,
+};
+
+int32_t server_test_psa_read_with_invec_equal_to_max_iovec(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+    uint8_t         data[NUM_OF_BYTES] = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_read with invec_idx=PSA_MAX_IOVEC, call should panic */
+            psa->read(msg.handle, PSA_MAX_IOVEC, (void *)data, 0);
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_read with invec_idx=PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+            status = VAL_STATUS_SPM_FAILED;
+            psa->reply(msg.handle, -4);
+
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_read_with_invec_equal_to_max_iovec(void);
 
 const server_test_t test_i032_server_tests_list[] = {
@@ -110,3 +188,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i033/test_i033.c b/api-tests/ff/ipc/test_i033/test_i033.c
index f83589c..dadf109 100644
--- a/api-tests/ff/ipc/test_i033/test_i033.c
+++ b/api-tests/ff/ipc/test_i033/test_i033.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,36 @@
 
 #include "test_i033.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i033_client_tests_list[] = {
+    NULL,
+    client_test_psa_read_with_invec_greater_than_max_iovec,
+    NULL,
+};
+
+int32_t client_test_psa_read_with_invec_greater_than_max_iovec(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_read with invec_idx > PSA_MAX_IOVEC\n", 0);
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i033_client_tests_list[] = {
     NULL,
     client_test_psa_read_with_invec_greater_than_max_iovec,
@@ -46,7 +76,6 @@
        val->print(PRINT_ERROR, "\tConnection failed\n", 0);
        return VAL_STATUS_INVALID_HANDLE;
    }
-
    status_of_call =  psa->call(handle, PSA_IPC_CALL, NULL, 0, NULL, 0);
 
    /* Expectation is server test should hang and control shouldn't have come here */
@@ -55,6 +84,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i033/test_supp_i033.c b/api-tests/ff/ipc/test_i033/test_supp_i033.c
index 789de3d..fe8f220 100644
--- a/api-tests/ff/ipc/test_i033/test_supp_i033.c
+++ b/api-tests/ff/ipc/test_i033/test_supp_i033.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,84 @@
 
 #define NUM_OF_BYTES 4
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_invec_greater_than_max_iovec(void);
+
+const server_test_t test_i033_server_tests_list[] = {
+    NULL,
+    server_test_psa_read_with_invec_greater_than_max_iovec,
+    NULL,
+};
+
+int32_t server_test_psa_read_with_invec_greater_than_max_iovec(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+    uint8_t         data[NUM_OF_BYTES] = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_read with invec_idx > PSA_MAX_IOVEC, call should panic */
+            psa->read(msg.handle, PSA_MAX_IOVEC + 1, (void *)data, 0);
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_read with invec_idx > PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            status = VAL_STATUS_SPM_FAILED;
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_read_with_invec_greater_than_max_iovec(void);
 
 const server_test_t test_i033_server_tests_list[] = {
@@ -110,3 +188,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i036/test_i036.c b/api-tests/ff/ipc/test_i036/test_i036.c
index bb85aea..28f93c3 100644
--- a/api-tests/ff/ipc/test_i036/test_i036.c
+++ b/api-tests/ff/ipc/test_i036/test_i036.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,36 @@
 
 #include "test_i036.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i036_client_tests_list[] = {
+    NULL,
+    client_test_psa_skip_with_null_handle,
+    NULL,
+};
+
+int32_t client_test_psa_skip_with_null_handle(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_skip with NULL handle\n", 0);
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i036_client_tests_list[] = {
     NULL,
     client_test_psa_skip_with_null_handle,
@@ -55,6 +85,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i036/test_supp_i036.c b/api-tests/ff/ipc/test_i036/test_supp_i036.c
index cf92845..6a17a5f 100644
--- a/api-tests/ff/ipc/test_i036/test_supp_i036.c
+++ b/api-tests/ff/ipc/test_i036/test_supp_i036.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,81 @@
 
 int32_t server_test_psa_skip_with_null_handle(void);
 
+#if STATELESS_ROT == 1
+
+const server_test_t test_i036_server_tests_list[] = {
+    NULL,
+    server_test_psa_skip_with_null_handle,
+    NULL,
+};
+
+int32_t server_test_psa_skip_with_null_handle(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_skip with PSA_NULL_HANDLE, call should panic */
+            psa->skip(PSA_NULL_HANDLE, 0, 0);
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_skip with NULL handle should failed but succeed\n", 0);
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            status = VAL_STATUS_SPM_FAILED;
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 const server_test_t test_i036_server_tests_list[] = {
     NULL,
     server_test_psa_skip_with_null_handle,
@@ -107,3 +182,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i037/test_i037.c b/api-tests/ff/ipc/test_i037/test_i037.c
index 407232e..ba752e2 100644
--- a/api-tests/ff/ipc/test_i037/test_i037.c
+++ b/api-tests/ff/ipc/test_i037/test_i037.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,36 @@
 
 #include "test_i037.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i037_client_tests_list[] = {
+    NULL,
+    client_test_psa_skip_with_invalid_handle,
+    NULL,
+};
+
+int32_t client_test_psa_skip_with_invalid_handle(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_skip with invalid handle\n", 0);
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i037_client_tests_list[] = {
     NULL,
     client_test_psa_skip_with_invalid_handle,
@@ -55,6 +85,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i037/test_supp_i037.c b/api-tests/ff/ipc/test_i037/test_supp_i037.c
index c7d7711..e3d0a73 100644
--- a/api-tests/ff/ipc/test_i037/test_supp_i037.c
+++ b/api-tests/ff/ipc/test_i037/test_supp_i037.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,83 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_skip_with_invalid_handle(void);
+
+const server_test_t test_i037_server_tests_list[] = {
+    NULL,
+    server_test_psa_skip_with_invalid_handle,
+    NULL,
+};
+
+int32_t server_test_psa_skip_with_invalid_handle(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_skip with INVALID_HANDLE, call should panic */
+            psa->skip(INVALID_HANDLE, 0, 0);
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_skip with invalid handle should failed but succeed\n", 0);
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            status = VAL_STATUS_SPM_FAILED;
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_skip_with_invalid_handle(void);
 
 const server_test_t test_i037_server_tests_list[] = {
@@ -107,3 +184,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i038/test_i038.c b/api-tests/ff/ipc/test_i038/test_i038.c
index 2a2a2e6..df8ec4a 100644
--- a/api-tests/ff/ipc/test_i038/test_i038.c
+++ b/api-tests/ff/ipc/test_i038/test_i038.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
 
 #include "test_i038.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i038_client_tests_list[] = {
+    NULL,
+    client_test_psa_skip_with_invec_equal_to_max_iovec,
+    NULL,
+};
+
+int32_t client_test_psa_skip_with_invec_equal_to_max_iovec(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_skip with invec_idx=PSA_MAX_IOVEC\n", 0);
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i038_client_tests_list[] = {
     NULL,
     client_test_psa_skip_with_invec_equal_to_max_iovec,
@@ -55,6 +84,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i038/test_supp_i038.c b/api-tests/ff/ipc/test_i038/test_supp_i038.c
index 3790305..850de8b 100644
--- a/api-tests/ff/ipc/test_i038/test_supp_i038.c
+++ b/api-tests/ff/ipc/test_i038/test_supp_i038.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,85 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_skip_with_invec_equal_to_max_iovec(void);
+
+const server_test_t test_i038_server_tests_list[] = {
+    NULL,
+    server_test_psa_skip_with_invec_equal_to_max_iovec,
+    NULL,
+};
+
+int32_t server_test_psa_skip_with_invec_equal_to_max_iovec(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_skip with invec_idx=PSA_MAX_IOVEC, call should panic */
+            psa->skip(msg.handle, PSA_MAX_IOVEC, 0);
+
+            status = VAL_STATUS_SPM_FAILED;
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_skip with invec_idx=PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+            psa->reply(msg.handle, -4);
+
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_skip_with_invec_equal_to_max_iovec(void);
 
 const server_test_t test_i038_server_tests_list[] = {
@@ -109,3 +188,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i039/test_i039.c b/api-tests/ff/ipc/test_i039/test_i039.c
index 26bd8a7..bee2b67 100644
--- a/api-tests/ff/ipc/test_i039/test_i039.c
+++ b/api-tests/ff/ipc/test_i039/test_i039.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
 
 #include "test_i039.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i039_client_tests_list[] = {
+    NULL,
+    client_test_psa_skip_with_invec_greater_than_max_iovec,
+    NULL,
+};
+
+int32_t client_test_psa_skip_with_invec_greater_than_max_iovec(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_skip with invec_idx > PSA_MAX_IOVEC\n", 0);
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i039_client_tests_list[] = {
     NULL,
     client_test_psa_skip_with_invec_greater_than_max_iovec,
@@ -55,6 +84,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i039/test_supp_i039.c b/api-tests/ff/ipc/test_i039/test_supp_i039.c
index a94076c..25a25cb 100644
--- a/api-tests/ff/ipc/test_i039/test_supp_i039.c
+++ b/api-tests/ff/ipc/test_i039/test_supp_i039.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,85 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_skip_with_invec_greater_than_max_iovec(void);
+
+const server_test_t test_i039_server_tests_list[] = {
+    NULL,
+    server_test_psa_skip_with_invec_greater_than_max_iovec,
+    NULL,
+};
+
+int32_t server_test_psa_skip_with_invec_greater_than_max_iovec(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_skip with invec_idx > PSA_MAX_IOVEC, call should panic */
+            psa->skip(msg.handle, PSA_MAX_IOVEC + 1, 0);
+
+            status = VAL_STATUS_SPM_FAILED;
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_skip with invec_idx > PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+            psa->reply(msg.handle, -4);
+
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_skip_with_invec_greater_than_max_iovec(void);
 
 const server_test_t test_i039_server_tests_list[] = {
@@ -106,6 +185,9 @@
     val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
     status = ((val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
                ? VAL_STATUS_ERROR : status);
+
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i042/test_i042.c b/api-tests/ff/ipc/test_i042/test_i042.c
index 9c8e4ce..4c14de1 100644
--- a/api-tests/ff/ipc/test_i042/test_i042.c
+++ b/api-tests/ff/ipc/test_i042/test_i042.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
 
 #include "test_i042.h"
 
+#if STATELESS_ROT == 1
+
 const client_test_t test_i042_client_tests_list[] = {
     NULL,
     client_test_psa_write_with_null_handle,
@@ -34,12 +36,39 @@
 int32_t client_test_psa_write_with_null_handle(caller_security_t caller __UNUSED)
 {
    int32_t            status = VAL_STATUS_SUCCESS;
-   psa_handle_t       handle = 0;
    psa_status_t       status_of_call;
 
    val->print(PRINT_TEST,
             "[Check 1] Test psa_write with NULL handle\n", 0);
 
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
+const client_test_t test_i042_client_tests_list[] = {
+    NULL,
+    client_test_psa_write_with_null_handle,
+    NULL,
+};
+
+int32_t client_test_psa_write_with_null_handle(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+
+   psa_status_t       status_of_call;
+   psa_handle_t       handle = 0;
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_write with NULL handle\n", 0);
+
    handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
    if (!PSA_HANDLE_IS_VALID(handle))
    {
@@ -55,6 +84,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i042/test_supp_i042.c b/api-tests/ff/ipc/test_i042/test_supp_i042.c
index 09bb04f..6b233b3 100644
--- a/api-tests/ff/ipc/test_i042/test_supp_i042.c
+++ b/api-tests/ff/ipc/test_i042/test_supp_i042.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,7 +23,9 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
-int32_t server_test_psa_write_with_null_handle();
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_null_handle(void);
 
 const server_test_t test_i042_server_tests_list[] = {
     NULL,
@@ -31,7 +33,81 @@
     NULL,
 };
 
-int32_t server_test_psa_write_with_null_handle()
+int32_t server_test_psa_write_with_null_handle(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+    uint8_t         data[4] = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* psa_write with PSA_NULL_HANDLE, call should panic */
+            psa->write(PSA_NULL_HANDLE, 0, (void *)data, 0);
+
+            status = VAL_STATUS_SPM_FAILED;
+
+            /* Resetting boot.state to catch unwanted reboot */
+            val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED);
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_write with NULL handle should failed but succeed\n", 0);
+
+            psa->reply(msg.handle, -4);
+
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
+int32_t server_test_psa_write_with_null_handle(void);
+
+const server_test_t test_i042_server_tests_list[] = {
+    NULL,
+    server_test_psa_write_with_null_handle,
+    NULL,
+};
+
+int32_t server_test_psa_write_with_null_handle(void)
 {
     int32_t         status = VAL_STATUS_SUCCESS;
     psa_msg_t       msg = {0};
@@ -106,3 +182,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i043/test_i043.c b/api-tests/ff/ipc/test_i043/test_i043.c
index 1030e65..49c4e6f 100644
--- a/api-tests/ff/ipc/test_i043/test_i043.c
+++ b/api-tests/ff/ipc/test_i043/test_i043.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
 
 #include "test_i043.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i043_client_tests_list[] = {
+    NULL,
+    client_test_psa_write_with_invalid_handle,
+    NULL,
+};
+
+int32_t client_test_psa_write_with_invalid_handle(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_write with invalid handle\n", 0);
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i043_client_tests_list[] = {
     NULL,
     client_test_psa_write_with_invalid_handle,
@@ -55,6 +84,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i043/test_supp_i043.c b/api-tests/ff/ipc/test_i043/test_supp_i043.c
index eca5ee7..7f314e0 100644
--- a/api-tests/ff/ipc/test_i043/test_supp_i043.c
+++ b/api-tests/ff/ipc/test_i043/test_supp_i043.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,85 @@
 
 #define NUM_OF_BYTES 4
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_invalid_handle(void);
+
+const server_test_t test_i043_server_tests_list[] = {
+    NULL,
+    server_test_psa_write_with_invalid_handle,
+    NULL,
+};
+
+int32_t server_test_psa_write_with_invalid_handle(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+    uint8_t         data[NUM_OF_BYTES] = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_write with INVALID_HANDLE, call should panic */
+            psa->write(INVALID_HANDLE, 0, (void *)data, 0);
+
+            status = VAL_STATUS_SPM_FAILED;
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_write with invalid handle should failed but succeed\n", 0);
+
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_write_with_invalid_handle(void);
 
 const server_test_t test_i043_server_tests_list[] = {
@@ -111,3 +190,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i044/test_i044.c b/api-tests/ff/ipc/test_i044/test_i044.c
index 09050d2..bf2c5c4 100644
--- a/api-tests/ff/ipc/test_i044/test_i044.c
+++ b/api-tests/ff/ipc/test_i044/test_i044.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
 
 #include "test_i044.h"
 
+#if STATELESS_ROT == 1
+
 const client_test_t test_i044_client_tests_list[] = {
     NULL,
     client_test_psa_write_with_invec_equal_to_max_iovec,
@@ -34,12 +36,39 @@
 int32_t client_test_psa_write_with_invec_equal_to_max_iovec(caller_security_t caller __UNUSED)
 {
    int32_t            status = VAL_STATUS_SUCCESS;
-   psa_handle_t       handle = 0;
    psa_status_t       status_of_call;
 
    val->print(PRINT_TEST,
             "[Check 1] Test psa_write with invec_idx=PSA_MAX_IOVEC\n", 0);
 
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
+const client_test_t test_i044_client_tests_list[] = {
+    NULL,
+    client_test_psa_write_with_invec_equal_to_max_iovec,
+    NULL,
+};
+
+int32_t client_test_psa_write_with_invec_equal_to_max_iovec(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+
+   psa_status_t       status_of_call;
+   psa_handle_t       handle = 0;
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_write with invec_idx=PSA_MAX_IOVEC\n", 0);
+
    handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
    if (!PSA_HANDLE_IS_VALID(handle))
    {
@@ -55,6 +84,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i044/test_supp_i044.c b/api-tests/ff/ipc/test_i044/test_supp_i044.c
index 6fea86e..4a55125 100644
--- a/api-tests/ff/ipc/test_i044/test_supp_i044.c
+++ b/api-tests/ff/ipc/test_i044/test_supp_i044.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,85 @@
 
 #define NUM_OF_BYTES 4
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_invec_equal_to_max_iovec(void);
+
+const server_test_t test_i044_server_tests_list[] = {
+    NULL,
+    server_test_psa_write_with_invec_equal_to_max_iovec,
+    NULL,
+};
+
+int32_t server_test_psa_write_with_invec_equal_to_max_iovec(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+    uint8_t         data[NUM_OF_BYTES] = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_write with invec_idx=PSA_MAX_IOVEC, call should panic */
+            psa->write(msg.handle, PSA_MAX_IOVEC, (void *)data, 0);
+
+            status = VAL_STATUS_SPM_FAILED;
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_write with invec_idx=PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_write_with_invec_equal_to_max_iovec(void);
 
 const server_test_t test_i044_server_tests_list[] = {
@@ -111,3 +190,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i045/test_i045.c b/api-tests/ff/ipc/test_i045/test_i045.c
index 774e9cd..883f81c 100644
--- a/api-tests/ff/ipc/test_i045/test_i045.c
+++ b/api-tests/ff/ipc/test_i045/test_i045.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
 
 #include "test_i045.h"
 
+#if STATELESS_ROT == 1
+
 const client_test_t test_i045_client_tests_list[] = {
     NULL,
     client_test_psa_write_with_invec_greater_than_max_iovec,
@@ -34,12 +36,39 @@
 int32_t client_test_psa_write_with_invec_greater_than_max_iovec(caller_security_t caller __UNUSED)
 {
    int32_t            status = VAL_STATUS_SUCCESS;
-   psa_handle_t       handle = 0;
    psa_status_t       status_of_call;
 
    val->print(PRINT_TEST,
             "[Check 1] Test psa_write with invec_idx > PSA_MAX_IOVEC\n", 0);
 
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
+const client_test_t test_i045_client_tests_list[] = {
+    NULL,
+    client_test_psa_write_with_invec_greater_than_max_iovec,
+    NULL,
+};
+
+int32_t client_test_psa_write_with_invec_greater_than_max_iovec(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+
+   psa_status_t       status_of_call;
+   psa_handle_t       handle = 0;
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_write with invec_idx > PSA_MAX_IOVEC\n", 0);
+
    handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
    if (!PSA_HANDLE_IS_VALID(handle))
    {
@@ -55,6 +84,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i045/test_supp_i045.c b/api-tests/ff/ipc/test_i045/test_supp_i045.c
index b590405..d414a78 100644
--- a/api-tests/ff/ipc/test_i045/test_supp_i045.c
+++ b/api-tests/ff/ipc/test_i045/test_supp_i045.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,86 @@
 
 #define NUM_OF_BYTES 4
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_invec_greater_than_max_iovec(void);
+
+const server_test_t test_i045_server_tests_list[] = {
+    NULL,
+    server_test_psa_write_with_invec_greater_than_max_iovec,
+    NULL,
+};
+
+int32_t server_test_psa_write_with_invec_greater_than_max_iovec(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+    uint8_t         data[NUM_OF_BYTES] = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_write with invec_idx > PSA_MAX_IOVEC, call should panic */
+            psa->write(msg.handle, PSA_MAX_IOVEC + 1, (void *)data, 0);
+
+            status = VAL_STATUS_SPM_FAILED;
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_write with invec_idx > PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_write_with_invec_greater_than_max_iovec(void);
 
 const server_test_t test_i045_server_tests_list[] = {
@@ -105,9 +185,12 @@
         }
     }
 
+
     val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
     status = ((val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
                ? VAL_STATUS_ERROR : status);
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i046/test_i046.c b/api-tests/ff/ipc/test_i046/test_i046.c
index 8aea6db..3f967ef 100644
--- a/api-tests/ff/ipc/test_i046/test_i046.c
+++ b/api-tests/ff/ipc/test_i046/test_i046.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
 
 #include "test_i046.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i046_client_tests_list[] = {
+    NULL,
+    client_test_psa_write_with_size_overflow,
+    NULL,
+};
+
+int32_t client_test_psa_write_with_size_overflow(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+   psa_status_t       status_of_call;
+   uint8_t            data = 0;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_write with size overflow\n", 0);
+
+   psa_outvec resp = {&data, sizeof(data)};
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, &resp, 1);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i046_client_tests_list[] = {
     NULL,
     client_test_psa_write_with_size_overflow,
@@ -58,6 +90,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i046/test_supp_i046.c b/api-tests/ff/ipc/test_i046/test_supp_i046.c
index d4be5e0..5d86843 100644
--- a/api-tests/ff/ipc/test_i046/test_supp_i046.c
+++ b/api-tests/ff/ipc/test_i046/test_supp_i046.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,85 @@
 
 #define NUM_OF_BYTES 4
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_size_overflow(void);
+
+const server_test_t test_i046_server_tests_list[] = {
+    NULL,
+    server_test_psa_write_with_size_overflow,
+    NULL,
+};
+
+int32_t server_test_psa_write_with_size_overflow(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+    uint8_t         data[NUM_OF_BYTES] = {0};
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_write with size overflow, call should panic */
+            psa->write(msg.handle, 0, (void *)data, msg.out_size[0]+1);
+
+            status = VAL_STATUS_SPM_FAILED;
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_write with size overflow should failed but succeed\n", 0);
+
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_write_with_size_overflow(void);
 
 const server_test_t test_i046_server_tests_list[] = {
@@ -111,3 +190,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i047/test_i047.c b/api-tests/ff/ipc/test_i047/test_i047.c
index f5d9502..e145117 100644
--- a/api-tests/ff/ipc/test_i047/test_i047.c
+++ b/api-tests/ff/ipc/test_i047/test_i047.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
 
 #include "test_i047.h"
 
+#if STATELESS_ROT == 1
+
 const client_test_t test_i047_client_tests_list[] = {
     NULL,
     client_test_psa_get_with_invalid_msg_pointer,
@@ -33,11 +35,36 @@
 
 int32_t client_test_psa_get_with_invalid_msg_pointer(caller_security_t caller __UNUSED)
 {
+
+    psa_status_t            status_of_call;
+
+	val->print(PRINT_TEST,
+            "[Check 1] Test psa_get with invalid msg pointer\n", 0);
+
+    status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+    (void)status_of_call;
+
+    return VAL_STATUS_SUCCESS;
+
+}
+
+#else
+
+const client_test_t test_i047_client_tests_list[] = {
+    NULL,
+    client_test_psa_get_with_invalid_msg_pointer,
+    NULL,
+};
+
+int32_t client_test_psa_get_with_invalid_msg_pointer(caller_security_t caller __UNUSED)
+{
+
    psa_handle_t       handle = 0;
 
    val->print(PRINT_TEST,
             "[Check 1] Test psa_get with invalid msg pointer\n", 0);
 
+
    handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
    if (PSA_HANDLE_IS_VALID(handle))
    {
@@ -48,5 +75,8 @@
    val->print(PRINT_ERROR, "\tpsa_connect should failed but succeed\n", 0);
 
    (void)(handle);
+
    return VAL_STATUS_SPM_FAILED;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i047/test_supp_i047.c b/api-tests/ff/ipc/test_i047/test_supp_i047.c
index 49a5337..3c74b9f 100644
--- a/api-tests/ff/ipc/test_i047/test_supp_i047.c
+++ b/api-tests/ff/ipc/test_i047/test_supp_i047.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,100 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_get_with_invalid_msg_pointer(void);
+
+const server_test_t test_i047_server_tests_list[] = {
+    NULL,
+    server_test_psa_get_with_invalid_msg_pointer,
+    NULL,
+};
+
+int32_t server_test_psa_get_with_invalid_msg_pointer(void)
+{
+   int32_t                 status = VAL_STATUS_SUCCESS;
+   psa_signal_t            signals = 0;
+   psa_msg_t               *invalid_msg = NULL;
+   memory_desc_t           *memory_desc;
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    signals = psa->wait(SERVER_UNSPECIFED_VERSION_SIGNAL, PSA_BLOCK);
+    if ((signals & SERVER_UNSPECIFED_VERSION_SIGNAL) == 0)
+    {
+       val->print(PRINT_ERROR,
+                "psa_wait returned with invalid signal value = 0x%x\n", signals);
+       return VAL_STATUS_ERROR;
+    }
+
+    /*
+     * Selection of invalid msg pointer:
+     *
+     *  if (ISOLATION_LEVEL > 1)
+     *       msg_pointer = driver_mmio_region_base;
+     *  else
+     *       msg_pointer = NULL;
+     */
+
+    if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+    {
+        status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                      MEMORY_DRIVER_PARTITION_MMIO, 0),
+                                      (uint8_t **)&memory_desc,
+                                      (uint32_t *)sizeof(memory_desc_t));
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(201), status))
+        {
+            return status;
+        }
+
+        invalid_msg = (psa_msg_t *) memory_desc->start;
+    }
+
+    /* Setting boot.state before test check */
+    if (val->set_boot_flag(BOOT_EXPECTED_NS))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+        return VAL_STATUS_ERROR;
+    }
+
+    /* psa_get with invalid msg pointer, call should panic */
+    psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, invalid_msg);
+
+    /* shouldn't have reached here */
+    val->print(PRINT_ERROR,
+             "\tpsa_get with invalid msg pointer should failed but succeed\n", 0);
+
+    /* Resetting boot.state to catch unwanted reboot */
+    if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+    }
+
+    return VAL_STATUS_SPM_FAILED;
+}
+
+#else
 
 int32_t server_test_psa_get_with_invalid_msg_pointer(void);
 
@@ -114,5 +208,8 @@
 
     /* Reject the connection */
     psa->reply(invalid_msg->handle, PSA_ERROR_CONNECTION_REFUSED);
+
     return VAL_STATUS_SPM_FAILED;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i048/test_i048.c b/api-tests/ff/ipc/test_i048/test_i048.c
index 7e11989..91aeeba 100644
--- a/api-tests/ff/ipc/test_i048/test_i048.c
+++ b/api-tests/ff/ipc/test_i048/test_i048.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,117 @@
 
 #include "test_i048.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i048_client_tests_list[] = {
+    NULL,
+    client_test_psa_call_with_invalid_invec_pointer,
+    NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_invec_pointer(caller_security_t caller)
+{
+   int32_t                 status = VAL_STATUS_SUCCESS;
+
+   psa_status_t            status_of_call;
+   boot_state_t            boot_state;
+   memory_desc_t           *memory_desc;
+   psa_invec               *invalid_invec = NULL;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_call with invalid address for in_vec\n", 0);
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+   /*
+    * Selection of invalid invec pointer:
+    *
+    * if caller == CALLER_NONSECURE
+    *    // PSA RoT pointer
+    *    invec_pointer = driver_mmio_region_base;
+    * else
+    *    if (ISOLATION_LEVEL > 1)
+    *       // PSA RoT pointer
+    *       invec_pointer = driver_mmio_region_base;
+    *    else
+    *       invec_pointer = NULL;
+    */
+
+   status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                  MEMORY_DRIVER_PARTITION_MMIO, 0),
+                                  (uint8_t **)&memory_desc,
+                                  (uint32_t *)sizeof(memory_desc_t));
+   if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+   {
+       return status;
+   }
+
+   if (caller == CALLER_NONSECURE)
+       invalid_invec = (psa_invec *) memory_desc->start;
+   else
+   {
+       if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+           invalid_invec = (psa_invec *) memory_desc->start;
+   }
+
+   /* Setting boot.state before test check */
+   boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+   if (val->set_boot_flag(boot_state))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Test check- psa_call with invalid address for in_vec */
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL,
+		                                           invalid_invec, 1, NULL, 0);
+
+   /*
+    * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+    * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+    * For SPE caller, it must panic.
+    */
+   if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+   {
+       return VAL_STATUS_SUCCESS;
+   }
+
+   /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+   val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   status = VAL_STATUS_SPM_FAILED;
+   return status;
+}
+
+#else
+
 const client_test_t test_i048_client_tests_list[] = {
     NULL,
     client_test_psa_call_with_invalid_invec_pointer,
@@ -140,3 +251,4 @@
    psa->close(handle);
    return status;
 }
+#endif
diff --git a/api-tests/ff/ipc/test_i048/test_supp_i048.c b/api-tests/ff/ipc/test_i048/test_supp_i048.c
index 29058c1..794c180 100644
--- a/api-tests/ff/ipc/test_i048/test_supp_i048.c
+++ b/api-tests/ff/ipc/test_i048/test_supp_i048.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,39 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_invec_pointer(void);
+
+const server_test_t test_i048_server_tests_list[] = {
+    NULL,
+    server_test_psa_call_with_invalid_invec_pointer,
+    NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_invec_pointer(void)
+{
+    psa_msg_t       msg = {0};
+    psa_signal_t    signals;
+
+wait:
+    signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+    if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+    {
+	goto wait;
+    }
+
+    if (msg.type == PSA_IPC_CALL)
+    {
+	/* Control shouldn't have come here */
+	val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+	psa->reply(msg.handle, -2);
+    }
+    return VAL_STATUS_ERROR;
+}
+
+#else
+
 int32_t server_test_psa_call_with_invalid_invec_pointer(void);
 
 const server_test_t test_i048_server_tests_list[] = {
@@ -77,3 +110,5 @@
 
     return VAL_STATUS_ERROR;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i049/test_i049.c b/api-tests/ff/ipc/test_i049/test_i049.c
index becd24a..8313316 100644
--- a/api-tests/ff/ipc/test_i049/test_i049.c
+++ b/api-tests/ff/ipc/test_i049/test_i049.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,6 +24,117 @@
 #endif
 
 #include "test_i049.h"
+#include "stdio.h"
+
+#if STATELESS_ROT == 1
+
+const client_test_t test_i049_client_tests_list[] = {
+    NULL,
+    client_test_psa_call_with_invalid_outvec_pointer,
+    NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_outvec_pointer(caller_security_t caller)
+{
+   int32_t                 status = VAL_STATUS_SUCCESS;
+   psa_status_t            status_of_call;
+   boot_state_t            boot_state;
+   memory_desc_t           *memory_desc;
+   psa_outvec               *invalid_outvec = NULL;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_call with invalid address for outvec\n", 0);
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+   /*
+    * Selection of invalid outvec pointer:
+    *
+    * if caller == CALLER_NONSECURE
+    *    // PSA RoT pointer
+    *    outvec_pointer = driver_mmio_region_base;
+    * else
+    *    if (ISOLATION_LEVEL > 1)
+    *       // PSA RoT pointer
+    *       outvec_pointer = driver_mmio_region_base;
+    *    else
+    *       outvec_pointer = NULL;
+    */
+
+   status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                  MEMORY_DRIVER_PARTITION_MMIO, 0),
+                                  (uint8_t **)&memory_desc,
+                                  (uint32_t *)sizeof(memory_desc_t));
+   if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+   {
+       return status;
+   }
+
+   if (caller == CALLER_NONSECURE)
+       invalid_outvec = (psa_outvec *) memory_desc->start;
+   else
+   {
+       if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+           invalid_outvec = (psa_outvec *) memory_desc->start;
+   }
+
+   /* Setting boot.state before test check */
+   boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+   if (val->set_boot_flag(boot_state))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Test check- psa_call with invalid address for outvec */
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0,
+		                                                            invalid_outvec, 1);
+
+   /*
+    * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+    * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+    * For SPE caller, it must panic.
+    */
+   if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+   {
+       return VAL_STATUS_SUCCESS;
+   }
+
+   /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+   val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   status = VAL_STATUS_SPM_FAILED;
+   return status;
+}
+
+#else
 
 const client_test_t test_i049_client_tests_list[] = {
     NULL,
@@ -140,3 +251,5 @@
    psa->close(handle);
    return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i049/test_supp_i049.c b/api-tests/ff/ipc/test_i049/test_supp_i049.c
index 8061a00..0a53cd9 100644
--- a/api-tests/ff/ipc/test_i049/test_supp_i049.c
+++ b/api-tests/ff/ipc/test_i049/test_supp_i049.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,12 +17,47 @@
 
 #include "val_client_defs.h"
 #include "val_service_defs.h"
+#include "stdio.h"
 
 #define val CONCAT(val, _server_sp)
 #define psa CONCAT(psa, _server_sp)
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_outvec_pointer(void);
+
+const server_test_t test_i049_server_tests_list[] = {
+    NULL,
+    server_test_psa_call_with_invalid_outvec_pointer,
+    NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_outvec_pointer(void)
+{
+    psa_msg_t       msg = {0};
+    psa_signal_t    signals;
+
+wait:
+    signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+    if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+    {
+    	goto wait;
+    }
+
+    if (msg.type == PSA_IPC_CALL)
+    {
+    	/* Control shouldn't have come here */
+        val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+        psa->reply(msg.handle, -2);
+    }
+
+    return VAL_STATUS_ERROR;
+}
+
+#else
+
 int32_t server_test_psa_call_with_invalid_outvec_pointer(void);
 
 const server_test_t test_i049_server_tests_list[] = {
@@ -77,3 +112,5 @@
 
     return VAL_STATUS_ERROR;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i050/test_i050.c b/api-tests/ff/ipc/test_i050/test_i050.c
index 13701a3..df986d7 100644
--- a/api-tests/ff/ipc/test_i050/test_i050.c
+++ b/api-tests/ff/ipc/test_i050/test_i050.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,118 @@
 
 #include "test_i050.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i050_client_tests_list[] = {
+    NULL,
+    client_test_psa_call_with_invalid_invec_base,
+    NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_invec_base(caller_security_t caller)
+{
+   int32_t                 status = VAL_STATUS_SUCCESS;
+   psa_status_t            status_of_call;
+   boot_state_t            boot_state;
+   memory_desc_t           *memory_desc;
+   addr_t                  *invalid_base = NULL;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_call with invalid psa_invec.base\n", 0);
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+   /*
+    * Selection of invalid invec pointer:
+    *
+    * if caller == CALLER_NONSECURE
+    *    // PSA RoT pointer
+    *    invalid_base = driver_mmio_region_base;
+    * else
+    *    if (ISOLATION_LEVEL > 1)
+    *       // PSA RoT pointer
+    *       invalid_base = driver_mmio_region_base;
+    *    else
+    *       invalid_base = NULL;
+    */
+
+   status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                  MEMORY_DRIVER_PARTITION_MMIO, 0),
+                                  (uint8_t **)&memory_desc,
+                                  (uint32_t *)sizeof(memory_desc_t));
+   if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+   {
+       return status;
+   }
+
+
+   if (caller == CALLER_NONSECURE)
+       invalid_base = (addr_t *) memory_desc->start;
+   else
+   {
+       if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+           invalid_base = (addr_t *) memory_desc->start;
+   }
+
+   /* Setting boot.state before test check */
+   boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+   if (val->set_boot_flag(boot_state))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   psa_invec invec[1] = { {invalid_base, sizeof(addr_t)} };
+
+   /* Test check- psa_call with invalid address for psa_invec.base */
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec, 1, NULL, 0);
+
+   /*
+    * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+    * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+    * For SPE caller, it must panic.
+    */
+   if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+   {
+       return VAL_STATUS_SUCCESS;
+   }
+
+   /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+   val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   status = VAL_STATUS_SPM_FAILED;
+   return status;
+}
+
+#else
+
 const client_test_t test_i050_client_tests_list[] = {
     NULL,
     client_test_psa_call_with_invalid_invec_base,
@@ -96,6 +208,7 @@
        return status;
    }
 
+
    if (caller == CALLER_NONSECURE)
        invalid_base = (addr_t *) memory_desc->start;
    else
@@ -142,3 +255,5 @@
    psa->close(handle);
    return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i050/test_supp_i050.c b/api-tests/ff/ipc/test_i050/test_supp_i050.c
index 3cd745d..d988e8c 100644
--- a/api-tests/ff/ipc/test_i050/test_supp_i050.c
+++ b/api-tests/ff/ipc/test_i050/test_supp_i050.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,40 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_invec_base(void);
+
+const server_test_t test_i050_server_tests_list[] = {
+    NULL,
+    server_test_psa_call_with_invalid_invec_base,
+    NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_invec_base(void)
+{
+    psa_msg_t       msg = {0};
+    psa_signal_t    signals;
+
+wait:
+    signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+    if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+    {
+	goto wait;
+    }
+
+    if (msg.type == PSA_IPC_CALL)
+    {
+    	/* Control shouldn't have come here */
+        val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+        psa->reply(msg.handle, -2);
+    }
+
+    return VAL_STATUS_ERROR;
+}
+
+#else
+
 int32_t server_test_psa_call_with_invalid_invec_base(void);
 
 const server_test_t test_i050_server_tests_list[] = {
@@ -77,3 +111,5 @@
 
     return VAL_STATUS_ERROR;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i051/test_i051.c b/api-tests/ff/ipc/test_i051/test_i051.c
index 3fb0d15..60805ef 100644
--- a/api-tests/ff/ipc/test_i051/test_i051.c
+++ b/api-tests/ff/ipc/test_i051/test_i051.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,118 @@
 
 #include "test_i051.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i051_client_tests_list[] = {
+    NULL,
+    client_test_psa_call_with_invalid_outvec_base,
+    NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_outvec_base(caller_security_t caller)
+{
+   int32_t                 status = VAL_STATUS_SUCCESS;
+
+   psa_status_t            status_of_call;
+   boot_state_t            boot_state;
+   memory_desc_t           *memory_desc;
+   addr_t                  *invalid_base = NULL;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_call with invalid psa_outvec.base\n", 0);
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+   /*
+    * Selection of invalid outvec pointer:
+    *
+    * if caller == CALLER_NONSECURE
+    *    // PSA RoT pointer
+    *    invalid_base = driver_mmio_region_base;
+    * else
+    *    if (ISOLATION_LEVEL > 1)
+    *      // PSA RoT pointer
+    *       invalid_base = driver_mmio_region_base;
+    *    else
+    *       invalid_base = NULL;
+    */
+
+   status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                  MEMORY_DRIVER_PARTITION_MMIO, 0),
+                                  (uint8_t **)&memory_desc,
+                                  (uint32_t *)sizeof(memory_desc_t));
+   if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+   {
+       return status;
+   }
+
+   if (caller == CALLER_NONSECURE)
+       invalid_base = (addr_t *) memory_desc->start;
+   else
+   {
+       if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+           invalid_base = (addr_t *) memory_desc->start;
+   }
+
+   /* Setting boot.state before test check */
+   boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+   if (val->set_boot_flag(boot_state))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   psa_outvec outvec[1] = { {invalid_base, sizeof(addr_t)} };
+
+   /* Test check- psa_call with invalid address for psa_outvec.base */
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1);
+
+   /*
+    * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+    * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+    * For SPE caller, it must panic.
+    */
+   if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+   {
+       return VAL_STATUS_SUCCESS;
+   }
+
+   /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+   val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   status = VAL_STATUS_SPM_FAILED;
+   return status;
+}
+
+#else
+
 const client_test_t test_i051_client_tests_list[] = {
     NULL,
     client_test_psa_call_with_invalid_outvec_base,
@@ -142,3 +254,5 @@
    psa->close(handle);
    return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i051/test_supp_i051.c b/api-tests/ff/ipc/test_i051/test_supp_i051.c
index 01d83f1..396163d 100644
--- a/api-tests/ff/ipc/test_i051/test_supp_i051.c
+++ b/api-tests/ff/ipc/test_i051/test_supp_i051.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,40 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_outvec_base(void);
+
+const server_test_t test_i051_server_tests_list[] = {
+    NULL,
+    server_test_psa_call_with_invalid_outvec_base,
+    NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_outvec_base(void)
+{
+    psa_msg_t       msg = {0};
+    psa_signal_t    signals;
+
+wait:
+    signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+    if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+    {
+	goto wait;
+    }
+
+    if (msg.type == PSA_IPC_CALL)
+    {
+        /* Control shouldn't have come here */
+        val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+        psa->reply(msg.handle, -2);
+    }
+
+    return VAL_STATUS_ERROR;
+}
+
+#else
+
 int32_t server_test_psa_call_with_invalid_outvec_base(void);
 
 const server_test_t test_i051_server_tests_list[] = {
@@ -77,3 +111,5 @@
 
     return VAL_STATUS_ERROR;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i052/test_i052.c b/api-tests/ff/ipc/test_i052/test_i052.c
index d8c3ef0..ba04f62 100644
--- a/api-tests/ff/ipc/test_i052/test_i052.c
+++ b/api-tests/ff/ipc/test_i052/test_i052.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,126 @@
 
 #include "test_i052.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i052_client_tests_list[] = {
+    NULL,
+    client_test_psa_call_with_invalid_invec_end_addr,
+    NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_invec_end_addr(caller_security_t caller)
+{
+   int32_t                 status = VAL_STATUS_SUCCESS;
+   psa_status_t            status_of_call;
+   boot_state_t            boot_state;
+   memory_desc_t           *memory_desc_driver, *memory_desc;
+   size_t                  invalid_size;
+   memory_cfg_id_t         memory_cfg_id;
+   addr_t                  *valid_base = NULL;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_call with invalid end_addr for psa_invec\n", 0);
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+   /*
+    * Selection of invalid size for psa_invec:
+    *
+    * if caller == CALLER_NONSECURE
+    *    valid_base = nspe_mmio_region_base;
+    *    invalid_size = (driver_mmio_region_base - nspe_mmio_region_base + 1);
+    * else
+    *    if (ISOLATION_LEVEL > 1)
+    *       valid_base = server_mmio_region_base;
+    *       invalid_size = (driver_mmio_region_base - server_mmio_region_base + 1);
+    */
+
+   status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                  MEMORY_DRIVER_PARTITION_MMIO, 0),
+                                  (uint8_t **)&memory_desc_driver,
+                                  (uint32_t *)sizeof(memory_desc_t));
+   if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+   {
+       return status;
+   }
+
+   if (caller == CALLER_NONSECURE)
+       memory_cfg_id = MEMORY_NSPE_MMIO;
+   else
+       memory_cfg_id = MEMORY_SERVER_PARTITION_MMIO;
+
+   status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                  memory_cfg_id, 0),
+                                  (uint8_t **)&memory_desc,
+                                  (uint32_t *)sizeof(memory_desc_t));
+   if (val->err_check_set(TEST_CHECKPOINT_NUM(102), status))
+   {
+       return status;
+   }
+
+   valid_base = (addr_t *) memory_desc->start;
+   invalid_size = (memory_desc_driver->start - memory_desc->start + 1);
+
+   /* Setting boot.state before test check */
+   boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+   if (val->set_boot_flag(boot_state))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   psa_invec invec[1] = { {valid_base, invalid_size} };
+
+   /* Test check- psa_call with invalid end_addr for psa_invec */
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec, 1, NULL, 0);
+
+   /*
+    * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+    * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+    * For SPE caller, it must panic.
+    */
+   if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+   {
+       return VAL_STATUS_SUCCESS;
+   }
+
+   /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+   val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   status = VAL_STATUS_SPM_FAILED;
+   return status;
+}
+
+#else
+
 const client_test_t test_i052_client_tests_list[] = {
     NULL,
     client_test_psa_call_with_invalid_invec_end_addr,
@@ -152,3 +272,5 @@
    psa->close(handle);
    return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i052/test_supp_i052.c b/api-tests/ff/ipc/test_i052/test_supp_i052.c
index c989cf1..818d3a0 100644
--- a/api-tests/ff/ipc/test_i052/test_supp_i052.c
+++ b/api-tests/ff/ipc/test_i052/test_supp_i052.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,39 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_invec_end_addr(void);
+
+const server_test_t test_i052_server_tests_list[] = {
+    NULL,
+    server_test_psa_call_with_invalid_invec_end_addr,
+    NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_invec_end_addr(void)
+{
+    psa_msg_t       msg = {0};
+    psa_signal_t    signals;
+
+wait:
+    signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+    if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+    {
+	goto wait;
+    }
+
+    if (msg.type == PSA_IPC_CALL)
+    {
+	/* Control shouldn't have come here */
+	val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+	psa->reply(msg.handle, -2);
+    }
+    return VAL_STATUS_ERROR;
+}
+
+#else
+
 int32_t server_test_psa_call_with_invalid_invec_end_addr(void);
 
 const server_test_t test_i052_server_tests_list[] = {
@@ -77,3 +110,5 @@
 
     return VAL_STATUS_ERROR;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i053/test_i053.c b/api-tests/ff/ipc/test_i053/test_i053.c
index 542f809..9644563 100644
--- a/api-tests/ff/ipc/test_i053/test_i053.c
+++ b/api-tests/ff/ipc/test_i053/test_i053.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,127 @@
 
 #include "test_i053.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i053_client_tests_list[] = {
+    NULL,
+    client_test_psa_call_with_invalid_outvec_end_addr,
+    NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_outvec_end_addr(caller_security_t caller)
+{
+   int32_t                 status = VAL_STATUS_SUCCESS;
+   psa_status_t            status_of_call;
+   boot_state_t            boot_state;
+   memory_desc_t           *memory_desc_driver, *memory_desc;
+   size_t                  invalid_size;
+   memory_cfg_id_t         memory_cfg_id;
+   addr_t                  *valid_base = NULL;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_call with invalid end_addr for psa_outvec\n", 0);
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+   /*
+    * Selection of invalid size for psa_outvec:
+    *
+    * if caller == CALLER_NONSECURE
+    *    valid_base = nspe_mmio_region_base;
+    *    invalid_size = (driver_mmio_region_base - nspe_mmio_region_base + 1);
+    * else
+    *    if (ISOLATION_LEVEL > 1)
+    *       valid_base = server_mmio_region_base;
+    *       invalid_size = (driver_mmio_region_base - server_mmio_region_base + 1);
+    */
+
+   status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                  MEMORY_DRIVER_PARTITION_MMIO, 0),
+                                  (uint8_t **)&memory_desc_driver,
+                                  (uint32_t *)sizeof(memory_desc_t));
+   if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+   {
+       return status;
+   }
+
+   if (caller == CALLER_NONSECURE)
+       memory_cfg_id = MEMORY_NSPE_MMIO;
+   else
+       memory_cfg_id = MEMORY_SERVER_PARTITION_MMIO;
+
+   status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                  memory_cfg_id, 0),
+                                  (uint8_t **)&memory_desc,
+                                  (uint32_t *)sizeof(memory_desc_t));
+   if (val->err_check_set(TEST_CHECKPOINT_NUM(102), status))
+   {
+       return status;
+   }
+
+   valid_base = (addr_t *) memory_desc->start;
+   invalid_size = (memory_desc_driver->start - memory_desc->start + 1);
+
+   /* Setting boot.state before test check */
+   boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+   if (val->set_boot_flag(boot_state))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   psa_outvec outvec[1] = { {valid_base, invalid_size} };
+
+   /* Test check- psa_call with invalid end_addr for psa_outvec */
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1);
+
+   /*
+    * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+    * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+    * For SPE caller, it must panic.
+    */
+   if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+   {
+       return VAL_STATUS_SUCCESS;
+   }
+
+   /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+   val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   status = VAL_STATUS_SPM_FAILED;
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i053_client_tests_list[] = {
     NULL,
     client_test_psa_call_with_invalid_outvec_end_addr,
@@ -153,3 +274,5 @@
    (void)(status_of_call);
    return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i053/test_supp_i053.c b/api-tests/ff/ipc/test_i053/test_supp_i053.c
index 59ad945..d5e5f6a 100644
--- a/api-tests/ff/ipc/test_i053/test_supp_i053.c
+++ b/api-tests/ff/ipc/test_i053/test_supp_i053.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,39 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_outvec_end_addr(void);
+
+const server_test_t test_i053_server_tests_list[] = {
+    NULL,
+    server_test_psa_call_with_invalid_outvec_end_addr,
+    NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_outvec_end_addr(void)
+{
+    psa_msg_t       msg = {0};
+    psa_signal_t    signals;
+
+wait:
+    signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+    if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+    {
+	goto wait;
+    }
+
+    if (msg.type == PSA_IPC_CALL)
+    {
+	/* Control shouldn't have come here */
+	val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+        psa->reply(msg.handle, -2);
+    }
+    return VAL_STATUS_ERROR;
+}
+
+#else
+
 int32_t server_test_psa_call_with_invalid_outvec_end_addr(void);
 
 const server_test_t test_i053_server_tests_list[] = {
@@ -77,3 +110,5 @@
 
     return VAL_STATUS_ERROR;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i054/test_i054.c b/api-tests/ff/ipc/test_i054/test_i054.c
index cf05d6d..808566d 100644
--- a/api-tests/ff/ipc/test_i054/test_i054.c
+++ b/api-tests/ff/ipc/test_i054/test_i054.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,72 @@
 
 #include "test_i054.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i054_client_tests_list[] = {
+    NULL,
+    client_test_psa_call_with_not_writable_outvec_base,
+    NULL,
+};
+
+int32_t client_test_psa_call_with_not_writable_outvec_base(caller_security_t caller __UNUSED)
+{
+   int32_t                 status = VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_call with not writable psa_outvec.base\n", 0);
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_S))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Using function address (code) as not writable address */
+   psa_outvec outvec[1] = { {&client_test_psa_call_with_not_writable_outvec_base, sizeof(char)} };
+
+   /* Test check- psa_call with not writable psa_outvec.base, call should panic */
+   psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1);
+
+   /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+   val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   status = VAL_STATUS_SPM_FAILED;
+   return status;
+}
+
+#else
+
 const client_test_t test_i054_client_tests_list[] = {
     NULL,
     client_test_psa_call_with_not_writable_outvec_base,
@@ -92,6 +158,8 @@
    }
 
    status = VAL_STATUS_SPM_FAILED;
-   psa->close(handle);
+       psa->close(handle);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i054/test_supp_i054.c b/api-tests/ff/ipc/test_i054/test_supp_i054.c
index b76863b..fdcd2d2 100644
--- a/api-tests/ff/ipc/test_i054/test_supp_i054.c
+++ b/api-tests/ff/ipc/test_i054/test_supp_i054.c
@@ -23,6 +23,8 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
 int32_t server_test_psa_call_with_not_writable_outvec_base(void);
 
 const server_test_t test_i054_server_tests_list[] = {
@@ -33,10 +35,50 @@
 
 int32_t server_test_psa_call_with_not_writable_outvec_base(void)
 {
-    int32_t         status = VAL_STATUS_SUCCESS;
     psa_msg_t       msg = {0};
     psa_signal_t    signals;
 
+wait:
+    signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+    if (signals & SERVER_UNSPECIFED_VERSION_SIGNAL)
+    {
+        if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+        {
+            goto wait;
+        }
+
+        if (msg.type == PSA_IPC_CALL)
+        {
+            /* Control shouldn't have come here */
+            val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+            psa->reply(msg.handle, -2);
+        }
+    }
+    else
+    {
+        val->print(PRINT_ERROR, "\tpsa_wait returned with invalid signal value = 0x%x\n", signals);
+        return VAL_STATUS_ERROR;
+    }
+
+    return VAL_STATUS_ERROR;
+}
+
+#else
+
+int32_t server_test_psa_call_with_not_writable_outvec_base(void);
+
+const server_test_t test_i054_server_tests_list[] = {
+    NULL,
+    server_test_psa_call_with_not_writable_outvec_base,
+    NULL,
+};
+
+int32_t server_test_psa_call_with_not_writable_outvec_base(void)
+{
+    psa_msg_t       msg = {0};
+    psa_signal_t    signals;
+
+    int32_t         status = VAL_STATUS_SUCCESS;
     status = val->process_connect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
     if (val->err_check_set(TEST_CHECKPOINT_NUM(201), status))
     {
@@ -77,3 +119,5 @@
 
     return VAL_STATUS_ERROR;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i055/test_i055.c b/api-tests/ff/ipc/test_i055/test_i055.c
index cbec364..2ed9a95 100644
--- a/api-tests/ff/ipc/test_i055/test_i055.c
+++ b/api-tests/ff/ipc/test_i055/test_i055.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
 
 #include "test_i055.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i055_client_tests_list[] = {
+    NULL,
+    client_test_psa_read_with_invalid_buffer_addr,
+    NULL,
+};
+
+int32_t client_test_psa_read_with_invalid_buffer_addr(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+   uint8_t            data = 0x11;
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_read with invalid buffer addr\n", 0);
+
+   psa_invec invec[1] = { {&data, sizeof(data)} };
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec, 1, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i055_client_tests_list[] = {
     NULL,
     client_test_psa_read_with_invalid_buffer_addr,
@@ -48,7 +80,9 @@
        return VAL_STATUS_INVALID_HANDLE;
    }
 
+
    psa_invec invec[1] = {{&data, sizeof(data)}};
+
    status_of_call =  psa->call(handle, PSA_IPC_CALL, invec, 1, NULL, 0);
 
    /* Expectation is server test should hang and control shouldn't have come here */
@@ -57,6 +91,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i055/test_supp_i055.c b/api-tests/ff/ipc/test_i055/test_supp_i055.c
index 406f416..1aa23e9 100644
--- a/api-tests/ff/ipc/test_i055/test_supp_i055.c
+++ b/api-tests/ff/ipc/test_i055/test_supp_i055.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,110 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_invalid_buffer_addr(void);
+
+const server_test_t test_i055_server_tests_list[] = {
+    NULL,
+    server_test_psa_read_with_invalid_buffer_addr,
+    NULL,
+};
+
+int32_t server_test_psa_read_with_invalid_buffer_addr(void)
+{
+    int32_t                 status = VAL_STATUS_SUCCESS;
+    psa_msg_t               msg = {0};
+    void                    *buffer = NULL;
+    memory_desc_t           *memory_desc;
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    /*
+     * Selection of invalid buffer addr:
+     *
+     *  if (ISOLATION_LEVEL > 1)
+     *       buffer = driver_mmio_region_base;
+     *  else
+     *       buffer = NULL;
+     */
+
+    if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+    {
+        status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                      MEMORY_DRIVER_PARTITION_MMIO, 0),
+                                      (uint8_t **)&memory_desc,
+                                      (uint32_t *)sizeof(memory_desc_t));
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+        {
+            psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+            return status;
+        }
+
+        buffer = (void *) memory_desc->start;
+    }
+
+    /* Serve psa_call */
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(204), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_read with invalid buffer addr, call should panic */
+            psa->read(msg.handle, 0, (void *)buffer, msg.in_size[0]);
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_read with invalid buffer should failed but succeed\n", 0);
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            status = VAL_STATUS_SPM_FAILED;
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(205), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_read_with_invalid_buffer_addr(void);
 
 const server_test_t test_i055_server_tests_list[] = {
@@ -135,3 +239,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i056/test_i056.c b/api-tests/ff/ipc/test_i056/test_i056.c
index 291e0d0..9871d65 100644
--- a/api-tests/ff/ipc/test_i056/test_i056.c
+++ b/api-tests/ff/ipc/test_i056/test_i056.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
 
 #include "test_i056.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i056_client_tests_list[] = {
+    NULL,
+    client_test_psa_read_with_not_writable_buffer_addr,
+    NULL,
+};
+
+int32_t client_test_psa_read_with_not_writable_buffer_addr(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+   uint8_t            data = 0x11;
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_read with invalid buffer addr\n", 0);
+
+   psa_invec invec[1] = { {&data, sizeof(data)} };
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec, 1, NULL, 0);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i056_client_tests_list[] = {
     NULL,
     client_test_psa_read_with_not_writable_buffer_addr,
@@ -49,6 +81,7 @@
    }
 
    psa_invec invec[1] = {{&data, sizeof(data)}};
+
    status_of_call =  psa->call(handle, PSA_IPC_CALL, invec, 1, NULL, 0);
 
    /* Expectation is server test should hang and control shouldn't have come here */
@@ -57,6 +90,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i056/test_supp_i056.c b/api-tests/ff/ipc/test_i056/test_supp_i056.c
index b0fd4a2..9791c60 100644
--- a/api-tests/ff/ipc/test_i056/test_supp_i056.c
+++ b/api-tests/ff/ipc/test_i056/test_supp_i056.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,88 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_not_writable_buffer_addr(void);
+
+const server_test_t test_i056_server_tests_list[] = {
+    NULL,
+    server_test_psa_read_with_not_writable_buffer_addr,
+    NULL,
+};
+
+int32_t server_test_psa_read_with_not_writable_buffer_addr(void)
+{
+    int32_t                 status = VAL_STATUS_SUCCESS;
+    psa_msg_t               msg = {0};
+    void                    *buffer = NULL;
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    /* Set buffer to point to not writable location (Code memory) */
+    buffer = (void *) &server_test_psa_read_with_not_writable_buffer_addr;
+
+    /* Serve psa_call */
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_read with not writable buffer addr, call should panic */
+            psa->read(msg.handle, 0, (void *)buffer, msg.in_size[0]);
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_read with not writable buffer should failed but succeed\n", 0);
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            status = VAL_STATUS_SPM_FAILED;
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_read_with_not_writable_buffer_addr(void);
 
 const server_test_t test_i056_server_tests_list[] = {
@@ -89,7 +171,6 @@
         }
         else
         {
-
             /* Test check- psa_read with not writable buffer addr, call should panic */
             psa->read(msg.handle, 0, (void *)buffer, msg.in_size[0]);
 
@@ -114,3 +195,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i057/test_i057.c b/api-tests/ff/ipc/test_i057/test_i057.c
index 95c265a..b092704 100644
--- a/api-tests/ff/ipc/test_i057/test_i057.c
+++ b/api-tests/ff/ipc/test_i057/test_i057.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
 
 #include "test_i057.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i057_client_tests_list[] = {
+    NULL,
+    client_test_psa_write_with_invalid_buffer_addr,
+    NULL,
+};
+
+int32_t client_test_psa_write_with_invalid_buffer_addr(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+   uint8_t            data = 0x11;
+   psa_status_t       status_of_call;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_write with invalid buffer addr\n", 0);
+
+   psa_outvec outvec[1] = { {&data, sizeof(data)} };
+
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1);
+
+   /* Expectation is server test should hang and control shouldn't have come here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   (void)(status_of_call);
+   return status;
+}
+
+#else
+
 const client_test_t test_i057_client_tests_list[] = {
     NULL,
     client_test_psa_write_with_invalid_buffer_addr,
@@ -49,6 +81,7 @@
    }
 
    psa_outvec outvec[1] = {{&data, sizeof(data)}};
+
    status_of_call =  psa->call(handle, PSA_IPC_CALL, NULL, 0, outvec, 1);
 
    /* Expectation is server test should hang and control shouldn't have come here */
@@ -57,6 +90,9 @@
    status = VAL_STATUS_SPM_FAILED;
 
    psa->close(handle);
+
    (void)(status_of_call);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i057/test_supp_i057.c b/api-tests/ff/ipc/test_i057/test_supp_i057.c
index d00ed25..0eb5f70 100644
--- a/api-tests/ff/ipc/test_i057/test_supp_i057.c
+++ b/api-tests/ff/ipc/test_i057/test_supp_i057.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,110 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_invalid_buffer_addr(void);
+
+const server_test_t test_i057_server_tests_list[] = {
+    NULL,
+    server_test_psa_write_with_invalid_buffer_addr,
+    NULL,
+};
+
+int32_t server_test_psa_write_with_invalid_buffer_addr(void)
+{
+    int32_t                 status = VAL_STATUS_SUCCESS;
+    psa_msg_t               msg = {0};
+    void                    *buffer = NULL;
+    memory_desc_t           *memory_desc;
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+    /*
+     * Selection of invalid buffer addr:
+     *
+     *  if (ISOLATION_LEVEL > 1)
+     *       buffer = driver_mmio_region_base;
+     *  else
+     *       buffer = NULL;
+     */
+
+    if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+    {
+        status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                      MEMORY_DRIVER_PARTITION_MMIO, 0),
+                                      (uint8_t **)&memory_desc,
+                                      (uint32_t *)sizeof(memory_desc_t));
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+        {
+            psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+            return status;
+        }
+
+        buffer = (void *) memory_desc->start;
+    }
+
+    /* Server psa_call */
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+    {
+        psa->reply(msg.handle, -2);
+    }
+    else
+    {
+        /* Setting boot.state before test check */
+        status = val->set_boot_flag(BOOT_EXPECTED_NS);
+        if (val->err_check_set(TEST_CHECKPOINT_NUM(204), status))
+        {
+            val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+            psa->reply(msg.handle, -3);
+        }
+        else
+        {
+            /* Test check- psa_write with invalid buffer addr, call should panic */
+            psa->write(msg.handle, 0, (void *)buffer, msg.out_size[0]);
+
+            /* shouldn't have reached here */
+            val->print(PRINT_ERROR,
+                "\tpsa_write with invalid buffer should failed but succeed\n", 0);
+
+            /* Resetting boot.state to catch unwanted reboot */
+            if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+            {
+                val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+            }
+
+            status = VAL_STATUS_SPM_FAILED;
+            psa->reply(msg.handle, -4);
+        }
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(205), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_write_with_invalid_buffer_addr(void);
 
 const server_test_t test_i057_server_tests_list[] = {
@@ -135,3 +239,5 @@
     psa->reply(msg.handle, PSA_SUCCESS);
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i058/test_i058.c b/api-tests/ff/ipc/test_i058/test_i058.c
index 6ffdd77..4277a1e 100644
--- a/api-tests/ff/ipc/test_i058/test_i058.c
+++ b/api-tests/ff/ipc/test_i058/test_i058.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,65 @@
 
 #include "test_i058.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i058_client_tests_list[] = {
+    NULL,
+    client_test_psa_doorbell_signal,
+    NULL,
+};
+
+int32_t client_test_psa_doorbell_signal(caller_security_t caller __UNUSED)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+#ifndef NONSECURE_TEST_BUILD
+   psa_signal_t       signals = 0;
+#endif
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test PSA_DOORBELL signal\n", 0);
+
+#ifndef NONSECURE_TEST_BUILD
+   /* Wait for doorball notification */
+   signals = psa_wait(PSA_DOORBELL, PSA_BLOCK);
+
+   /* Is this doorbell signal? */
+   if ((signals & PSA_DOORBELL) == 0)
+   {
+       status = VAL_STATUS_INVALID_HANDLE;
+       val->print(PRINT_ERROR, "\tpsa_wait didn't receive doorbell signal\n", 0);
+   }
+
+   /*
+    * Wait for doorball notification again to check -
+    * Doorbell should remain asserted until psa_clear is called.
+    */
+   signals = psa_wait(PSA_DOORBELL, PSA_BLOCK);
+
+   /* Is this doorbell signal? */
+   if ((signals & PSA_DOORBELL) == 0)
+   {
+       status = VAL_STATUS_INVALID_HANDLE;
+       val->print(PRINT_ERROR, "\tDoorbell signal cleared without calling psa_clear\n", 0);
+   }
+
+   /* Clear the doorbell signal */
+   psa_clear();
+
+   /* Is doorbell signal cleared? */
+   signals = psa_wait(PSA_DOORBELL, PSA_POLL);
+   if ((signals & PSA_DOORBELL) != 0)
+   {
+       status = VAL_STATUS_INVALID_HANDLE;
+       val->print(PRINT_ERROR, "\tpsa_clear didn't clear doorbell signal\n", 0);
+   }
+#endif
+
+   return status;
+}
+
+#else
+
 const client_test_t test_i058_client_tests_list[] = {
     NULL,
     client_test_psa_doorbell_signal,
@@ -88,3 +147,5 @@
    psa->close(handle);
    return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i058/test_supp_i058.c b/api-tests/ff/ipc/test_i058/test_supp_i058.c
index 21218b0..f84497d 100644
--- a/api-tests/ff/ipc/test_i058/test_supp_i058.c
+++ b/api-tests/ff/ipc/test_i058/test_supp_i058.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,38 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_doorbell_signal(void);
+
+const server_test_t test_i058_server_tests_list[] = {
+    NULL,
+    server_test_psa_doorbell_signal,
+    NULL,
+};
+
+int32_t server_test_psa_doorbell_signal(void)
+{
+    int32_t                 status = VAL_STATUS_SUCCESS;
+    psa_msg_t               msg = {0};
+
+    if (msg.client_id > 0)
+    {
+        /* Doorbell signal to client partititon */
+        psa->notify(msg.client_id);
+    }
+    else
+    {
+        status = VAL_STATUS_SPM_FAILED;
+        val->print(PRINT_ERROR, "Caller is from non-secure\n", 0);
+    }
+
+    val->err_check_set(TEST_CHECKPOINT_NUM(202), status);
+    return status;
+}
+
+#else
+
 int32_t server_test_psa_doorbell_signal(void);
 
 const server_test_t test_i058_server_tests_list[] = {
@@ -66,3 +98,5 @@
 
     return status;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i063/test_i063.c b/api-tests/ff/ipc/test_i063/test_i063.c
index 644aa65..4a03410 100644
--- a/api-tests/ff/ipc/test_i063/test_i063.c
+++ b/api-tests/ff/ipc/test_i063/test_i063.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
 
 #include "test_i063.h"
 
+#if STATELESS_ROT == 1
+
 const client_test_t test_i063_client_tests_list[] = {
     NULL,
     client_test_psa_wait_signal_mask,
@@ -33,6 +35,24 @@
 
 int32_t client_test_psa_wait_signal_mask(caller_security_t caller __UNUSED)
 {
+
+
+   val->print(PRINT_TEST, "[Check 1] Test psa_wait signal mask\n", 0);
+
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
+const client_test_t test_i063_client_tests_list[] = {
+    NULL,
+    client_test_psa_wait_signal_mask,
+    NULL,
+};
+
+int32_t client_test_psa_wait_signal_mask(caller_security_t caller __UNUSED)
+{
+
    psa_handle_t     handle = 0;
 
    val->print(PRINT_TEST, "[Check 1] Test psa_wait signal mask\n", 0);
@@ -52,6 +72,7 @@
        val->print(PRINT_ERROR, "psa_connect failed -2\n", 0);
        return VAL_STATUS_INVALID_HANDLE;
    }
-
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i064/test_i064.c b/api-tests/ff/ipc/test_i064/test_i064.c
index e627fc3..104a72e 100644
--- a/api-tests/ff/ipc/test_i064/test_i064.c
+++ b/api-tests/ff/ipc/test_i064/test_i064.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
 
 #include "test_i064.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i064_client_tests_list[] = {
+    NULL,
+    client_test_psa_eoi_with_non_intr_signal,
+    NULL,
+};
+
+int32_t client_test_psa_eoi_with_non_intr_signal(caller_security_t caller __UNUSED)
+{
+   driver_test_fn_id_t    driver_test_fn_id = TEST_PSA_EOI_WITH_NON_INTR_SIGNAL;
+
+   /*
+    * The interrupt related test check is captured in driver_partition.c as this is the
+    * only partition in test suite that holds the interrupt source. The interrupt test check
+    * is invoked by client by calling to DRIVER_TEST_SID RoT service of driver partition that
+    * hold the test check.
+    */
+
+   val->print(PRINT_TEST, "[Check 1] Test psa_eoi with non-interrupt signal\n", 0);
+
+   /* Execute driver function related to TEST_PSA_EOI_WITH_NON_INTR_SIGNAL */
+   psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
+   psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, &invec, 1, NULL, 0);
+
+   /* The expectation is that driver partition get panic and control never reaches here. */
+   return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
 const client_test_t test_i064_client_tests_list[] = {
     NULL,
     client_test_psa_eoi_with_non_intr_signal,
@@ -45,6 +77,7 @@
 
    val->print(PRINT_TEST, "[Check 1] Test psa_eoi with non-interrupt signal\n", 0);
 
+
    /* Connect to DRIVER_TEST_SID */
    handle = psa->connect(DRIVER_TEST_SID, DRIVER_TEST_VERSION);
    if (!PSA_HANDLE_IS_VALID(handle))
@@ -55,6 +88,7 @@
 
    /* Execute driver function related to TEST_PSA_EOI_WITH_NON_INTR_SIGNAL */
    psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
    psa->call(handle, PSA_IPC_CALL, &invec, 1, NULL, 0);
 
    psa->close(handle);
@@ -62,3 +96,5 @@
    /* The expectation is that driver partition get panic and control never reaches here. */
    return VAL_STATUS_SPM_FAILED;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i065/test_i065.c b/api-tests/ff/ipc/test_i065/test_i065.c
index 518dce4..6f0434e 100644
--- a/api-tests/ff/ipc/test_i065/test_i065.c
+++ b/api-tests/ff/ipc/test_i065/test_i065.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
 
 #include "test_i065.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i065_client_tests_list[] = {
+    NULL,
+    client_test_psa_eoi_with_unasserted_signal,
+    NULL,
+};
+
+int32_t client_test_psa_eoi_with_unasserted_signal(caller_security_t caller __UNUSED)
+{
+   driver_test_fn_id_t    driver_test_fn_id = TEST_PSA_EOI_WITH_UNASSERTED_SIGNAL;
+
+   /*
+    * The interrupt related test check is captured in driver_partition.c as this is the
+    * only partition in test suite that holds the interrupt source. The interrupt test check
+    * is invoked by client by calling to DRIVER_TEST_SID RoT service of driver partition that
+    * hold the test check.
+    */
+
+   val->print(PRINT_TEST, "[Check 1] Test psa_eoi with multiple signal\n", 0);
+
+   /* Execute driver function related to TEST_PSA_EOI_WITH_UNASSERTED_SIGNAL */
+   psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
+   psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, &invec, 1, NULL, 0);
+
+   /* The expectation is that driver partition get panic and control never reaches here. */
+   return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
 const client_test_t test_i065_client_tests_list[] = {
     NULL,
     client_test_psa_eoi_with_unasserted_signal,
@@ -55,6 +87,7 @@
 
    /* Execute driver function related to TEST_PSA_EOI_WITH_UNASSERTED_SIGNAL */
    psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
    psa->call(handle, PSA_IPC_CALL, &invec, 1, NULL, 0);
 
    psa->close(handle);
@@ -62,3 +95,5 @@
    /* The expectation is that driver partition get panic and control never reaches here. */
    return VAL_STATUS_SPM_FAILED;
 }
+
+ #endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i066/test_i066.c b/api-tests/ff/ipc/test_i066/test_i066.c
index dc602ba..ddfa6b3 100644
--- a/api-tests/ff/ipc/test_i066/test_i066.c
+++ b/api-tests/ff/ipc/test_i066/test_i066.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
 
 #include "test_i066.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i066_client_tests_list[] = {
+    NULL,
+    client_test_psa_eoi_with_multiple_signals,
+    NULL,
+};
+
+int32_t client_test_psa_eoi_with_multiple_signals(caller_security_t caller __UNUSED)
+{
+   driver_test_fn_id_t    driver_test_fn_id = TEST_PSA_EOI_WITH_MULTIPLE_SIGNALS;
+
+   /*
+    * The interrupt related test check is captured in driver_partition.c as this is the
+    * only partition in test suite that holds the interrupt source. The interrupt test check
+    * is invoked by client by calling to DRIVER_TEST_SID RoT service of driver partition that
+    * hold the test check.
+    */
+
+   val->print(PRINT_TEST, "[Check 1] Test psa_eoi with multiple signals\n", 0);
+
+   /* Execute driver function related to TEST_PSA_EOI_WITH_MULTIPLE_SIGNALS */
+   psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
+   psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, &invec, 1, NULL, 0);
+
+   /* The expectation is that driver partition get panic and control never reaches here. */
+   return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
 const client_test_t test_i066_client_tests_list[] = {
     NULL,
     client_test_psa_eoi_with_multiple_signals,
@@ -55,6 +87,7 @@
 
    /* Execute driver function related to TEST_PSA_EOI_WITH_MULTIPLE_SIGNALS */
    psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
    psa->call(handle, PSA_IPC_CALL, &invec, 1, NULL, 0);
 
    psa->close(handle);
@@ -62,3 +95,5 @@
    /* The expectation is that driver partition get panic and control never reaches here. */
    return VAL_STATUS_SPM_FAILED;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i072/test_i072.c b/api-tests/ff/ipc/test_i072/test_i072.c
index ec77eb0..9f09884 100644
--- a/api-tests/ff/ipc/test_i072/test_i072.c
+++ b/api-tests/ff/ipc/test_i072/test_i072.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,95 @@
 
 #include "test_i072.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i072_client_tests_list[] = {
+    NULL,
+    client_test_nspe_read_app_rot_variable,
+    client_test_nspe_write_app_rot_variable,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+
+   psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+   if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+   {
+	   val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+       return VAL_STATUS_CALL_FAILED;
+   }
+
+   val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
+
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_app_rot_variable(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = 0x1234;
+
+   val->print(PRINT_TEST, "[Check 1] Test NSPE reading APP-RoT data\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read Application RoT global variable address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)app_rot_addr;
+
+   /* Did read ignore? */
+   if (data == 0x1234)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_app_rot_variable(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = 0x1234;
+
+   val->print(PRINT_TEST, "[Check 2] Test NSPE writing APP-RoT data\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_NS))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Write Application RoT global variable address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const client_test_t test_i072_client_tests_list[] = {
     NULL,
     client_test_nspe_read_app_rot_variable,
@@ -54,6 +143,7 @@
    val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
 
    psa->close(handle);
+
    return VAL_STATUS_SUCCESS;
 }
 
@@ -123,5 +213,8 @@
        val->print(PRINT_ERROR, "\tExpected connection to fail but succeed\n", 0);
        return VAL_STATUS_INVALID_HANDLE;
    }
+
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i072/test_supp_i072.c b/api-tests/ff/ipc/test_i072/test_supp_i072.c
index 636f477..665ee31 100644
--- a/api-tests/ff/ipc/test_i072/test_supp_i072.c
+++ b/api-tests/ff/ipc/test_i072/test_supp_i072.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -31,6 +31,68 @@
 /* Application RoT data region */
 volatile uint32_t g_test_i072 = DATA_VALUE;
 
+#if STATELESS_ROT == 1
+
+const server_test_t test_i072_server_tests_list[] = {
+    NULL,
+    server_test_nspe_read_app_rot_variable,
+    server_test_nspe_write_app_rot_variable,
+    NULL,
+};
+
+static int32_t send_secure_partition_address(void)
+{
+    int32_t           status = VAL_STATUS_SUCCESS;
+    volatile uint32_t *addr = &g_test_i072;
+    psa_msg_t         msg = {0};
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+        return status;
+    }
+
+    val->print(PRINT_DEBUG, "\tAPP-ROT: Passing 0x%x to NSPE\n", (int)&g_test_i072);
+
+    /* Send Application RoT data address - global variable */
+    psa->write(msg.handle, 0, (void *)&addr, sizeof(addr));
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_nspe_read_app_rot_variable(void)
+{
+    return send_secure_partition_address();
+}
+
+int32_t server_test_nspe_write_app_rot_variable(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+
+
+    status = send_secure_partition_address();
+    if (VAL_ERROR(status))
+        return status;
+
+    /* Reached here means there could be write succeed or ignored */
+    if (g_test_i072 == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+    val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+    /* Resetting boot.state to catch unwanted reboot */
+    if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+        return VAL_STATUS_ERROR;
+    }
+    return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const server_test_t test_i072_server_tests_list[] = {
     NULL,
     server_test_nspe_read_app_rot_variable,
@@ -72,6 +134,7 @@
         return status;
     }
     psa->reply(msg.handle, PSA_SUCCESS);
+
     return VAL_STATUS_SUCCESS;
 }
 
@@ -114,3 +177,5 @@
     }
     return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i073/test_i073.c b/api-tests/ff/ipc/test_i073/test_i073.c
index 99e6448..b3891b5 100644
--- a/api-tests/ff/ipc/test_i073/test_i073.c
+++ b/api-tests/ff/ipc/test_i073/test_i073.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,95 @@
 
 #include "test_i073.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i073_client_tests_list[] = {
+    NULL,
+    client_test_nspe_read_app_rot_stack,
+    client_test_nspe_write_app_rot_stack,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+   /* Get App-RoT address */
+   psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+   if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+   {
+	   val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+       return VAL_STATUS_CALL_FAILED;
+   }
+
+   val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
+
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_app_rot_stack(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = 0x1234;
+
+   val->print(PRINT_TEST, "[Check 1] Test NSPE reading APP-RoT stack\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read Application RoT stack address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)app_rot_addr;
+
+   /* Did read ignore? */
+   if (data == 0x1234)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_app_rot_stack(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = 0x1234;
+
+   val->print(PRINT_TEST, "[Check 2] Test NSPE writing APP-RoT stack\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_NS))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Write Application RoT stack address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const client_test_t test_i073_client_tests_list[] = {
     NULL,
     client_test_nspe_read_app_rot_stack,
@@ -54,6 +143,7 @@
    val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
 
    psa->close(handle);
+
    return VAL_STATUS_SUCCESS;
 }
 
@@ -123,5 +213,8 @@
        val->print(PRINT_ERROR, "\tExpected connection to fail but succeed\n", 0);
        return VAL_STATUS_INVALID_HANDLE;
    }
+
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i073/test_supp_i073.c b/api-tests/ff/ipc/test_i073/test_supp_i073.c
index 0a0900d..28b0fcf 100644
--- a/api-tests/ff/ipc/test_i073/test_supp_i073.c
+++ b/api-tests/ff/ipc/test_i073/test_supp_i073.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,6 +28,76 @@
 
 #define DATA_VALUE 0x5467
 
+#if STATELESS_ROT == 1
+
+const server_test_t test_i073_server_tests_list[] = {
+    NULL,
+    server_test_nspe_read_app_rot_stack,
+    server_test_nspe_write_app_rot_stack,
+    NULL,
+};
+
+static int32_t send_secure_partition_address(addr_t *stack)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+        return status;
+    }
+
+    val->print(PRINT_DEBUG, "\tAPP-ROT: Passing 0x%x to NSPE\n", (int)stack);
+
+    /* Send Application RoT stack address */
+    psa->write(msg.handle, 0, (void *)&stack, sizeof(uint32_t));
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_nspe_read_app_rot_stack(void)
+{
+    /* Application RoT stack - local variable */
+    uint32_t        l_test_i073 = DATA_VALUE;
+    int32_t         status = VAL_STATUS_SUCCESS;
+
+    status = send_secure_partition_address(&l_test_i073);
+
+    /* Dummy print to avoid compiler optimisation on local variable */
+    val->print(PRINT_INFO, "\tStack data 0x%x\n", l_test_i073);
+    return status;
+}
+
+int32_t server_test_nspe_write_app_rot_stack(void)
+{
+    /* Application RoT stack - local variable */
+    uint32_t        l_test_i073 = DATA_VALUE;
+    int32_t         status = VAL_STATUS_SUCCESS;
+
+    status = send_secure_partition_address(&l_test_i073);
+    if (VAL_ERROR(status))
+        return status;
+
+    /* Reached here means there could be write succeed or ignored */
+    if (l_test_i073 == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+    val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+    /* Resetting boot.state to catch unwanted reboot */
+    if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+        return VAL_STATUS_ERROR;
+    }
+    return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const server_test_t test_i073_server_tests_list[] = {
     NULL,
     server_test_nspe_read_app_rot_stack,
@@ -68,6 +138,7 @@
         return status;
     }
     psa->reply(msg.handle, PSA_SUCCESS);
+
     return VAL_STATUS_SUCCESS;
 }
 
@@ -120,3 +191,5 @@
     }
     return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i074/test_i074.c b/api-tests/ff/ipc/test_i074/test_i074.c
index 85bbdbb..6042bb6 100644
--- a/api-tests/ff/ipc/test_i074/test_i074.c
+++ b/api-tests/ff/ipc/test_i074/test_i074.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,112 @@
 #define DATA_VALUE     0x12
 #define BUFFER_SIZE    0x4
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i074_client_tests_list[] = {
+    NULL,
+    client_test_nspe_read_app_rot_heap,
+    client_test_nspe_write_app_rot_heap,
+    NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+
+   /* Get App-RoT address */
+   psa_outvec outvec[1] = { {addr, BUFFER_SIZE} };
+   if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+   {
+       val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+       return VAL_STATUS_CALL_FAILED;
+   }
+
+   val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
+
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_app_rot_heap(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint8_t  data = DATA_VALUE;
+
+   val->print(PRINT_TEST, "[Check 1] Test NSPE reading APP-RoT heap\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read Application RoT heap address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint8_t *)app_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_app_rot_heap(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint8_t  data = DATA_VALUE;
+
+   val->print(PRINT_TEST, "[Check 2] Test NSPE writing APP-RoT heap\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_NS))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Write Application RoT heap address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint8_t *)app_rot_addr = (uint8_t)data;
+
+   return VAL_STATUS_SUCCESS;
+}
+#else
+int32_t client_test_nspe_read_app_rot_heap(caller_security_t caller __UNUSED)
+{
+   val->print(PRINT_TEST, "[Check 1] Test NSPE reading APP-RoT heap\n", 0);
+   val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+   return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t client_test_nspe_write_app_rot_heap(caller_security_t caller __UNUSED)
+{
+   val->print(PRINT_TEST, "[Check 2] Test NSPE writing APP-RoT heap\n", 0);
+   val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+   return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+#else
+
 const client_test_t test_i074_client_tests_list[] = {
     NULL,
     client_test_nspe_read_app_rot_heap,
@@ -59,6 +165,7 @@
    val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
 
    psa->close(handle);
+
    return VAL_STATUS_SUCCESS;
 }
 
@@ -128,6 +235,7 @@
        val->print(PRINT_ERROR, "\tExpected connection to fail but succeed\n", 0);
        return VAL_STATUS_INVALID_HANDLE;
    }
+
    return VAL_STATUS_SUCCESS;
 }
 #else
@@ -145,3 +253,5 @@
    return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
 }
 #endif
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i074/test_supp_i074.c b/api-tests/ff/ipc/test_i074/test_supp_i074.c
index d5c84bf..c296a6b 100644
--- a/api-tests/ff/ipc/test_i074/test_supp_i074.c
+++ b/api-tests/ff/ipc/test_i074/test_supp_i074.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,6 +34,97 @@
 #define DATA_VALUE_ORG 0x11
 #define BUFFER_SIZE    0x4
 
+#if STATELESS_ROT == 1
+
+const server_test_t test_i074_server_tests_list[] = {
+    NULL,
+    server_test_nspe_read_app_rot_heap,
+    server_test_nspe_write_app_rot_heap,
+    NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t send_secure_partition_address(uint8_t *heap)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+        return status;
+    }
+
+	val->print(PRINT_DEBUG, "\tAPP-ROT: Passing 0x%x to NSPE\n", (int)heap);
+
+    /* Send Application RoT heap address */
+    psa->write(msg.handle, 0, (void *)&heap, sizeof(BUFFER_SIZE));
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_nspe_read_app_rot_heap(void)
+{
+    /* Application RoT heap buffer */
+    uint8_t         *buffer;
+    int32_t          status = VAL_STATUS_SUCCESS;
+
+    buffer = (uint8_t *)malloc(sizeof(uint8_t) * BUFFER_SIZE);
+    memset((uint8_t *)buffer, DATA_VALUE_ORG, BUFFER_SIZE);
+
+    status = send_secure_partition_address(buffer);
+    free(buffer);
+
+    return status;
+}
+
+int32_t server_test_nspe_write_app_rot_heap(void)
+{
+    /* Application RoT heap buffer */
+    uint8_t         *buffer;
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+    buffer = (uint8_t *)malloc(sizeof(uint8_t) * BUFFER_SIZE);
+    memset((uint8_t *)buffer, DATA_VALUE_ORG, BUFFER_SIZE);
+
+    status = send_secure_partition_address(buffer);
+    if (VAL_ERROR(status))
+        return status;
+
+    /* Reached here means there could be write succeed or ignored */
+    if (buffer[0] == DATA_VALUE_ORG)
+        return VAL_STATUS_SUCCESS;
+
+    val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+    /* Resetting boot.state to catch unwanted reboot */
+    if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+        return VAL_STATUS_ERROR;
+    }
+
+    free(buffer);
+    return VAL_STATUS_SUCCESS;
+}
+#else
+
+int32_t server_test_nspe_read_app_rot_heap(void)
+{
+    return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t server_test_nspe_write_app_rot_heap(void)
+{
+    return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+#else
+
 const server_test_t test_i074_server_tests_list[] = {
     NULL,
     server_test_nspe_read_app_rot_heap,
@@ -75,6 +166,7 @@
         return status;
     }
     psa->reply(msg.handle, PSA_SUCCESS);
+
     return VAL_STATUS_SUCCESS;
 }
 
@@ -146,3 +238,5 @@
     return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
 }
 #endif
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i075/test_i075.c b/api-tests/ff/ipc/test_i075/test_i075.c
index fc5dcce..5c7f4d0 100644
--- a/api-tests/ff/ipc/test_i075/test_i075.c
+++ b/api-tests/ff/ipc/test_i075/test_i075.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,93 @@
 
 #define DATA_VALUE 0x1234
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i075_client_tests_list[] = {
+    NULL,
+    client_test_nspe_read_app_rot_mmio,
+    client_test_nspe_write_app_rot_mmio,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+   psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+   if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+   {
+	   val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+       return VAL_STATUS_CALL_FAILED;
+   }
+
+   val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_app_rot_mmio(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = DATA_VALUE;
+
+   val->print(PRINT_TEST, "[Check 1] Test NSPE reading APP-RoT mmio\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read Application RoT mmio address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)app_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_app_rot_mmio(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = DATA_VALUE;
+
+   val->print(PRINT_TEST, "[Check 2] Test NSPE writing APP-RoT mmio\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_NS))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Write Application RoT mmio address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const client_test_t test_i075_client_tests_list[] = {
     NULL,
     client_test_nspe_read_app_rot_mmio,
@@ -56,6 +143,7 @@
    val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
 
    psa->close(handle);
+
    return VAL_STATUS_SUCCESS;
 }
 
@@ -125,5 +213,8 @@
        val->print(PRINT_ERROR, "\tExpected connection to fail but succeed\n", 0);
        return VAL_STATUS_INVALID_HANDLE;
    }
+
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i075/test_supp_i075.c b/api-tests/ff/ipc/test_i075/test_supp_i075.c
index 8b094d5..3f56a5a 100644
--- a/api-tests/ff/ipc/test_i075/test_supp_i075.c
+++ b/api-tests/ff/ipc/test_i075/test_supp_i075.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,6 +28,103 @@
 
 #define DATA_VALUE 0x5467
 
+#if STATELESS_ROT == 1
+
+const server_test_t test_i075_server_tests_list[] = {
+    NULL,
+    server_test_nspe_read_app_rot_mmio,
+    server_test_nspe_write_app_rot_mmio,
+    NULL,
+};
+
+static int32_t get_mmio_addr(addr_t *addr)
+{
+   memory_desc_t           *memory_desc;
+   int32_t                 status = VAL_STATUS_SUCCESS;
+
+   /* Get APP-ROT MMIO address */
+   status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                  MEMORY_SERVER_PARTITION_MMIO, 0),
+                                  (uint8_t **)&memory_desc,
+                                  (uint32_t *)sizeof(memory_desc_t));
+   if (val->err_check_set(TEST_CHECKPOINT_NUM(201), status))
+   {
+       return status;
+   }
+
+   *addr = memory_desc->start;
+   return VAL_STATUS_SUCCESS;
+}
+
+static int32_t send_secure_partition_address(addr_t *addr)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+    {
+        psa->reply(msg.handle, -2);
+        return status;
+    }
+
+    val->print(PRINT_DEBUG, "\tAPP-ROT: Passing 0x%x to NSPE\n", (int)*addr);
+
+    /* Send Application RoT mmio address */
+    psa->write(msg.handle, 0, (void *)addr, sizeof(uint32_t));
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_nspe_read_app_rot_mmio(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    addr_t          app_rot_addr;
+
+    status = get_mmio_addr(&app_rot_addr);
+    if (VAL_ERROR(status))
+        return status;
+
+    /* Initialise mmio address */
+    *(uint32_t *)app_rot_addr = (uint32_t)DATA_VALUE;
+
+    return send_secure_partition_address(&app_rot_addr);
+}
+
+int32_t server_test_nspe_write_app_rot_mmio(void)
+{
+    addr_t          app_rot_addr;
+    int32_t         status = VAL_STATUS_SUCCESS;
+
+
+    status = get_mmio_addr(&app_rot_addr);
+    if (VAL_ERROR(status))
+        return status;
+
+    /* Initialise mmio address */
+    *(uint32_t *)app_rot_addr = (uint32_t)DATA_VALUE;
+    status = send_secure_partition_address(&app_rot_addr);
+    if (VAL_ERROR(status))
+        return status;
+
+    /* Reached here means there could be write succeed or ignored */
+    if (*(uint32_t *)app_rot_addr == (uint32_t)DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+    val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+    /* Resetting boot.state to catch unwanted reboot */
+    if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+        return VAL_STATUS_ERROR;
+    }
+    return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const server_test_t test_i075_server_tests_list[] = {
     NULL,
     server_test_nspe_read_app_rot_mmio,
@@ -146,3 +243,5 @@
     }
     return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i076/test_i076.c b/api-tests/ff/ipc/test_i076/test_i076.c
index 485c451..b4e9a0a 100644
--- a/api-tests/ff/ipc/test_i076/test_i076.c
+++ b/api-tests/ff/ipc/test_i076/test_i076.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,8 @@
 
 #define DATA_VALUE1 0x1234
 
+#if STATELESS_ROT == 1
+
 const client_test_t test_i076_client_tests_list[] = {
     NULL,
     client_test_nspe_read_psa_rot_variable,
@@ -34,7 +36,107 @@
     NULL,
 };
 
-static int32_t get_secure_partition_address(psa_handle_t *handle,
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+                                            addr_t *addr,
+                                            driver_test_fn_id_t test_fn_id)
+{
+   psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+   psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+   if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+   {
+	   val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+       return VAL_STATUS_CALL_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+   if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+   {
+       return VAL_STATUS_CALL_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_psa_rot_variable(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE1;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 1] Test NSPE reading PSA-RoT data\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_DATA_RD)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read PSA RoT global variable address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)psa_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE1)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_psa_rot_variable(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE1;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 2] Test NSPE writing PSA-RoT data\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_DATA_WR)))
+       return VAL_STATUS_ERROR;
+
+   /* Write PSA RoT global variable address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+   /* Handshake with driver to decide write status */
+   if (VAL_ERROR(get_driver_status(&handle)))
+   {
+       return VAL_STATUS_DRIVER_FN_FAILED;
+   }
+
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
+const client_test_t test_i076_client_tests_list[] = {
+    NULL,
+    client_test_nspe_read_psa_rot_variable,
+    client_test_nspe_write_psa_rot_variable,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
                                             addr_t *addr,
                                             driver_test_fn_id_t test_fn_id)
 {
@@ -53,7 +155,6 @@
        val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
        return VAL_STATUS_CALL_FAILED;
    }
-
    return VAL_STATUS_SUCCESS;
 }
 
@@ -140,5 +241,8 @@
    }
 
    close_driver_fn(&handle);
+
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i077/test_i077.c b/api-tests/ff/ipc/test_i077/test_i077.c
index 42f204b..10837f3 100644
--- a/api-tests/ff/ipc/test_i077/test_i077.c
+++ b/api-tests/ff/ipc/test_i077/test_i077.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,8 @@
 
 #define DATA_VALUE1 0x1234
 
+#if STATELESS_ROT == 1
+
 const client_test_t test_i077_client_tests_list[] = {
     NULL,
     client_test_nspe_read_psa_rot_stack,
@@ -34,7 +36,110 @@
     NULL,
 };
 
-static int32_t get_secure_partition_address(psa_handle_t *handle,
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+                                            addr_t *addr,
+                                            driver_test_fn_id_t test_fn_id)
+{
+   /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+   psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+   psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+   if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+   {
+	   val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+       return VAL_STATUS_CALL_FAILED;
+   }
+
+   return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+   if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+   {
+       return VAL_STATUS_CALL_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_psa_rot_stack(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE1;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 1] Test NSPE reading PSA-RoT stack\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_STACK_RD)))
+       return VAL_STATUS_ERROR;
+
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read PSA RoT stack address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)psa_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE1)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_psa_rot_stack(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE1;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 2] Test NSPE writing PSA-RoT stack\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_STACK_WR)))
+       return VAL_STATUS_ERROR;
+
+   /* Write PSA RoT stack address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+   /* Handshake with driver to decide write status */
+   if (VAL_ERROR(get_driver_status(&handle)))
+   {
+       return VAL_STATUS_DRIVER_FN_FAILED;
+   }
+
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
+const client_test_t test_i077_client_tests_list[] = {
+    NULL,
+    client_test_nspe_read_psa_rot_stack,
+    client_test_nspe_write_psa_rot_stack,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
                                             addr_t *addr,
                                             driver_test_fn_id_t test_fn_id)
 {
@@ -55,6 +160,7 @@
    }
 
    return VAL_STATUS_SUCCESS;
+
 }
 
 static int32_t get_driver_status(psa_handle_t *handle)
@@ -71,7 +177,6 @@
    psa->close(*handle);
 }
 
-
 int32_t client_test_nspe_read_psa_rot_stack(caller_security_t caller __UNUSED)
 {
    addr_t       psa_rot_addr;
@@ -141,5 +246,8 @@
    }
 
    close_driver_fn(&handle);
+
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i078/test_i078.c b/api-tests/ff/ipc/test_i078/test_i078.c
index 2e257d9..595a2a5 100644
--- a/api-tests/ff/ipc/test_i078/test_i078.c
+++ b/api-tests/ff/ipc/test_i078/test_i078.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,129 @@
 #define DATA_VALUE     0x12
 #define BUFFER_SIZE    0x4
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i078_client_tests_list[] = {
+    NULL,
+    client_test_nspe_read_psa_rot_heap,
+    client_test_nspe_write_psa_rot_heap,
+    NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t get_secure_partition_address(psa_handle_t *handle,
+                                            addr_t *addr,
+                                            driver_test_fn_id_t test_fn_id)
+{
+   /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+      psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+      psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+      if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+      {
+          val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+          return VAL_STATUS_CALL_FAILED;
+      }
+
+      return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+   if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+   {
+       return VAL_STATUS_CALL_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+
+int32_t client_test_nspe_read_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint8_t      data = DATA_VALUE;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 1] Test NSPE reading PSA-RoT heap\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_HEAP_RD)))
+       return VAL_STATUS_ERROR;
+
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read PSA RoT heap address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint8_t *)psa_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint8_t      data = DATA_VALUE;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 2] Test NSPE writing PSA-RoT heap\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_HEAP_WR)))
+       return VAL_STATUS_ERROR;
+
+   /* Write PSA RoT heap address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint8_t *)psa_rot_addr = (uint8_t)data;
+
+   /* Handshake with driver to decide write status */
+   if (VAL_ERROR(get_driver_status(&handle)))
+   {
+       return VAL_STATUS_DRIVER_FN_FAILED;
+   }
+
+   return VAL_STATUS_SUCCESS;
+}
+#else
+int32_t client_test_nspe_read_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+   val->print(PRINT_TEST, "[Check 1] Test NSPE reading PSA-RoT heap\n", 0);
+   val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+   return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t client_test_nspe_write_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+   val->print(PRINT_TEST, "[Check 2] Test NSPE writing PSA-RoT heap\n", 0);
+   val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+   return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+
+#else
+
 const client_test_t test_i078_client_tests_list[] = {
     NULL,
     client_test_nspe_read_psa_rot_heap,
@@ -143,6 +266,7 @@
    }
 
    close_driver_fn(&handle);
+
    return VAL_STATUS_SUCCESS;
 }
 #else
@@ -160,3 +284,6 @@
    return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
 }
 #endif
+
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i079/test_i079.c b/api-tests/ff/ipc/test_i079/test_i079.c
index 995e850..d98f946 100644
--- a/api-tests/ff/ipc/test_i079/test_i079.c
+++ b/api-tests/ff/ipc/test_i079/test_i079.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,110 @@
 
 #define DATA_VALUE 0x1234
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i079_client_tests_list[] = {
+    NULL,
+    client_test_nspe_read_psa_rot_mmio,
+    client_test_nspe_write_psa_rot_mmio,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+                                            addr_t *addr,
+                                            driver_test_fn_id_t test_fn_id)
+{
+   /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+      psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+      psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+      if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+      {
+          val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+          return VAL_STATUS_CALL_FAILED;
+      }
+
+      return VAL_STATUS_SUCCESS;
+
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+   if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+   {
+       return VAL_STATUS_CALL_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_psa_rot_mmio(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 1] Test NSPE reading PSA-RoT mmio\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_MMIO_RD)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read PSA RoT mmio address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)psa_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_psa_rot_mmio(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 2] Test NSPE writing PSA-RoT mmio\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_MMIO_WR)))
+       return VAL_STATUS_ERROR;
+
+   /* Write PSA RoT mmio address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+   /* Handshake with driver to decide write status */
+   if (VAL_ERROR(get_driver_status(&handle)))
+   {
+       return VAL_STATUS_DRIVER_FN_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const client_test_t test_i079_client_tests_list[] = {
     NULL,
     client_test_nspe_read_psa_rot_mmio,
@@ -83,9 +187,7 @@
                                               &psa_rot_addr,
                                               TEST_ISOLATION_PSA_ROT_MMIO_RD)))
        return VAL_STATUS_ERROR;
-
    close_driver_fn(&handle);
-
    /* Setting boot.state before test check */
    if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
    {
@@ -138,7 +240,8 @@
        close_driver_fn(&handle);
        return VAL_STATUS_DRIVER_FN_FAILED;
    }
-
    close_driver_fn(&handle);
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i080/test_i080.c b/api-tests/ff/ipc/test_i080/test_i080.c
index 1fd25f6..abce5b0 100644
--- a/api-tests/ff/ipc/test_i080/test_i080.c
+++ b/api-tests/ff/ipc/test_i080/test_i080.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,109 @@
 
 #define DATA_VALUE1 0x1234
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i080_client_tests_list[] = {
+    NULL,
+    client_test_app_rot_read_psa_rot_variable,
+    client_test_app_rot_write_psa_rot_variable,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+                                            addr_t *addr,
+                                            driver_test_fn_id_t test_fn_id)
+{
+   /* Execute driver function related to TEST_ISOLATION_PSA_ROT_* */
+      psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+      psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+      if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+      {
+          val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+          return VAL_STATUS_CALL_FAILED;
+      }
+
+      return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+   if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+   {
+       return VAL_STATUS_CALL_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_app_rot_read_psa_rot_variable(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE1;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 1] Test APP-RoT reading PSA-RoT data\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_DATA_RD)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read PSA RoT global variable address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)psa_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE1)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_app_rot_write_psa_rot_variable(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE1;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 2] Test APP-RoT writing PSA-RoT data\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_DATA_WR)))
+       return VAL_STATUS_ERROR;
+
+   /* Write PSA RoT global variable address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+   /* Handshake with driver to decide write status */
+   if (VAL_ERROR(get_driver_status(&handle)))
+   {
+       return VAL_STATUS_DRIVER_FN_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const client_test_t test_i080_client_tests_list[] = {
     NULL,
     client_test_app_rot_read_psa_rot_variable,
@@ -138,7 +241,8 @@
        close_driver_fn(&handle);
        return VAL_STATUS_DRIVER_FN_FAILED;
    }
-
    close_driver_fn(&handle);
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i081/test_i081.c b/api-tests/ff/ipc/test_i081/test_i081.c
index 5f12593..3e53183 100644
--- a/api-tests/ff/ipc/test_i081/test_i081.c
+++ b/api-tests/ff/ipc/test_i081/test_i081.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,111 @@
 
 #define DATA_VALUE1 0x1234
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i081_client_tests_list[] = {
+    NULL,
+    client_test_app_rot_read_psa_rot_stack,
+    client_test_app_rot_write_psa_rot_stack,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+                                            addr_t *addr,
+                                            driver_test_fn_id_t test_fn_id)
+{
+   /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+      psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+      psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+      if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+      {
+          val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+          return VAL_STATUS_CALL_FAILED;
+      }
+
+      return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+   if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+   {
+       return VAL_STATUS_CALL_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_app_rot_read_psa_rot_stack(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE1;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 1] Test APP-RoT reading PSA-RoT stack\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_STACK_RD)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read PSA RoT stack address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)psa_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE1)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_app_rot_write_psa_rot_stack(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE1;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 2] Test APP-RoT writing PSA-RoT stack\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_STACK_WR)))
+       return VAL_STATUS_ERROR;
+
+   /* Write PSA RoT stack address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+   /* Handshake with driver to decide write status */
+   if (VAL_ERROR(get_driver_status(&handle)))
+   {
+       return VAL_STATUS_DRIVER_FN_FAILED;
+   }
+
+
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const client_test_t test_i081_client_tests_list[] = {
     NULL,
     client_test_app_rot_read_psa_rot_stack,
@@ -141,5 +246,8 @@
    }
 
    close_driver_fn(&handle);
+
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i082/test_i082.c b/api-tests/ff/ipc/test_i082/test_i082.c
index 6e56975..e6651cc 100644
--- a/api-tests/ff/ipc/test_i082/test_i082.c
+++ b/api-tests/ff/ipc/test_i082/test_i082.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,125 @@
 #define DATA_VALUE     0x12
 #define BUFFER_SIZE    0x4
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i082_client_tests_list[] = {
+    NULL,
+    client_test_app_rot_read_psa_rot_heap,
+    client_test_app_rot_write_psa_rot_heap,
+    NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t get_secure_partition_address(psa_handle_t *handle,
+                                            addr_t *addr,
+                                            driver_test_fn_id_t test_fn_id)
+{
+   /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+      psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+      psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+      if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+      {
+          val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+          return VAL_STATUS_CALL_FAILED;
+      }
+
+      return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+   if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+   {
+       return VAL_STATUS_CALL_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_app_rot_read_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint8_t      data = DATA_VALUE;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 1] Test APP-RoT reading PSA-RoT heap\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_HEAP_RD)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read PSA RoT heap address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint8_t *)psa_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_app_rot_write_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint8_t      data = DATA_VALUE;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 2] Test APP-RoT writing PSA-RoT heap\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_HEAP_WR)))
+       return VAL_STATUS_ERROR;
+
+   /* Write PSA RoT heap address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint8_t *)psa_rot_addr = (uint8_t)data;
+
+   /* Handshake with driver to decide write status */
+   if (VAL_ERROR(get_driver_status(&handle)))
+   {
+       return VAL_STATUS_DRIVER_FN_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+#else
+int32_t client_test_app_rot_read_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+   val->print(PRINT_TEST, "[Check 1] Test APP-RoT reading PSA-RoT heap\n", 0);
+   val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+   return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t client_test_app_rot_write_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+   val->print(PRINT_TEST, "[Check 2] Test APP-RoT writing PSA-RoT heap\n", 0);
+   val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+   return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+#else
+
 const client_test_t test_i082_client_tests_list[] = {
     NULL,
     client_test_app_rot_read_psa_rot_heap,
@@ -87,7 +206,7 @@
                                               TEST_ISOLATION_PSA_ROT_HEAP_RD)))
        return VAL_STATUS_ERROR;
 
-   close_driver_fn(&handle);
+       close_driver_fn(&handle);
 
    /* Setting boot.state before test check */
    if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
@@ -160,3 +279,5 @@
    return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
 }
 #endif
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i083/test_i083.c b/api-tests/ff/ipc/test_i083/test_i083.c
index 477f91e..8c1bd7f 100644
--- a/api-tests/ff/ipc/test_i083/test_i083.c
+++ b/api-tests/ff/ipc/test_i083/test_i083.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,118 @@
 
 #define DATA_VALUE 0x1234
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i083_client_tests_list[] = {
+    NULL,
+    client_test_app_rot_read_psa_rot_mmio,
+    client_test_app_rot_write_psa_rot_mmio,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+                                            addr_t *addr,
+                                            driver_test_fn_id_t test_fn_id)
+{
+
+   /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+      psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+      psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+      if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+      {
+          val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+          return VAL_STATUS_CALL_FAILED;
+      }
+
+      return VAL_STATUS_SUCCESS;
+
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+   if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+   {
+       return VAL_STATUS_CALL_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_app_rot_read_psa_rot_mmio(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 1] Test APP-RoT reading PSA-RoT mmio\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_MMIO_RD)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read PSA RoT mmio address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)psa_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_app_rot_write_psa_rot_mmio(caller_security_t caller __UNUSED)
+{
+   addr_t       psa_rot_addr;
+   uint32_t     data = DATA_VALUE;
+   psa_handle_t handle = 0;
+
+   val->print(PRINT_TEST, "[Check 2] Test APP-RoT writing PSA-RoT mmio\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&handle,
+                                              &psa_rot_addr,
+                                              TEST_ISOLATION_PSA_ROT_MMIO_WR)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_S))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Write PSA RoT mmio address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+   /* Handshake with driver to decide write status */
+   if (VAL_ERROR(get_driver_status(&handle)))
+   {
+       return VAL_STATUS_DRIVER_FN_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const client_test_t test_i083_client_tests_list[] = {
     NULL,
     client_test_app_rot_read_psa_rot_mmio,
@@ -55,6 +167,7 @@
    }
 
    return VAL_STATUS_SUCCESS;
+
 }
 
 static int32_t get_driver_status(psa_handle_t *handle)
@@ -127,6 +240,13 @@
                                               TEST_ISOLATION_PSA_ROT_MMIO_WR)))
        return VAL_STATUS_ERROR;
 
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_S))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
    /* Write PSA RoT mmio address.
     * This should generate internal fault or ignore the write.
     */
@@ -142,3 +262,5 @@
    close_driver_fn(&handle);
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i084/test_i084.c b/api-tests/ff/ipc/test_i084/test_i084.c
index 50afc94..023b88c 100644
--- a/api-tests/ff/ipc/test_i084/test_i084.c
+++ b/api-tests/ff/ipc/test_i084/test_i084.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,95 @@
 
 #include "test_i084.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i084_client_tests_list[] = {
+    NULL,
+    client_test_sp_read_other_sp_variable,
+    client_test_sp_write_other_sp_variable,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+   /* Get App-RoT address */
+   psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+   if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+   {
+	   val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+       return VAL_STATUS_CALL_FAILED;
+   }
+
+  val->print(PRINT_DEBUG, "\tClient SP: Accessing address 0x%x\n", *addr);
+
+  return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_sp_read_other_sp_variable(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = 0x1234;
+
+   val->print(PRINT_TEST, "[Check 1] Test SP reading other SP data\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read Application RoT global variable address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)app_rot_addr;
+
+   /* Did read ignore? */
+   if (data == 0x1234)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_sp_write_other_sp_variable(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = 0x1234;
+
+   val->print(PRINT_TEST, "[Check 2] Test SP writing other SP data\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_NS))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Write Application RoT global variable address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const client_test_t test_i084_client_tests_list[] = {
     NULL,
     client_test_sp_read_other_sp_variable,
@@ -125,3 +214,5 @@
    }
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i084/test_supp_i084.c b/api-tests/ff/ipc/test_i084/test_supp_i084.c
index 5362919..9e33823 100644
--- a/api-tests/ff/ipc/test_i084/test_supp_i084.c
+++ b/api-tests/ff/ipc/test_i084/test_supp_i084.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -31,6 +31,68 @@
 /* Application RoT data region */
 volatile uint32_t g_test_i084 = DATA_VALUE;
 
+#if STATELESS_ROT == 1
+
+const server_test_t test_i084_server_tests_list[] = {
+    NULL,
+    server_test_sp_read_other_sp_variable,
+    server_test_sp_write_other_sp_variable,
+    NULL,
+};
+
+static int32_t send_secure_partition_address(void)
+{
+    int32_t           status = VAL_STATUS_SUCCESS;
+    volatile uint32_t *addr = &g_test_i084;
+    psa_msg_t         msg = {0};
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+        return status;
+    }
+
+    val->print(PRINT_DEBUG, "\tServer SP: Passing 0x%x to Client SP\n", (int)&g_test_i084);
+
+    /* Send Application RoT data address - global variable */
+    psa->write(msg.handle, 0, (void *)&addr, sizeof(addr));
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_sp_read_other_sp_variable(void)
+{
+    return send_secure_partition_address();
+}
+
+int32_t server_test_sp_write_other_sp_variable(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+
+
+    status = send_secure_partition_address();
+    if (VAL_ERROR(status))
+        return status;
+
+    /* Reached here means there could be write succeed or ignored */
+    if (g_test_i084 == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+    val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+    /* Resetting boot.state to catch unwanted reboot */
+    if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+        return VAL_STATUS_ERROR;
+    }
+    return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const server_test_t test_i084_server_tests_list[] = {
     NULL,
     server_test_sp_read_other_sp_variable,
@@ -114,3 +176,5 @@
     }
     return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i085/test_i085.c b/api-tests/ff/ipc/test_i085/test_i085.c
index 9a3647e..f672fdd 100644
--- a/api-tests/ff/ipc/test_i085/test_i085.c
+++ b/api-tests/ff/ipc/test_i085/test_i085.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,96 @@
 
 #include "test_i085.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i085_client_tests_list[] = {
+    NULL,
+    client_test_sp_read_other_sp_stack,
+    client_test_sp_write_other_sp_stack,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+   /* Get App-RoT address */
+   psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+   if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+   {
+	   val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+       return VAL_STATUS_CALL_FAILED;
+   }
+
+      val->print(PRINT_DEBUG, "\tClient SP: Accessing address 0x%x\n", *addr);
+
+
+      return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_sp_read_other_sp_stack(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = 0x1234;
+
+   val->print(PRINT_TEST, "[Check 1] Test SP reading other SP stack\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read Application RoT stack address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)app_rot_addr;
+
+   /* Did read ignore? */
+   if (data == 0x1234)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_sp_write_other_sp_stack(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = 0x1234;
+
+   val->print(PRINT_TEST, "[Check 2] Test SP writing other SP stack\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_NS))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Write Application RoT stack address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+   return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const client_test_t test_i085_client_tests_list[] = {
     NULL,
     client_test_sp_read_other_sp_stack,
@@ -125,3 +215,5 @@
    }
    return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i085/test_supp_i085.c b/api-tests/ff/ipc/test_i085/test_supp_i085.c
index bf0541a..7c47b49 100644
--- a/api-tests/ff/ipc/test_i085/test_supp_i085.c
+++ b/api-tests/ff/ipc/test_i085/test_supp_i085.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,6 +28,77 @@
 
 #define DATA_VALUE 0x5467
 
+#if STATELESS_ROT == 1
+
+const server_test_t test_i085_server_tests_list[] = {
+    NULL,
+    server_test_sp_read_other_sp_stack,
+    server_test_sp_write_other_sp_stack,
+    NULL,
+};
+
+static int32_t send_secure_partition_address(addr_t *stack)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+        return status;
+    }
+
+    val->print(PRINT_DEBUG, "\tServer SP: Passing 0x%x to Client SP\n", (int)stack);
+
+    /* Send Application RoT stack address */
+    psa->write(msg.handle, 0, (void *)&stack, sizeof(addr_t));
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_sp_read_other_sp_stack(void)
+{
+    /* Application RoT stack - local variable */
+    uint32_t        l_test_i085 = DATA_VALUE;
+    int32_t         status = VAL_STATUS_SUCCESS;
+
+    status = send_secure_partition_address(&l_test_i085);
+
+    /* Dummy print to avoid compiler optimisation on local variable */
+    val->print(PRINT_INFO, "\tData value 0x%x\n", l_test_i085);
+    return status;
+}
+
+int32_t server_test_sp_write_other_sp_stack(void)
+{
+    /* Application RoT stack - local variable */
+    uint32_t        l_test_i085 = DATA_VALUE;
+    int32_t         status = VAL_STATUS_SUCCESS;
+
+
+    status = send_secure_partition_address(&l_test_i085);
+    if (VAL_ERROR(status))
+        return status;
+
+    /* Reached here means there could be write succeed or ignored */
+    if (l_test_i085 == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+    val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+    /* Resetting boot.state to catch unwanted reboot */
+    if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+        return VAL_STATUS_ERROR;
+    }
+    return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const server_test_t test_i085_server_tests_list[] = {
     NULL,
     server_test_sp_read_other_sp_stack,
@@ -120,3 +191,5 @@
     }
     return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i086/test_i086.c b/api-tests/ff/ipc/test_i086/test_i086.c
index 2cb9ce6..2c2fcaa 100644
--- a/api-tests/ff/ipc/test_i086/test_i086.c
+++ b/api-tests/ff/ipc/test_i086/test_i086.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,110 @@
 #define DATA_VALUE     0x12
 #define BUFFER_SIZE    0x4
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i086_client_tests_list[] = {
+    NULL,
+    client_test_sp_read_other_sp_heap,
+    client_test_sp_write_other_sp_heap,
+    NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+   psa_outvec outvec[1] = { {addr, BUFFER_SIZE} };
+   if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+   {
+	   val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+       return VAL_STATUS_CALL_FAILED;
+   }
+
+   val->print(PRINT_DEBUG, "\tClient SP: Accessing address 0x%x\n", *addr);
+
+   return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_sp_read_other_sp_heap(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint8_t  data = DATA_VALUE;
+
+   val->print(PRINT_TEST, "[Check 1] Test SP reading other SP heap\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read Application RoT heap address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint8_t *)app_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_sp_write_other_sp_heap(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint8_t  data = DATA_VALUE;
+
+   val->print(PRINT_TEST, "[Check 2] Test SP writing other SP heap\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_NS))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Write Application RoT heap address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint8_t *)app_rot_addr = (uint8_t)data;
+   return VAL_STATUS_SUCCESS;
+
+}
+#else
+int32_t client_test_sp_read_other_sp_heap(caller_security_t caller __UNUSED)
+{
+   val->print(PRINT_TEST, "[Check 1] Test SP reading other SP heap\n", 0);
+   val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+   return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t client_test_sp_write_other_sp_heap(caller_security_t caller __UNUSED)
+{
+   val->print(PRINT_TEST, "[Check 2] Test SP writing other SP heap\n", 0);
+   val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+   return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+#else
+
 const client_test_t test_i086_client_tests_list[] = {
     NULL,
     client_test_sp_read_other_sp_heap,
@@ -129,6 +233,7 @@
        return VAL_STATUS_INVALID_HANDLE;
    }
    return VAL_STATUS_SUCCESS;
+
 }
 #else
 int32_t client_test_sp_read_other_sp_heap(caller_security_t caller __UNUSED)
@@ -145,3 +250,5 @@
    return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
 }
 #endif
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i086/test_supp_i086.c b/api-tests/ff/ipc/test_i086/test_supp_i086.c
index 2d48686..0b20c05 100644
--- a/api-tests/ff/ipc/test_i086/test_supp_i086.c
+++ b/api-tests/ff/ipc/test_i086/test_supp_i086.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,6 +34,97 @@
 #define DATA_VALUE_ORG 0x11
 #define BUFFER_SIZE    0x4
 
+#if STATELESS_ROT == 1
+
+const server_test_t test_i086_server_tests_list[] = {
+    NULL,
+    server_test_sp_read_other_sp_heap,
+    server_test_sp_write_other_sp_heap,
+    NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t send_secure_partition_address(uint8_t *heap)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+    {
+        psa->reply(msg.handle, -2);
+        return status;
+    }
+
+    val->print(PRINT_DEBUG, "\tServer SP: Passing 0x%x to Client SP\n", (int)heap);
+
+    /* Send Application RoT heap address */
+    psa->write(msg.handle, 0, (void *)&heap, sizeof(BUFFER_SIZE));
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_sp_read_other_sp_heap(void)
+{
+    /* Application RoT heap buffer */
+    uint8_t         *buffer;
+    int32_t          status = VAL_STATUS_SUCCESS;
+
+    buffer = (uint8_t *)malloc(sizeof(uint8_t) * BUFFER_SIZE);
+    memset((uint8_t *)buffer, DATA_VALUE_ORG, BUFFER_SIZE);
+
+    status = send_secure_partition_address(buffer);
+    free(buffer);
+
+    return status;
+}
+
+int32_t server_test_sp_write_other_sp_heap(void)
+{
+    /* Application RoT heap buffer */
+    uint8_t         *buffer;
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+    buffer = (uint8_t *)malloc(sizeof(uint8_t) * BUFFER_SIZE);
+    memset((uint8_t *)buffer, DATA_VALUE_ORG, BUFFER_SIZE);
+
+    status = send_secure_partition_address(buffer);
+    if (VAL_ERROR(status))
+        return status;
+
+    /* Reached here means there could be write succeed or ignored */
+    if (buffer[0] == DATA_VALUE_ORG)
+        return VAL_STATUS_SUCCESS;
+
+    val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+    /* Resetting boot.state to catch unwanted reboot */
+    if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+        return VAL_STATUS_ERROR;
+    }
+
+    free(buffer);
+    return VAL_STATUS_SUCCESS;
+}
+#else
+
+int32_t server_test_sp_read_other_sp_heap(void)
+{
+    return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t server_test_sp_write_other_sp_heap(void)
+{
+    return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+#else
+
 const server_test_t test_i086_server_tests_list[] = {
     NULL,
     server_test_sp_read_other_sp_heap,
@@ -75,6 +166,7 @@
         return status;
     }
     psa->reply(msg.handle, PSA_SUCCESS);
+
     return VAL_STATUS_SUCCESS;
 }
 
@@ -146,3 +238,5 @@
     return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
 }
 #endif
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i087/test_i087.c b/api-tests/ff/ipc/test_i087/test_i087.c
index 90d39cb..864d444 100644
--- a/api-tests/ff/ipc/test_i087/test_i087.c
+++ b/api-tests/ff/ipc/test_i087/test_i087.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,8 @@
 
 #define DATA_VALUE 0x1234
 
+#if STATELESS_ROT == 1
+
 const client_test_t test_i087_client_tests_list[] = {
     NULL,
     client_test_sp_read_other_sp_mmio,
@@ -36,6 +38,97 @@
 
 static int32_t get_secure_partition_address(addr_t *addr)
 {
+   /* Get App-RoT address */
+   psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+   if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+   {
+	   val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+       return VAL_STATUS_CALL_FAILED;
+   }
+
+   val->print(PRINT_DEBUG, "\tClient SP: Accessing address 0x%x\n", *addr);
+
+   return VAL_STATUS_SUCCESS;
+
+}
+
+int32_t client_test_sp_read_other_sp_mmio(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = DATA_VALUE;
+
+   val->print(PRINT_TEST, "[Check 1] Test SP reading other SP mmio\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Read Application RoT mmio address.
+    * This should generate internal fault or ignore the read.
+    */
+   data = *(uint32_t *)app_rot_addr;
+
+   /* Did read ignore? */
+   if (data == DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+   val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_sp_write_other_sp_mmio(caller_security_t caller __UNUSED)
+{
+   addr_t   app_rot_addr;
+   uint32_t data = DATA_VALUE;
+
+   val->print(PRINT_TEST, "[Check 2] Test SP writing other SP mmio\n", 0);
+
+   if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+       return VAL_STATUS_ERROR;
+
+   /* Setting boot.state before test check */
+   if (val->set_boot_flag(BOOT_EXPECTED_NS))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Write Application RoT mmio address.
+    * This should generate internal fault or ignore the write.
+    */
+   *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+   return VAL_STATUS_SUCCESS;
+
+
+}
+
+#else
+
+const client_test_t test_i087_client_tests_list[] = {
+    NULL,
+    client_test_sp_read_other_sp_mmio,
+    client_test_sp_write_other_sp_mmio,
+    NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+
    psa_handle_t            handle = 0;
 
    handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
@@ -126,4 +219,7 @@
        return VAL_STATUS_INVALID_HANDLE;
    }
    return VAL_STATUS_SUCCESS;
+
+
 }
+ #endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i087/test_supp_i087.c b/api-tests/ff/ipc/test_i087/test_supp_i087.c
index 0eedb5e..3fd6eac 100644
--- a/api-tests/ff/ipc/test_i087/test_supp_i087.c
+++ b/api-tests/ff/ipc/test_i087/test_supp_i087.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,6 +28,100 @@
 
 #define DATA_VALUE 0x5467
 
+#if STATELESS_ROT == 1
+
+const server_test_t test_i087_server_tests_list[] = {
+    NULL,
+    server_test_sp_read_other_sp_mmio,
+    server_test_sp_write_other_sp_mmio,
+    NULL,
+};
+
+static int32_t get_mmio_addr(addr_t *addr)
+{
+   memory_desc_t           *memory_desc;
+   int32_t                 status = VAL_STATUS_SUCCESS;
+
+   /* Get APP-ROT MMIO address */
+   status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+                                  MEMORY_SERVER_PARTITION_MMIO, 0),
+                                  (uint8_t **)&memory_desc,
+                                  (uint32_t *)sizeof(memory_desc_t));
+   if (val->err_check_set(TEST_CHECKPOINT_NUM(201), status))
+   {
+       return status;
+   }
+
+   *addr = memory_desc->start;
+   return VAL_STATUS_SUCCESS;
+}
+
+static int32_t send_secure_partition_address(addr_t *addr)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    psa_msg_t       msg = {0};
+
+    status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+    if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+    {
+        psa->reply(msg.handle, -2);
+        return status;
+    }
+
+    val->print(PRINT_DEBUG, "\tServer SP: Passing 0x%x to Client SP\n", (int)*addr);
+
+    /* Send Application RoT mmio address */
+    psa->write(msg.handle, 0, (void *)addr, sizeof(addr_t));
+    psa->reply(msg.handle, PSA_SUCCESS);
+
+    return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_sp_read_other_sp_mmio(void)
+{
+    int32_t         status = VAL_STATUS_SUCCESS;
+    addr_t          app_rot_addr;
+
+    status = get_mmio_addr(&app_rot_addr);
+    if (VAL_ERROR(status))
+        return status;
+
+    return send_secure_partition_address(&app_rot_addr);
+}
+
+int32_t server_test_sp_write_other_sp_mmio(void)
+{
+    addr_t          app_rot_addr;
+    int32_t         status = VAL_STATUS_SUCCESS;
+
+
+    status = get_mmio_addr(&app_rot_addr);
+    if (VAL_ERROR(status))
+        return status;
+
+    /* Initialise mmio address */
+    *(uint32_t *)app_rot_addr = (uint32_t)DATA_VALUE;
+    status = send_secure_partition_address(&app_rot_addr);
+    if (VAL_ERROR(status))
+        return status;
+
+    /* Reached here means there could be write succeed or ignored */
+    if (*(uint32_t *)app_rot_addr == (uint32_t)DATA_VALUE)
+        return VAL_STATUS_SUCCESS;
+
+    val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+    /* Resetting boot.state to catch unwanted reboot */
+    if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+    {
+        val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+        return VAL_STATUS_ERROR;
+    }
+    return VAL_STATUS_SUCCESS;
+}
+
+#else
+
 const server_test_t test_i087_server_tests_list[] = {
     NULL,
     server_test_sp_read_other_sp_mmio,
@@ -143,3 +237,5 @@
     }
     return VAL_STATUS_SUCCESS;
 }
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i090/test_i090.c b/api-tests/ff/ipc/test_i090/test_i090.c
index f7e9bfe..249f52f 100644
--- a/api-tests/ff/ipc/test_i090/test_i090.c
+++ b/api-tests/ff/ipc/test_i090/test_i090.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,83 @@
 
 #include "test_i090.h"
 
+#if STATELESS_ROT == 1
+
+const client_test_t test_i090_client_tests_list[] = {
+    NULL,
+    client_test_psa_call_with_neg_type,
+    NULL,
+};
+
+int32_t client_test_psa_call_with_neg_type(caller_security_t caller)
+{
+   int32_t            status = VAL_STATUS_SUCCESS;
+   psa_status_t       status_of_call;
+   boot_state_t       boot_state;
+
+   val->print(PRINT_TEST,
+            "[Check 1] Test psa_call with negative type\n", 0);
+
+   /*
+    * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+    * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+    * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+    * in this specification. The behavior of the SPM following a Secure Partition panic is
+    * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+    * this situation. Refer PSA-FF for more information on panic.
+    * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+    * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+    * tests continuity and able to jump to next tests. Therefore, each test who checks for
+    * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+    * the test harness function.
+    *
+    * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+    * timeout entries available in target.cfg.
+    *
+    * To decide, a reboot happened as intended by test scenario or it happended
+    * due to other reasons, test is setting a boot signature into non-volatile memory before and
+    * after targeted test check. After a reboot, these boot signatures are being read by the
+    * VAL APIs to decide test status.
+    */
+
+   /* Setting boot.state before test check */
+   boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+   if (val->set_boot_flag(boot_state))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   /* Test check- psa_call with negative type */
+   status_of_call =  psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, -1, NULL, 0, NULL, 0);
+
+   /*
+    * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+    * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+    * For SPE caller, it must panic.
+    */
+   if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+   {
+       return VAL_STATUS_SUCCESS;
+   }
+
+   /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+   val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+   /* Resetting boot.state to catch unwanted reboot */
+   if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+   {
+       val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+       return VAL_STATUS_ERROR;
+   }
+
+   status = VAL_STATUS_SPM_FAILED;
+
+   return status;
+}
+
+#else
+
 const client_test_t test_i090_client_tests_list[] = {
     NULL,
     client_test_psa_call_with_neg_type,
@@ -106,3 +183,5 @@
    psa->close(handle);
    return status;
 }
+
+#endif
diff --git a/api-tests/ff/ipc/test_i090/test_supp_i090.c b/api-tests/ff/ipc/test_i090/test_supp_i090.c
index 7295b59..3570c2b 100644
--- a/api-tests/ff/ipc/test_i090/test_supp_i090.c
+++ b/api-tests/ff/ipc/test_i090/test_supp_i090.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,7 +23,9 @@
 extern val_api_t *val;
 extern psa_api_t *psa;
 
-int32_t server_test_psa_call_with_neg_type();
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_neg_type(void);
 
 const server_test_t test_i090_server_tests_list[] = {
     NULL,
@@ -31,7 +33,38 @@
     NULL,
 };
 
-int32_t server_test_psa_call_with_neg_type()
+int32_t server_test_psa_call_with_neg_type(void)
+{
+    psa_msg_t       msg = {0};
+    psa_signal_t    signals;
+
+wait:
+    signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+    if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+    {
+	goto wait;
+    }
+        if (msg.type == PSA_IPC_CALL)
+        {
+        	/* Control shouldn't have come here */
+        	val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+        	psa->reply(msg.handle, -2);
+        }
+
+    return VAL_STATUS_ERROR;
+}
+
+#else
+
+int32_t server_test_psa_call_with_neg_type(void);
+
+const server_test_t test_i090_server_tests_list[] = {
+    NULL,
+    server_test_psa_call_with_neg_type,
+    NULL,
+};
+
+int32_t server_test_psa_call_with_neg_type(void)
 {
     int32_t         status = VAL_STATUS_SUCCESS;
     psa_msg_t       msg = {0};
@@ -77,3 +110,5 @@
 
     return VAL_STATUS_ERROR;
 }
+
+#endif
diff --git a/api-tests/ff/partition/client_partition.c b/api-tests/ff/partition/client_partition.c
index 7ecea52..ae6b40f 100644
--- a/api-tests/ff/partition/client_partition.c
+++ b/api-tests/ff/partition/client_partition.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2019, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -97,11 +97,13 @@
         /* Server_partition requests client to connect to SERVER_SECURE_CONNECT_ONLY_SID */
         else if (signals & PSA_DOORBELL)
         {
+#if STATELESS_ROT != 1
             if (psa_connect(SERVER_SECURE_CONNECT_ONLY_SID, SERVER_SECURE_CONNECT_ONLY_VERSION)
                 != PSA_ERROR_CONNECTION_REFUSED)
             {
                val_print(PRINT_ERROR, "psa_connect failed \n", 0);
             }
+#endif
             psa_clear();
         }
         else
diff --git a/api-tests/ff/partition/driver_partition.c b/api-tests/ff/partition/driver_partition.c
index 956e370..8823fc2 100644
--- a/api-tests/ff/partition/driver_partition.c
+++ b/api-tests/ff/partition/driver_partition.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,10 +16,15 @@
 **/
 
 #include "val_driver_service_apis.h"
-
 #define DATA_VALUE  0x1111
 #define BUFFER_SIZE 4
 
+#if SPEC_VERSION == 11
+
+#define DRIVER_UART_INTR_SIG DRIVER_UART_INTR_SIG_SIGNAL
+
+#endif
+
 uint32_t g_psa_rot_data = DATA_VALUE;
 
 int32_t driver_test_psa_eoi_with_non_intr_signal(void);
@@ -352,6 +357,7 @@
 
 int32_t driver_test_psa_eoi_with_multiple_signals(void)
 {
+    psa_irq_enable(DRIVER_UART_INTR_SIG);
     /*
      * To test psa_eoi for multiple signals, one of signal should asserted first.
      * Otherwise, check can false pass with psa_eoi_with_unasserted_signal.
@@ -398,7 +404,9 @@
 
 int32_t driver_test_irq_routing(void)
 {
+
     psa_signal_t signals = 0;
+    psa_irq_enable(DRIVER_UART_INTR_SIG);
 
     /* Assert interrupt signal assigned to driver partition */
     val_generate_interrupt();
@@ -406,6 +414,7 @@
     /* Wait for DRIVER_UART_INTR_SIG signal */
     signals = psa_wait(DRIVER_UART_INTR_SIG, PSA_BLOCK);
 
+
     if (signals & DRIVER_UART_INTR_SIG)
     {
         /* Received DRIVER_UART_INTR_SIG signal, now process it */
diff --git a/api-tests/platform/targets/common/nspe/crypto/pal_crypto_intf.c b/api-tests/platform/targets/common/nspe/crypto/pal_crypto_intf.c
index 34ef721..7d8e633 100644
--- a/api-tests/platform/targets/common/nspe/crypto/pal_crypto_intf.c
+++ b/api-tests/platform/targets/common/nspe/crypto/pal_crypto_intf.c
@@ -60,17 +60,14 @@
     size_t                                    nonce_length;
     const uint8_t                            *additional_data;
     size_t                                    additional_data_length;
+#if HOST_GCC_MISSING_CRYPTO_1_0 == 0
     uint8_t                                  *output1;
     size_t                                   output_size1, *p_output_length1;
-
+#endif
 
 
     switch (type)
 	{
-		case PAL_CRYPTO_AEAD_ABORT:
-			aead_operation           = va_arg(valist, psa_aead_operation_t *);
-			return psa_aead_abort(aead_operation);
-			break;
 		case PAL_CRYPTO_AEAD_DECRYPT:
 			key                      = va_arg(valist, psa_key_id_t);
 			alg                      = va_arg(valist, psa_algorithm_t);
@@ -95,14 +92,6 @@
 									output_size,
 									p_output_length);
 			break;
-		case PAL_CRYPTO_AEAD_DECRYPT_SETUP:
-			aead_operation           = va_arg(valist, psa_aead_operation_t *);
-			key                      = va_arg(valist, psa_key_id_t);
-			alg                      = va_arg(valist, psa_algorithm_t);
-			return psa_aead_decrypt_setup(aead_operation,
-										  key,
-										  alg);
-			break;
 		case PAL_CRYPTO_AEAD_ENCRYPT:
 			key                      = va_arg(valist, psa_key_id_t);
 			alg                      = va_arg(valist, psa_algorithm_t);
@@ -127,7 +116,12 @@
 									output_size,
 									p_output_length);
 			break;
-		case PAL_CRYPTO_AEAD_ENCRYPT_SETUP:
+#if HOST_GCC_MISSING_CRYPTO_1_0 == 0
+		case PAL_CRYPTO_AEAD_ABORT:
+			aead_operation           = va_arg(valist, psa_aead_operation_t *);
+			return psa_aead_abort(aead_operation);
+			break;
+		case PAL_CRYPTO_AEAD_DECRYPT_SETUP:
 			aead_operation           = va_arg(valist, psa_aead_operation_t *);
 			key                      = va_arg(valist, psa_key_id_t);
 			alg                      = va_arg(valist, psa_algorithm_t);
@@ -135,6 +129,14 @@
 										  key,
 										  alg);
 			break;
+		case PAL_CRYPTO_AEAD_ENCRYPT_SETUP:
+			aead_operation           = va_arg(valist, psa_aead_operation_t *);
+			key                      = va_arg(valist, psa_key_id_t);
+			alg                      = va_arg(valist, psa_algorithm_t);
+			return psa_aead_encrypt_setup(aead_operation,
+										  key,
+										  alg);
+			break;
 		case PAL_CRYPTO_AEAD_FINISH:
 			aead_operation           = va_arg(valist, psa_aead_operation_t *);
 			output                   = va_arg(valist, uint8_t *);
@@ -161,13 +163,6 @@
 										   output_size,
 										   p_output_length);
 			break;
-		case PAL_CRYPTO_AEAD_OPERATION_INIT:
-			aead_operation           = va_arg(valist, psa_aead_operation_t *);
-			aead_operation_temp      = psa_aead_operation_init();
-			memcpy((void *)aead_operation, (void *)&aead_operation_temp,
-				   sizeof(psa_aead_operation_t));
-			return 0;
-			break;
 		case PAL_CRYPTO_AEAD_SET_LENGTHS:
 			aead_operation           = va_arg(valist, psa_aead_operation_t *);
 			input_length             = va_arg(valist, size_t);
@@ -220,6 +215,14 @@
 								   input,
 								   input_length);
 			break;
+#endif
+		case PAL_CRYPTO_AEAD_OPERATION_INIT:
+			aead_operation           = va_arg(valist, psa_aead_operation_t *);
+			aead_operation_temp      = psa_aead_operation_init();
+			memcpy((void *)aead_operation, (void *)&aead_operation_temp,
+				   sizeof(psa_aead_operation_t));
+			return 0;
+			break;
 		case PAL_CRYPTO_ASYMMETRIC_DECRYPT:
 			key                      = va_arg(valist, psa_key_id_t);
 			alg                      = va_arg(valist, psa_algorithm_t);
@@ -264,6 +267,7 @@
 			cipher_operation         =  va_arg(valist, psa_cipher_operation_t *);
 			return psa_cipher_abort(cipher_operation);
 			break;
+#if HOST_GCC_MISSING_CRYPTO_1_0 == 0
 		case PAL_CRYPTO_CIPHER_DECRYPT:
 			key                      = va_arg(valist, psa_key_id_t);
 			alg                      = va_arg(valist, psa_algorithm_t);
@@ -280,6 +284,7 @@
 									  output_size,
 									  p_output_length);
 			break;
+#endif
 		case PAL_CRYPTO_CIPHER_DECRYPT_SETUP:
 			cipher_operation         = va_arg(valist, psa_cipher_operation_t *);
 			key                      = va_arg(valist, psa_key_id_t);
@@ -288,6 +293,7 @@
 											key,
 											alg);
 			break;
+#if HOST_GCC_MISSING_CRYPTO_1_0 == 0
 		case PAL_CRYPTO_CIPHER_ENCRYPT:
 			key                      = va_arg(valist, psa_key_id_t);
 			alg                      = va_arg(valist, psa_algorithm_t);
@@ -304,6 +310,7 @@
 									  output_size,
 									  p_output_length);
 			break;
+#endif
 		case PAL_CRYPTO_CIPHER_ENCRYPT_SETUP:
 			cipher_operation         = va_arg(valist, psa_cipher_operation_t *);
 			key                      = va_arg(valist, psa_key_id_t);
@@ -692,6 +699,7 @@
 								  input,
 								  input_length);
 			break;
+#if HOST_GCC_MISSING_CRYPTO_1_0 == 0
 		case PAL_CRYPTO_MAC_VERIFY:
 			key                      = va_arg(valist, psa_key_id_t);
 			alg                      = va_arg(valist, psa_algorithm_t);
@@ -706,6 +714,7 @@
 								  input1,
 								  input_length1);
 			break;
+#endif
 		case PAL_CRYPTO_MAC_VERIFY_FINISH:
 			mac_operation            = va_arg(valist, psa_mac_operation_t *);
 			input                    = va_arg(valist, const uint8_t *);
diff --git a/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_config.h
index 4b1f3f3..6112ba7 100755
--- a/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -60,7 +60,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/pal_config.h
index eae2f8e..e3fb297 100644
--- a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/pal_config.h
@@ -59,7 +59,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/pal_config.h
index c9a3597..304ee56 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/pal_config.h
index c9a3597..304ee56 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an539/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an539/nspe/pal_config.h
index 59ff02a..089a0c9 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an539/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an539/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_config.h
index c9a3597..304ee56 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/pal_config.h
index c9a3597..304ee56 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_s1/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_s1/nspe/pal_config.h
index 59ff02a..089a0c9 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_s1/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_s1/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_nrf/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_nrf/nspe/pal_config.h
index 5871659..b05dcba 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_nrf/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_nrf/nspe/pal_config.h
@@ -49,7 +49,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_psoc64/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_psoc64/nspe/pal_config.h
index ffb6a26..58aca3a 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_psoc64/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_psoc64/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_stm32l562e_dk/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_stm32l562e_dk/nspe/pal_config.h
index c9a3597..304ee56 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_stm32l562e_dk/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_stm32l562e_dk/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_config.h b/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_config.h
index 0c956f5..e5578d9 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -44,7 +44,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_driver_ipc_intf.c b/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_driver_ipc_intf.c
index ba4b84b..dbc87a9 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_driver_ipc_intf.c
+++ b/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_driver_ipc_intf.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,7 +24,6 @@
 **/
 int pal_uart_init_ns(uint32_t uart_base_addr)
 {
-    psa_handle_t            print_handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
     uart_fn_type_t          uart_fn = UART_INIT;
 
@@ -32,13 +31,21 @@
                          {&uart_base_addr, sizeof(uart_base_addr)},
                          {NULL, 0}};
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data, 3, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            print_handle = 0;
     print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
     if (PSA_HANDLE_IS_VALID(print_handle))
     {
-        status_of_call = psa_call(print_handle, 0, data, 3, NULL, 0);
-        psa_close(print_handle);
-        if (status_of_call != PSA_SUCCESS)
-            return PAL_STATUS_ERROR;
+    	status_of_call = psa_call(print_handle, 0, data, 3, NULL, 0);
+    	psa_close(print_handle);
+    	if (status_of_call != PSA_SUCCESS)
+    		return PAL_STATUS_ERROR;
 
         return PAL_STATUS_SUCCESS;
     }
@@ -46,6 +53,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -59,7 +67,6 @@
 {
     int             string_len = 0;
     const char      *p = str;
-    psa_handle_t    print_handle = 0;
     psa_status_t    status_of_call = PSA_SUCCESS;
     uart_fn_type_t  uart_fn = UART_PRINT;
 
@@ -72,7 +79,14 @@
     psa_invec data1[3] = {{&uart_fn, sizeof(uart_fn)},
                           {str, string_len+1},
                           {&data, sizeof(data)}};
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data1, 3, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
 
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    print_handle = 0;
     print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
     if (PSA_HANDLE_IS_VALID(print_handle))
     {
@@ -87,6 +101,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -99,7 +114,6 @@
 int pal_wd_timer_init_ns(addr_t base_addr, uint32_t time_us, uint32_t timer_tick_us)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_INIT_SEQ;
@@ -108,6 +122,15 @@
     wd_param.wd_timer_tick_us = timer_tick_us;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+
+    psa_handle_t            handle = 0;
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -122,6 +145,8 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
+
 }
 
 /**
@@ -132,7 +157,6 @@
 int pal_wd_timer_enable_ns(addr_t base_addr)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_ENABLE_SEQ;
@@ -141,6 +165,14 @@
     wd_param.wd_timer_tick_us = 0;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            handle = 0;
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -155,6 +187,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -165,7 +198,6 @@
 int pal_wd_timer_disable_ns(addr_t base_addr)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_DISABLE_SEQ;
@@ -173,6 +205,14 @@
     wd_param.wd_time_us = 0;
     wd_param.wd_timer_tick_us = 0;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            handle = 0;
 
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
@@ -188,6 +228,8 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
+
 }
 
 /**
@@ -201,7 +243,6 @@
 int pal_nvmem_read_ns(addr_t base, uint32_t offset, void *buffer, int size)
 {
     nvmem_param_t   nvmem_param;
-    psa_handle_t    handle = 0;
     psa_status_t    status_of_call = PSA_SUCCESS;
 
     nvmem_param.nvmem_fn_type = NVMEM_READ;
@@ -210,7 +251,14 @@
     nvmem_param.size = size;
     psa_invec invec[1] = {{&nvmem_param, sizeof(nvmem_param)}};
     psa_outvec outvec[1] = {{buffer, size}};
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 1, outvec, 1);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
 
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    handle = 0;
     handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -225,6 +273,8 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
+
 }
 
 /**
@@ -238,7 +288,7 @@
 int pal_nvmem_write_ns(addr_t base, uint32_t offset, void *buffer, int size)
 {
     nvmem_param_t   nvmem_param;
-    psa_handle_t    handle = 0;
+
     psa_status_t    status_of_call = PSA_SUCCESS;
 
     nvmem_param.nvmem_fn_type = NVMEM_WRITE;
@@ -246,7 +296,14 @@
     nvmem_param.offset = offset;
     nvmem_param.size = size;
     psa_invec invec[2] = {{&nvmem_param, sizeof(nvmem_param)}, {buffer, size}};
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 2, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
 
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    handle = 0;
     handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -261,6 +318,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_config.h b/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_config.h
index 0c956f5..e5578d9 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -44,7 +44,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_driver_ipc_intf.c b/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_driver_ipc_intf.c
index ba4b84b..9f8b708 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_driver_ipc_intf.c
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_driver_ipc_intf.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,7 +24,6 @@
 **/
 int pal_uart_init_ns(uint32_t uart_base_addr)
 {
-    psa_handle_t            print_handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
     uart_fn_type_t          uart_fn = UART_INIT;
 
@@ -32,6 +31,14 @@
                          {&uart_base_addr, sizeof(uart_base_addr)},
                          {NULL, 0}};
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data, 3, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            print_handle = 0;
     print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
     if (PSA_HANDLE_IS_VALID(print_handle))
     {
@@ -46,6 +53,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -59,7 +67,6 @@
 {
     int             string_len = 0;
     const char      *p = str;
-    psa_handle_t    print_handle = 0;
     psa_status_t    status_of_call = PSA_SUCCESS;
     uart_fn_type_t  uart_fn = UART_PRINT;
 
@@ -73,6 +80,14 @@
                           {str, string_len+1},
                           {&data, sizeof(data)}};
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data1, 3, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    print_handle = 0;
     print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
     if (PSA_HANDLE_IS_VALID(print_handle))
     {
@@ -87,6 +102,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -99,7 +115,6 @@
 int pal_wd_timer_init_ns(addr_t base_addr, uint32_t time_us, uint32_t timer_tick_us)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_INIT_SEQ;
@@ -108,6 +123,14 @@
     wd_param.wd_timer_tick_us = timer_tick_us;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            handle = 0;
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -122,6 +145,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -132,7 +156,6 @@
 int pal_wd_timer_enable_ns(addr_t base_addr)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_ENABLE_SEQ;
@@ -141,6 +164,14 @@
     wd_param.wd_timer_tick_us = 0;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            handle = 0;
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -155,6 +186,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -165,7 +197,6 @@
 int pal_wd_timer_disable_ns(addr_t base_addr)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_DISABLE_SEQ;
@@ -174,6 +205,14 @@
     wd_param.wd_timer_tick_us = 0;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            handle = 0;
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -188,6 +227,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -201,7 +241,6 @@
 int pal_nvmem_read_ns(addr_t base, uint32_t offset, void *buffer, int size)
 {
     nvmem_param_t   nvmem_param;
-    psa_handle_t    handle = 0;
     psa_status_t    status_of_call = PSA_SUCCESS;
 
     nvmem_param.nvmem_fn_type = NVMEM_READ;
@@ -211,6 +250,14 @@
     psa_invec invec[1] = {{&nvmem_param, sizeof(nvmem_param)}};
     psa_outvec outvec[1] = {{buffer, size}};
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 1, outvec, 1);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    handle = 0;
     handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -225,6 +272,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -238,7 +286,6 @@
 int pal_nvmem_write_ns(addr_t base, uint32_t offset, void *buffer, int size)
 {
     nvmem_param_t   nvmem_param;
-    psa_handle_t    handle = 0;
     psa_status_t    status_of_call = PSA_SUCCESS;
 
     nvmem_param.nvmem_fn_type = NVMEM_WRITE;
@@ -247,6 +294,14 @@
     nvmem_param.size = size;
     psa_invec invec[2] = {{&nvmem_param, sizeof(nvmem_param)}, {buffer, size}};
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 2, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    handle = 0;
     handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -261,6 +316,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_config.h b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_config.h
index 5dc14f1..7957254 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_config.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -44,7 +44,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_driver_ipc_intf.c b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_driver_ipc_intf.c
index 7c3b02f..47768d7 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_driver_ipc_intf.c
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_driver_ipc_intf.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,7 +24,6 @@
 **/
 int pal_uart_init_ns(uint32_t uart_base_addr)
 {
-    psa_handle_t            print_handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
     uart_fn_type_t          uart_fn = UART_INIT;
 
@@ -32,6 +31,14 @@
                          {&uart_base_addr, sizeof(uart_base_addr)},
                          {NULL, 0} };
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data, 3, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            print_handle = 0;
     print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
     if (PSA_HANDLE_IS_VALID(print_handle))
     {
@@ -46,6 +53,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -59,7 +67,6 @@
 {
     int             string_len = 0;
     const char      *p = str;
-    psa_handle_t    print_handle = 0;
     psa_status_t    status_of_call = PSA_SUCCESS;
     uart_fn_type_t  uart_fn = UART_PRINT;
 
@@ -73,6 +80,14 @@
                           {str, string_len+1},
                           {&data, sizeof(data)} };
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data1, 3, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    print_handle = 0;
     print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
     if (PSA_HANDLE_IS_VALID(print_handle))
     {
@@ -87,6 +102,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -99,7 +115,6 @@
 int pal_wd_timer_init_ns(addr_t base_addr, uint32_t time_us, uint32_t timer_tick_us)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_INIT_SEQ;
@@ -108,6 +123,15 @@
     wd_param.wd_timer_tick_us = timer_tick_us;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+
+    psa_handle_t            handle = 0;
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -122,6 +146,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -132,7 +157,6 @@
 int pal_wd_timer_enable_ns(addr_t base_addr)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_ENABLE_SEQ;
@@ -141,6 +165,14 @@
     wd_param.wd_timer_tick_us = 0;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            handle = 0;
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -155,6 +187,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -165,7 +198,6 @@
 int pal_wd_timer_disable_ns(addr_t base_addr)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_DISABLE_SEQ;
@@ -174,6 +206,14 @@
     wd_param.wd_timer_tick_us = 0;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            handle = 0;
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -188,6 +228,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -201,7 +242,6 @@
 int pal_nvmem_read_ns(addr_t base, uint32_t offset, void *buffer, int size)
 {
     nvmem_param_t   nvmem_param;
-    psa_handle_t    handle = 0;
     psa_status_t    status_of_call = PSA_SUCCESS;
 
     nvmem_param.nvmem_fn_type = NVMEM_READ;
@@ -210,7 +250,14 @@
     nvmem_param.size = size;
     psa_invec invec[1] = {{&nvmem_param, sizeof(nvmem_param)} };
     psa_outvec outvec[1] = {{buffer, size} };
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 1, outvec, 1);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
 
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    handle = 0;
     handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -225,6 +272,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -238,7 +286,6 @@
 int pal_nvmem_write_ns(addr_t base, uint32_t offset, void *buffer, int size)
 {
     nvmem_param_t   nvmem_param;
-    psa_handle_t    handle = 0;
     psa_status_t    status_of_call = PSA_SUCCESS;
 
     nvmem_param.nvmem_fn_type = NVMEM_WRITE;
@@ -246,7 +293,14 @@
     nvmem_param.offset = offset;
     nvmem_param.size = size;
     psa_invec invec[2] = {{&nvmem_param, sizeof(nvmem_param)}, {buffer, size} };
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 2, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
 
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    handle = 0;
     handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -261,6 +315,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/target.cfg b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/target.cfg
index 2e5ac7f..f9ac826 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/target.cfg
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/target.cfg
@@ -28,11 +28,11 @@
 watchdog.0.size = 0xFFF;
 watchdog.0.intr_id = 0xFF;
 watchdog.0.permission = TYPE_READ_WRITE;
-watchdog.0.num_of_tick_per_micro_sec = 0x3;         //(sys_feq/1000000)
-watchdog.0.timeout_in_micro_sec_low = 0xF4240;      //1.0  sec :  1 * 1000 * 1000
-watchdog.0.timeout_in_micro_sec_medium = 0x1E8480;  //2.0  sec :  2 * 1000 * 1000
-watchdog.0.timeout_in_micro_sec_high = 0x4C4B40;    //5.0  sec :  5 * 1000 * 1000
-watchdog.0.timeout_in_micro_sec_crypto = 0x1312D00; //18.0 sec : 18 * 1000 * 1000
+watchdog.0.num_of_tick_per_micro_sec = 0x3;          //(sys_feq/1000000)
+watchdog.0.timeout_in_micro_sec_low = 20000000;      //20.0  sec :  20 * 1000 * 1000
+watchdog.0.timeout_in_micro_sec_medium = 20000000;   //20.0  sec :  20 * 1000 * 1000
+watchdog.0.timeout_in_micro_sec_high = 20000000;     //20.0  sec :  20 * 1000 * 1000
+watchdog.0.timeout_in_micro_sec_crypto = 20000000;   //20.0 sec :   20 * 1000 * 1000
 
 // Range of 1KB Non-volatile memory to preserve data over reset. Ex, NVRAM and FLASH
 nvmem.num =1;
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_config.h b/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_config.h
index d0b8ac0..fc2eed3 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_config.h
@@ -44,7 +44,7 @@
 #define CRYPTO_VERSION_BETA3
 
 /* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
 
 /*
  * Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_driver_ipc_intf.c b/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_driver_ipc_intf.c
index bcf7ccf..47768d7 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_driver_ipc_intf.c
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_driver_ipc_intf.c
@@ -24,7 +24,6 @@
 **/
 int pal_uart_init_ns(uint32_t uart_base_addr)
 {
-    psa_handle_t            print_handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
     uart_fn_type_t          uart_fn = UART_INIT;
 
@@ -32,6 +31,14 @@
                          {&uart_base_addr, sizeof(uart_base_addr)},
                          {NULL, 0} };
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data, 3, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            print_handle = 0;
     print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
     if (PSA_HANDLE_IS_VALID(print_handle))
     {
@@ -46,6 +53,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -59,7 +67,6 @@
 {
     int             string_len = 0;
     const char      *p = str;
-    psa_handle_t    print_handle = 0;
     psa_status_t    status_of_call = PSA_SUCCESS;
     uart_fn_type_t  uart_fn = UART_PRINT;
 
@@ -73,6 +80,14 @@
                           {str, string_len+1},
                           {&data, sizeof(data)} };
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data1, 3, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    print_handle = 0;
     print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
     if (PSA_HANDLE_IS_VALID(print_handle))
     {
@@ -87,6 +102,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -99,7 +115,6 @@
 int pal_wd_timer_init_ns(addr_t base_addr, uint32_t time_us, uint32_t timer_tick_us)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_INIT_SEQ;
@@ -108,6 +123,15 @@
     wd_param.wd_timer_tick_us = timer_tick_us;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+
+    psa_handle_t            handle = 0;
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -122,6 +146,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -132,7 +157,6 @@
 int pal_wd_timer_enable_ns(addr_t base_addr)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_ENABLE_SEQ;
@@ -141,6 +165,14 @@
     wd_param.wd_timer_tick_us = 0;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            handle = 0;
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -155,6 +187,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -165,7 +198,6 @@
 int pal_wd_timer_disable_ns(addr_t base_addr)
 {
     wd_param_t              wd_param;
-    psa_handle_t            handle = 0;
     psa_status_t            status_of_call = PSA_SUCCESS;
 
     wd_param.wd_fn_type = WD_DISABLE_SEQ;
@@ -174,6 +206,14 @@
     wd_param.wd_timer_tick_us = 0;
     psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
 
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
+
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t            handle = 0;
     handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -188,6 +228,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -201,7 +242,6 @@
 int pal_nvmem_read_ns(addr_t base, uint32_t offset, void *buffer, int size)
 {
     nvmem_param_t   nvmem_param;
-    psa_handle_t    handle = 0;
     psa_status_t    status_of_call = PSA_SUCCESS;
 
     nvmem_param.nvmem_fn_type = NVMEM_READ;
@@ -210,7 +250,14 @@
     nvmem_param.size = size;
     psa_invec invec[1] = {{&nvmem_param, sizeof(nvmem_param)} };
     psa_outvec outvec[1] = {{buffer, size} };
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 1, outvec, 1);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
 
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    handle = 0;
     handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -225,6 +272,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
@@ -238,7 +286,6 @@
 int pal_nvmem_write_ns(addr_t base, uint32_t offset, void *buffer, int size)
 {
     nvmem_param_t   nvmem_param;
-    psa_handle_t    handle = 0;
     psa_status_t    status_of_call = PSA_SUCCESS;
 
     nvmem_param.nvmem_fn_type = NVMEM_WRITE;
@@ -246,7 +293,14 @@
     nvmem_param.offset = offset;
     nvmem_param.size = size;
     psa_invec invec[2] = {{&nvmem_param, sizeof(nvmem_param)}, {buffer, size} };
+#if STATELESS_ROT == 1
+    status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 2, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    	return PAL_STATUS_ERROR;
 
+    return PAL_STATUS_SUCCESS;
+#else
+    psa_handle_t    handle = 0;
     handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
     if (PSA_HANDLE_IS_VALID(handle))
     {
@@ -261,6 +315,7 @@
     {
         return PAL_STATUS_ERROR;
     }
+#endif
 }
 
 /**
diff --git a/api-tests/tools/cmake/compiler/HOST_GCC.cmake b/api-tests/tools/cmake/compiler/HOST_GCC.cmake
index 35c9d54..2071b12 100644
--- a/api-tests/tools/cmake/compiler/HOST_GCC.cmake
+++ b/api-tests/tools/cmake/compiler/HOST_GCC.cmake
@@ -1,5 +1,5 @@
 #/** @file
-# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
+# * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
 # * SPDX-License-Identifier : Apache-2.0
 # *
 # * Licensed under the Apache License, Version 2.0 (the "License");
@@ -50,3 +50,4 @@
 	set(CMAKE_C_FLAGS	"-g -Wall -Werror -Werror -std=c99")
 	message(STATUS "[PSA] : ${_LNG}  compiler used '${CMAKE_${_LNG}_COMPILER}'")
 endforeach()
+add_definitions(-DHOST_GCC_MISSING_CRYPTO_1_0=1)
diff --git a/api-tests/tools/utils/README.md b/api-tests/tools/utils/README.md
index a22f14d..01adabe 100644
--- a/api-tests/tools/utils/README.md
+++ b/api-tests/tools/utils/README.md
@@ -4,9 +4,34 @@
 Prerequisites :
 Python 3.7 with Tkinter Package
 
-Execution : python log_analysis_tool.py
-
 This Directory contain script for analysis of log result.
-It wil take test logs as input and display results in tree format.
-1. By double clicking on TEST it will show detail description of that test.
-2. Right click of the parent node of tree and select summary option it will show summary result of that node.
+Log Analysis Tool wil take test logs as input and display results in tree format. It will show the tests accroding to the APIs.
+
+## How to execute:
+```
+python log_analysis_tool.py
+```
+
+By running the script GUI will be open.
+
+## How to use GUI Tool:
+1. When GUI is opened on top left side Menu option will come.
+
+2. From Menu there will be 3 submenu options.
+	Select Log File: For selecting single test suite log file.
+	Select Log Folder: For selecting folder for multiple test suite files.
+	Exit: For exiting from GUI Tool.
+   Note: While selecting make sure you have only log files in selected folder and not more than one log file for one test suite.
+
+3. The test suite tree node will be generated. User can expand and collapse the nodes.
+
+4. By double clicking on TEST node, it will show detail description of that test on right hand side of window.
+
+5. By right clicking on any node, menu will be open. This menu will contain three options.
+	Summary: Display summary result of the node on the right hand side window.
+	Expand: For expanding all nodes for all level from current expanding level.
+	Collapse: For collapsing all nodes for all level from current collapsing level.
+   Note: The node which has not any leaf nodes will not perform any of right click menu functionality.
+
+
+*Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.*
diff --git a/api-tests/val/nspe/val_dispatcher.c b/api-tests/val/nspe/val_dispatcher.c
index 4a256b9..57de976 100644
--- a/api-tests/val/nspe/val_dispatcher.c
+++ b/api-tests/val/nspe/val_dispatcher.c
@@ -33,7 +33,7 @@
     @param        - None
     @return       - None
 **/
-static void val_print_api_version(void)
+__attribute__((unused)) static void val_print_api_version(void)
 {
 #ifdef CRYPTO
     val_print(PRINT_ALWAYS, " %d.", PSA_CRYPTO_API_VERSION_MAJOR);
@@ -228,7 +228,7 @@
             {
                 val_print(PRINT_ALWAYS, "\nRunning.. ", 0);
                 val_print(PRINT_ALWAYS, val_get_comp_name(test_id), 0);
-				val_print_api_version();
+			//	val_print_api_version();
                 val_print(PRINT_ALWAYS, "\n******************************************\n", 0);
             }
 
diff --git a/api-tests/val/nspe/val_entry.h b/api-tests/val/nspe/val_entry.h
index b8d6b6f..ba333ef 100644
--- a/api-tests/val/nspe/val_entry.h
+++ b/api-tests/val/nspe/val_entry.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,7 +21,7 @@
 #include "val_framework.h"
 
 #define PSA_ACS_MAJOR_VER    1
-#define PSA_ACS_MINOR_VER    1
+#define PSA_ACS_MINOR_VER    2
 
 /**
     @brief    - PSA Test Suite C main function, does VAL init and calls test dispatcher
diff --git a/api-tests/val/nspe/val_framework.c b/api-tests/val/nspe/val_framework.c
index 9e7df32..ec6b1cc 100644
--- a/api-tests/val/nspe/val_framework.c
+++ b/api-tests/val/nspe/val_framework.c
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -154,8 +154,14 @@
             {
                 /* Handshake with server tests */
                 test_info.block_num = i;
+#if STATELESS_ROT == 1
+                status = val_execute_secure_test_func(&handle, test_info,
+                                                                SERVER_TEST_DISPATCHER_HANDLE);
+                handle = (int32_t)SERVER_TEST_DISPATCHER_HANDLE;
+#else
                 status = val_execute_secure_test_func(&handle, test_info,
                                                 SERVER_TEST_DISPATCHER_SID);
+#endif
                 if (VAL_ERROR(status))
                 {
                     val_set_status(RESULT_FAIL(status));
@@ -258,7 +264,12 @@
        }
 
        /* switch to secure client */
+#if STATELESS_ROT == 1
+       status = val_execute_secure_test_func(&handle, test_info, CLIENT_TEST_DISPATCHER_HANDLE);
+       handle = (int32_t)CLIENT_TEST_DISPATCHER_HANDLE;
+#else
        status = val_execute_secure_test_func(&handle, test_info, CLIENT_TEST_DISPATCHER_SID);
+#endif
        if (VAL_ERROR(status))
        {
            goto exit;
@@ -299,12 +310,25 @@
     @param    - sid        : RoT service to be connected. Partition dispatcher sid
     @return   - val_status_t
 **/
-val_status_t val_execute_secure_test_func(psa_handle_t *handle, test_info_t test_info, uint32_t sid)
+val_status_t val_execute_secure_test_func(__attribute__((unused)) psa_handle_t *handle,
+		                                           test_info_t test_info, uint32_t sid)
 {
     uint32_t        test_data;
     val_status_t    status = VAL_STATUS_SUCCESS;
     psa_status_t    status_of_call = PSA_SUCCESS;
+#if STATELESS_ROT == 1
+    test_data = ((uint32_t)(test_info.test_num) | ((uint32_t)(test_info.block_num) << BLOCK_NUM_POS)
+                        | ((uint32_t)(TEST_EXECUTE_FUNC) << ACTION_POS));
+    psa_invec data[1] = { {&test_data, sizeof(test_data)} };
 
+    status_of_call = psa_call(sid, 0, data, 1, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    {
+    	status = VAL_STATUS_CALL_FAILED;
+        val_print(PRINT_ERROR, "Call to dispatch SF failed. Status=%x\n", status_of_call);
+    }
+    return status;
+#else
     *handle = psa_connect(sid, 1);
     if (*handle > 0)
     {
@@ -327,6 +351,7 @@
     }
 
     return status;
+#endif
 }
 
 /**
@@ -352,8 +377,9 @@
         status = VAL_STATUS_CALL_FAILED;
         val_print(PRINT_ERROR, "Call to dispatch SF failed. Status=%x\n", status_of_call);
     }
-
+#if STATELESS_ROT != 1
     psa_close(*handle);
+#endif
     return status;
 }
 #endif
diff --git a/api-tests/val/spe/val_partition_common.h b/api-tests/val/spe/val_partition_common.h
index 0b1d6be..f52c340 100644
--- a/api-tests/val/spe/val_partition_common.h
+++ b/api-tests/val/spe/val_partition_common.h
@@ -1,5 +1,5 @@
 /** @file
- * Copyright (c) 2018-2019, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
  * SPDX-License-Identifier : Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -102,7 +102,7 @@
 {
     int             string_len = 0;
     char            *p = string;
-    psa_handle_t    print_handle = 0;
+
     psa_status_t    status_of_call = PSA_SUCCESS;
     val_status_t    status = VAL_STATUS_SUCCESS;
     uart_fn_type_t  uart_fn = UART_PRINT;
@@ -117,8 +117,17 @@
         string_len++;
         p++;
     }
-
     psa_invec data1[3] = {{&uart_fn, sizeof(uart_fn)}, {string, string_len+1}, {&data, sizeof(data)}};
+#if STATELESS_ROT == 1
+
+    status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data1, 3, NULL, 0);
+    if (status_of_call != PSA_SUCCESS)
+    {
+    	status = VAL_STATUS_CALL_FAILED;
+    }
+    return status;
+#else
+    psa_handle_t    print_handle = 0;
     print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
 
     if (PSA_HANDLE_IS_VALID(print_handle))
@@ -135,6 +144,7 @@
     }
     psa_close(print_handle);
     return status;
+#endif
 }
 
 /**
@@ -332,7 +342,12 @@
 
         /* Handshake with server tests */
         test_info.block_num = i;
+#if STATELESS_ROT == 1
+        status = val_execute_secure_test_func(&handle, test_info, SERVER_TEST_DISPATCHER_HANDLE);
+        handle = (int32_t)SERVER_TEST_DISPATCHER_HANDLE;
+#else
         status = val_execute_secure_test_func(&handle, test_info, SERVER_TEST_DISPATCHER_SID);
+#endif
         if (VAL_ERROR(status))
         {
             val_print(PRINT_ERROR, "[Check %d] START\n", i);
@@ -379,14 +394,26 @@
     @param    - sid        : RoT service to be connected. Partition dispatcher sid
     @return   - val_status_t
 **/
-STATIC_DECLARE val_status_t val_execute_secure_test_func(psa_handle_t *handle,
-                                                         test_info_t test_info,
-                                                         uint32_t sid)
+STATIC_DECLARE val_status_t val_execute_secure_test_func
+               (__attribute__((unused)) psa_handle_t *handle, test_info_t test_info, uint32_t sid)
 {
     uint32_t        test_data;
     val_status_t    status = VAL_STATUS_SUCCESS;
     psa_status_t    status_of_call = PSA_SUCCESS;
+#if STATELESS_ROT == 1
+    test_data = ((uint32_t)(test_info.test_num) | ((uint32_t)(test_info.block_num) << BLOCK_NUM_POS)
+                    | ((uint32_t)(TEST_EXECUTE_FUNC) << ACTION_POS));
+    psa_invec data[1] = { {&test_data, sizeof(test_data)} };
 
+    status_of_call = psa_call(sid, 0, data, 1, NULL, 0);
+
+    if (status_of_call != PSA_SUCCESS)
+    {
+    	status = VAL_STATUS_CALL_FAILED;
+        val_print(PRINT_ERROR, "Call to dispatch SF failed. Status=%x\n", status_of_call);
+    }
+    return status;
+#else
     *handle = psa_connect(sid, 1);
 
     if (*handle < 0)
@@ -408,6 +435,7 @@
         psa_close(*handle);
     }
     return status;
+#endif
 }
 
 /**
@@ -433,8 +461,9 @@
         status = VAL_STATUS_CALL_FAILED;
         val_print(PRINT_ERROR, "Call to dispatch SF failed. Status=%x\n", status_of_call);
     }
-
+#if STATELESS_ROT != 1
     psa_close(*handle);
+#endif
     return status;
 }
 
@@ -471,7 +500,7 @@
 STATIC_DECLARE val_status_t val_nvmem_write(uint32_t offset, void *buffer, int size)
 {
    nvmem_param_t   nvmem_param;
-   psa_handle_t    handle = 0;
+
    psa_status_t    status_of_call = PSA_SUCCESS;
    val_status_t    status = VAL_STATUS_SUCCESS;
    memory_desc_t   *memory_desc;
@@ -491,6 +520,16 @@
    nvmem_param.size = size;
    psa_invec invec[2] = {{&nvmem_param, sizeof(nvmem_param)}, {buffer, size}};
 
+#if STATELESS_ROT == 1
+   status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 2, NULL, 0);
+   if (status_of_call != PSA_SUCCESS)
+   {
+	   return VAL_STATUS_CALL_FAILED;
+   }
+   return VAL_STATUS_SUCCESS;
+
+#else
+   psa_handle_t    handle = 0;
    handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
    if (PSA_HANDLE_IS_VALID(handle))
    {
@@ -507,6 +546,7 @@
    }
    psa_close(handle);
    return VAL_STATUS_SUCCESS;
+#endif
 }
 
 /**
diff --git a/secure-debug/CMakeLists.txt b/secure-debug/CMakeLists.txt
new file mode 100644
index 0000000..8266ccb
--- /dev/null
+++ b/secure-debug/CMakeLists.txt
@@ -0,0 +1,221 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * 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.
+
+# Set the minimum required version of CMake for the project
+cmake_minimum_required(VERSION 3.10)
+# cmake_policy
+cmake_policy(SET CMP0057 NEW)
+PROJECT (psa_adac_tests)
+
+# Find python interpreter version 3 or greater
+find_package(PythonInterp 3 REQUIRED)
+
+get_filename_component(PSA_ROOT_DIR . ABSOLUTE)
+include(${PSA_ROOT_DIR}/tools/cmake/common/Utils.cmake)
+
+set(CMAKE_C_STANDARD 99)
+set(CMAKE_C_EXTENSIONS Off)
+set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_EXTENSIONS Off)
+
+if(NOT DEFINED RDDI_LIB)
+    set(DEPENDS_INC_PATH ${CMAKE_SOURCE_DIR}/platform/native/include)
+else()
+    set(DEPENDS_INC_PATH ${CMAKE_SOURCE_DIR}/platform/rddi/include)
+
+    if(WIN32)
+        set(DEPENDS_LIB_PATH ${CMAKE_SOURCE_DIR}/depends/rddi/win_32-x86_64)
+    else()
+        set(DEPENDS_LIB_PATH ${CMAKE_SOURCE_DIR}/depends/rddi/linux-x86_64)
+    endif()
+endif()
+
+if(NOT DEFINED PSA_ADAC_ROOT)
+    get_filename_component(PSA_ADAC_ROOT ${CMAKE_SOURCE_DIR}/psa-adac ABSOLUTE)
+endif()
+include(${PSA_ADAC_ROOT}/cmake/psa_adac.cmake OPTIONAL)
+
+configure_file(${PSA_ADAC_ROOT}/psa-adac/core/include/psa_adac_config.h.in psa_adac_config.h)
+include_directories (
+    ${DEPENDS_INC_PATH}
+    ${CMAKE_BINARY_DIR}
+    ${PSA_ADAC_ROOT}/psa-adac/core/include
+    ${PSA_ADAC_ROOT}/ports/include
+    )
+
+set(MBEDTLS_CONFIG_FILE "${PSA_ADAC_ROOT}/ports/crypto/manager-crypto-config.h")
+add_compile_options(-DMBEDTLS_CONFIG_FILE="${MBEDTLS_CONFIG_FILE}")
+if (UNIX)
+    add_compile_options(-fPIC -fpic)
+else ()
+    # Silence warning about standard C APIs not being secure.
+    add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
+endif ()
+
+# Generate ADAC LIB
+add_subdirectory(${PSA_ADAC_ROOT}/psa-adac/core adac_core)
+add_subdirectory(${PSA_ADAC_ROOT}/psa-adac/sdm adac_sdm)
+add_subdirectory(${PSA_ADAC_ROOT}/ports/crypto/psa-crypto psa_adac_psa_crypto)
+
+set(ADAC_LIBS psa_adac_sdm psa_adac_core psa_adac_psa_crypto mbedcrypto)
+
+if(NOT DEFINED TFM_PROFILE)
+	message(STATUS "[PSA] : Building Default profile")
+list(APPEND PSA_SUITES  #PSA_SUITES
+	"ADAC"
+)
+endif()
+
+# list of VERBOSE options
+list(APPEND PSA_VERBOSE_OPTIONS 1 2 3 4 5)
+
+message(STATUS "[PSA] : ----------Process input arguments- start-------------")
+
+# Check for TARGET command line argument
+_check_arguments("TARGET")
+# Check for SUITE command line argument
+_check_arguments("SUITE")
+
+string(TOLOWER ${SUITE} SUITE_LOWER)
+
+# Check for valid targets
+_get_sub_dir_list(PSA_TARGET_LIST ${PSA_ROOT_DIR}/platform)
+if(NOT ${TARGET} IN_LIST PSA_TARGET_LIST)
+	message(FATAL_ERROR "[PSA] : Error: Unsupported value for -DTARGET=${TARGET}, supported targets are : ${PSA_TARGET_LIST}")
+else()
+    message(STATUS "[PSA] : TARGET is set to ${TARGET}")
+endif()
+
+# Check for the presence of required test suite directories
+if(NOT IS_DIRECTORY ${PSA_ROOT_DIR}/tests)
+	message(STATUS "[PSA] : Error: Could not find architecture test suite directories in psa root path ${PSA_ROOT_DIR}")
+endif()
+
+# Check for valid suite cmake argument passed
+if(NOT ${SUITE} IN_LIST PSA_SUITES)
+	message(FATAL_ERROR "[PSA] : Error: Unsupported value for -DSUITE=${SUITE}, select one from supported suites which are : ${PSA_SUITES}")
+else()
+    message(STATUS "[PSA] : SUITE is set to ${SUITE}")
+endif()
+
+# Project variables
+set(ADAC_HOST_VAL_LIB        psa_adac_val)
+set(ADAC_HOST_PAL_LIB        psa_adac_pal)
+set(TEST_COMBINE_LIB		 test_combine)
+set(ADAC_HOST_EXE		     psa_adac_test)
+
+set(PSA_SUITE_DIR		            ${PSA_ROOT_DIR}/tests/${SUITE_LOWER})
+set(PSA_TESTLIST_GENERATOR		    ${PSA_ROOT_DIR}/tools/scripts/gen_tests_list.py)
+set(TESTSUITE_DB			        ${PSA_SUITE_DIR}/testsuite.db)
+set(PSA_TESTLIST_FILE			    ${CMAKE_CURRENT_BINARY_DIR}/${SUITE_LOWER}_testlist.txt)
+set(PSA_TEST_ENTRY_LIST_INC		    ${CMAKE_CURRENT_BINARY_DIR}/test_entry_list.inc)
+set(PSA_TEST_ENTRY_FUN_DECLARE_INC	${CMAKE_CURRENT_BINARY_DIR}/test_entry_fn_declare_list.inc)
+
+# Check for VERBOSE
+if(NOT DEFINED VERBOSE)
+	set(VERBOSE 3 CACHE INTERNAL "Default VERBOSE value" FORCE)
+        message(STATUS "[PSA] : Defaulting VERBOSE to ${VERBOSE}")
+else()
+	if(NOT ${VERBOSE} IN_LIST PSA_VERBOSE_OPTIONS)
+		message(FATAL_ERROR "[PSA] : Error: Unsupported value for -DVERBOSE=${VERBOSE}, supported values are : ${PSA_VERBOSE_OPTIONS}")
+	endif()
+    message(STATUS "[PSA] : VERBOSE is set to ${VERBOSE}")
+endif()
+
+if(NOT DEFINED SUITE_TEST_RANGE)
+	set(SUITE_TEST_RANGE_MIN None)
+	set(SUITE_TEST_RANGE_MAX None)
+else()
+	list(LENGTH SUITE_TEST_RANGE SUITE_TEST_RANGE_LENGTH)
+	if(${SUITE_TEST_RANGE_LENGTH} GREATER "2")
+		message(FATAL_ERROR "[PSA] : -DSUITE_TEST_RANGE=<...> value error! accepts two "
+                                             " numbers in quotes separated with ';'")
+	endif()
+	if(${SUITE_TEST_RANGE_LENGTH} EQUAL "2")
+		list(GET SUITE_TEST_RANGE 0 SUITE_TEST_RANGE_MIN)
+		list(GET SUITE_TEST_RANGE 1 SUITE_TEST_RANGE_MAX)
+		message(STATUS "[PSA] : Testing (${SUITE_TEST_RANGE_MIN}, ${SUITE_TEST_RANGE_MAX}) of ${SUITE} suite")
+	endif()
+	if(${SUITE_TEST_RANGE_LENGTH} EQUAL "1")
+		set(SUITE_TEST_RANGE_MIN ${SUITE_TEST_RANGE})
+		set(SUITE_TEST_RANGE_MAX ${SUITE_TEST_RANGE})
+		message(STATUS "[PSA] : Testing ${SUITE_TEST_RANGE_MIN} of ${SUITE} suite")
+	endif()
+endif()
+
+message(STATUS "[PSA] : ----------Process input arguments- complete-------------")
+
+# Create PSA clean list
+list(APPEND PSA_CLEAN_LIST
+	${PSA_TESTLIST_FILE}
+	${PSA_TEST_ENTRY_LIST_INC}
+	${PSA_TEST_ENTRY_FUN_DECLARE_INC}
+)
+
+# Process testsuite.db
+message(STATUS "[PSA] : Creating testlist.txt 'available at ${PSA_TESTLIST_FILE}'")
+execute_process(COMMAND ${PYTHON_EXECUTABLE} ${PSA_TESTLIST_GENERATOR}
+					${SUITE_LOWER}
+					${TESTSUITE_DB}
+					${PSA_TESTLIST_FILE}
+					${PSA_TEST_ENTRY_LIST_INC}
+					${PSA_TEST_ENTRY_FUN_DECLARE_INC}
+					${SUITE_TEST_RANGE_MIN}
+					${SUITE_TEST_RANGE_MAX})
+
+# Creating CMake list variable from file
+file(READ ${PSA_TESTLIST_FILE} PSA_TEST_LIST)
+if(NOT PSA_TEST_LIST)
+	message(FATAL_ERROR "[PSA] : Invalid test number!")
+endif()
+string(REGEX REPLACE "\n" ";" PSA_TEST_LIST "${PSA_TEST_LIST}")
+
+# Global macro to identify the PSA test suite cmake build
+add_definitions(-D${SUITE})
+add_definitions(-DVERBOSE=${VERBOSE})
+add_definitions(-D${TARGET})
+
+# Build PAL LIB
+if(NOT DEFINED RDDI_LIB)
+    add_subdirectory(${CMAKE_SOURCE_DIR}/platform/native)
+    set(ADAC_HOST_PAL_LIB    platform_native)
+else()
+    add_subdirectory(${CMAKE_SOURCE_DIR}/platform/csapbcom)
+    set(ADAC_HOST_PAL_LIB    csapbcom)
+endif()
+
+# Generate VAL LIB
+include(${CMAKE_SOURCE_DIR}/val/val.cmake)
+
+# Build test
+include(${PSA_SUITE_DIR}/suite.cmake)
+
+#add_dependencies(${TEST_COMBINE_LIB}		${ADAC_HOST_VAL_LIB} ${ADAC_HOST_PAL_LIB} ${ADAC_LIBS})
+add_executable(${ADAC_HOST_EXE} ${SUITE_CC_SOURCE})
+target_include_directories(${ADAC_HOST_EXE} PRIVATE
+    ${CMAKE_SOURCE_DIR}/val/include
+    )
+target_link_libraries (${ADAC_HOST_EXE} ${TEST_COMBINE_LIB}
+                                        ${ADAC_HOST_VAL_LIB}
+                                        ${ADAC_HOST_PAL_LIB}
+                                        ${ADAC_LIBS}
+                                        )
+
+# Include the files for make clean
+foreach(clean_item ${PSA_CLEAN_LIST})
+        set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${clean_item})
+endforeach()
+
diff --git a/secure-debug/README.md b/secure-debug/README.md
new file mode 100644
index 0000000..8947afa
--- /dev/null
+++ b/secure-debug/README.md
@@ -0,0 +1,157 @@
+
+# PSA Secure Debug : Arm ADAC Test Suite
+
+## Introduction
+
+### ADAC Specification
+
+The ADAC specification defines the protocol that allows a target to securely authenticate a debug host. The specification targets software-only layers that sit above the physical debug link.
+
+The ADAC specification can be obtained at [ADAC specification](https://developer.arm.com/documentation/den0101/0000).
+
+### ADAC test suite
+
+The ADAC test suite checks if a device-side implementation conforms to the behavior described in the ADAC specification. The tests are self-checking, portable C-based tests with directed stimulus. The tests are expected to run on the host platform only. The tests drive the commands from the host platform via the debug link and verify the response obtained from the target platform.
+
+The tests are available as open source. The tests and the corresponding abstraction layers are available with an Apache v2.0 license allowing for external contribution.
+
+## Release details
+ - Release Version - 0.5
+ - Code Quality: Alpha <br />
+   The suite is in development. This indicates that the suite contains tests that has not been validated on any hardware platform. Please use this opportunity to suggest enhancements and point out errors.
+
+ - The ADAC tests are written for version Beta of the [ADAC specification](https://developer.arm.com/documentation/den0101/0000).
+ - This test suite is not a substitute for design verification.
+
+## Layers
+
+ADAC tests use a layered software-stack approach to enable porting across different test platforms. The constituents of the layered stack are:
+        - Test suite
+        - Validation Abstraction Layer (VAL)
+        - Platform Abstraction Layer (PAL)
+
+These tests are written on top of Validation Abstraction Layer (VAL) and Platform Abstraction Layer (PAL).
+
+The abstraction layers provide platform information and runtime environment to enable execution of the tests.
+
+In this release, PAL implementation uses unix sockets as the link layer for sending commands and receiving responses.
+
+Partners can also write their own abstraction layer implementations to allow ADAC tests to be run in other host platforms and support the debug link layer.
+
+## Scenarios
+
+The mapping of the rules in the specification to the test cases and the steps followed in the tests are mentioned in the [Scenario document](docs/psa_adac_scenarios.md) present in the docs/ folder.
+
+## Getting started
+
+
+Follow the instructions in the subsequent sections to get a copy of the source code on your local machine and build the tests. <br />
+See User guide document to get details on the steps involved in porting the test suite to your platform.
+This test suite is provided as a separate directory within the psa-arch-tests repository.
+
+### Prerequisites
+
+Before starting the test suite build, ensure that the following requirements are met:
+
+- Host Operating System     : Ubuntu 16.04.4, RHEL 7, Windows 10
+- Scripting tools           : Python 3.7.1
+- Other open-source tools   : GNUARM 6.3.1, GCC 5.4.0 32-Bit (Linux Host), mingw 6.3.0 32-Bit (Windows Host)
+                              CMake 3.1 or later
+
+
+## Download source
+To download the master branch of the repository, type the following command:
+
+	git clone https://github.com/ARM-software/psa-arch-tests.git
+
+To download the master branch of the psa-adac repository, type the following command:
+
+	git clone git@github.com:ARMmbed/psa-adac.git
+
+Note:
+    To obtain the access to the psa-adac repository and some of its dependent submodules, Arm Licensees may contact Arm through their partner managers.
+
+
+## Porting steps
+
+Refer to the [Porting Guide](docs/porting_guide_adac_host.md) document for porting steps for your host platform.
+Refer to the [User Guide](docs/Arm_Authenticated_Debug_Access_Control_Test_Suite_User_Guide.pdf) document in the docs folder for additional details.
+
+## Build steps
+
+To build ADAC test suite for a given host platform, execute the following commands: <br/>
+~~~
+    cd psa-arch-tests/secure-debug
+    git clone git@github.com:ARMmbed/psa-adac.git --recurse-submodules
+    mkdir <host_build_dir>
+    cd <host_build_dir>
+	cmake ../ -G<generator-name> -DTARGET=<target-name> -DCOMPILER=<compiler-selection> -DSUITE=<suite-selection>
+	    where:
+        - <generator-name>          "Unix Makefiles"  - to generate Makefiles for Linux and Cygwin
+                                    "MinGW Makefiles" - to generate Makefiles for cmd.exe on Windows
+        - <target-name>             target to build, as created in the platform/board directory
+        - <compiler-selection>      GNU
+                                    Defaults to GNU if not specified
+        - <suite-selection>         ADAC              - specify the ADAC suite
+
+	To build project
+	   cmake --build .
+	To clean
+	   cmake --build . -- clean
+
+    For example:
+    cmake ../ -G"Unix Makefiles" -DTARGET=native -DSUITE=ADAC
+    cmake --build .
+~~~
+
+Note:
+    It is recommended to build each different build configurations in separate directories.
+
+### Build output
+The following ADAC test suite build outputs are available under host build directory, as created.
+
+	- psa_adac_test executable
+	- val and platform layer libraries
+
+## Test Suite Execution
+
+The current release provides a reference implementation of ADAC target which communicates with the host platform using unix sockets. In order to execute the test suite, please follow the steps below:
+
+    cd psa-arch-tests/secure-debug/psa-adac
+    make native
+
+To launch the target to run as a server instance, run the target executable in another terminal as shown:
+
+    cd psa-arch-tests/secure-debug/psa-adac
+    ./build/native/Debug/psa_adac_server coms.socket tools/test/resources/chains/chain.EcdsaP256-0
+
+To run the test suite, execute the following command from your host build directory <host_build_dir>:
+
+    ./psa_adac_test ../psa-adac/tools/test/resources/keys/EcdsaP256Key-0.pem \../psa-adac/tools/test/resources/chains/chain.EcdsaP256-0 ../psa-adac/coms.socket
+
+Note:
+ - Please look at the psa-adac directory for details about other target platforms.
+ - The keys and the certificate credentials for a supported cryptosystem can be generated using the tools provided in the psa-adac repository.
+ - The test suite is designed to run once per supported cryptosystem. Partners must ensure that the device must be provisioned with the correct certificates installed in the device's RoT.
+
+
+## Security implication
+
+ADAC test suite may run at higher privilege level. An attacker can utilize these tests to elevate privilege which can potentially reveal the platform secure attests. To prevent such security vulnerabilities into the production system, it is strongly recommended that ADAC test suite is run on development platforms. If it is run on production system, make sure system is scrubbed after running the test suite.
+
+## License
+
+Arm ADAC Architecture test suite is distributed under Apache v2.0 License.
+The psa-adac code repository is distributed under BSD-3-Clause License.
+
+
+## Feedback, contributions, and support
+
+ - For feedback, use the GitHub Issue Tracker that is associated with this repository.
+ - For support, send an email to support-psa-arch-tests@arm.com with details.
+ - Arm licensees can contact Arm directly through their partner managers.
+ - Arm welcomes code contributions through GitHub pull requests.
+
+--------------
+
+*Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.*
diff --git a/secure-debug/depends/rddi/linux-x86_64/README.txt b/secure-debug/depends/rddi/linux-x86_64/README.txt
new file mode 100644
index 0000000..80b9a82
--- /dev/null
+++ b/secure-debug/depends/rddi/linux-x86_64/README.txt
@@ -0,0 +1,6 @@
+This directory should include Linux x86_64 RDDI redistributables.
+
+These can be found in:
+- <Arm DS Install Directory>/sw/debugger/RDDI/redistributables/linux-x86_64/<compiler choice>/rel/
+
+<compiler choice>: Choose a compiler which matches your host system
diff --git a/secure-debug/depends/rddi/win_32-x86_64/README.txt b/secure-debug/depends/rddi/win_32-x86_64/README.txt
new file mode 100644
index 0000000..f78ccd8
--- /dev/null
+++ b/secure-debug/depends/rddi/win_32-x86_64/README.txt
@@ -0,0 +1,12 @@
+This directory should include Windows x86_64 RDDI redistributable and development libraries.
+
+Redistributables can be found in:
+- <Arm DS Install Directory>/sw/debugger/RDDI/redistributables/win_32-x86_64/<compiler choice>/rel/
+
+Development libraries can be found in:
+- <Arm DS Install Directory>/sw/debugger/RDDI/lib/win_32-x86_64/<compiler choice>/rel/
+
+<compiler choice>: Choose a compiler which matches your host system
+    Example compilers:
+        cl-16.00.40219.01 = Microsoft Visual Studio 2010
+        cl-19.00.24215.1  = Microsoft Visual Studio 2015 Update 3
diff --git a/secure-debug/docs/Arm_Authenticated_Debug_Access_Control_Test_Suite_User_Guide.pdf b/secure-debug/docs/Arm_Authenticated_Debug_Access_Control_Test_Suite_User_Guide.pdf
new file mode 100644
index 0000000..532a4ac
--- /dev/null
+++ b/secure-debug/docs/Arm_Authenticated_Debug_Access_Control_Test_Suite_User_Guide.pdf
Binary files differ
diff --git a/secure-debug/docs/porting_guide_adac_host.md b/secure-debug/docs/porting_guide_adac_host.md
new file mode 100644
index 0000000..07f1c03
--- /dev/null
+++ b/secure-debug/docs/porting_guide_adac_host.md
@@ -0,0 +1,36 @@
+
+# Porting Guide: ADAC Test Suite
+-----------------------------------------------------
+
+## Introduction
+The ADAC test suite contains the *Platform Abstraction Layer* (PAL) which abstracts platform-specific information from the tests. You must implement and port the PAL interface functions to your host platform.
+
+This document provides the porting steps and the list of PAL APIs.
+
+## Porting steps
+
+### Adding a new target
+
+  1. Create a new directory in **platform/<platform_name>**. For reference, see the existing platform **native** directory.
+  2. Execute `cp -rf platform/native/ platform/<platform_name>/`.
+  3. Update **platform/<platform_name>/CMakeLists.txt** appropriately to select the correct instances of PAL files for compilation.
+  4. Refer to the **List of PAL APIs** section to view the list of PAL APIs that must be ported for your target platform. These API definitions are available in **val/include/pal_interfaces.h**. These APIs are written for native target platform. You can reuse the code if it works for your platform. Otherwise, you must port them for your platform-specific peripherals.
+  5. The main.c requires path to the key and certificate chain that point to the host credentials. This must be provided as command-line arguments. You can provide debug link layer specific parameters as additional command-line arguments.
+  6. If you want to use a pre-built debug communication interface, create a new directory under the depends directory and list your shared libraries within it. A placeholder for RDDI libraries is provided. You can then link these libraries to your platform.
+
+## List of PAL APIs
+Since the test suite is agnostic to various system platforms, you must port the following PAL APIs before building the tests. Implement these functions for your host platform. <br/>
+
+| No | Prototype                                             | Description                                                                 | Parameters                                                              |
+|----|-------------------------------------------------------|-----------------------------------------------------------------------------|-------------------------------------------------------------------------|
+| 01 | int pal_print(char *str, int32_t data);               | Parses the input string and writes bytes into the message interface         | str      : Input String<br/>data     : Value for format specifier<br/>  |
+| 02 | int request_packet_send(request_packet_t *packet);    | Writes the ADAC command frame into the communication buffer for transmit    | request packet<br/>                                                     |
+| 03 | response_packet_t *response_packet_receive();         | Reads the ADAC command response from the communication buffer               | None<br/>                                                               |
+| 04 | int pal_system_reset(void)                            | Resets the system and disconnects from device                               | None                                                                    |
+
+## License
+Arm PSA test suite is distributed under Apache v2.0 License.
+
+--------------
+
+*Copyright (c) 2021 Arm Limited and Contributors. All rights reserved.*
diff --git a/secure-debug/docs/psa_adac_scenarios.md b/secure-debug/docs/psa_adac_scenarios.md
new file mode 100644
index 0000000..8d8fcae
--- /dev/null
+++ b/secure-debug/docs/psa_adac_scenarios.md
@@ -0,0 +1,28 @@
+# PSA ADAC Scenarios
+
+| Scenario ID | Section    | Description                                                                                                                                                                                                                            | Test Cases |
+|-------------|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|
+| S_ADAC_001  | Commands   | Verify that the following commands are recognized by the target and do not return SDP_INVALID_COMMAND status.<br />1. Discovery<br/>2. Authentication Start<br\>3. Authentication Response<br/>4. Close Session<br/>5. Lock Debug<br/> | TBD <br/>  |
+| S_ADAC_002  | Commands   | Send two authentication start commands back-to-back and verify that the challenge vector obtained in the response is different. | test_a001 <br/>  |
+| S_ADAC_003  | Commands   | Use discovery command to query the target for supported response fragment formats. Check that the following response fragments are supported: <br\>1. 0x200 token_adac<br\>2. 0x201 cert_adac<br\>| TBD <br/>  |
+| S_ADAC_004  | Commands   | Issue invalid response fragment as part of Authentication response and check that the target responds with SDP_FAILURE status.| TBD <br/>  |
+| S_ADAC_005  | Commands   | Issue a different command after starting the Authentication response command and check that the target responds with SDP_FAILURE status. | TBD <br/>  |
+| S_ADAC_006  | Commands   | Verify that for a multiple fragment Authentication response request, the device responds with a SDP_MORE_DATA_NEEDED status code after each response fragment.| TBD <br/>  |
+| S_ADAC_007  | Commands   | Check that the Close Session command always returns a SDP_SUCCESS status.| TBD <br/>  |
+| S_ADAC_008  | Constraints| Provide a leaf certificate before a root certificate and verify that an error response is generated by the target.| TBD <br/>  |
+| S_ADAC_009  | Constraints| Check that a certificate is rejected due to each of the following scope-limiting feature:1. Role<br/>2. Lifecycle<br/>| TBD <br/>  |
+| S_ADAC_010  | Constraints| Check that if two or more distinct non-neutral values are present in the certificate chain, a failure response is obtained.| TBD <br/>  |
+| S_ADAC_011  | Constraints| Request a permission value (perm_req) via authentication token which is denied due to a restrictive perm_mask field. Check that the authentication response is successful.| TBD <br/>  |
+| S_ADAC_012  | Constraints| Request access to software partition with no software partition ID listed in the certificate chain. Check that success status is reported.| TBD <br/>  |
+
+## Note
+
+1. The list of identified scenarios are not exhaustive and is subject to change.<br/>
+2. Some of the listed scenarios could be descoped or classified as testing limitation.<br />
+
+# License
+Arm PSA test suite is distributed under Apache v2.0 License.
+
+--------------
+
+*Copyright (c) 2021 Arm Limited and Contributors. All rights reserved.*
diff --git a/secure-debug/platform/native/CMakeLists.txt b/secure-debug/platform/native/CMakeLists.txt
new file mode 100644
index 0000000..a517d01
--- /dev/null
+++ b/secure-debug/platform/native/CMakeLists.txt
@@ -0,0 +1,31 @@
+#/** @file
+# * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+# * 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.
+
+# Set the minimum required version of CMake for the project
+cmake_minimum_required(VERSION 3.10)
+PROJECT (platform_native)
+
+include_directories(
+    ${CMAKE_SOURCE_DIR}/platform/native/include
+    )
+
+add_library(platform_native STATIC)
+target_sources(platform_native PUBLIC
+    ${CMAKE_SOURCE_DIR}/platform/native/src/pal_interfaces.c
+    ${CMAKE_SOURCE_DIR}/platform/native/src/unix_msg.c
+    ${CMAKE_SOURCE_DIR}/platform/native/src/main.c
+    )
+target_link_libraries(platform_native mbedcrypto)
diff --git a/secure-debug/platform/native/include/pal_common.h b/secure-debug/platform/native/include/pal_common.h
new file mode 100644
index 0000000..c88dcf5
--- /dev/null
+++ b/secure-debug/platform/native/include/pal_common.h
@@ -0,0 +1,37 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+#ifndef _PAL_COMMON_H_
+#define _PAL_COMMON_H_
+#include <platform.h>
+#include <stddef.h>
+/**
+ *   @brief    - Initialise the host-side channel for communication with device.
+ *   @param    - ctx            Hook for platform-specific descriptor
+ *               buffer         Pointer to memory used for TX/RX
+ *               buffer_size    Size of allocated memory for TX/RX
+ *   @return   - SUCCESS/FAILURE
+**/
+int msg_interface_init(void *ctx, uint8_t buffer[], size_t size);
+
+/**
+ *   @brief    - Release the host-side channel for communication with device.
+ *   @param    - ctx            Hook for platform-specific descriptor
+ *   @return   - SUCCESS/FAILURE
+**/
+int msg_interface_free(void *ctx);
+
+#endif
diff --git a/secure-debug/platform/native/include/platform.h b/secure-debug/platform/native/include/platform.h
new file mode 100644
index 0000000..2df84d9
--- /dev/null
+++ b/secure-debug/platform/native/include/platform.h
@@ -0,0 +1,37 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+
+#ifndef PSA_ADAC_PLATFORM_H
+#define PSA_ADAC_PLATFORM_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+#ifdef PSA_ADAC_PLATFORM_CONFIG_FILE
+#include PSA_ADAC_PLATFORM_CONFIG_FILE
+#else
+#include <psa_adac_platform.h>
+#endif
+
+#ifndef PSA_ADAC_PLATFORM_BANNER
+#define PSA_ADAC_PLATFORM_BANNER "PSA ADAC "
+#endif
+
+void platform_init(void);
+void psa_adac_platform_init(void);
+
+#endif //PSA_ADAC_PLATFORM_H
diff --git a/secure-debug/platform/native/include/psa_adac_platform.h b/secure-debug/platform/native/include/psa_adac_platform.h
new file mode 100644
index 0000000..5e4e272
--- /dev/null
+++ b/secure-debug/platform/native/include/psa_adac_platform.h
@@ -0,0 +1,23 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+
+#ifndef PSA_ADAC_NATIVE_PSA_ADAC_PLATFORM_H
+#define PSA_ADAC_NATIVE_PSA_ADAC_PLATFORM_H
+
+#define PSA_ADAC_MANAGER_IMPLICIT_TRANSPORT
+
+#endif //PSA_ADAC_NATIVE_PSA_ADAC_PLATFORM_H
diff --git a/secure-debug/platform/native/include/unix_msg.h b/secure-debug/platform/native/include/unix_msg.h
new file mode 100644
index 0000000..a21a165
--- /dev/null
+++ b/secure-debug/platform/native/include/unix_msg.h
@@ -0,0 +1,41 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+
+#ifndef PSA_ADAC_UNIX_MSG_H
+#define PSA_ADAC_UNIX_MSG_H
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#if !defined(_MSC_VER)
+#include <sys/types.h>
+#else // !defined(_MSC_VER)
+#include <BaseTsd.h>
+typedef SSIZE_T ssize_t;
+#endif // !defined(_MSC_VER)
+
+bool unix_socket_init(void);
+
+int unix_socket_server(const char *path);
+int unix_socket_client(const char *path);
+
+void unix_socket_close(int fd);
+
+ssize_t nwrite(int fd, const uint8_t *buf, size_t count);
+ssize_t nread(int fd, uint8_t *buf, size_t count);
+
+#endif //PSA_ADAC_UNIX_MSG_H
diff --git a/secure-debug/platform/native/src/main.c b/secure-debug/platform/native/src/main.c
new file mode 100644
index 0000000..86c563f
--- /dev/null
+++ b/secure-debug/platform/native/src/main.c
@@ -0,0 +1,57 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include "pal_common.h"
+#include "unix_msg.h"
+
+int32_t val_entry(void);
+
+/**
+    @brief    - PSA C main function, used for generating host-side test binaries.
+    @param    - argc    : the number of command line arguments.
+                argv    : array containing command line arguments.
+    @return   - error status
+**/
+extern uint8_t buffer[4096];
+uint8_t buffer[4096];
+char *key_file, *chain_file;
+
+int main(int argc, char *argv[])
+{
+    if (argc < 4) {
+        printf("Usage:\n\tpsa_adac_test <keyfile> <chainfile> <socket>\n\n");
+        exit(-1);
+    }
+
+    key_file = argv[1];
+    chain_file = argv[2];
+    char *socket_path = argv[3];
+    int fd;
+
+    fd = unix_socket_client(socket_path);
+    if (-1 == fd)
+        exit(-1);
+
+    msg_interface_init((void *) &fd, buffer, sizeof(buffer));
+
+    return val_entry();
+
+    msg_interface_free(NULL);
+    return 0;
+}
diff --git a/secure-debug/platform/native/src/pal_interfaces.c b/secure-debug/platform/native/src/pal_interfaces.c
new file mode 100644
index 0000000..9c33a5a
--- /dev/null
+++ b/secure-debug/platform/native/src/pal_interfaces.c
@@ -0,0 +1,245 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * 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 <psa_adac.h>
+#include <psa_adac_debug.h>
+#include "unix_msg.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if !defined(_MSC_VER)
+    #include <unistd.h>
+#else // !defined(_MSC_VER)
+    #include <io.h>
+
+    // Disable warning about POSIX function names.
+    #pragma warning(disable : 4996)
+#endif // !defined(_MSC_VER)
+
+int static_buffer_msg_init(uint8_t *buffer, size_t size);
+int static_buffer_msg_release(void);
+
+#define PAL_STATUS_UNSUPPORTED_FUNC      0xFF
+
+typedef enum {
+    PAL_STATUS_SUCCESS = 0x0,
+    PAL_STATUS_ERROR   = 0x80
+} pal_status_t;
+
+enum {
+    BUFFER_UNINITIALIZED = 0,
+    BUFFER_EMPTY,
+    BUFFER_REQUEST,
+    BUFFER_RESPONSE
+};
+static size_t static_buffer_size;
+static uint8_t *static_buffer_pointer;
+static uint8_t static_buffer_status = BUFFER_UNINITIALIZED;
+static int _fd;
+
+
+int pal_print(const char *str, int32_t data)
+{
+    if (printf(str, data) < 0)
+    {
+        return PAL_STATUS_ERROR;
+    }
+    return PAL_STATUS_SUCCESS;
+}
+
+void pal_terminate_simulation(void)
+{
+    ;
+}
+
+int pal_system_reset(void)
+{
+    return PAL_STATUS_UNSUPPORTED_FUNC;
+}
+
+int static_buffer_msg_init(uint8_t *buffer, size_t size)
+{
+    int ret = -1;
+
+    if (static_buffer_status == BUFFER_UNINITIALIZED) {
+        static_buffer_size = size;
+        static_buffer_pointer = buffer;
+        static_buffer_status = BUFFER_EMPTY;
+        ret = 0;
+    }
+    return ret;
+}
+
+int static_buffer_msg_release(void)
+{
+    int ret = -1;
+
+    if (static_buffer_status == BUFFER_EMPTY) {
+        static_buffer_size = 0;
+        static_buffer_pointer = NULL;
+        static_buffer_status = BUFFER_UNINITIALIZED;
+        ret = 0;
+    }
+    return ret;
+}
+
+request_packet_t *request_packet_build(uint16_t command, uint8_t *data, size_t data_size)
+{
+    request_packet_t *request = NULL;
+
+    if ((static_buffer_status == BUFFER_EMPTY) &&
+        (data_size <= (static_buffer_size - sizeof(request_packet_t)))) {
+        request = (request_packet_t *) static_buffer_pointer;
+        request->command = command;
+        request->data_count = data_size / 4UL;
+        (void) memcpy((void *) request->data, (void *) data, data_size);
+        static_buffer_status = BUFFER_REQUEST;
+    }
+    return request;
+}
+
+request_packet_t *request_packet_lock(size_t *max_data_size)
+{
+    request_packet_t *request = NULL;
+
+    if (static_buffer_status == BUFFER_EMPTY) {
+        if (max_data_size != NULL)
+            *max_data_size = static_buffer_size - sizeof(response_packet_t);
+
+        request = (request_packet_t *) static_buffer_pointer;
+        static_buffer_status = BUFFER_REQUEST;
+    }
+    return request;
+}
+
+int request_packet_release(request_packet_t *packet)
+{
+    int ret = -1;
+
+    if (static_buffer_status == BUFFER_REQUEST) {
+        static_buffer_status = BUFFER_EMPTY;
+        ret = 0;
+    }
+    return ret;
+}
+
+response_packet_t *response_packet_lock(size_t *max_data_size)
+{
+    response_packet_t *response = NULL;
+
+    if (static_buffer_status == BUFFER_EMPTY) {
+        if (max_data_size != NULL)
+            *max_data_size = static_buffer_size - sizeof(response_packet_t);
+
+        response = (response_packet_t *) static_buffer_pointer;
+        static_buffer_status = BUFFER_RESPONSE;
+    }
+    return response;
+}
+
+int response_packet_release(response_packet_t *packet)
+{
+    int ret = -1;
+
+    if (static_buffer_status == BUFFER_RESPONSE) {
+        static_buffer_status = BUFFER_EMPTY;
+        ret = 0;
+    }
+    return ret;
+}
+
+int msg_interface_init(void *ctx, uint8_t buffer[], size_t buffer_size)
+{
+    unix_socket_init();
+
+    if (ctx == NULL)
+        return -1;
+
+    _fd = *((int *) ctx);
+    return static_buffer_msg_init(buffer, buffer_size);
+}
+
+int msg_interface_free(void *ctx)
+{
+    unix_socket_close(_fd);
+    _fd = -1;
+    return static_buffer_msg_release();
+}
+
+static int message_receive(int fd, uint8_t buffer[], size_t max, size_t *size)
+{
+    if (nread(fd, buffer, sizeof(request_packet_t)) != sizeof(request_packet_t)) {
+        PSA_ADAC_LOG_ERR("transport_unix", "Error receiving message header\n");
+        return -1;
+    }
+    request_packet_t *p = (request_packet_t *) buffer;
+
+    if (4 + p->data_count * 4 > max) {
+        PSA_ADAC_LOG_ERR("transport_unix", "Message would overflow buffer (%d > %d)\n",
+                                            4 + p->data_count * 4, (int) max);
+        return -1;
+    }
+    if (p->data_count) {
+        if (nread(fd, (uint8_t *) p->data, p->data_count * 4) != p->data_count * 4) {
+            PSA_ADAC_LOG_ERR("transport_unix", "Error receiving message body\n");
+            return -1;
+        }
+    }
+    //PSA_ADAC_LOG_DUMP("msg", "receive", buffer, 4 + p->data_count * 4);
+    return 0;
+}
+
+static int message_send(int fd, uint8_t buffer[], size_t size)
+{
+    //PSA_ADAC_LOG_DUMP("msg", "send", buffer, size);
+    return nwrite(fd, (uint8_t *) buffer, size) == size ? 0 : -1;
+}
+
+int request_packet_send(request_packet_t *packet)
+{
+    if (packet == NULL)
+        return -1;
+
+    size_t size = sizeof(request_packet_t) + 4 * packet->data_count;
+
+    return message_send(_fd, (uint8_t *) packet, size);
+}
+
+response_packet_t *response_packet_receive()
+{
+    size_t max = 0;
+    response_packet_t *r = response_packet_lock(&max);
+
+    if (r != NULL) {
+        if (message_receive(_fd, (uint8_t *) r, max, NULL) == 0)
+            return r;
+
+        PSA_ADAC_LOG_ERR("transport_unix", "Error Receiving Response");
+        response_packet_release(r);
+    } else {
+        PSA_ADAC_LOG_ERR("transport_unix", "Error Locking Response");
+    }
+    return NULL;
+}
+
+void psa_adac_platform_init(void)
+{
+    ;
+}
+
diff --git a/secure-debug/platform/native/src/unix_msg.c b/secure-debug/platform/native/src/unix_msg.c
new file mode 100644
index 0000000..9a6e301
--- /dev/null
+++ b/secure-debug/platform/native/src/unix_msg.c
@@ -0,0 +1,156 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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 "unix_msg.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#if !defined(_MSC_VER)
+    #include <unistd.h>
+    #include <sys/socket.h>
+    #include <sys/un.h>
+#else // !defined(_MSC_VER)
+    #include <WinSock2.h>
+    #include <afunix.h>
+    #include <io.h>
+
+    // Disable warning about POSIX function names.
+    #pragma warning(disable : 4996)
+#endif // !defined(_MSC_VER)
+
+void unix_socket_close(int fd)
+{
+    if (fd != -1) {
+#if defined(_MSC_VER)
+        closesocket(fd);
+#else
+        close(fd);
+#endif
+    }
+}
+
+bool unix_socket_init(void)
+{
+#if defined(_MSC_VER)
+    static bool did_init_winsock;
+
+    did_init_winsock = false;
+    if (!did_init_winsock) {
+        WSADATA wsa_data = { 0 };
+
+        int result = WSAStartup(MAKEWORD(2, 2), &wsa_data);
+
+        if (result != 0) {
+            printf("WSAStartup failed with error: %d\n", result);
+            return false;
+        }
+    }
+#endif
+    return true;
+}
+
+int unix_socket_server(const char *path)
+{
+    struct sockaddr_un addr;
+    int fd;
+
+    fd = socket(AF_UNIX, SOCK_STREAM, 0);
+    if (fd == -1) {
+        perror("Error while calling socket()");
+        goto error;
+    }
+
+    memset(&addr, 0, sizeof(addr));
+    addr.sun_family = AF_UNIX;
+    strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
+
+    if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) != 0) {
+        perror("Error while calling bind()");
+        goto error;
+    }
+
+    if (listen(fd, 1) == -1) {
+        perror("Error while calling listen()");
+        goto error;
+    }
+    return fd;
+
+error:
+    unix_socket_close(fd);
+    return -1;
+}
+
+int unix_socket_client(const char *path)
+{
+    struct sockaddr_un addr;
+    int fd;
+
+    fd = socket(AF_UNIX, SOCK_STREAM, 0);
+    if (fd == -1) {
+        perror("Error while calling socket()");
+        goto error;
+    }
+
+    memset(&addr, 0, sizeof(addr));
+    addr.sun_family = AF_UNIX;
+    strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
+
+    if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
+        perror("Error while calling connect()");
+        goto error;
+    }
+    return fd;
+
+error:
+    unix_socket_close(fd);
+    return -1;
+}
+
+ssize_t nwrite(int fd, const uint8_t *buf, size_t count)
+{
+    const char *ptr = (const char *) buf;
+    ssize_t t;
+    size_t left = count;
+
+    while (left) {
+        t = send(fd, ptr, left, 0);
+        if (t  < 0)
+            return -1;
+        left -= t;
+        ptr += t;
+    }
+    return count;
+}
+
+ssize_t nread(int fd, uint8_t *buf, size_t count)
+{
+    char *ptr = (char *) buf; /* Removes warning on pointer operation */
+    ssize_t t = 0;
+    size_t left = count;
+
+    while (left) {
+        t = recv(fd, ptr, left, 0);
+        if (t < 0)
+            return -1;
+        left -= t;
+        ptr += t;
+    }
+    return count;
+}
diff --git a/secure-debug/tests/adac/suite.cmake b/secure-debug/tests/adac/suite.cmake
new file mode 100644
index 0000000..167d305
--- /dev/null
+++ b/secure-debug/tests/adac/suite.cmake
@@ -0,0 +1,41 @@
+#/** @file
+# * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+foreach(test ${PSA_TEST_LIST})
+	include(${PSA_SUITE_DIR}/${test}/test.cmake)
+	foreach(source_file ${CC_SOURCE})
+		list(APPEND SUITE_CC_SOURCE
+			${PSA_SUITE_DIR}/${test}/${source_file}
+		)
+	endforeach()
+	unset(CC_SOURCE)
+endforeach()
+
+add_definitions(${CC_OPTIONS})
+add_library(${TEST_COMBINE_LIB} STATIC ${SUITE_CC_SOURCE})
+
+# Test related Include directories
+foreach(test ${PSA_TEST_LIST})
+	target_include_directories(${TEST_COMBINE_LIB} PRIVATE ${PSA_SUITE_DIR}/${test})
+endforeach()
+
+target_include_directories(${TEST_COMBINE_LIB} PRIVATE
+	${CMAKE_BINARY_DIR}
+	${PSA_ROOT_DIR}/val/include
+	${PSA_ROOT_DIR}/platform/${TARGET}/include
+)
+target_link_libraries(${TEST_COMBINE_LIB} mbedcrypto)
diff --git a/secure-debug/tests/adac/test_a001/test.cmake b/secure-debug/tests/adac/test_a001/test.cmake
new file mode 100644
index 0000000..c38649e
--- /dev/null
+++ b/secure-debug/tests/adac/test_a001/test.cmake
@@ -0,0 +1,21 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+list(APPEND CC_SOURCE
+	test_a001.c
+)
+list(APPEND CC_OPTIONS )
diff --git a/secure-debug/tests/adac/test_a001/test_a001.c b/secure-debug/tests/adac/test_a001/test_a001.c
new file mode 100644
index 0000000..66f878e
--- /dev/null
+++ b/secure-debug/tests/adac/test_a001/test_a001.c
@@ -0,0 +1,86 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * 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 <psa_adac.h>
+#include <val_adac.h>
+#include "val_interfaces.h"
+
+#include "test_a001.h"
+
+#define TEST_NUM  VAL_CREATE_TEST_ID(VAL_SECURE_DEBUG_BASE, 1)
+#define TEST_DESC "Testing ADAC Protocol Host API| UT: psa_challenge\n"
+TEST_PUBLISH(TEST_NUM, test_entry);
+
+void test_entry(val_api_t *val_api)
+{
+    int32_t   status = VAL_STATUS_SUCCESS;
+    val_api_t *val = NULL;
+
+    val = val_api;
+
+    /* test init */
+    val->test_init(TEST_NUM, TEST_DESC);
+    val_adac_host_init();
+
+    uint8_t challenge1[CHALLENGE_SIZE], challenge2[CHALLENGE_SIZE], i;
+
+    request_packet_t *request;
+    response_packet_t *response;
+
+    if (PSA_SUCCESS != val_issue_command(SDP_AUTH_START_CMD, request, NULL, 0))
+        goto test_fail_exit;
+
+    response = val_await_response();
+    if (PSA_SUCCESS != val_parse_response(SDP_AUTH_START_CMD, response))
+        goto test_fail_exit;
+
+    psa_auth_challenge_t *challenge = (psa_auth_challenge_t *) response->data;
+
+    *challenge1 = (uint8_t)(challenge->challenge_vector);
+    response_packet_release(response);
+
+    if (PSA_SUCCESS != val_issue_command(SDP_AUTH_START_CMD, request, NULL, 0))
+        goto test_fail_exit;
+
+    response = val_await_response();
+    if (PSA_SUCCESS != val_parse_response(SDP_AUTH_START_CMD, response))
+        goto test_fail_exit;
+
+    challenge = (psa_auth_challenge_t *) response->data;
+
+    *challenge2 = (uint8_t)(challenge->challenge_vector);
+    response_packet_release(response);
+
+    for (i = 0; i < CHALLENGE_SIZE; i++) {
+        if (challenge1[i] != challenge2[i])
+            break;
+    }
+
+    if (i == CHALLENGE_SIZE) {
+	    val->print(PRINT_ERROR, "Challenge response obtained is not unique\n", 0);
+        goto test_fail_exit;
+    } else {
+	    val->print(PRINT_INFO, "Challenge response obtained is unique\n", 0);
+        goto test_end;
+    }
+
+test_fail_exit:
+	val_set_status(RESULT_FAIL(VAL_STATUS_TEST_FAILED));
+test_end:
+    val->test_exit();
+}
+
diff --git a/secure-debug/tests/adac/test_a001/test_a001.h b/secure-debug/tests/adac/test_a001/test_a001.h
new file mode 100644
index 0000000..5212fed
--- /dev/null
+++ b/secure-debug/tests/adac/test_a001/test_a001.h
@@ -0,0 +1,26 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+#ifndef _TEST_A001_TESTS_H_
+#define _TEST_A001_TESTS_H_
+
+#define test_entry CONCAT(test_entry_, a001)
+
+extern val_api_t *val;
+extern char *key_file;
+extern char *chain_file;
+
+#endif /* _TEST_A001_TESTS_H_ */
diff --git a/secure-debug/tests/adac/test_a002/test.cmake b/secure-debug/tests/adac/test_a002/test.cmake
new file mode 100644
index 0000000..c6318e9
--- /dev/null
+++ b/secure-debug/tests/adac/test_a002/test.cmake
@@ -0,0 +1,21 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+list(APPEND CC_SOURCE
+	test_a002.c
+)
+list(APPEND CC_OPTIONS )
diff --git a/secure-debug/tests/adac/test_a002/test_a002.c b/secure-debug/tests/adac/test_a002/test_a002.c
new file mode 100644
index 0000000..dabbc34
--- /dev/null
+++ b/secure-debug/tests/adac/test_a002/test_a002.c
@@ -0,0 +1,124 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * 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 <psa_adac.h>
+#include <val_adac.h>
+#include "val_interfaces.h"
+
+#include "test_a002.h"
+
+#define TEST_NUM  VAL_CREATE_TEST_ID(VAL_SECURE_DEBUG_BASE, 2)
+#define TEST_DESC "Testing ADAC Protocol Host API| UT: psa_connect\n"
+TEST_PUBLISH(TEST_NUM, test_entry);
+
+void test_entry(val_api_t *val_api)
+{
+    int32_t   status = VAL_STATUS_SUCCESS;
+    val_api_t *val = NULL;
+
+    val = val_api;
+
+    /* test init */
+    val->test_init(TEST_NUM, TEST_DESC);
+    val_adac_host_init();
+
+    uint8_t *chain = NULL;
+    size_t chain_size = 0;
+
+    if (PSA_SUCCESS != val_load_certificate_chain(chain_file, &chain, &chain_size))
+        goto test_fail_exit;
+
+    psa_tlv_t *exts[MAX_EXTENSIONS];
+    size_t exts_count = 0;
+    uint8_t key_type;
+
+    if (PSA_SUCCESS != val_infer_cryptosystem((uint32_t *) chain, chain_size, exts,
+                                                           &exts_count, &key_type)) {
+        goto test_fail_exit;
+    }
+
+    request_packet_t *request;
+
+    if (PSA_SUCCESS != val_issue_command(SDP_DISCOVERY_CMD, request, NULL, 0))
+        goto test_fail_exit;
+
+    response_packet_t *response;
+
+    response = val_await_response();
+    if (PSA_SUCCESS != val_parse_response(SDP_DISCOVERY_CMD, response))
+        goto test_fail_exit;
+
+    if (!val_check_cryptosystem_support(response, key_type))
+        goto test_fail_exit;
+
+    response_packet_release(response);
+
+    psa_key_handle_t handle;
+    uint8_t *key = NULL;
+    size_t key_size = 0;
+
+    if (PSA_SUCCESS != val_get_private_key(key_file, &key_type, &handle, &key, &key_size))
+        goto test_fail_exit;
+
+    if (PSA_SUCCESS != val_issue_command(SDP_AUTH_START_CMD, request, NULL, 0))
+        goto test_fail_exit;
+
+    response = val_await_response();
+    if (PSA_SUCCESS != val_parse_response(SDP_AUTH_START_CMD, response))
+        goto test_fail_exit;
+
+    psa_auth_challenge_t *challenge = (psa_auth_challenge_t *) response->data;
+
+    uint8_t *token = NULL;
+    size_t token_size = 0;
+
+    if (PSA_SUCCESS != val_sign_token(challenge->challenge_vector,
+                                      sizeof(challenge->challenge_vector),
+                                      key_type, NULL, 0, &token, &token_size,
+                                      handle, key, key_size)) {
+        goto test_fail_exit;
+    }
+    response_packet_release(response);
+
+    if (PSA_SUCCESS != val_send_certificate(exts, exts_count))
+        goto test_fail_exit;
+
+	val->print(PRINT_INFO, "Sending token\n", 0);
+    if (PSA_SUCCESS != val_issue_command(SDP_AUTH_RESPONSE_CMD, request,
+                                        (uint8_t *)token, token_size)) {
+        goto test_fail_exit;
+    }
+
+	val->print(PRINT_INFO, "Receiving token_authentication response\n", 0);
+    response = val_await_response();
+    if (PSA_SUCCESS != val_parse_response(SDP_AUTH_RESPONSE_CMD, response))
+        goto test_fail_exit;
+
+    if (response->status == SDP_SUCCESS)
+	    val->print(PRINT_INFO, "Target unlocked successfully\n", 0);
+    else
+        goto test_fail_exit;
+
+    response_packet_release(response);
+    goto test_end;
+
+test_fail_exit:
+	val_set_status(RESULT_FAIL(VAL_STATUS_TEST_FAILED));
+test_end:
+    val->test_exit();
+}
+
diff --git a/secure-debug/tests/adac/test_a002/test_a002.h b/secure-debug/tests/adac/test_a002/test_a002.h
new file mode 100644
index 0000000..da5f094
--- /dev/null
+++ b/secure-debug/tests/adac/test_a002/test_a002.h
@@ -0,0 +1,26 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+#ifndef _TEST_A002_TESTS_H_
+#define _TEST_A002_TESTS_H_
+
+#define test_entry CONCAT(test_entry_, a002)
+
+extern val_api_t *val;
+extern char *key_file;
+extern char *chain_file;
+
+#endif /* _TEST_A002_TESTS_H_ */
diff --git a/secure-debug/tests/adac/testsuite.db b/secure-debug/tests/adac/testsuite.db
new file mode 100644
index 0000000..9695860
--- /dev/null
+++ b/secure-debug/tests/adac/testsuite.db
@@ -0,0 +1,26 @@
+#/** @file
+# * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+
+#List of tests to be compiled and run as part of initial_attestation suite
+
+(START)
+
+test_a001
+test_a002
+
+(END)
diff --git a/secure-debug/tools/cmake/common/CMakeSettings.cmake b/secure-debug/tools/cmake/common/CMakeSettings.cmake
new file mode 100644
index 0000000..e709dc0
--- /dev/null
+++ b/secure-debug/tools/cmake/common/CMakeSettings.cmake
@@ -0,0 +1,25 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+#Stop built in CMakeDetermine<lang>.cmake scripts to run.
+set (CMAKE_C_COMPILER_ID_RUN 1)
+#Stop cmake run compiler tests.
+set (CMAKE_C_COMPILER_FORCED true)
+
+set(CMAKE_STATIC_LIBRARY_PREFIX "")
+set(CMAKE_STATIC_LIBRARY_SUFFIX ".a")
+set(CMAKE_SHARED_LIBRARY_SUFFIX "")
diff --git a/secure-debug/tools/cmake/common/Utils.cmake b/secure-debug/tools/cmake/common/Utils.cmake
new file mode 100644
index 0000000..6013fef
--- /dev/null
+++ b/secure-debug/tools/cmake/common/Utils.cmake
@@ -0,0 +1,37 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+# Function to CMake arguments
+function(_check_arguments)
+        foreach(_ARG IN LISTS ARGV)
+                if(NOT DEFINED ${_ARG})
+                        message(FATAL_ERROR "[PSA] : ${_ARG} is not passed! Please specify -D${_ARG}=<...> to CMake.")
+                endif()
+        endforeach()
+endfunction(_check_arguments)
+
+# Function to get all the folders inside given parent directory
+function(_get_sub_dir_list result parent_dir)
+        file(GLOB parent_dir_items RELATIVE ${parent_dir} ${parent_dir}/*)
+        set(dir_list "")
+        foreach(item ${parent_dir_items})
+                if(IS_DIRECTORY ${parent_dir}/${item})
+                        list(APPEND dir_list ${item})
+                endif()
+        endforeach()
+        set(${result} ${dir_list} PARENT_SCOPE)
+endfunction(_get_sub_dir_list)
diff --git a/secure-debug/tools/cmake/compiler/ARMCLANG.cmake b/secure-debug/tools/cmake/compiler/ARMCLANG.cmake
new file mode 100644
index 0000000..c6a8b0d
--- /dev/null
+++ b/secure-debug/tools/cmake/compiler/ARMCLANG.cmake
@@ -0,0 +1,63 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+set(CMAKE_SYSTEM_NAME Generic)
+set(CMKE_SYSTEM_PROCESSOR ARM)
+
+set(_C_TOOLCHAIN_NAME armclang)
+
+if(WIN32)
+        if (NOT DEFINED ARMCLANG_PATH)
+                set(ARMCLANG_PATH "C:" CACHE PATH "Install directory for ARMCLANG Compiler")
+        endif()
+else(WIN32)
+        if (NOT DEFINED ARMCLANG_PATH)
+                set(ARMCLANG_PATH "/" CACHE PATH "Install directory for ARMCLANG Compiler")
+        endif()
+endif(WIN32)
+
+find_program(
+        _C_TOOLCHAIN_PATH
+        ${_C_TOOLCHAIN_NAME}
+        PATHS env PATH
+        HINTS ${ARMCLANG_PATH}
+        HINTS bin
+)
+
+if(_C_TOOLCHAIN_PATH STREQUAL "_C_TOOLCHAIN_PATH-NOTFOUND")
+        message(FATAL_ERROR "[PSA] : Couldn't find ${_C_TOOLCHAIN_NAME}."
+                            " Either put ${_C_TOOLCHAIN_NAME} on the PATH or set ARMCLANG_PATH set properly.")
+endif()
+
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
+foreach(_LNG IN ITEMS "C" "ASM")
+        set(CMAKE_${_LNG}_COMPILER ${_C_TOOLCHAIN_PATH})
+        message(STATUS "[PSA] : ${_LNG}  compiler used '${CMAKE_${_LNG}_COMPILER}'")
+endforeach()
+
+if(${CPU_ARCH} STREQUAL armv7m)
+	set(TARGET_SWITCH "-march=armv7-m")
+elseif(${CPU_ARCH} STREQUAL armv8m_ml)
+	set(TARGET_SWITCH "-march=armv8-m.main -mcmse")
+elseif(${CPU_ARCH} STREQUAL armv8m_bl)
+	set(TARGET_SWITCH "-march=armv8-m.base -mcmse")
+endif()
+
+set(CMAKE_C_FLAGS              "--target=arm-arm-none-eabi ${TARGET_SWITCH} -g -Wall -Werror -Wextra -fshort-enums -fshort-wchar -funsigned-char -fdata-sections -ffunction-sections -mno-unaligned-access -mfpu=none")
+set(CMAKE_ASM_FLAGS            "${TARGET_SWITCH} -mthumb")
+set(CMAKE_EXE_LINKER_FLAGS     "--strict --map --symbols --xref  --info=summarysizes,sizes,totals,unused,veneers --diag_warning=L6204")
diff --git a/secure-debug/tools/cmake/compiler/GNUARM.cmake b/secure-debug/tools/cmake/compiler/GNUARM.cmake
new file mode 100644
index 0000000..3bd8347
--- /dev/null
+++ b/secure-debug/tools/cmake/compiler/GNUARM.cmake
@@ -0,0 +1,63 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+set(CMAKE_SYSTEM_NAME Generic)
+set(CMKE_SYSTEM_PROCESSOR ARM)
+
+set(_C_TOOLCHAIN_NAME arm-none-eabi-gcc)
+
+if(WIN32)
+	if (NOT DEFINED GNUARM_PATH)
+		set(GNUARM_PATH "C:" CACHE PATH "Install directory for GNUARM Compiler")
+	endif()
+else(WIN32)
+	if (NOT DEFINED GNUARM_PATH)
+		set(GNUARM_PATH "/" CACHE PATH "Install directory for GNUARM Compiler")
+	endif()
+endif(WIN32)
+
+find_program(
+	_C_TOOLCHAIN_PATH
+	${_C_TOOLCHAIN_NAME}
+	PATHS env PATH
+	HINTS ${GNUARM_PATH}
+	HINTS bin
+)
+
+if(_C_TOOLCHAIN_PATH STREQUAL "_C_TOOLCHAIN_PATH-NOTFOUND")
+        message(FATAL_ERROR "[PSA] : Couldn't find ${_C_TOOLCHAIN_NAME}."
+			    " Either put ${_C_TOOLCHAIN_NAME} on the PATH or set GNUARM_PATH set properly.")
+endif()
+
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
+foreach(_LNG IN ITEMS "C" "ASM")
+	set(CMAKE_${_LNG}_COMPILER ${_C_TOOLCHAIN_PATH})
+	message(STATUS "[PSA] : ${_LNG}  compiler used '${CMAKE_${_LNG}_COMPILER}'")
+endforeach()
+
+if(${CPU_ARCH} STREQUAL armv7m)
+	set(TARGET_SWITCH "-march=armv7-m")
+elseif(${CPU_ARCH} STREQUAL armv8m_ml)
+	set(TARGET_SWITCH "-march=armv8-m.main -mcmse")
+elseif(${CPU_ARCH} STREQUAL armv8m_bl)
+	set(TARGET_SWITCH "-march=armv8-m.base -mcmse")
+endif()
+
+set(CMAKE_C_FLAGS          "${TARGET_SWITCH} -g -Wall -Werror -Wextra -fdata-sections -ffunction-sections -mno-unaligned-access")
+set(CMAKE_ASM_FLAGS        "${TARGET_SWITCH} -mthumb")
+set(CMAKE_EXE_LINKER_FLAGS "-Xlinker --fatal-warnings -Xlinker --gc-sections -z max-page-size=0x400 -lgcc -lc -lnosys")
diff --git a/secure-debug/tools/cmake/compiler/HOST_GCC.cmake b/secure-debug/tools/cmake/compiler/HOST_GCC.cmake
new file mode 100644
index 0000000..5b43cb0
--- /dev/null
+++ b/secure-debug/tools/cmake/compiler/HOST_GCC.cmake
@@ -0,0 +1,52 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+set(CMAKE_SYSTEM_NAME Generic)
+set(CMKE_SYSTEM_PROCESSOR x86_64)
+
+set(_C_TOOLCHAIN_NAME gcc)
+
+if(WIN32)
+	if (NOT DEFINED HOST_GCC_PATH)
+		set(HOST_GCC_PATH "C:" CACHE PATH "Install directory for Host GCC Compiler")
+	endif()
+else(WIN32)
+	if (NOT DEFINED HOST_GCC_PATH)
+		set(HOST_GCC_PATH "/" CACHE PATH "Install directory for Host GCC Compiler")
+	endif()
+endif(WIN32)
+
+find_program(
+	_C_TOOLCHAIN_PATH
+	${_C_TOOLCHAIN_NAME}
+	PATHS env PATH
+	HINTS ${HOST_GCC_PATH}
+	HINTS bin
+)
+
+if(_C_TOOLCHAIN_PATH STREQUAL "_C_TOOLCHAIN_PATH-NOTFOUND")
+        message(FATAL_ERROR "[PSA] : Couldn't find ${_C_TOOLCHAIN_NAME}."
+			    " Either put ${_C_TOOLCHAIN_NAME} on the PATH or set GNUARM_PATH set properly.")
+endif()
+
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
+foreach(_LNG IN ITEMS "C" "ASM")
+	set(CMAKE_${_LNG}_COMPILER ${_C_TOOLCHAIN_PATH})
+	set(CMAKE_C_FLAGS	"-g -Wall -Werror -Werror -std=c99")
+	message(STATUS "[PSA] : ${_LNG}  compiler used '${CMAKE_${_LNG}_COMPILER}'")
+endforeach()
diff --git a/secure-debug/tools/scripts/gen_tests_list.py b/secure-debug/tools/scripts/gen_tests_list.py
new file mode 100644
index 0000000..2bd0ab3
--- /dev/null
+++ b/secure-debug/tools/scripts/gen_tests_list.py
@@ -0,0 +1,87 @@
+#!/usr/bin/python
+#/** @file
+# * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+import sys
+
+if (len(sys.argv) != 8):
+        print("\nScript requires following inputs")
+        print("\narg1  : <INPUT  SUITE identifier>")
+        print("\narg2  : <INPUT  testsuite.db file>")
+        print("\narg3  : <OUTPUT testlist file>")
+        print("\narg4  : <OUTPUT test_entry_list>")
+        print("\narg5  : <OUTPUT test_entry_fn_declare_list>")
+        print("\narg6  : <OUTPUT Suite test start number")
+        print("\narg7  : <OUTPUT Suite test end number")
+        sys.exit(1)
+
+suite                      = sys.argv[1]
+testsuite_db_file          = sys.argv[2]
+testlist_file              = sys.argv[3]
+test_entry_list            = sys.argv[4]
+test_entry_fn_declare_list = sys.argv[5]
+if sys.argv[6] != "None":
+	suite_test_start_number    = int(sys.argv[6])
+else:
+	suite_test_start_number    = 0
+if sys.argv[7] != "None":
+	suite_test_end_number      = int(sys.argv[7])
+else:
+	suite_test_end_number      = sys.maxsize
+
+# Dictionary to hold the mapping between suite and the base number
+suite_with_base_dict = {"adac":4}
+
+def gen_test_list():
+	"""
+	Read the input testsuite.db file and generates the output file with list of tests
+	"""
+	with open(testlist_file, mode='w') as o_f:
+		with open(testsuite_db_file, mode='r') as i_f:
+			for line in i_f:
+				if (('test_' == line[0:5]) and
+				    (int(line[6:9]) >= suite_test_start_number) and
+				    (int(line[6:9]) <= suite_test_end_number)):
+						o_f.write(line)
+
+def gen_test_entry_info():
+	"""
+	Generate inc files
+	"""
+	test_num           = 0
+	uniq_test_string   = ''
+	max_test_per_suite = 200
+	suite_base         = 0
+
+	if (suite not in suite_with_base_dict.keys()):
+		print("\nProvide a valid SUITE identifier")
+		sys.exit()
+
+	with open(test_entry_list, mode='w') as o_f1, \
+             open(test_entry_fn_declare_list, mode='w') as o_f2,\
+             open(testlist_file, mode='r') as i_f:
+		for line in i_f:
+			line = line.strip()
+			test_num = int(line[6:9]) + (max_test_per_suite * suite_with_base_dict[suite])
+			uniq_test_string = line[5:9]
+			o_f1.write("\t{%d, &test_entry_%s},\n" %(test_num, uniq_test_string))
+			o_f2.write("void test_entry_%s(val_api_t *val_api);\n" %(uniq_test_string))
+	print("Test entry symbol list:\n\t%s,\n\t%s" %(test_entry_list, test_entry_fn_declare_list))
+
+# Call routines
+gen_test_list()
+gen_test_entry_info()
diff --git a/secure-debug/val/include/pal_interfaces.h b/secure-debug/val/include/pal_interfaces.h
new file mode 100644
index 0000000..9f7390f
--- /dev/null
+++ b/secure-debug/val/include/pal_interfaces.h
@@ -0,0 +1,93 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+#ifndef _PAL_INTERFACES_H_
+#define _PAL_INTERFACES_H_
+
+#include <stdarg.h>
+#include <psa_adac.h>
+
+/**
+ *   @brief    - This function parses the input string and writes bytes into logger TX FIFO
+ *   @param    - str      : Input String
+ *             - data     : Value for format specifier
+ *   @return   - SUCCESS/FAILURE
+**/
+
+int pal_print(const char *str, int32_t data);
+
+/**
+ *   @brief    - Terminates the simulation at the end of all tests completion.
+ *               By default, it put cpus into power down mode.
+ *   @param    - void
+ *   @return   - void
+**/
+void pal_terminate_simulation(void);
+
+/**
+ *   @brief    - Resets the system.
+ *   @param    - void
+ *   @return   - SUCCESS/FAILURE
+**/
+int pal_system_reset(void);
+
+request_packet_t *request_packet_lock(size_t *max_data_size);
+
+/**
+ *   @brief    - Reserve the communication buffer memory for receive packet.
+ *   @param    - max_data_size      Valid size of command frame
+ *   @return   - Pointer to the command frame to be read
+**/
+response_packet_t *response_packet_lock(size_t *max_data_size);
+
+/**
+ *   @brief    - Release the lock held by transmit packet.
+ *   @param    - packet      Most recent command frame sent
+ *   @return   - SUCCESS/FAILURE
+**/
+int request_packet_release(request_packet_t *packet);
+
+/**
+ *   @brief    - Release the lock held by receive packet.
+ *   @param    - packet      Most recent response packet received
+ *   @return   - SUCCESS/FAILURE
+**/
+int response_packet_release(response_packet_t *packet);
+
+/**
+ *   @brief    - Construct the Request packet for the specified ADAC command.
+ *   @param    - command      ADAC command
+ *               data         Pointer to payload
+ *               data_size    Size of the command payload
+ *   @return   - Pointer to the command frame to be written
+**/
+request_packet_t *request_packet_build(uint16_t command, uint8_t *data, size_t data_size);
+
+/**
+ *   @brief    - Write the Request packet into the communication buffer for transmit.
+ *   @param    - packet       Request packet built for dispatch
+ *   @return   - SUCCESS/FAILURE
+**/
+int request_packet_send(request_packet_t *packet);
+
+/**
+ *   @brief    - Read the Response packet from the communication buffer.
+ *   @param    - None
+ *   @return   - Response packet received from target.
+**/
+response_packet_t *response_packet_receive();
+
+#endif
diff --git a/secure-debug/val/include/val.h b/secure-debug/val/include/val.h
new file mode 100644
index 0000000..8ac9a98
--- /dev/null
+++ b/secure-debug/val/include/val.h
@@ -0,0 +1,332 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+
+#ifndef _VAL_COMMON_H_
+#define _VAL_COMMON_H_
+
+#include <string.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <stdarg.h>
+
+typedef uint8_t             bool_t;
+typedef uintptr_t           addr_t;
+typedef uint32_t            test_id_t;
+typedef uint32_t            block_id_t;
+typedef char                char8_t;
+typedef uint32_t            cfg_id_t;
+
+/* Print verbosity = TEST */
+#ifndef VERBOSE
+#define VERBOSE 9
+#endif
+
+#ifndef VAL_NSPE_BUILD
+#define STATIC_DECLARE  static
+#else
+#define STATIC_DECLARE
+#endif
+
+#ifndef __WEAK
+#define __WEAK __attribute__((weak))
+#endif
+
+#ifndef __UNUSED
+#define __UNUSED __attribute__((unused))
+#endif
+
+#ifndef TRUE
+#define TRUE 0
+#endif
+#ifndef FALSE
+#define FALSE 1
+#endif
+
+#define _CONCAT(A, B) A##B
+#define CONCAT(A, B) _CONCAT(A, B)
+
+/* test status defines */
+#define TEST_START                 0x01
+#define TEST_END                   0x02
+#define TEST_PASS                  0x04
+#define TEST_FAIL                  0x08
+#define TEST_SKIP                  0x10
+#define TEST_PENDING               0x20
+
+#define TEST_NUM_BIT                 32
+#define TEST_STATE_BIT                8
+#define TEST_STATUS_BIT               0
+
+#define TEST_NUM_MASK        0xFFFFFFFF
+#define TEST_STATE_MASK            0xFF
+#define TEST_STATUS_MASK           0xFF
+
+#define RESULT_START(status)    (((TEST_START) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+#define RESULT_END(status)      (((TEST_END) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+#define RESULT_PASS(status)     (((TEST_PASS) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+#define RESULT_FAIL(status)     (((TEST_FAIL) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+#define RESULT_SKIP(status)     (((TEST_SKIP) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+#define RESULT_PENDING(status)  (((TEST_PENDING) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+
+#define IS_TEST_FAIL(status)    (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_FAIL)
+#define IS_TEST_PASS(status)    (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_PASS)
+#define IS_TEST_SKIP(status)    (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_SKIP)
+#define IS_TEST_PENDING(status) (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_PENDING)
+#define IS_TEST_START(status)   (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_START)
+#define IS_TEST_END(status)     (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_END)
+#define VAL_ERROR(status)       ((status & TEST_STATUS_MASK) ? 1 : 0)
+
+
+
+/* Test Defines */
+#define TEST_PUBLISH(test_id, entry) \
+   const val_test_info_t __attribute__((section(".acs_test_info"))) \
+                      CONCAT(acs_test_info, entry) = {test_id, entry}
+
+#define VAL_MAX_TEST_PER_COMP                200
+#define VAL_SECURE_DEBUG_BASE                  4
+
+
+#define VAL_GET_COMP_NUM(test_id)      \
+   ((test_id - (test_id % VAL_MAX_TEST_PER_COMP)) / VAL_MAX_TEST_PER_COMP)
+#define VAL_GET_TEST_NUM(test_id)      (test_id % VAL_MAX_TEST_PER_COMP)
+#define VAL_CREATE_TEST_ID(comp, num)   ((comp*VAL_MAX_TEST_PER_COMP) + num)
+
+#define TEST_FIELD(num1, num2)           (num2 << 8 | num1)
+#define GET_TEST_ISOLATION_LEVEL(num)   (num & 0x3)
+#define GET_WD_TIMOUT_TYPE(num)         ((num >> 8) & 0x7)
+
+#define TEST_CHECKPOINT_NUM(n)          n
+#define TEST(n)                         n
+#define BLOCK(n)                        n
+
+#define BLOCK_NUM_POS                   8
+#define ACTION_POS                      16
+#define GET_TEST_NUM(n)                 (0xff & n)
+#define GET_BLOCK_NUM(n)                ((n >> BLOCK_NUM_POS) & 0xff)
+
+#define GET_ACTION_NUM(n)               ((n >> ACTION_POS) & 0xff)
+#define TEST_EXECUTE_FUNC               1
+#define TEST_RETURN_RESULT              2
+#define INVALID_HANDLE                  0x1234DEAD
+
+#define VAL_NVMEM_BLOCK_SIZE           4
+#define VAL_NVMEM_OFFSET(nvmem_idx)    (nvmem_idx * VAL_NVMEM_BLOCK_SIZE)
+
+#define UART_INIT_SIGN  0xff
+#define UART_PRINT_SIGN 0xfe
+
+#define TEST_PANIC()                          \
+    do {                                         \
+    } while (1)
+
+#define TEST_ASSERT_EQUAL(arg1, arg2, checkpoint)                                   \
+    do {                                                                            \
+        if ((arg1) != arg2)                                                         \
+        {                                                                           \
+            val->print(PRINT_ERROR, "\tFailed at Checkpoint: %d\n", checkpoint);    \
+            val->print(PRINT_ERROR, "\tActual: %d\n", arg1);                        \
+            val->print(PRINT_ERROR, "\tExpected: %d\n", arg2);                      \
+            return 1;                                                               \
+        }                                                                           \
+    } while (0)
+
+#define TEST_ASSERT_DUAL(arg1, status1, status2, checkpoint)                        \
+    do {                                                                            \
+        if ((arg1) != status1 && (arg1) != status2)                                 \
+        {                                                                           \
+            val->print(PRINT_ERROR, "\tFailed at Checkpoint: %d\n", checkpoint);    \
+            val->print(PRINT_ERROR, "\tActual: %d\n", arg1);                        \
+            val->print(PRINT_ERROR, "\tExpected: %d", status1);                     \
+            val->print(PRINT_ERROR, "or %d\n", status2);                            \
+            return 1;                                                               \
+        }                                                                           \
+    } while (0)
+
+#define TEST_ASSERT_NOT_EQUAL(arg1, arg2, checkpoint)                               \
+    do {                                                                            \
+        if ((arg1) == arg2)                                                         \
+        {                                                                           \
+            val->print(PRINT_ERROR, "\tFailed at Checkpoint: %d\n", checkpoint);    \
+            val->print(PRINT_ERROR, "\tValue: %d\n", arg1);                         \
+            return 1;                                                               \
+        }                                                                           \
+    } while (0)
+
+#define TEST_ASSERT_MEMCMP(buf1, buf2, size, checkpoint)                            \
+    do {                                                                            \
+        if (memcmp(buf1, buf2, size))                                               \
+        {                                                                           \
+            val->print(PRINT_ERROR, "\tFailed at Checkpoint: %d : ", checkpoint);   \
+            val->print(PRINT_ERROR, "Unequal data in compared buffers\n", 0);       \
+            return 1;                                                               \
+        }                                                                           \
+    } while (0)
+
+#define TEST_ASSERT_RANGE(arg1, range1, range2, checkpoint)                         \
+    do {                                                                            \
+        if ((arg1) < range1 || (arg1) > range2)                                     \
+        {                                                                           \
+            val->print(PRINT_ERROR, "\tFailed at Checkpoint: %d\n", checkpoint);    \
+            val->print(PRINT_ERROR, "\tActual: %d\n", arg1);                        \
+            val->print(PRINT_ERROR, "\tExpected range: %d to ", range1);            \
+            val->print(PRINT_ERROR, "%d", range2);                                  \
+            return 1;                                                               \
+        }                                                                           \
+    } while (0)
+
+/* enums */
+typedef enum {
+    CALLER_NONSECURE = 0x0,
+    CALLER_SECURE    = 0x1,
+} caller_security_t;
+
+typedef enum {
+    TEST_ISOLATION_L1      = 0x1,
+    TEST_ISOLATION_L2      = 0x2,
+    TEST_ISOLATION_L3      = 0x3,
+} test_isolation_level_t;
+
+typedef enum {
+    LEVEL1 = 0x1,
+    LEVEL2,
+    LEVEL3,
+} isolation_level_t;
+
+typedef enum {
+    /* VAL uses this boot flag to mark first time boot of the system  */
+    BOOT_UNKNOWN                       = 0x1,
+    /* VAL/Test uses this boot flag to catch any unwanted system reboot - SIM ERROR Cases*/
+    BOOT_NOT_EXPECTED                  = 0x2,
+    /* Test performs panic check for non-secure test run and expect reboot */
+    BOOT_EXPECTED_NS                   = 0x3,
+    /* Test performs panic check for secure test run and expect reboot */
+    BOOT_EXPECTED_S                    = 0x4,
+    /* Test expects reboot but it didn't happen */
+    BOOT_EXPECTED_BUT_FAILED           = 0x5,
+    /* Test expects reboot for secure/non-secure test run. If reboot happens,
+     * re-enter the same test and execute the next check function
+     */
+    BOOT_EXPECTED_REENTER_TEST         = 0x6,
+    /* Test expect reboot for the test run. If reboot happens,
+     * re-enter the same test and continue executing the same check function
+     */
+    BOOT_EXPECTED_CONT_TEST_EXEC       = 0x7,
+} boot_state_t;
+
+typedef enum {
+    NV_BOOT             = 0x0,
+    NV_TEST_ID_PREVIOUS = 0x1,
+    NV_TEST_ID_CURRENT  = 0x2,
+    NV_TEST_CNT         = 0x3,
+    NV_TEST_DATA1       = 0x4,
+    NV_TEST_DATA2       = 0x5,
+    NV_TEST_DATA3       = 0x6,
+} nvmem_index_t;
+
+/* enums to report test sub-state */
+typedef enum {
+  VAL_STATUS_SUCCESS                     = 0x0,
+  VAL_STATUS_INVALID                     = 0x10,
+  VAL_STATUS_ERROR                       = 0x11,
+  VAL_STATUS_NOT_FOUND                   = 0x12,
+  VAL_STATUS_LOAD_ERROR                  = 0x13,
+  VAL_STATUS_INSUFFICIENT_SIZE           = 0x14,
+  VAL_STATUS_CONNECTION_FAILED           = 0x15,
+  VAL_STATUS_CALL_FAILED                 = 0x16,
+  VAL_STATUS_READ_FAILED                 = 0x17,
+  VAL_STATUS_WRITE_FAILED                = 0x18,
+  VAL_STATUS_ISOLATION_LEVEL_NOT_SUPP    = 0x19,
+  VAL_STATUS_INIT_FAILED                 = 0x1A,
+  VAL_STATUS_SPM_FAILED                  = 0x1B,
+  VAL_STATUS_SPM_UNEXPECTED_BEH          = 0x1C,
+  VAL_STATUS_FRAMEWORK_VERSION_FAILED    = 0x1D,
+  VAL_STATUS_VERSION_API_FAILED          = 0x1E,
+  VAL_STATUS_INVALID_HANDLE              = 0x1F,
+  VAL_STATUS_INVALID_MSG_TYPE            = 0x20,
+  VAL_STATUS_WRONG_IDENTITY              = 0x21,
+  VAL_STATUS_MSG_INSIZE_FAILED           = 0x22,
+  VAL_STATUS_MSG_OUTSIZE_FAILED          = 0x23,
+  VAL_STATUS_SKIP_FAILED                 = 0x24,
+  VAL_STATUS_CRYPTO_FAILURE              = 0x25,
+  VAL_STATUS_INVALID_SIZE                = 0x26,
+  VAL_STATUS_DATA_MISMATCH               = 0x27,
+  VAL_STATUS_BOOT_EXPECTED_BUT_FAILED    = 0x28,
+  VAL_STATUS_INIT_ALREADY_DONE           = 0x29,
+  VAL_STATUS_HEAP_NOT_AVAILABLE          = 0x2A,
+  VAL_STATUS_UNSUPPORTED                 = 0x2B,
+  VAL_STATUS_DRIVER_FN_FAILED            = 0x2C,
+  VAL_STATUS_NO_TESTS                    = 0X2D,
+  VAL_STATUS_TEST_FAILED                 = 0x2E,
+  VAL_STATUS_ERROR_MAX                   = INT_MAX,
+} val_status_t;
+
+/* verbosity enums */
+typedef enum {
+    PRINT_INFO    = 1,
+    PRINT_DEBUG   = 2,
+    PRINT_TEST    = 3,
+    PRINT_WARN    = 4,
+    PRINT_ERROR   = 5,
+    PRINT_ALWAYS  = 9
+} print_verbosity_t;
+
+/* Driver test function id enums */
+typedef enum {
+    TEST_PSA_EOI_WITH_NON_INTR_SIGNAL    = 1,
+    TEST_PSA_EOI_WITH_MULTIPLE_SIGNALS   = 2,
+    TEST_PSA_EOI_WITH_UNASSERTED_SIGNAL  = 3,
+    TEST_INTR_SERVICE                    = 4,
+    TEST_ISOLATION_PSA_ROT_DATA_RD       = 5,
+    TEST_ISOLATION_PSA_ROT_DATA_WR       = 6,
+    TEST_ISOLATION_PSA_ROT_STACK_RD      = 7,
+    TEST_ISOLATION_PSA_ROT_STACK_WR      = 8,
+    TEST_ISOLATION_PSA_ROT_HEAP_RD       = 9,
+    TEST_ISOLATION_PSA_ROT_HEAP_WR       = 10,
+    TEST_ISOLATION_PSA_ROT_MMIO_RD       = 11,
+    TEST_ISOLATION_PSA_ROT_MMIO_WR       = 12,
+} driver_test_fn_id_t;
+
+/* typedef's */
+typedef struct {
+    boot_state_t state;
+} boot_t;
+
+typedef struct {
+    uint32_t pass_cnt:8;
+    uint32_t skip_cnt:8;
+    uint32_t fail_cnt:8;
+    uint32_t sim_error_cnt:8;
+} test_count_t;
+
+typedef struct {
+    uint16_t test_num;
+    uint8_t block_num;
+} test_info_t;
+
+
+/* struture to capture test state */
+typedef struct {
+    uint16_t reserved;
+    uint8_t  state;
+    uint8_t  status;
+} test_status_buffer_t;
+
+typedef int32_t (*client_test_t)(caller_security_t caller);
+typedef int32_t (*server_test_t)(void);
+#endif /* VAL_COMMON_H */
diff --git a/secure-debug/val/include/val_adac.h b/secure-debug/val/include/val_adac.h
new file mode 100644
index 0000000..6086df9
--- /dev/null
+++ b/secure-debug/val/include/val_adac.h
@@ -0,0 +1,51 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+
+#ifndef _VAL_ADAC_H_
+#define _VAL_ADAC_H_
+#include <psa_adac.h>
+
+/** \brief Token header
+ *
+ */
+typedef struct {
+    uint16_t type;
+    uint8_t *data;
+    size_t size;
+} adac_command_frame_t;
+
+void val_adac_host_init(void);
+psa_status_t val_load_certificate_chain(const char *chain_file, uint8_t **chain,
+                                        size_t *chain_size);
+psa_status_t val_infer_cryptosystem(uint32_t *chain, size_t chain_size, psa_tlv_t **extns_list,
+                                size_t *extns_count, uint8_t *key_system);
+psa_status_t val_get_private_key(const char *key_file, uint8_t *type, psa_key_handle_t *handle,
+                                 uint8_t **key_ptr, size_t *size);
+request_packet_t *val_construct_command(uint16_t command, uint8_t *data, size_t data_size);
+psa_status_t val_issue_command(uint32_t command, request_packet_t *packet,
+                               uint8_t *data, size_t data_size);
+response_packet_t *val_await_response(void);
+psa_status_t val_parse_response(uint32_t command, response_packet_t *packet);
+
+psa_status_t val_sign_token(uint8_t challenge[], size_t challenge_size, uint8_t signature_type,
+                            uint8_t exts[], size_t exts_size, uint8_t *fragment[],
+                            size_t *fragment_size, psa_key_handle_t handle,
+                            uint8_t *key, size_t key_size);
+psa_status_t val_send_certificate(psa_tlv_t **extns_list, size_t extns_count);
+int val_check_cryptosystem_support(response_packet_t *packet, uint8_t key_system);
+
+#endif /* _VAL_ADAC_H_ */
diff --git a/secure-debug/val/include/val_dispatcher.h b/secure-debug/val/include/val_dispatcher.h
new file mode 100644
index 0000000..1419387
--- /dev/null
+++ b/secure-debug/val/include/val_dispatcher.h
@@ -0,0 +1,70 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+
+#ifndef _VAL_DISPATCHER_H_
+#define _VAL_DISPATCHER_H_
+
+#include "val.h"
+
+#define ELF_IDENT                      16
+#define VAL_INVALID_TEST_ID            0xffffffff
+#define VAL_TEST_START_MARKER          0xfaceface
+#define VAL_TEST_END_MARKER            0xc3c3c3c3
+
+/* typedef's */
+typedef uint32_t  elf32_word;
+typedef int32_t   elf32_sword;
+typedef uint16_t  elf32_half;
+typedef uint32_t  elf32_off;
+typedef uint32_t  elf32_addr;
+
+typedef struct {
+    unsigned char e_ident[ELF_IDENT]; /* ident bytes */
+    elf32_half    e_type;            /* file type */
+    elf32_half    e_machine;         /* target machine */
+    elf32_word    e_version;         /* file version */
+    elf32_addr    e_entry;           /* start address */
+    elf32_off     e_phoff;           /* phdr file offset */
+    elf32_off     e_shoff;           /* shdr file offset */
+    elf32_word    e_flags;           /* file flags */
+    elf32_half    e_ehsize;          /* sizeof ehdr */
+    elf32_half    e_phentsize;       /* sizeof phdr */
+    elf32_half    e_phnum;           /* number phdrs */
+    elf32_half    e_shentsize;       /* sizeof shdr */
+    elf32_half    e_shnum;           /* number shdrs */
+    elf32_half    e_shstrndx;        /* shdr string index */
+} elf_header_t;
+
+typedef struct {
+    elf32_word p_type;          /* Segment type */
+    elf32_off  p_offset;        /* Segment file offset */
+    elf32_addr p_vaddr;         /* Segment virtual address */
+    elf32_addr p_paddr;         /* Segment physical address */
+    elf32_word p_filesz;        /* Segment size in file */
+    elf32_word p_memsz;         /* Segment size in memory */
+    elf32_word p_flags;         /* Segment flags */
+    elf32_word p_align;         /* Segment alignment */
+} elf_pheader_t;
+
+typedef struct {
+    uint32_t  start_marker;
+    test_id_t test_id;
+    uint32_t  elf_size;
+} test_header_t;
+
+int32_t val_dispatcher(test_id_t test_id_prev);
+#endif
diff --git a/secure-debug/val/include/val_entry.h b/secure-debug/val/include/val_entry.h
new file mode 100644
index 0000000..f4d173f
--- /dev/null
+++ b/secure-debug/val/include/val_entry.h
@@ -0,0 +1,32 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+
+#ifndef _VAL_ENTRY_H_
+#define _VAL_ENTRY_H_
+
+#include "val_framework.h"
+
+#define PSA_ACS_MAJOR_VER    1
+#define PSA_ACS_MINOR_VER    2
+
+/**
+    @brief    - PSA Test Suite C main function, does VAL init and calls test dispatcher
+    @param    - None
+    @return   - int32_t
+**/
+extern int32_t val_entry(void);
+#endif
diff --git a/secure-debug/val/include/val_framework.h b/secure-debug/val/include/val_framework.h
new file mode 100644
index 0000000..5d53cbb
--- /dev/null
+++ b/secure-debug/val/include/val_framework.h
@@ -0,0 +1,33 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+
+
+#ifndef _VAL_INFRA_H_
+#define _VAL_INFRA_H_
+
+#include "val.h"
+#include "val_interfaces.h"
+
+/* prototypes */
+uint32_t     val_report_status(void);
+val_status_t val_set_status(uint32_t status);
+uint32_t     val_get_status(void);
+val_status_t val_err_check_set(uint32_t checkpoint, val_status_t status);
+void         val_test_init(uint32_t test_num, char8_t *desc);
+void         val_test_exit(void);
+
+#endif
diff --git a/secure-debug/val/include/val_interfaces.h b/secure-debug/val/include/val_interfaces.h
new file mode 100644
index 0000000..eca9a63
--- /dev/null
+++ b/secure-debug/val/include/val_interfaces.h
@@ -0,0 +1,79 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+
+#ifndef _VAL_INTERFACES_H_
+#define _VAL_INTERFACES_H_
+
+#include "val.h"
+#include "pal_interfaces.h"
+
+/* typedef's */
+typedef struct {
+    val_status_t     (*print)                     (print_verbosity_t verbosity,
+                                                   const char *string, int32_t data);
+    val_status_t     (*set_status)                (uint32_t status);
+    uint32_t         (*get_status)                (void);
+    void             (*test_init)                 (uint32_t test_num,  char8_t *desc);
+    void             (*test_exit)                 (void);
+    val_status_t     (*err_check_set)             (uint32_t checkpoint, val_status_t status);
+} val_api_t;
+
+typedef void (*test_fptr_t)(val_api_t *val);
+
+typedef struct {
+    test_id_t     test_id;
+    test_fptr_t   entry_addr;
+} val_test_info_t;
+
+typedef enum {
+    VAL_TEST_IDX0    = 0x0,
+    VAL_TEST_IDX1    = 0x1,
+    VAL_TEST_IDX2    = 0x2,
+    VAL_TEST_IDX3    = 0x3,
+    VAL_TEST_IDX4    = 0x4,
+    VAL_TEST_IDX5    = 0x5,
+    VAL_TEST_IDX6    = 0x6,
+    VAL_TEST_IDX7    = 0x7,
+    VAL_TEST_IDX8    = 0x8,
+    VAL_TEST_IDX9    = 0x9,
+    VAL_TEST_IDX10   = 0xA,
+    VAL_TEST_IDX11   = 0xB,
+    VAL_TEST_IDX12   = 0xC,
+    VAL_TEST_IDX13   = 0xD,
+    VAL_TEST_IDX14   = 0xE,
+    VAL_TEST_IDX15   = 0xF,
+    VAL_TEST_IDX16   = 0x10,
+    VAL_TEST_IDX17   = 0x11,
+    VAL_TEST_IDX18   = 0x12,
+    VAL_TEST_IDX19   = 0x13,
+    VAL_TEST_IDX20   = 0x14,
+    VAL_TEST_IDX21   = 0x15,
+    VAL_TEST_IDX22   = 0x16,
+    VAL_TEST_IDX23   = 0x17,
+    VAL_TEST_IDX24   = 0x18,
+    VAL_TEST_IDX25   = 0x19,
+    VAL_TEST_IDX26   = 0x1A,
+    VAL_TEST_IDX27   = 0x1B,
+    VAL_TEST_IDX28   = 0x1C,
+    VAL_TEST_IDX29   = 0x1D,
+    VAL_TEST_IDX30   = 0x1E,
+} val_test_index_t;
+
+#include "test_entry_fn_declare_list.inc"
+
+void test_entry(val_api_t *val);
+#endif
diff --git a/secure-debug/val/include/val_peripherals.h b/secure-debug/val/include/val_peripherals.h
new file mode 100644
index 0000000..d5fa4e9
--- /dev/null
+++ b/secure-debug/val/include/val_peripherals.h
@@ -0,0 +1,26 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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.
+**/
+
+#ifndef _VAL_PERIPHERALS_H_
+#define _VAL_PERIPHERALS_H_
+
+#include "val.h"
+
+val_status_t val_logger_init(void);
+val_status_t val_print(print_verbosity_t verbosity, const char *string, int32_t data);
+
+#endif
diff --git a/secure-debug/val/src/val_adac.c b/secure-debug/val/src/val_adac.c
new file mode 100644
index 0000000..53f02d1
--- /dev/null
+++ b/secure-debug/val/src/val_adac.c
@@ -0,0 +1,332 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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 <val_adac.h>
+#include <psa_adac_cryptosystems.h>
+#include <psa_adac_sdm.h>
+#include <psa_adac_debug.h>
+#include <pal_interfaces.h>
+
+void val_adac_host_init(void)
+{
+    psa_adac_platform_init();
+    psa_crypto_init();
+}
+
+psa_status_t val_load_certificate_chain(const char *chain_file, uint8_t **chain, size_t *chain_size)
+{
+    int ret_val;
+    psa_status_t r = PSA_SUCCESS;
+
+    if (chain_file == NULL) {
+        printf("Error:Path not found\n");
+        r = PSA_ERROR_INVALID_ARGUMENT;
+        return r;
+    }
+    ret_val = load_trust_chain(chain_file, chain, chain_size);
+    if (ret_val != 0) {
+        printf("Error loading trust chain (%s)\n", chain_file);
+        r = PSA_ERROR_GENERIC_ERROR;
+    }
+    return r;
+}
+
+psa_status_t val_infer_cryptosystem(uint32_t *chain, size_t chain_size, psa_tlv_t **extns_list,
+                              size_t *extns_count, uint8_t *key_system)
+{
+    int ret_val;
+    psa_status_t r = PSA_SUCCESS;
+    uint8_t key_type;
+    size_t count, i;
+    psa_tlv_t *current_extn;
+
+    ret_val = split_tlv_static(chain, chain_size, extns_list, MAX_EXTENSIONS, extns_count);
+    if (ret_val != 0) {
+        PSA_ADAC_LOG_ERR("host", "Error parsing trust chain\n");
+        r = PSA_ERROR_GENERIC_ERROR;
+        return r;
+    }
+    count = *extns_count;
+    if (count > MAX_EXTENSIONS) {
+        printf("Error:Extension count exceeded maximum allowed\n");
+        r = PSA_ERROR_NOT_PERMITTED;
+        return r;
+    }
+
+    PSA_ADAC_LOG_INFO("host", "Found %zu certificates\n", count);
+    for (i = 0; i < count; i++) {
+        current_extn = extns_list[i];
+        if ((current_extn)->type_id == 0x0201)
+            key_type = ((certificate_header_t *) current_extn->value)->key_type;
+    }
+    *key_system = key_type;
+    PSA_ADAC_LOG_INFO("host", "Cryptosystem detected: %d\n", key_type);
+    return r;
+}
+
+psa_status_t val_get_private_key(const char *key_file, uint8_t *type, psa_key_handle_t *handle,
+                                 uint8_t **key_ptr, size_t *size)
+{
+    int ret_val;
+    psa_status_t r = PSA_SUCCESS;
+    uint8_t key_type = *type;
+
+    if (key_file == NULL) {
+        printf("Error:Path not found\n");
+        r = PSA_ERROR_INVALID_ARGUMENT;
+        return r;
+    }
+
+    switch (key_type) {
+    case ECDSA_P256_SHA256:
+    case ECDSA_P521_SHA512:
+    case RSA_3072_SHA256:
+    case RSA_4096_SHA256:
+    case ED_25519_SHA512:
+    case ED_448_SHAKE256:
+    case SM_SM2_SM3:
+        ret_val = import_private_key(key_file, type, handle);
+        if (ret_val != 0) {
+            printf("Error importing private key (%s)\n", key_file);
+            r = PSA_ERROR_GENERIC_ERROR;
+        } else {
+            key_ptr = NULL;
+            size = 0;
+        }
+        break;
+
+    case CMAC_AES:
+    case HMAC_SHA256:
+        ret_val = load_secret_key(key_file, key_type, key_ptr, size);
+        if (ret_val != 0) {
+            printf("Error importing secret key (%s)\n", key_file);
+            r = PSA_ERROR_GENERIC_ERROR;
+        } else {
+            handle = NULL;
+        }
+        break;
+
+    default:
+        printf("Error: unsupported key type (0x%x)\n", key_type);
+        r = PSA_ERROR_NOT_SUPPORTED;
+    }
+    return r;
+}
+
+request_packet_t *val_construct_command(uint16_t cmd_type, uint8_t *data, size_t data_size)
+{
+    request_packet_t *packet = NULL;
+
+    switch (cmd_type) {
+    case SDP_RESUME_BOOT_CMD:
+    case SDP_LOCK_DEBUG_CMD:
+    case SDP_DISCOVERY_CMD:
+    case SDP_AUTH_START_CMD:
+        packet = request_packet_build(cmd_type, NULL, 0);
+        break;
+    case SDP_AUTH_RESPONSE_CMD:
+        if (data == NULL || data_size == 0) {
+            printf("Error: No payload specified\n");
+            break;
+        }
+        packet = request_packet_build((uint16_t)cmd_type, data, data_size);
+        break;
+    default:
+        //TO DO: Callback for vendor specific command construction
+        printf("Error: Unrecognized command. ID=(0x%x)\n", cmd_type);
+    }
+    return packet;
+}
+
+psa_status_t val_issue_command(uint32_t command, request_packet_t *packet,
+                               uint8_t *data, size_t data_size)
+{
+    int ret_val;
+    psa_status_t r = PSA_SUCCESS;
+
+    packet = val_construct_command((uint16_t)command, data, data_size);
+
+    if (packet == NULL) {
+        printf("Command construction failed\n");
+        r = PSA_ERROR_GENERIC_ERROR;
+        return r;
+    }
+
+    switch (command) {
+    case SDP_DISCOVERY_CMD:
+        printf("Sending discovery request\n");
+        break;
+    case SDP_AUTH_START_CMD:
+        printf("Sending challenge request\n");
+        break;
+    case SDP_AUTH_RESPONSE_CMD:
+        printf("Sending authentication response\n");
+        break;
+    case SDP_RESUME_BOOT_CMD:
+        printf("Sending close session command\n");
+        break;
+    case SDP_LOCK_DEBUG_CMD:
+        printf("Sending lock debug request\n");
+    default:
+        //TO DO: Vendor specific message
+        printf("Error: Unrecognized command. ID=(0x%x)\n", command);
+        r = PSA_ERROR_NOT_SUPPORTED;
+    }
+    ret_val = request_packet_send(packet);
+    if (ret_val < 0)
+        r = PSA_ERROR_GENERIC_ERROR;
+
+    request_packet_release(packet);
+    return r;
+}
+
+response_packet_t *val_await_response(void)
+{
+    return response_packet_receive();
+}
+
+psa_status_t val_parse_response(uint32_t command, response_packet_t *packet)
+{
+    int ret_val;
+    psa_status_t r = PSA_SUCCESS;
+    size_t i;
+    psa_tlv_t *tlv;
+    psa_auth_challenge_t *challenge;
+
+    if (packet == NULL) {
+        printf("Error: Target response not obtained\n");
+        r = PSA_ERROR_COMMUNICATION_FAILURE;
+        return r;
+    }
+
+    switch (command) {
+    case SDP_DISCOVERY_CMD:
+        printf("Receiving discovery response...\n");
+        for (i = 0; (i + 4) < (packet->data_count * 4);) {
+            tlv = (psa_tlv_t *) (((uint8_t *)packet->data) + i);
+            i += sizeof(psa_tlv_t) + tlv->length_in_bytes;
+        }
+        break;
+    case SDP_AUTH_START_CMD:
+        printf("Receiving challenge\n");
+        printf("status = 0x%04x, data_count = %d\n", packet->status, packet->data_count);
+        if (packet->data_count * 4 != sizeof(psa_auth_challenge_t)) {
+            r = PSA_ERROR_GENERIC_ERROR;
+            return r;
+        }
+        challenge = (psa_auth_challenge_t *) packet->data;
+        PSA_ADAC_LOG_DUMP("host", "challenge", challenge->challenge_vector,
+                           sizeof(challenge->challenge_vector));
+        break;
+    case SDP_AUTH_RESPONSE_CMD:
+    case SDP_RESUME_BOOT_CMD:
+    case SDP_LOCK_DEBUG_CMD:
+        printf("status = 0x%04x, data_count = %d\n", packet->status, packet->data_count);
+        break;
+    default:
+        r = PSA_ERROR_NOT_SUPPORTED;
+    }
+    return r;
+}
+
+psa_status_t val_sign_token(uint8_t challenge[], size_t challenge_size, uint8_t signature_type,
+                            uint8_t exts[], size_t exts_size, uint8_t *fragment[],
+                            size_t *fragment_size, psa_key_handle_t handle,
+                            uint8_t *key, size_t key_size)
+{
+    psa_status_t r;
+
+    r = psa_adac_sign_token(challenge, challenge_size, signature_type, exts, exts_size,
+                           fragment, fragment_size, handle, key, key_size);
+    if (r == PSA_SUCCESS) {
+        PSA_ADAC_LOG_DUMP("host", "token", *fragment, *fragment_size);
+    } else {
+        PSA_ADAC_LOG_ERR("host", "Error signing token\n");
+        r = PSA_ERROR_GENERIC_ERROR;
+    }
+    return r;
+}
+
+psa_status_t val_send_certificate(psa_tlv_t **extns_list, size_t extns_count)
+{
+    request_packet_t *request;
+    response_packet_t *response;
+    psa_status_t r;
+    uint8_t *payload;
+    size_t i, payload_size;
+    psa_tlv_t *current_extn;
+
+    for (size_t i = 0; i < extns_count; i++) {
+        current_extn = extns_list[i];
+        if (current_extn->type_id == 0x0201) {
+            payload = (uint8_t *)current_extn;
+            payload_size = current_extn->length_in_bytes + sizeof(psa_tlv_t);
+
+            printf("Sending Certificate\n");
+            r = val_issue_command(SDP_AUTH_RESPONSE_CMD, request, payload, payload_size);
+            if (r != PSA_SUCCESS)
+                return r;
+
+            printf("Receiving token_authentication response\n");
+            response = val_await_response();
+            r = val_parse_response(SDP_AUTH_RESPONSE_CMD, response);
+            if (r != PSA_SUCCESS)
+                return r;
+
+            if (response->status == SDP_NEED_MORE_DATA)
+                response_packet_release(response);
+        }
+    }
+    if (response->status != SDP_NEED_MORE_DATA) {
+        PSA_ADAC_LOG_ERR("host", "Unexpected response status %x\n", response->status);
+        r = PSA_ERROR_GENERIC_ERROR;
+        return r;
+    }
+    response_packet_release(response);
+    return r;
+}
+
+int val_check_cryptosystem_support(response_packet_t *packet, uint8_t key_system)
+{
+    int found = 0, j;
+    size_t i = 0;
+    psa_tlv_t *tlv;
+    uint8_t *key_support_types = NULL;
+
+    while ((i + 4) < (packet->data_count * 4)) {
+        tlv = (psa_tlv_t *) (((uint8_t *)packet->data) + i);
+        if (tlv->type_id == 0x0102) {
+           key_support_types = tlv->value;
+           for (j = 0; j < (tlv->length_in_bytes); j++) {
+                if (*(key_support_types+j) == key_system) {
+                    found = 1;
+                    break;
+                }
+           }
+        }
+        i += sizeof(psa_tlv_t) + tlv->length_in_bytes;
+    }
+
+    if (key_support_types == NULL)
+        printf("Cryptosystem Type ID not found in target's response\n");
+    else if (!found)
+        printf("Cryptosystem not supported by target\n");
+    else
+        printf("Cryptosystem supported by target\n");
+
+    return found;
+}
diff --git a/secure-debug/val/src/val_dispatcher.c b/secure-debug/val/src/val_dispatcher.c
new file mode 100644
index 0000000..86426cc
--- /dev/null
+++ b/secure-debug/val/src/val_dispatcher.c
@@ -0,0 +1,222 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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 "val_framework.h"
+#include "val_dispatcher.h"
+#include "val_interfaces.h"
+#include "val_peripherals.h"
+
+
+extern val_api_t val_api;
+
+/* gloabls */
+addr_t          g_test_info_addr;
+
+/**
+    @brief        - This function prints PSA_{SUITE}_API_VERSION_MAJOR
+                    PSA_{SUITE}_API_VERSION_MINOR details.
+    @param        - None
+    @return       - None
+**/
+static void val_print_api_version(void)
+{
+#ifdef CRYPTO
+    val_print(PRINT_ALWAYS, " %d.", PSA_CRYPTO_API_VERSION_MAJOR);
+    val_print(PRINT_ALWAYS, "%d", PSA_CRYPTO_API_VERSION_MINOR);
+#endif
+#ifdef INTERNAL_TRUSTED_STORAGE
+    val_print(PRINT_ALWAYS, " %d.", PSA_ITS_API_VERSION_MAJOR);
+    val_print(PRINT_ALWAYS, "%d", PSA_ITS_API_VERSION_MINOR);
+#endif
+#ifdef PROTECTED_STORAGE
+    val_print(PRINT_ALWAYS, " %d.", PSA_PS_API_VERSION_MAJOR);
+    val_print(PRINT_ALWAYS, "%d", PSA_PS_API_VERSION_MINOR);
+#endif
+#ifdef STORAGE
+    val_print(PRINT_ALWAYS, " ITS %d.", PSA_ITS_API_VERSION_MAJOR);
+    val_print(PRINT_ALWAYS, "%d", PSA_ITS_API_VERSION_MINOR);
+    val_print(PRINT_ALWAYS, " and PS %d.", PSA_PS_API_VERSION_MAJOR);
+    val_print(PRINT_ALWAYS, "%d", PSA_PS_API_VERSION_MINOR);
+#endif
+#ifdef INITIAL_ATTESTATION
+    val_print(PRINT_ALWAYS, " %d.", PSA_INITIAL_ATTEST_API_VERSION_MAJOR);
+    val_print(PRINT_ALWAYS, "%d", PSA_INITIAL_ATTEST_API_VERSION_MINOR);
+#endif
+}
+
+/**
+    @brief        - This function reads the test ELFs from RAM or secondary storage and loads into
+                    system memory
+    @param        - test_id      : Returns the current test ID
+                  - test_id_prev : Previous test ID.
+    @return       - Error code
+**/
+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}
+                                  };
+
+    for (i = 0; i < (int)(sizeof(test_list)/sizeof(test_list[0])); i++)
+    {
+        if (test_id_prev == VAL_INVALID_TEST_ID)
+        {
+            *test_id = test_list[i].test_id;
+            g_test_info_addr = (addr_t) test_list[i].entry_addr;
+            return VAL_STATUS_SUCCESS;
+        }
+        else if (test_id_prev == test_list[i].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;
+            return VAL_STATUS_SUCCESS;
+        }
+    }
+
+    *test_id = VAL_INVALID_TEST_ID;
+    val_print(PRINT_ERROR, "\n\nError: No more valid tests found. Exiting.", 0);
+    return VAL_STATUS_LOAD_ERROR;
+}
+
+/**
+    @brief    - This function reads the function pointer addresses for
+                test_entry
+    @param    - paddr    : Returns the Test function address
+    @return   - Returns val_status_t
+**/
+val_status_t val_get_test_entry_addr(addr_t *paddr)
+{
+    *paddr = g_test_info_addr;
+    return VAL_STATUS_SUCCESS;
+}
+
+/**
+    @brief    - Execute the function pointer which was given to us by the test
+    @param    - void
+**/
+void val_execute_test_fn(void)
+{
+    test_fptr_t   fn_ptr;
+    addr_t        addr;
+
+    val_get_test_entry_addr(&addr);
+    fn_ptr = (test_fptr_t)addr;
+    fn_ptr(&val_api);
+    return;
+}
+
+/*
+    @brief    - Reads the pre-defined component name against given test_id
+    @param    - test_id  : Current Test ID
+    @return   - Component name
+*/
+char *val_get_comp_name(test_id_t test_id)
+{
+    switch (VAL_GET_COMP_NUM(test_id))
+    {
+        case VAL_SECURE_DEBUG_BASE:
+            return "Secure Debug Suite";
+        default:
+            return "Unknown Suite";
+    }
+}
+
+/**
+    @brief    - This function is responsible for setting up VAL infrastructure.
+                Loads test one by one from combine binary and calls test_entry
+                function of each test image.
+    @return   - 0 if success Or error code for the failure.
+**/
+int32_t val_dispatcher(test_id_t test_id_prev)
+{
+
+    test_id_t            test_id;
+    val_status_t         status;
+    boot_t               boot;
+    test_count_t         test_count = {0,};
+    uint32_t             test_result;
+
+    do
+    {
+		status = val_test_load(&test_id, test_id_prev);
+
+		if (VAL_ERROR(status))
+		{
+			return status;
+		}
+		else if (test_id == VAL_INVALID_TEST_ID)
+		{
+			break;
+		}
+		if (VAL_GET_COMP_NUM(test_id_prev) != VAL_GET_COMP_NUM(test_id))
+		{
+			val_print(PRINT_ALWAYS, "\nRunning.. ", 0);
+			val_print(PRINT_ALWAYS, val_get_comp_name(test_id), 0);
+			val_print(PRINT_ALWAYS, "\n******************************\n", 0);
+		}
+
+		val_execute_test_fn();
+
+        test_result = val_report_status();
+
+        switch (test_result)
+        {
+            case TEST_PASS:
+                test_count.pass_cnt += 1;
+                break;
+            case TEST_FAIL:
+                test_count.fail_cnt += 1;
+                break;
+            case TEST_SKIP:
+                test_count.skip_cnt += 1;
+                break;
+            case TEST_PENDING:
+                test_count.sim_error_cnt += 1;
+                break;
+        }
+
+        test_id_prev = test_id;
+   } while (1);
+
+   val_print(PRINT_ALWAYS, "\n************ ", 0);
+   val_print(PRINT_ALWAYS, val_get_comp_name(test_id_prev), 0);
+   val_print(PRINT_ALWAYS, " Report **********\n", 0);
+   val_print(PRINT_ALWAYS, "TOTAL TESTS     : %d\n", test_count.pass_cnt + test_count.fail_cnt
+            + test_count.skip_cnt + test_count.sim_error_cnt);
+   val_print(PRINT_ALWAYS, "TOTAL PASSED    : %d\n", test_count.pass_cnt);
+   val_print(PRINT_ALWAYS, "TOTAL SIM ERROR : %d\n", test_count.sim_error_cnt);
+   val_print(PRINT_ALWAYS, "TOTAL FAILED    : %d\n", test_count.fail_cnt);
+   val_print(PRINT_ALWAYS, "TOTAL SKIPPED   : %d\n", test_count.skip_cnt);
+   val_print(PRINT_ALWAYS, "******************************************\n", 0);
+
+   return (test_count.fail_cnt > 0) ? VAL_STATUS_TEST_FAILED : VAL_STATUS_SUCCESS;
+}
+
+
+
+
+
+
+
diff --git a/secure-debug/val/src/val_entry.c b/secure-debug/val/src/val_entry.c
new file mode 100644
index 0000000..1d13bcb
--- /dev/null
+++ b/secure-debug/val/src/val_entry.c
@@ -0,0 +1,64 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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 "val_entry.h"
+#include "val_framework.h"
+#include "val_peripherals.h"
+#include "val_dispatcher.h"
+
+int32_t val_entry(void);
+
+/**
+    @brief    - PSA C main function, does VAL init and calls test dispatcher
+    @param    - None
+    @return   - status - error code
+**/
+int32_t val_entry(void)
+{
+    test_id_t       test_id = VAL_INVALID_TEST_ID;
+    int32_t         status;
+
+    status = val_logger_init();
+    if (VAL_ERROR(status))
+    {
+        goto exit;
+    }
+
+    /* Compliance header print */
+    if (test_id == VAL_INVALID_TEST_ID)
+    {
+        val_print(PRINT_ALWAYS, "\n***** PSA Architecture Test Suite - Version %d.",
+                                                                         PSA_ACS_MAJOR_VER);
+        val_print(PRINT_ALWAYS, "%d *****\n", PSA_ACS_MINOR_VER);
+    }
+
+    /* Call dispatcher routine*/
+    status = val_dispatcher(test_id);
+
+exit:
+    val_print(PRINT_ALWAYS, "\nEntering standby.. \n", 0);
+
+    pal_terminate_simulation();
+
+    return status;
+}
+
+//int main()
+//{
+//	val_entry();
+//	return 0;
+//}
diff --git a/secure-debug/val/src/val_framework.c b/secure-debug/val/src/val_framework.c
new file mode 100644
index 0000000..2a700b4
--- /dev/null
+++ b/secure-debug/val/src/val_framework.c
@@ -0,0 +1,172 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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 "val_framework.h"
+#include "val_interfaces.h"
+#include "val_dispatcher.h"
+#include "val_peripherals.h"
+#include "pal_interfaces.h"
+
+
+extern val_api_t val_api;
+
+
+/* globals */
+test_status_buffer_t    g_status_buffer;
+
+/**
+    @brief    - Parses input status for a given test and
+                outputs appropriate information on the console
+    @return   - Test state
+**/
+uint32_t val_report_status(void)
+{
+    uint32_t status, state;
+
+    status = val_get_status();
+
+    state = (status >> TEST_STATE_BIT) & TEST_STATE_MASK;
+    status = status & TEST_STATUS_MASK;
+
+    switch (state)
+    {
+        case TEST_START:
+            state = TEST_FAIL;
+            val_print(PRINT_ALWAYS, "\nTEST RESULT: FAILED (Error Code=0x%x)\n",
+                                                    VAL_STATUS_INIT_FAILED);
+            break;
+
+        case TEST_END:
+            state = TEST_PASS;
+            val_print(PRINT_ALWAYS, "\nTEST RESULT: PASSED\n", 0);
+            break;
+
+        case TEST_FAIL:
+            val_print(PRINT_ALWAYS, "\nTEST RESULT: FAILED (Error Code=0x%x)\n", status);
+            break;
+
+        case TEST_SKIP:
+            state = TEST_SKIP;
+            val_print(PRINT_ALWAYS, "\nTEST RESULT: SKIPPED (Skip Code=0x%x)\n", status);
+            break;
+
+        case TEST_PENDING:
+            val_print(PRINT_ALWAYS, "\nTEST RESULT: SIM ERROR (Error Code=0x%x)\n", status);
+            break;
+
+        default:
+            state = TEST_FAIL;
+            val_print(PRINT_ALWAYS, "\nTEST RESULT: FAILED(Error Code=0x%x)\n", VAL_STATUS_INVALID);
+            break;
+
+    }
+
+    val_print(PRINT_ALWAYS, "\n******************************************\n", 0);
+    return state;
+}
+
+/**
+    @brief    - Records the state and status of test
+    @return   - val_status_t
+**/
+val_status_t val_set_status(uint32_t status)
+{
+    g_status_buffer.state   = ((status >> TEST_STATE_BIT) & TEST_STATE_MASK);
+    g_status_buffer.status  = (status & TEST_STATUS_MASK);
+
+    return VAL_STATUS_SUCCESS;
+}
+
+/**
+    @brief    - Updates the state and status for a given test
+    @return   - test status
+**/
+uint32_t val_get_status(void)
+{
+    return ((g_status_buffer.state) << TEST_STATE_BIT) | (g_status_buffer.status);
+}
+
+/*
+    @brief           - This function checks if the input status argument is an error.
+                       On error, we print the checkpoint value and set the status.
+    @param           - checkpoint     : Test debug checkpoint
+                     - val_status_t   : Test status
+    @return          - returns the input status back to the program.
+*/
+
+val_status_t val_err_check_set(uint32_t checkpoint, val_status_t status)
+{
+    if (VAL_ERROR(status)) {
+        val_print(PRINT_ERROR, "\tCheckpoint %d : ", checkpoint);
+        val_print(PRINT_ERROR, "Error Code=0x%x \n", status);
+        val_set_status(RESULT_FAIL(status));
+    } else {
+        status = (val_get_status() & TEST_STATUS_MASK);
+        if (VAL_ERROR(status)) {
+            val_print(PRINT_ERROR, "\tCheckpoint %d : ", checkpoint);
+            val_print(PRINT_ERROR, "Error Code=0x%x \n", status);
+        } else {
+            val_print(PRINT_DEBUG, "\tCheckpoint %d \n", checkpoint);
+        }
+    }
+    return status;
+}
+
+/**
+  @brief  This API prints the test number, description and
+          sets the test state to TEST_START on successful execution.
+  @param  test_num       :unique number identifying this test
+  @param  desc           :brief description of the test
+  @param  test_bitfield  :Addition test info such as
+                           - test isolation level requirement
+                           - Watchdog timeout type
+  @return void
+**/
+
+void val_test_init(uint32_t test_num, char8_t *desc)
+{
+   val_status_t         status = VAL_STATUS_SUCCESS;
+
+   /*global init*/
+   g_status_buffer.state   = TEST_FAIL;
+   g_status_buffer.status  = VAL_STATUS_INVALID;
+
+   val_print(PRINT_ALWAYS, "\nTEST: %d | DESCRIPTION: ", test_num);
+   val_print(PRINT_ALWAYS, desc, 0);
+
+   val_set_status(RESULT_START(status));
+   return;
+}
+
+/**
+  @brief  This API sets the test state to TEST_END if test is successfully passed.
+  @param none
+  @return none
+**/
+
+void val_test_exit(void)
+{
+    val_status_t status = VAL_STATUS_SUCCESS;
+
+    status = val_get_status();
+
+    /* return if test skipped or failed */
+    if (IS_TEST_FAIL(status) || IS_TEST_SKIP(status))
+        return;
+    else
+        val_set_status(RESULT_END(VAL_STATUS_SUCCESS));
+}
diff --git a/secure-debug/val/src/val_interfaces.c b/secure-debug/val/src/val_interfaces.c
new file mode 100644
index 0000000..63c041d
--- /dev/null
+++ b/secure-debug/val/src/val_interfaces.c
@@ -0,0 +1,32 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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 "val_framework.h"
+#include "val_interfaces.h"
+#include "val_peripherals.h"
+
+/*VAL APIs to be used by test */
+const val_api_t val_api = {
+    .print                     = val_print,
+    .set_status                = val_set_status,
+    .get_status                = val_get_status,
+    .test_init                 = val_test_init,
+    .test_exit                 = val_test_exit,
+    .err_check_set             = val_err_check_set,
+};
+
diff --git a/secure-debug/val/src/val_peripherals.c b/secure-debug/val/src/val_peripherals.c
new file mode 100644
index 0000000..e804485
--- /dev/null
+++ b/secure-debug/val/src/val_peripherals.c
@@ -0,0 +1,55 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * 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 "val_peripherals.h"
+#include "pal_interfaces.h"
+#include "val_framework.h"
+
+/* Global */
+uint32_t   is_logger_init_done = 0;
+
+/*
+    @brief    - Initialize UART.
+                This is client interface API of secure partition UART INIT API.
+    @param    - None
+    @return   - val_status_t
+*/
+val_status_t val_logger_init(void)
+{
+	is_logger_init_done = 1;
+	return VAL_STATUS_SUCCESS;
+}
+
+/**
+    @brief    - Print module. This is client interface API of secure partition
+                val_print_sf API for nspe world
+    @param    - verbosity: Print verbosity level
+              - string   : Input string
+              - data     : Value for format specifier
+    @return   - val_status_t
+**/
+val_status_t val_print(print_verbosity_t verbosity, const char *string, int32_t data)
+{
+    if ((is_logger_init_done == 0) && (verbosity < VERBOSE))
+    {
+       return VAL_STATUS_SUCCESS;
+    }
+    return pal_print(string, data);
+}
+
+
+
diff --git a/secure-debug/val/val.cmake b/secure-debug/val/val.cmake
new file mode 100644
index 0000000..665db48
--- /dev/null
+++ b/secure-debug/val/val.cmake
@@ -0,0 +1,42 @@
+#/** @file
+# * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+# * 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.
+#**/
+
+if(NOT DEFINED PSA_ADAC_ROOT)
+    get_filename_component(PSA_ADAC_ROOT ${CMAKE_SOURCE_DIR}/psa-adac ABSOLUTE)
+endif()
+
+# Listing all the sources from val
+list(APPEND VAL_SRC_C
+	${CMAKE_SOURCE_DIR}/val/src/val_entry.c
+	${CMAKE_SOURCE_DIR}/val/src/val_adac.c
+	${CMAKE_SOURCE_DIR}/val/src/val_dispatcher.c
+	${CMAKE_SOURCE_DIR}/val/src/val_framework.c
+	${CMAKE_SOURCE_DIR}/val/src/val_interfaces.c
+	${CMAKE_SOURCE_DIR}/val/src/val_peripherals.c
+)
+
+# Create VAL library
+add_library(${ADAC_HOST_VAL_LIB} STATIC ${VAL_SRC_C})
+
+target_include_directories(${ADAC_HOST_VAL_LIB} PRIVATE
+    ${CMAKE_SOURCE_DIR}/val/include
+    ${CMAKE_BINARY_DIR}
+    ${PSA_ADAC_ROOT}/psa-adac/core/include
+    ${PSA_ADAC_ROOT}/psa-adac/sdm/include
+    )
+
+target_link_libraries(${ADAC_HOST_VAL_LIB} mbedcrypto)
