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
 }
 
 /**
