psa arch test v1.2 release commits
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
 }
 
 /**