diff --git a/api-tests/tools/cmake/common/CMakeSettings.cmake b/api-tests/tools/cmake/common/CMakeSettings.cmake
new file mode 100644
index 0000000..eb812a9
--- /dev/null
+++ b/api-tests/tools/cmake/common/CMakeSettings.cmake
@@ -0,0 +1,24 @@
+#/** @file
+# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# *  http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+#Stop built in CMakeDetermine<lang>.cmake scripts to run.
+set (CMAKE_C_COMPILER_ID_RUN 1)
+#Stop cmake run compiler tests.
+set (CMAKE_C_COMPILER_FORCED true)
+
+set(CMAKE_STATIC_LIBRARY_PREFIX "")
+set(CMAKE_STATIC_LIBRARY_SUFFIX ".a")
diff --git a/api-tests/tools/cmake/common/Utils.cmake b/api-tests/tools/cmake/common/Utils.cmake
new file mode 100644
index 0000000..6751763
--- /dev/null
+++ b/api-tests/tools/cmake/common/Utils.cmake
@@ -0,0 +1,37 @@
+#/** @file
+# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# *  http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+# Function to CMake arguments
+function(_check_arguments)
+        foreach(_ARG IN LISTS ARGV)
+                if(NOT DEFINED ${_ARG})
+                        message(FATAL_ERROR "[PSA] : ${_ARG} is not passed! Please specify -D${_ARG}=<...> to CMake.")
+                endif()
+        endforeach()
+endfunction(_check_arguments)
+
+# Function to get all the folders inside given parent directory
+function(_get_sub_dir_list result parent_dir)
+        file(GLOB parent_dir_items RELATIVE ${parent_dir} ${parent_dir}/*)
+        set(dir_list "")
+        foreach(item ${parent_dir_items})
+                if(IS_DIRECTORY ${parent_dir}/${item})
+                        list(APPEND dir_list ${item})
+                endif()
+        endforeach()
+        set(${result} ${dir_list} PARENT_SCOPE)
+endfunction(_get_sub_dir_list)
diff --git a/api-tests/tools/cmake/compiler/ARMCLANG.cmake b/api-tests/tools/cmake/compiler/ARMCLANG.cmake
new file mode 100644
index 0000000..d96dc9d
--- /dev/null
+++ b/api-tests/tools/cmake/compiler/ARMCLANG.cmake
@@ -0,0 +1,63 @@
+#/** @file
+# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# *  http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+set(CMAKE_SYSTEM_NAME Generic)
+set(CMKE_SYSTEM_PROCESSOR ARM)
+
+set(_C_TOOLCHAIN_NAME armclang)
+
+if(WIN32)
+        if (NOT DEFINED ARMCLANG_PATH)
+                set(ARMCLANG_PATH "C:" CACHE PATH "Install directory for ARMCLANG Compiler")
+        endif()
+else(WIN32)
+        if (NOT DEFINED ARMCLANG_PATH)
+                set(ARMCLANG_PATH "/" CACHE PATH "Install directory for ARMCLANG Compiler")
+        endif()
+endif(WIN32)
+
+find_program(
+        _C_TOOLCHAIN_PATH
+        ${_C_TOOLCHAIN_NAME}
+        PATHS env PATH
+        HINTS ${ARMCLANG_PATH}
+        HINTS bin
+)
+
+if(_C_TOOLCHAIN_PATH STREQUAL "_C_TOOLCHAIN_PATH-NOTFOUND")
+        message(FATAL_ERROR "[PSA] : Couldn't find ${_C_TOOLCHAIN_NAME}."
+                            " Either put ${_C_TOOLCHAIN_NAME} on the PATH or set ARMCLANG_PATH set properly.")
+endif()
+
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
+foreach(_LNG IN ITEMS "C" "ASM")
+        set(CMAKE_${_LNG}_COMPILER ${_C_TOOLCHAIN_PATH})
+        message(STATUS "[PSA] : ${_LNG}  compiler used '${CMAKE_${_LNG}_COMPILER}'")
+endforeach()
+
+if(${CPU_ARCH} STREQUAL armv7m)
+	set(TARGET_SWITCH "-march=armv7-m")
+elseif(${CPU_ARCH} STREQUAL armv8m_ml)
+	set(TARGET_SWITCH "-march=armv8-m.main -mcmse")
+elseif(${CPU_ARCH} STREQUAL armv8m_bl)
+	set(TARGET_SWITCH "-march=armv8-m.base -mcmse")
+endif()
+
+set(CMAKE_C_FLAGS              "--target=arm-arm-none-eabi ${TARGET_SWITCH} -Wall -Werror -fshort-enums -fshort-wchar -funsigned-char -fdata-sections -ffunction-sections -mno-unaligned-access -mfpu=none")
+set(CMAKE_ASM_FLAGS            "${TARGET_SWITCH} -mthumb")
+set(CMAKE_EXE_LINKER_FLAGS     "--strict --map --symbols --xref  --info=summarysizes,sizes,totals,unused,veneers --diag_warning=L6204")
diff --git a/api-tests/tools/cmake/compiler/GNUARM.cmake b/api-tests/tools/cmake/compiler/GNUARM.cmake
new file mode 100644
index 0000000..cede575
--- /dev/null
+++ b/api-tests/tools/cmake/compiler/GNUARM.cmake
@@ -0,0 +1,63 @@
+#/** @file
+# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# *  http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+set(CMAKE_SYSTEM_NAME Generic)
+set(CMKE_SYSTEM_PROCESSOR ARM)
+
+set(_C_TOOLCHAIN_NAME arm-none-eabi-gcc)
+
+if(WIN32)
+	if (NOT DEFINED GNUARM_PATH)
+		set(GNUARM_PATH "C:" CACHE PATH "Install directory for GNUARM Compiler")
+	endif()
+else(WIN32)
+	if (NOT DEFINED GNUARM_PATH)
+		set(GNUARM_PATH "/" CACHE PATH "Install directory for GNUARM Compiler")
+	endif()
+endif(WIN32)
+
+find_program(
+	_C_TOOLCHAIN_PATH
+	${_C_TOOLCHAIN_NAME}
+	PATHS env PATH
+	HINTS ${GNUARM_PATH}
+	HINTS bin
+)
+
+if(_C_TOOLCHAIN_PATH STREQUAL "_C_TOOLCHAIN_PATH-NOTFOUND")
+        message(FATAL_ERROR "[PSA] : Couldn't find ${_C_TOOLCHAIN_NAME}."
+			    " Either put ${_C_TOOLCHAIN_NAME} on the PATH or set GNUARM_PATH set properly.")
+endif()
+
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
+foreach(_LNG IN ITEMS "C" "ASM")
+	set(CMAKE_${_LNG}_COMPILER ${_C_TOOLCHAIN_PATH})
+	message(STATUS "[PSA] : ${_LNG}  compiler used '${CMAKE_${_LNG}_COMPILER}'")
+endforeach()
+
+if(${CPU_ARCH} STREQUAL armv7m)
+	set(TARGET_SWITCH "-march=armv7-m")
+elseif(${CPU_ARCH} STREQUAL armv8m_ml)
+	set(TARGET_SWITCH "-march=armv8-m.main -mcmse")
+elseif(${CPU_ARCH} STREQUAL armv8m_bl)
+	set(TARGET_SWITCH "-march=armv8-m.base -mcmse")
+endif()
+
+set(CMAKE_C_FLAGS          "${TARGET_SWITCH}  -Wall -Werror -fdata-sections -ffunction-sections -mno-unaligned-access")
+set(CMAKE_ASM_FLAGS        "${TARGET_SWITCH} -mthumb")
+set(CMAKE_EXE_LINKER_FLAGS "-Xlinker --fatal-warnings -Xlinker --gc-sections -z max-page-size=0x400 -lgcc -lc -lnosys")
diff --git a/api-tests/tools/cmake/compiler/HOST_GCC.cmake b/api-tests/tools/cmake/compiler/HOST_GCC.cmake
new file mode 100644
index 0000000..e7be183
--- /dev/null
+++ b/api-tests/tools/cmake/compiler/HOST_GCC.cmake
@@ -0,0 +1,51 @@
+#/** @file
+# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# *  http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+set(CMAKE_SYSTEM_NAME Generic)
+set(CMKE_SYSTEM_PROCESSOR x86_64)
+
+set(_C_TOOLCHAIN_NAME gcc)
+
+if(WIN32)
+	if (NOT DEFINED HOST_GCC_PATH)
+		set(HOST_GCC_PATH "C:" CACHE PATH "Install directory for Host GCC Compiler")
+	endif()
+else(WIN32)
+	if (NOT DEFINED HOST_GCC_PATH)
+		set(HOST_GCC_PATH "/" CACHE PATH "Install directory for Host GCC Compiler")
+	endif()
+endif(WIN32)
+
+find_program(
+	_C_TOOLCHAIN_PATH
+	${_C_TOOLCHAIN_NAME}
+	PATHS env PATH
+	HINTS ${HOST_GCC_PATH}
+	HINTS bin
+)
+
+if(_C_TOOLCHAIN_PATH STREQUAL "_C_TOOLCHAIN_PATH-NOTFOUND")
+        message(FATAL_ERROR "[PSA] : Couldn't find ${_C_TOOLCHAIN_NAME}."
+			    " Either put ${_C_TOOLCHAIN_NAME} on the PATH or set GNUARM_PATH set properly.")
+endif()
+
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
+foreach(_LNG IN ITEMS "C" "ASM")
+	set(CMAKE_${_LNG}_COMPILER ${_C_TOOLCHAIN_PATH})
+	message(STATUS "[PSA] : ${_LNG}  compiler used '${CMAKE_${_LNG}_COMPILER}'")
+endforeach()
diff --git a/api-tests/tools/makefiles/Makefile b/api-tests/tools/makefiles/Makefile
deleted file mode 100644
index 1aa790b..0000000
--- a/api-tests/tools/makefiles/Makefile
+++ /dev/null
@@ -1,131 +0,0 @@
-# * Copyright (c) 2018-2019, 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.
-#**/
-
-ifeq (${SUITE}, ipc)
-SUITE_DIR = ff/$(SUITE)
-else
-SUITE_DIR = dev_apis/$(SUITE)
-endif
-
-export SUITE_IN= $(SOURCE)/$(SUITE_DIR)
-export SUITE_OUT= $(BUILD)/$(SUITE_DIR)
-
-include $(SOURCE)/tools/makefiles/toolchain.mk
-
-
-all: clean target_cfg gen_linker process_testsuite.db build
-
-#Generate target files from User provided data base
-target_cfg:
-	@echo  ""
-	@echo  "Processing target configuration..."
-	mkdir -p $(BUILD)/platform/${TARGET}/
-	@if [ ! -f "$(SOURCE)/platform/targets/$(TARGET)/target.cfg" ]; then { echo "Error: Target Not Found!!!"; exit 1; } fi
-	python $(SOURCE)/tools/scripts/targetConfigGen.py ${TARGET} $(SOURCE)/val/common/val_target.h \
-	$(SOURCE)/platform/targets/${TARGET}/target.cfg $(BUILD)/platform/${TARGET}/targetConfigGen.c \
-	$(BUILD)/platform/${TARGET}/target_database.h target_database ""
-	gcc -D__addr_t_defined -DTARGET_CFG_BUILD $(BUILD)/platform/${TARGET}/targetConfigGen.c -o $(BUILD)/platform/${TARGET}/targetConfigGen \
-	-I$(SOURCE)/val/nspe -I$(SOURCE)/val/common -I$(SOURCE)/platform/targets/${TARGET}/nspe/common
-	./$(BUILD)/platform/${TARGET}/targetConfigGen
-
-#Read target.cfg and update the addresses in linker script
-gen_linker:
-	@echo  ""
-	@echo  "Updating linker files..."
-	mkdir -p $(SUITE_OUT)/ $(BUILD)/val/ $(BUILD)/partition/ ;
-	perl $(SOURCE)/tools/scripts/process_test_linker_file.pl $(SOURCE) $(SUITE_OUT) ${TARGET} $(TOOLCHAIN)
-
-process_testsuite.db:
-	@echo  ""
-	@echo  "Creating testlist..."
-ifeq (${INCLUDE_PANIC_TESTS}, 1)
-	$(eval TEST_LIST := $(shell grep -o "^test....." $(SUITE_IN)/testsuite.db > $(SUITE_OUT)/.testlist.txt ; dos2unix $(SUITE_OUT)/.testlist.txt ; cat $(SUITE_OUT)/.testlist.txt))
-else
-	$(eval TEST_LIST := $(shell grep -v "^test....., panic_test" $(SUITE_IN)/testsuite.db | grep "^test" > $(SUITE_OUT)/.testlist.txt ; dos2unix $(SUITE_OUT)/.testlist.txt ; cat $(SUITE_OUT)/.testlist.txt))
-endif
-	perl $(SOURCE)/tools/scripts/gen_tests_list.pl $(BUILD) $(SUITE_OUT)/.testlist.txt $(SUITE)
-
-
-#Build framework archives and test_combine.elf
-build:  build_pal val_nspe.a test_combine.elf partition_build output_list
-
-build_pal:
-	@echo  ""
-	@echo  "----------pal build start-------------"
-	make -f $(SOURCE)/platform/targets/$(TARGET)/Makefile
-	@echo  "----------pal build complete-------------"
-
-val_nspe.a:
-	@echo  ""
-	@echo  "----------val build start-------------"
-	make -f $(SOURCE)/tools/makefiles/valbuild.mk
-	@echo  "----------val build complete-------------"
-
-test_combine.elf: test.elf
-	@echo  ""
-ifeq (${TEST_COMBINE_ARCHIVE}, 1)
-	@echo  "----------Combine NS test objects into archive start-------------"
-	$(AR) $(AR_OPTIONS) $(SUITE_OUT)/test_combine.a $(SUITE_OUT)/test*/test_*_nspe.o
-	@echo  "----------Combine NS test objects into archive complete-------------"
-else
-	@echo  "----------Combine NS test elfs into binary start-------------"
-	perl $(SOURCE)/tools/scripts/test_elf_combine.pl $(SUITE_OUT)/.testlist.txt
-	hexdump -v -e ' 1/4 "%08X" "\n"' $(SUITE_OUT)/test_elf_combine.bin > $(SUITE_OUT)/test_elf_combine.hex
-	@echo  "----------Combine NS test elfs into binary complete-------------"
-endif
-
-test.elf:
-	@echo  ""
-	@echo  "----------test build start-------------"
-	@$(foreach TEST,$(TEST_LIST), make -f $(SOURCE)/tools/makefiles/testbuild.mk  TEST=$(TEST) ;)
-	@echo  "----------test build complete-------------"
-
-partition_build:
-ifeq (${PSA_IPC_IMPLEMENTED}, 1)
-	@echo  ""
-	@echo  "----------test partition build start-------------"
-	make -f $(SOURCE)/tools/makefiles/spbuild.mk
-	@echo  "----------test partition build complete-------------"
-endif
-
-output_list:
-	@echo  ""
-	@echo  "Below are the list of output binaries/libraries. Integrate these"
-	@echo  "to your software stack to execute test suite."
-	@echo  ""
-	@echo  "a) NSPE files:"
-	@echo  " $(BUILD)/val/val_nspe.a"
-	@echo  " $(BUILD)/platform/pal_nspe.a"
-ifeq (${TEST_COMBINE_ARCHIVE}, 1)
-	@echo  " $(SUITE_OUT)/test_combine.a"
-else
-	@echo  " $(SUITE_OUT)/test_elf_combine.bin"
-endif
-	@echo  ""
-ifeq (${PSA_IPC_IMPLEMENTED}, 1)
-	@echo  "b) SPE files"
-	@echo  " $(BUILD)/partition/driver_partition.a"
-endif
-ifeq (${SUITE}, ipc)
-	@echo  " $(BUILD)/partition/client_partition.a"
-	@echo  " $(BUILD)/partition/server_partition.a"
-endif
-	@echo  ""
-
-clean:
-	@echo  ""
-	@echo  "Cleaning the build directory..."
-	rm -rf $(BUILD)/*
diff --git a/api-tests/tools/makefiles/linker/test.linker b/api-tests/tools/makefiles/linker/test.linker
deleted file mode 100644
index 69fc4d1..0000000
--- a/api-tests/tools/makefiles/linker/test.linker
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Copyright (c) 2018-2019, 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.
-**/
-
-ENTRY(TEST_START)
-
-TEST_START = 0x2004F000;
-
-MEMORY
-{
-    TEST_INFO  (R)  : ORIGIN = TEST_START, LENGTH = 0x100
-    TEST_TEXT  (RX) : ORIGIN = TEST_START +0x100, LENGTH = 0x1A00
-    TEST_DATA  (RW) : ORIGIN = TEST_START +0x1B00, LENGTH = 0x1800
-}
-
-SECTIONS
-{
-    .acs_test_info :
-    {
-        KEEP(*(.acs_test_info))
-    } > TEST_INFO
-
-    .text :
-    {
-        *(.text)
-        *(.text*)
-        *(.rodata)
-        *(.rodata*)
-    } > TEST_TEXT
-
-    .data :
-    {
-        *(.data)
-        *(.data*)
-    } > TEST_DATA
-
-    .bss :
-    {
-        *(.bss)
-        *(.bss.*)
-        *(COMMON)
-    } > TEST_DATA
-}
diff --git a/api-tests/tools/makefiles/linker/test.sct b/api-tests/tools/makefiles/linker/test.sct
deleted file mode 100644
index 4de849d..0000000
--- a/api-tests/tools/makefiles/linker/test.sct
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (c) 2018-2019, 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.
-**/
-
-#define TEST_CODE_START 0x0
-#define TEST_INFO_SIZE  0x100
-#define TEST_TEXT_SIZE  0x1A00
-#define TEST_DATA_SIZE  0x1800
-
-LR_CODE TEST_CODE_START
-{
-
-    ER_CODE TEST_CODE_START (TEST_INFO_SIZE+TEST_TEXT_SIZE+TEST_DATA_SIZE)
-    {
-        test_entry_*_nspe.o(.acs_test_info +FIRST)
-        * (+CODE)
-        * (+RO)
-        * (+ZI +RW)
-    }
-
-}
diff --git a/api-tests/tools/makefiles/spbuild.mk b/api-tests/tools/makefiles/spbuild.mk
deleted file mode 100644
index 1479e74..0000000
--- a/api-tests/tools/makefiles/spbuild.mk
+++ /dev/null
@@ -1,74 +0,0 @@
-# * Copyright (c) 2018-2019, Arm Limited or its affiliates. All rights reserved.
-# * SPDX-License-Identifier : Apache-2.0
-# *
-# * Licensed under the Apache License, Version 2.0 (the "License");
-# * you may not use this file except in compliance with the License.
-# * You may obtain a copy of the License at
-# *
-# *  http://www.apache.org/licenses/LICENSE-2.0
-# *
-# * Unless required by applicable law or agreed to in writing, software
-# * distributed under the License is distributed on an "AS IS" BASIS,
-# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# * See the License for the specific language governing permissions and
-# * limitations under the License.
-#**/
-
-include $(SOURCE)/tools/makefiles/toolchain.mk
-
-INCLUDE= -I$(SOURCE)/val/common/ \
-         -I$(SOURCE)/val/nspe/ \
-         -I$(SOURCE)/val/spe/ \
-         -I$(SOURCE)/ \
-         -I$(SOURCE)/ff/partition/common/ \
-         -I$(SOURCE)/ff/partition/ipc/ \
-         -I$(BUILD)/partition/ \
-         -I$(BUILD)/platform/$(TARGET)/ \
-         -I$(SOURCE)/platform/targets/$(TARGET)/nspe \
-         -I$(SOURCE)/platform/targets/$(TARGET)/nspe/common \
-         -I$(SOURCE)/platform/targets/$(TARGET)/nspe/crypto \
-         -I$(SOURCE)/platform/targets/$(TARGET)/spe
-
-VPATH=$(SOURCE)/val/common/:\
-      $(SOURCE)/val/nspe/:\
-      $(SOURCE)/val/spe/:\
-      $(SOURCE)/ff/partition/common/: \
-      $(SOURCE)/ff/partition/ipc/
-
-
-CC_SOURCE += driver_partition.c val_driver_service_apis.c
-
-ifeq (${SUITE}, ipc)
-CC_SOURCE += client_partition.c server_partition.c
-all:  mkdir compile_c compile_asm driver_partition.a client_partition.a server_partition.a
-else
-all:  mkdir compile_c compile_asm driver_partition.a
-endif
-
-
-mkdir:
-	@mkdir -p $(BUILD)/partition/
-
-compile_c: $(CC_SOURCE:%.c=$(BUILD)/partition/%.o)
-compile_asm: $(AS_SOURCE:%.s=$(BUILD)/partition/%.o)
-
-$(BUILD)/partition/%.o : %.c
-	$(CC) -DSPE_BUILD -o $@ -c $<
-
-$(BUILD)/partition/%.o : %.s
-	$(AS) -o $@ $<
-
-client_partition.a:
-ifeq ($(wildcard $(SUITE_OUT)/test_i*/.*),)
-	$(AR) $(AR_OPTIONS) $(BUILD)/partition/client_partition.a $(BUILD)/partition/client_partition.o $(SUITE_OUT)/test*/test_l*_spe.o
-else ifeq ($(wildcard $(SUITE_OUT)/test_l*/.*),)
-	$(AR) $(AR_OPTIONS) $(BUILD)/partition/client_partition.a $(BUILD)/partition/client_partition.o $(SUITE_OUT)/test*/test_i*_spe.o
-else
-	$(AR) $(AR_OPTIONS) $(BUILD)/partition/client_partition.a $(BUILD)/partition/client_partition.o $(SUITE_OUT)/test*/test_i*_spe.o $(SUITE_OUT)/test*/test_l*_spe.o
-endif
-
-server_partition.a:
-	$(AR) $(AR_OPTIONS) $(BUILD)/partition/server_partition.a $(BUILD)/partition/server_partition.o $(SUITE_OUT)/test*/test_supp_*_spe.o
-
-driver_partition.a:
-	$(AR) $(AR_OPTIONS) $(BUILD)/partition/driver_partition.a $(BUILD)/platform/spe/*_driver_sp.o $(BUILD)/partition/driver_partition.o $(BUILD)/partition/val_driver_service_apis.o
diff --git a/api-tests/tools/makefiles/testbuild.mk b/api-tests/tools/makefiles/testbuild.mk
deleted file mode 100644
index 373111d..0000000
--- a/api-tests/tools/makefiles/testbuild.mk
+++ /dev/null
@@ -1,78 +0,0 @@
-# * Copyright (c) 2018-2019, Arm Limited or its affiliates. All rights reserved.
-# * SPDX-License-Identifier : Apache-2.0
-# *
-# * Licensed under the Apache License, Version 2.0 (the "License");
-# * you may not use this file except in compliance with the License.
-# * You may obtain a copy of the License at
-# *
-# *  http://www.apache.org/licenses/LICENSE-2.0
-# *
-# * Unless required by applicable law or agreed to in writing, software
-# * distributed under the License is distributed on an "AS IS" BASIS,
-# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# * See the License for the specific language governing permissions and
-# * limitations under the License.
-#**/
-
-include $(SOURCE)/tools/makefiles/toolchain.mk
-include $(SUITE_IN)/$(TEST)/source.mk
-
-INCLUDE= -I$(SOURCE)/val/common/ \
-         -I$(SOURCE)/val/nspe/ \
-         -I$(SOURCE)/val/spe/ \
-         -I$(SOURCE)/ \
-         -I$(SOURCE)/platform/targets/$(TARGET)/nspe/ \
-         -I$(SOURCE)/platform/targets/$(TARGET)/nspe/common \
-         -I$(SOURCE)/platform/targets/$(TARGET)/nspe/crypto \
-         -I$(BUILD)/platform/$(TARGET)/ \
-         -I$(SUITE_IN)/$(TEST)/\
-         -I$(SUITE_IN)/include/ \
-         -I$(BUILD)/val/
-
-ifeq (${SUITE}, protected_storage)
-INCLUDE += -I$(SUITE_IN)/../internal_trusted_storage/$(TEST)
-endif
-
-VPATH=$(SOURCE)/val/common/:\
-      $(SOURCE)/val/nspe/:\
-      $(SOURCE)/val/spe/:\
-      $(SUITE_IN)/$(TEST)/:\
-      $(SUITE_IN)/include/:
-
-ifeq (${SUITE}, protected_storage)
-VPATH += $(SUITE_IN)/../internal_trusted_storage/$(TEST)/
-endif
-
-
-all:  mkdir compile_c_nspe compile_asm_nspe test.elf compile_c_spe compile_asm_spe
-
-mkdir:
-	mkdir -p $(SUITE_OUT)/$(TEST)/
-
-compile_c_nspe: $(CC_SOURCE:%.c=$(SUITE_OUT)/$(TEST)/%_nspe.o)
-compile_asm_nspe: $(AS_SOURCE:%.s=$(SUITE_OUT)/$(TEST)/%_nspe.o)
-
-$(SUITE_OUT)/$(TEST)/%_nspe.o : %.c
-	$(CC) -D NONSECURE_TEST_BUILD -DVAL_NSPE_BUILD -o $@ -c $<
-
-$(SUITE_OUT)/$(TEST)/%_nspe.o : %.s
-	$(AS) -o $@ $<
-
-# Generated %_spe.o(s) are used in spbuild.mk to create final client_partition.a and server_partition.a
-compile_c_spe: $(CC_SOURCE_SPE:%.c=$(SUITE_OUT)/$(TEST)/%_spe.o)
-compile_asm_spe: $(AS_SOURCE_SPE:%.s=$(SUITE_OUT)/$(TEST)/%_spe.o)
-
-$(SUITE_OUT)/$(TEST)/%_spe.o : %.c
-	$(CC) -DSPE_BUILD -o $@ -c $<
-
-$(SUITE_OUT)/$(TEST)/%_spe.o : %.s
-	$(AS) -o $@ $<
-
-test.elf:
-ifeq (${TOOLCHAIN}, GNUARM)
-	$(LD) -Xlinker -Map=$(SUITE_OUT)/$(TEST)/test.map -o $(SUITE_OUT)/$(TEST)/test.elf -T$(SUITE_OUT)/.test.linker $(SUITE_OUT)/$(TEST)/*_nspe.o
-else
-	$(LD)  --scatter=$(SUITE_OUT)/.test.sct  --list=$(SUITE_OUT)/$(TEST)/test.map -o $(SUITE_OUT)/$(TEST)/test.elf  $(SUITE_OUT)/$(TEST)/*_nspe.o
-endif
-	$(DS)  $(SUITE_OUT)/$(TEST)/test.elf >  $(SUITE_OUT)/$(TEST)/test.disass
-
diff --git a/api-tests/tools/makefiles/toolchain.mk b/api-tests/tools/makefiles/toolchain.mk
deleted file mode 100644
index 699e6bb..0000000
--- a/api-tests/tools/makefiles/toolchain.mk
+++ /dev/null
@@ -1,119 +0,0 @@
-# * Copyright (c) 2018-2019, 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.
-#**/
-
-TOOLCHAIN=GNUARM
-PREFIX=
-
-#### GNUARM OPTIONS - START ####
-ifneq (,$(findstring $(TOOLCHAIN),GNUARM-GCC))
-    ifeq (${TOOLCHAIN}, GNUARM)
-    PREFIX=arm-none-eabi-
-    endif
-
-    ifeq (${CPU_ARCH}, armv7m)
-    TARGET_SWITCH= -march=armv7-m
-    else
-        ifeq (${CPU_ARCH}, armv8m_ml)
-        TARGET_SWITCH= -march=armv8-m.main -mcmse
-        else
-        TARGET_SWITCH= -march=armv8-m.base -mcmse
-        endif
-    endif
-
-COMPILER= $(PREFIX)gcc
-ASSEMBLER= $(PREFIX)as
-AR= $(PREFIX)ar
-LINKER= $(PREFIX)gcc
-OBJDUMP=$(PREFIX)objdump
-
-COMPILER_OPTIONS= $(TARGET_SWITCH) -Wall -Werror -fdata-sections -ffunction-sections -mno-unaligned-access
-
-ASSEMBLER_OPTIONS= $(TARGET_SWITCH) -mthumb
-AR_OPTIONS= -rcs
-LINKER_OPTIONS= $(TARGET_SWITCH) -mthumb -Wall -Werror -O0 -fdata-sections \
-				-ffunction-sections -Xlinker --fatal-warnings -Xlinker --gc-sections \
-				-z max-page-size=0x400 -lgcc -lc -lnosys
-OBJDUMP_OPTIONS= -d
-endif #GNUARM-GCC
-#### GNUARM OPTIONS - END ####
-
-#### ARMCLANG OPTIONS - START ####
-ifeq (${TOOLCHAIN}, ARMCLANG)
-
-COMPILER= armclang
-ASSEMBLER= armclang
-AR= armar
-LINKER= armlink
-OBJDUMP=fromelf
-
-    ifeq (${CPU_ARCH}, armv7m)
-    TARGET_SWITCH= -march=armv7-m
-    TARGET_SWITCH_LD= --cpu=7-M
-    else
-        ifeq (${CPU_ARCH}, armv8m_ml)
-        TARGET_SWITCH= -march=armv8-m.main -mcmse
-        TARGET_SWITCH_LD= --cpu=8-M.Main
-        else
-        TARGET_SWITCH= -march=armv8-m.base -mcmse
-        TARGET_SWITCH_LD= --cpu=8-M.Base
-        endif
-    endif
-
-COMPILER_OPTIONS= --target=arm-arm-none-eabi $(TARGET_SWITCH) -Wall -Werror -fshort-enums -fshort-wchar -funsigned-char -fdata-sections -ffunction-sections -mno-unaligned-access -mfpu=none
-AR_OPTIONS= --create -cr
-LINKER_OPTIONS= --strict --map --symbols --xref  --info=summarysizes,sizes,totals,unused,veneers --diag_warning=L6204
-OBJDUMP_OPTIONS= -c -d --datasymbols
-endif
-#### ARMCLANG OPTIONS - END ####
-
-COMPILER_OPTIONS += -DVERBOSE=$(VERBOSE)
-
-ifeq (${TEST_COMBINE_ARCHIVE}, 1)
-COMPILER_OPTIONS += -DTEST_COMBINE_ARCHIVE=1
-endif
-
-ifeq (${WATCHDOG_AVAILABLE}, 1)
-COMPILER_OPTIONS += -DWATCHDOG_AVAILABLE=1
-endif
-
-ifeq (${SP_HEAP_MEM_SUPP}, 1)
-COMPILER_OPTIONS += -DSP_HEAP_MEM_SUPP=1
-endif
-
-ifeq (${PSA_IPC_IMPLEMENTED}, 1)
-COMPILER_OPTIONS += -DPSA_IPC_IMPLEMENTED=1
-endif
-
-ifeq (${PSA_CRYPTO_IMPLEMENTED}, 1)
-COMPILER_OPTIONS += -DPSA_CRYPTO_IMPLEMENTED=1
-endif
-
-ifeq (${PSA_PROTECTED_STORAGE_IMPLEMENTED}, 1)
-COMPILER_OPTIONS += -DPSA_PROTECTED_STORAGE_IMPLEMENTED=1
-endif
-
-ifeq (${PSA_INTERNAL_TRUSTED_STORAGE_IMPLEMENTED}, 1)
-COMPILER_OPTIONS += -DPSA_INTERNAL_TRUSTED_STORAGE_IMPLEMENTED=1
-endif
-
-ifeq (${PSA_INITIAL_ATTESTATION_IMPLEMENTED}, 1)
-COMPILER_OPTIONS += -DPSA_INITIAL_ATTESTATION_IMPLEMENTED=1
-endif
-
-CC= $(COMPILER) $(COMPILER_OPTIONS) $(CC_OPTIONS) $(USER_INCLUDE) $(INCLUDE)
-AS= $(ASSEMBLER) $(ASSEMBLER_OPTIONS) $(AS_OPTIONS)
-LD= $(LINKER) $(LINKER_OPTIONS)
-DS= $(OBJDUMP) $(OBJDUMP_OPTIONS)
diff --git a/api-tests/tools/makefiles/valbuild.mk b/api-tests/tools/makefiles/valbuild.mk
deleted file mode 100644
index ef0ad4c..0000000
--- a/api-tests/tools/makefiles/valbuild.mk
+++ /dev/null
@@ -1,52 +0,0 @@
-# * Copyright (c) 2018-2019, Arm Limited or its affiliates. All rights reserved.
-# * SPDX-License-Identifier : Apache-2.0
-# *
-# * Licensed under the Apache License, Version 2.0 (the "License");
-# * you may not use this file except in compliance with the License.
-# * You may obtain a copy of the License at
-# *
-# *  http://www.apache.org/licenses/LICENSE-2.0
-# *
-# * Unless required by applicable law or agreed to in writing, software
-# * distributed under the License is distributed on an "AS IS" BASIS,
-# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# * See the License for the specific language governing permissions and
-# * limitations under the License.
-#**/
-
-include $(SOURCE)/tools/makefiles/toolchain.mk
-
-INCLUDE= -I$(SOURCE)/val/common/ \
-         -I$(SOURCE)/val/nspe/ \
-         -I$(SOURCE)/val/spe/ \
-         -I$(SOURCE)/platform/targets/$(TARGET)/nspe/ \
-         -I$(SOURCE)/platform/targets/$(TARGET)/nspe/common \
-         -I$(SOURCE)/platform/targets/$(TARGET)/nspe/crypto \
-         -I$(BUILD)/platform/$(TARGET)/ \
-         -I$(BUILD)/val/
-
-VPATH=$(SOURCE)/val/common/:\
-      $(SOURCE)/val/nspe/:\
-      $(SOURCE)/val/spe/
-
-SRC_COMMON=
-SRC_NS= val_entry.c val_dispatcher.c val_framework.c val_crypto.c val_interfaces.c val_peripherals.c val_target.c val_protected_storage.c val_internal_trusted_storage.c val_attestation.c
-
-all: build
-
-build: mkdir build_common build_ns val_nspe.a
-
-mkdir:
-	@mkdir -p $(BUILD)/val/
-
-build_common: $(SRC_COMMON:%.c=$(BUILD)/val/%.o)
-build_ns: $(SRC_NS:%.c=$(BUILD)/val/%.o)
-
-$(BUILD)/val/%.o : %.c
-	$(CC)  $(INCLUDE) -DVAL_NSPE_BUILD  -o $@ -c $<
-
-val_nspe.a:
-	$(AR) $(AR_OPTIONS) $(BUILD)/val/val_nspe.a $(BUILD)/val/*.o
-
-clean:
-	@rm -rf $(BUILD)/val/*.o $(BUILD)/val/*.a
diff --git a/api-tests/tools/scripts/gen_tests_list.pl b/api-tests/tools/scripts/gen_tests_list.pl
deleted file mode 100644
index f98bb56..0000000
--- a/api-tests/tools/scripts/gen_tests_list.pl
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/usr/bin/env perl
-#/** @file
-# * Copyright (c) 2019, 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.
-#**/
-
-
-$build=$ARGV[0];
-$tests_list=$ARGV[1];
-$suite=$ARGV[2];
-
-&gen_test_entry_info();
-&gen_secure_tests_list() if ($suite eq "ipc");
-
-sub gen_test_entry_info
-{
-    my $test_num                    = 0;
-    my $uniq_test_string            = '';
-    my $max_test_per_suite          = 200;
-    my $suite_base                  = 0;
-    my $test_entry_list             = "$build/val/test_entry_list.inc";
-    my $test_entry_fn_declare_list  = "$build/val/test_entry_fn_declare_list.inc";
-
-    if ($suite eq "crypto")
-    {
-        $suite_base = 1;
-    }
-    elsif ($suite eq "protected_storage")
-    {
-        $suite_base = 2;
-    }
-    elsif ($suite eq "internal_trusted_storage")
-    {
-        $suite_base = 3;
-    }
-    elsif ($suite eq "initial_attestation")
-    {
-        $suite_base = 4;
-    }
-
-    open(IN, $tests_list) or die "Unable to open $tests_list $!";
-    open(OUT1, '>', $test_entry_fn_declare_list) or die "Unable to open: $!";
-    open(OUT2, '>', $test_entry_list) or die "Unable to open: $!";
-
-        while(<IN>) {
-        if($_ !~ /^\//) {# exclude commented lines if any
-            chomp($_);
-            if($_ =~ /^test_(.+)/) {
-                $uniq_test_string = $1;
-                $uniq_test_string =~ s/s/p/ if ($suite eq "protected_storage");
-                print OUT1 "void test_entry_$uniq_test_string(val_api_t *val_api, psa_api_t *psa_api);\n";
-                if($_ =~ /^test_\w0*(\d+)/) {
-                    $test_num = $1 + ($max_test_per_suite * $suite_base);
-                    print OUT2 "\t{$test_num, &test_entry_$uniq_test_string},\n";
-                }
-            }
-        }
-    }
-    close IN;
-    close OUT1;
-    close OUT2;
-    print "Non-secure test entry symbol list:
-    $test_entry_list,
-    $test_entry_fn_declare_list\n";
-}
-
-sub gen_secure_tests_list
-{
-    my $test_num = 0;
-    my $test_num_prev = 0;
-    my $client_tests_list_declare = "$build/partition/client_tests_list_declare.inc";
-    my $client_tests_list         = "$build/partition/client_tests_list.inc";
-    my $server_tests_list_declare = "$build/partition/server_tests_list_declare.inc";
-    my $server_tests_list         = "$build/partition/server_tests_list.inc";
-
-    open(IN, $tests_list) or die "Unable to open $tests_list $!";
-    open(OUT1, '>', $client_tests_list_declare) or die "Unable to open: $!";
-    open(OUT2, '>', $client_tests_list) or die "Unable to open: $!";
-    open(OUT3, '>', $server_tests_list_declare) or die "Unable to open: $!";
-    open(OUT4, '>', $server_tests_list) or die "Unable to open: $!";
-
-    while(<IN>) {
-        if($_ !~ /^\//) {# exclude commented lines if any
-            chomp($_);
-            if($_ =~ /^test_\w(\d+)/) {
-                $test_num = $1;
-                print OUT1 " extern client_test_t $_\_client_tests_list[];\n";
-                print OUT3 " extern server_test_t $_\_server_tests_list[];\n";
-
-                if ($test_num - $test_num_prev > 1)
-                {
-                    for ($i = $test_num_prev; $i < ($test_num - 1); $i++)
-                    {
-                        print OUT2 "\tNULL,\n";
-                        print OUT4 "\tNULL,\n";
-                    }
-                }
-                print OUT2 "\t$_\_client_tests_list,\n";
-                print OUT4 "\t$_\_server_tests_list,\n";
-            }
-        }
-        $test_num_prev = $test_num;
-    }
-    close IN;
-    close OUT1;
-    close OUT2;
-    close OUT3;
-    close OUT4;
-
-    print "Secure test entry symbol list:
-    $client_tests_list_declare,
-    $client_tests_list,
-    $server_tests_list_declare,
-    $server_tests_list \n\n";
-}
diff --git a/api-tests/tools/scripts/gen_tests_list.py b/api-tests/tools/scripts/gen_tests_list.py
new file mode 100644
index 0000000..7d33bb5
--- /dev/null
+++ b/api-tests/tools/scripts/gen_tests_list.py
@@ -0,0 +1,126 @@
+#!/usr/bin/python
+#/** @file
+# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# *  http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+import sys
+
+if (len(sys.argv) != 11):
+        print("\nScript requires following inputs")
+        print("\narg1  : <INPUT  SUITE identifier>")
+        print("\narg2  : <INPUT  testsuite.db file>")
+        print("\narg3  : <INPUT  panic test>")
+        print("\narg4  : <OUTPUT testlist file>")
+        print("\narg5  : <OUTPUT test_entry_list>")
+        print("\narg6  : <OUTPUT test_entry_fn_declare_list>")
+        print("\narg7  : <OUTPUT client_tests_list_declare>")
+        print("\narg8  : <OUTPUT client_tests_list>")
+        print("\narg9  : <OUTPUT server_tests_list_declare>")
+        print("\narg10 : <OUTPUT server_tests_list>")
+        sys.exit(1)
+
+suite                      = sys.argv[1]
+testsuite_db_file          = sys.argv[2]
+panic_tests_included       = int(sys.argv[3])
+testlist_file              = sys.argv[4]
+test_entry_list            = sys.argv[5]
+test_entry_fn_declare_list = sys.argv[6]
+client_tests_list_declare  = sys.argv[7]
+client_tests_list          = sys.argv[8]
+server_tests_list_declare  = sys.argv[9]
+server_tests_list          = sys.argv[10]
+
+# Dictionary to hold the mapping between suite and the base number
+suite_with_base_dict = {"ipc":0, "crypto":1, "protected_storage":2, "internal_trusted_storage":3, "initial_attestation":4}
+
+def gen_test_list():
+	"""
+	Read the input testsuite.db file and generates the output file with list of tests
+	"""
+	with open(testlist_file, mode='w') as o_f:
+		with open(testsuite_db_file, mode='r') as i_f:
+			for line in i_f:
+				if ('test_' == line[0:5]):
+					if ((panic_tests_included == 1) and ("panic" not in line)):
+						o_f.write(line)
+					elif ((panic_tests_included == 1) and ("panic" in line)):
+						o_f.write(line[0:line.find(',')]+'\n')
+					elif ((panic_tests_included == 0) and ("panic" not in line)):
+						o_f.write(line)
+
+def gen_test_entry_info():
+	"""
+	Generate Non-secure related inc files
+	"""
+	test_num           = 0
+	uniq_test_string   = ''
+	max_test_per_suite = 200
+	suite_base         = 0
+
+	if (suite not in suite_with_base_dict.keys()):
+		print("\nProvide a valid SUITE identifier")
+		sys.exit()
+
+	with open(test_entry_list, mode='w') as o_f1, \
+             open(test_entry_fn_declare_list, mode='w') as o_f2,\
+             open(testlist_file, mode='r') as i_f:
+		for line in i_f:
+			line = line.strip()
+			test_num = int(line[6:9]) + (max_test_per_suite * suite_with_base_dict[suite])
+			if (suite == "protected_storage"):
+				uniq_test_string = 'p'+line[6:9]
+			else:
+				uniq_test_string = line[5:9]
+			o_f1.write("\t{%d, &test_entry_%s},\n" %(test_num, uniq_test_string))
+			o_f2.write("void test_entry_%s(val_api_t *val_api, psa_api_t *psa_api);\n" %(uniq_test_string))
+	print("Non-secure test entry symbol list:\n\t%s,\n\t%s" %(test_entry_list, test_entry_fn_declare_list))
+
+def gen_secure_tests_list():
+	"""
+	Generate partition related inc files
+	"""
+	test_num = 0
+	test_num_prev = 0
+
+	with open(testlist_file, mode='r') as i_f, \
+	     open(client_tests_list_declare, mode='w') as o_f1, \
+	     open(client_tests_list, mode='w') as o_f2, \
+	     open(server_tests_list_declare, mode='w') as o_f3, \
+	     open(server_tests_list, mode='w') as o_f4:
+		for line in i_f:
+			line = line.strip()
+			o_f1.write("extern client_test_t %s_client_tests_list[];\n" %(line))
+			o_f3.write("extern server_test_t %s_server_tests_list[];\n" %(line))
+
+			test_num = int(line[6:9])
+			if ((test_num - test_num_prev) > 1):
+				for num in range(test_num_prev, test_num-1):
+					o_f2.write("\tNULL,\n")
+					o_f4.write("\tNULL,\n")
+			o_f2.write("\t%s_client_tests_list,\n" %(line[0:9]));
+			o_f4.write("\t%s_server_tests_list,\n" %(line[0:9]));
+
+			test_num_prev = test_num
+
+	print("Secure test entry symbol list:\n\t%s,\n\t%s,\n\t%s,\n\t%s" \
+               %(client_tests_list_declare, client_tests_list, \
+                 server_tests_list_declare, server_tests_list))
+
+# Call routines
+gen_test_list()
+gen_test_entry_info()
+if (suite == "ipc"):
+	gen_secure_tests_list()
diff --git a/api-tests/tools/scripts/process_test_linker_file.pl b/api-tests/tools/scripts/process_test_linker_file.pl
deleted file mode 100755
index 4b0bb27..0000000
--- a/api-tests/tools/scripts/process_test_linker_file.pl
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/usr/bin/env perl
-#/** @file
-# * Copyright (c) 2018-2019, 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.
-#**/
-
-#inputs
-$source=$ARGV[0];
-$suite_out=$ARGV[1];
-$target=$ARGV[2];
-$toolchain=$ARGV[3];
-
-$targetConfigPath = "$source/platform/targets/$target/target.cfg";
-$linker_in = "";
-$linker_out = "";
-$ns_test_start_addr = undef;
-
-if($toolchain eq "GNUARM")
-{
-    $linker_in  = "$source/tools/makefiles/linker/test.linker";
-    $linker_out = "$suite_out/.test.linker";
-}
-else
-{
-    $linker_in  = "$source/tools/makefiles/linker/test.sct";
-    $linker_out = "$suite_out/.test.sct";
-}
-
-open(IN, $targetConfigPath) or die "Unable to open $targetConfigPath $!";
-while(<IN>) {
-    if($_ !~ /^\//) {# exclude commented lines
-        if($_ =~ /\.ns_test_addr(\s*)\=(\s*)(.+)(\s*)\;/) {
-            $ns_test_start_addr = $3;
-        }
-    }
-}
-close IN;
-
-if(defined($ns_test_start_addr))
-{
-    open(IN, $linker_in) or die "Unable to open $linker_in $!";
-    open(OUT, '>', $linker_out) or die "Unable to open: $!";
-    while(<IN>) {
-        if($_ =~ /^TEST_START/){
-            print OUT "TEST_START = $ns_test_start_addr;\n";
-        }elsif($_ =~ /#define *TEST_CODE_START/){
-            print OUT "#define TEST_CODE_START $ns_test_start_addr\n";
-        }else{
-            print OUT "$_";
-        }
-    }
-    close IN;
-    close OUT;
-    print "linker file - $linker_out\n"
-}
-else
-{
-    die ("Error: ns_test_addr is not found in target.cfg file\n");
-}
-
-if($toolchain eq "ARMCLANG")
-{
-    system("cpp -x assembler-with-cpp -w -E -o $linker_out.tmp $linker_out ") && die ("Failed to process $linker_out\n");
-    system("cp $linker_out.tmp  $linker_out");
-}
diff --git a/api-tests/tools/scripts/setup.sh b/api-tests/tools/scripts/setup.sh
deleted file mode 100755
index 7d6b36c..0000000
--- a/api-tests/tools/scripts/setup.sh
+++ /dev/null
@@ -1,497 +0,0 @@
-#!/usr/bin/env bash
-#/** @file
-# * Copyright (c) 2018-2019, 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.
-#**/
-
-echo ""
-
-declare -a INCLUDE_PATHS
-export SUITE=" "
-export TEST_COMBINE_ARCHIVE=0
-export INCLUDE_PANIC_TESTS=0
-export WATCHDOG_AVAILABLE=0
-export SP_HEAP_MEM_SUPP=0
-export CLIENT_FILE_FOUND=0
-export SERVICE_FILE_FOUND=0
-export MANIFEST_OUT_FILE_FOUND=0
-export CRYPTO_FILE_FOUND=0
-export PROTECTED_STORAGE_FILE_FOUND=0
-export INTERNAL_TRUSTED_STORAGE_FILE_FOUND=0
-export INITIAL_ATTESTATION_FILE_FOUND=0
-export LIFECYCLE_FILE_FOUND=0
-
-IPC_HEADER_FILE_REQ="If PSA IPC implemented in your platform, include path must point to 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.
-"
-CRYPTO_HEADER_FILE_REQ="If PSA CRYPTO APIs are implemented into your platform then you must provide
-\"psa/crypto.h\" file to setup.sh script using --include option to compile tests and framework.
-"
-PS_HEADER_FILE_REQ="If PSA PROTECTED STORAGE APIs are implemented into your platform then you must provide
-\"psa/protected_storage.h\" file to setup.sh script using --include option to compile tests and framework.
-"
-ITS_HEADER_FILE_REQ="If PSA INTERNAL_TRUSTED_STORAGE APIs are implemented into your platform then you must provide
-\"psa/internal_trusted_storage.h\" file to setup.sh script using --include option to compile tests and framework.
-"
-ATTESTATION_HEADER_FILE_REQ="If PSA INITIAL_ATTESTATION APIs are implemented into your platform then you must provide
-\"psa/initial_attestation.h\" and \"psa/crypto.h\" file to setup.sh script using --include option to compile tests and framework.
-"
-
-HELP="
-
-Usage: setup.sh [--source SOURCE_DIR] [--build BUILD_DIR] [--target TARGET] [--suite SUITE]
-                [--toolchain TOOLCHAIN] [--cpu_arch CPU_ARCH] [--verbose PRINT_LEVEL]
-                [--include INCLUDE_PATH] [--help|-h]
-Toplevel script to build tests and framework sources for given test suite.
-
-Arguments Info:
-    --source <SOURCE_DIR>   : SOURCE_DIR pointing to architecture test suite directory structure.
-                              Default is current directory
-    --build  <BUILD_DIR>    : To select the build (output) directory. Default: BUILD/ inside current directory
-    --target <TARGET>       : Provide target string as argument.
-                              target.cfg file corresponding to input string must be avaiable at
-                              platform/targets/<TARGET>/
-    --suite <SUITE>         : Compile tests for given suite. Support values are:
-                              ipc, crypto, internal_trusted_storage, protected_storage,
-                              and initial_attestation.
-    --toolchain <TOOLCHAIN> : Build using the given TOOLCHAIN.
-                              Supported values are GNUARM (GNU Arm Embedded) and ARMCLANG (ARM Compiler 6.x).
-    --cpu_arch <CPU_ARCH>   : Provide cpu arch string as argument.
-                              Supported CPU arch are armv8m_ml, armv8m_bl and armv7m.
-    --verbose <PRINT_LEVEL> : Print verbosity level
-                              Supported print levels are:
-                                1 - INFO & above.
-                                2 - DEBUG & above.
-                                3 - TEST & above.(Default)
-                                4 - WARN & ERROR.
-                                5 - ERROR.
-    --archive_tests         : Create combine test archive(.a) file by combining available test objects files.
-                              Absence of this option would create combine test binary(.bin) by combining available test elfs
-    --include_panic_tests   : Consider panic tests (mentioned in testsuite.db of respective suite) along with functional tests
-                              for building the final executables. Absence of this option would consider only non-panic (ie, functional) tests
-    --include <INCLUDE_PATH>: Additional directory to be included into compiler search path. Provide --include <path>
-                              where path pointing to location of PSA defined header files.
-                              You can specify multiple source locations using --include option.
-                              Ex: --include <path1>  --include <path2>
-    --help|-h               : Print this help message
-
-Notes:
-1. $IPC_HEADER_FILE_REQ
-2. $CRYPTO_HEADER_FILE_REQ
-3. $PS_HEADER_FILE_REQ
-4. $ITS_HEADER_FILE_REQ
-5. $ATTESTATION_HEADER_FILE_REQ
-
-"
-
-if [ "$#" == "0" ]; then
-    echo "Error: no argument to setup.sh"
-    echo "$HELP"
-    exit 1
-fi
-
-while [  $# -gt 0 ]; do
-    case $1 in
-    --source ) shift
-                  export SOURCE=$1
-                  ;;
-       --build )  shift
-                  export BUILD="$1/BUILD"
-                  ;;
-       --target )  shift
-                  export TARGET=$1
-                  ;;
-       --suite )  shift
-                  export SUITE=$1
-                  ;;
-       --toolchain )  shift
-                  export TOOLCHAIN=$1
-                  ;;
-       --cpu_arch )  shift
-                  export CPU_ARCH=$1
-                  ;;
-       --verbose )  shift
-                  export VERBOSE=$1
-                  ;;
-       --archive_tests )
-                  export TEST_COMBINE_ARCHIVE=1
-                  ;;
-       --include_panic_tests )
-                  export INCLUDE_PANIC_TESTS=1
-                  ;;
-       --include )  shift
-                  export INCLUDE="$INCLUDE -I $1/"
-                  INCLUDE_PATHS=("${INCLUDE_PATHS[@]}" $1)
-                  ;;
-       --help | -h )
-                  echo "$HELP"
-                  exit 1
-                  ;;
-               * )
-                  echo "Error: Invaid argument $1"
-                  echo "$HELP"
-                  exit 1
-        esac
-        shift
-done
-
-echo "----------Process input arguments- start-------------"
-if [ -z "$SOURCE" ]
-then
-   export SOURCE=./
-   echo "--source option is not provided, hence setting \$SOURCE to present dir"
-else
-   echo "setting \$SOURCE to $SOURCE"
-fi
-
-if [ ! -d "$SOURCE/dev_apis" ] || [ ! -d "$SOURCE/ff" ]
-then
-   echo "Error: Could not find architecture test suite directories in current path $SOURCE"
-   exit 1
-fi
-
-if [ -z "$BUILD" ]
-then
-   export BUILD="./BUILD"
-   echo "--build option is not provided, hence setting \$BUILD to ./BUILD"
-else
-   echo "setting \$BUILD to $BUILD"
-fi
-
-if [ -z "$TARGET" ]
-then
-   echo "Provide target string as argument using --target <string>"
-   exit 1
-else
-   echo "Using \$TARGET=$TARGET"
-fi
-
-if [ "$SUITE" != "ipc" ] && [ "$SUITE" != "crypto" ] &&  [ "$SUITE" != "protected_storage" ] &&
-   [ "$SUITE" != "internal_trusted_storage" ] &&  [ "$SUITE" != "initial_attestation" ]
-then
-   echo "Error: Unsupported value for --suite=$SUITE.
-   Refer help message to see supported suites"
-   exit 1
-fi
-
-PLATFORM_MAKEFILE=$SOURCE/platform/targets/$TARGET/Makefile
-PSA_IPC_IMPLEMENTED=`grep -c "^ *PSA_IPC_IMPLEMENTED\s*:=\s*1" $PLATFORM_MAKEFILE`
-PSA_CRYPTO_IMPLEMENTED=`grep -c "^ *PSA_CRYPTO_IMPLEMENTED\s*:=\s*1" $PLATFORM_MAKEFILE`
-PSA_PROTECTED_STORAGE_IMPLEMENTED=`grep -c "^ *PSA_PROTECTED_STORAGE_IMPLEMENTED\s*:=\s*1" $PLATFORM_MAKEFILE`
-PSA_INTERNAL_TRUSTED_STORAGE_IMPLEMENTED=`grep -c "^ *PSA_INTERNAL_TRUSTED_STORAGE_IMPLEMENTED\s*:=\s*1" $PLATFORM_MAKEFILE`
-PSA_INITIAL_ATTESTATION_IMPLEMENTED=`grep -c "^ *PSA_INITIAL_ATTESTATION_IMPLEMENTED\s*:=\s*1" $PLATFORM_MAKEFILE`
-WATCHDOG_AVAILABLE=`grep -c "^ *watchdog.num\s*=\s*1\s*;" $SOURCE/platform/targets/$TARGET/target.cfg`
-SP_HEAP_MEM_SUPP=`grep -c "^ *dut.0.sp_heap_mem_supp\s*=\s*AVAILABLE\s*;" $SOURCE/platform/targets/$TARGET/target.cfg`
-
-# Check PSA_IPC_IMPLEMENTED validity
-if [ $SUITE == "ipc" ] && [ $PSA_IPC_IMPLEMENTED == "0" ]
-then
-   echo "Error: PSA_IPC_IMPLEMENTED must be set to 1 for ipc suite
-         in $PLATFORM_MAKEFILE"
-   exit 1
-fi
-
-# Check PSA_CRYPTO_IMPLEMENTED validity
-if [ $SUITE == "crypto" ] && [ $PSA_CRYPTO_IMPLEMENTED == "0" ]
-then
-   echo "Error: PSA_CRYPTO_IMPLEMENTED must be set to 1 for crypto suite
-         in $PLATFORM_MAKEFILE"
-   exit 1
-fi
-
-# Check PSA_PROTECTED_STORAGE_IMPLEMENTED validity
-if [ $SUITE == "protected_storage" ] && [ $PSA_PROTECTED_STORAGE_IMPLEMENTED == "0" ]
-then
-   echo "Error: PSA_PROTECTED_STORAGE_IMPLEMENTED must be set to 1 for protected_storage suite
-         in $PLATFORM_MAKEFILE"
-   exit 1
-fi
-
-# Check PSA_INTERNAL_TRUSTED_STORAGE_IMPLEMENTED validity
-if [ $SUITE == "internal_trusted_storage" ] && [ $PSA_INTERNAL_TRUSTED_STORAGE_IMPLEMENTED == "0" ]
-then
-   echo "Error: PSA_INTERNAL_TRUSTED_STORAGE_IMPLEMENTED must be set to 1 for internal_trusted_storage suite
-         in $PLATFORM_MAKEFILE"
-   exit 1
-fi
-
-# Check PSA_INITIAL_ATTESTATION_IMPLEMENTED validity
-if [ $SUITE == "initial_attestation" ] && [ $PSA_INITIAL_ATTESTATION_IMPLEMENTED == "0" ]
-then
-   echo "Error: PSA_INITIAL_ATTESTATION_IMPLEMENTED must be set to 1 for initial_attestation suite
-         in $PLATFORM_MAKEFILE"
-   exit 1
-fi
-
-if [ $PSA_IPC_IMPLEMENTED == "1" ]
-then
-    # Check --include validity for ipc suite
-    if [ -z "$INCLUDE" ]
-    then
-          echo "Error: --include option is not provided. $IPC_HEADER_FILE_REQ"
-          exit 1
-    else
-        for path in "${INCLUDE_PATHS[@]}"
-        do
-            if [ -f "$path/psa/client.h" ]
-            then
-                export CLIENT_FILE_FOUND=1
-            fi
-            if [ -f "$path/psa/service.h" ]
-            then
-                export SERVICE_FILE_FOUND=1
-            fi
-            if [ -f "$path/psa_manifest/sid.h" ] && [ -f "$path/psa_manifest/pid.h" ]
-            then
-                export MANIFEST_OUT_FILE_FOUND=1
-            fi
-            if [ -f "$path/psa/lifecycle.h" ]
-            then
-                export LIFECYCLE_FILE_FOUND=1
-            fi
-        done
-        if [ $CLIENT_FILE_FOUND ==  "0" ]
-        then
-            echo "Couldn't find psa/client.h file in paths: ${INCLUDE_PATHS[@]}"
-            echo "$IPC_HEADER_FILE_REQ"
-            exit 1
-        fi
-        if [ $SERVICE_FILE_FOUND == "0" ]
-        then
-            echo "Couldn't find psa/service.h file in paths: ${INCLUDE_PATHS[@]}"
-            echo "$IPC_HEADER_FILE_REQ"
-            exit 1
-        fi
-        if [ $MANIFEST_OUT_FILE_FOUND == "0" ]
-        then
-            echo "Couldn't find psa_manifest/sid.h or psa_manifest/pid.h file in paths: ${INCLUDE_PATHS[@]}"
-            echo "$IPC_HEADER_FILE_REQ"
-            exit 1
-        fi
-        if [ $LIFECYCLE_FILE_FOUND ==  "0" ]
-        then
-            echo "Couldn't find psa/lifecycle.h file in paths: ${INCLUDE_PATHS[@]}"
-            echo "$IPC_HEADER_FILE_REQ"
-            exit 1
-        fi
-    fi
-fi
-
-if [ $PSA_CRYPTO_IMPLEMENTED == "1" ]
-then
-    # Check --include validity for crypto suite
-    if [ -z "$INCLUDE" ]
-    then
-          echo "Error: --include option is not provided."
-          echo "$CRYPTO_HEADER_FILE_REQ"
-          exit 1
-    else
-        for path in "${INCLUDE_PATHS[@]}"
-        do
-            if [ -f "$path/psa/crypto.h" ]
-            then
-                export CRYPTO_FILE_FOUND=1
-            fi
-        done
-        if [ $CRYPTO_FILE_FOUND ==  "0" ]
-        then
-            echo "Couldn't find psa/crypto.h file in paths: ${INCLUDE_PATHS[@]}"
-            echo "$CRYPTO_HEADER_FILE_REQ"
-            exit 1
-        fi
-    fi
-fi
-
-if [ $PSA_PROTECTED_STORAGE_IMPLEMENTED == "1" ]
-then
-    # Check --include validity for protected storage suite
-    if [ -z "$INCLUDE" ]
-    then
-          echo "Error: --include option is not provided."
-          echo "$PS_HEADER_FILE_REQ"
-          exit 1
-    else
-        for path in "${INCLUDE_PATHS[@]}"
-        do
-            if [ -f "$path/psa/protected_storage.h" ]
-            then
-                export PROTECTED_STORAGE_FILE_FOUND=1
-            fi
-        done
-        if [ $PROTECTED_STORAGE_FILE_FOUND ==  "0" ]
-        then
-            echo "Couldn't find psa/protected_storage.h file in paths: ${INCLUDE_PATHS[@]}"
-            echo "$PS_HEADER_FILE_REQ"
-            exit 1
-        fi
-    fi
-fi
-
-if [ $PSA_INTERNAL_TRUSTED_STORAGE_IMPLEMENTED == "1" ]
-then
-    # Check --include validity for internal trusted storage suite
-    if [ -z "$INCLUDE" ]
-    then
-          echo "Error: --include option is not provided."
-          echo "$ITS_HEADER_FILE_REQ"
-          exit 1
-    else
-        for path in "${INCLUDE_PATHS[@]}"
-        do
-            if [ -f "$path/psa/internal_trusted_storage.h" ]
-            then
-                export INTERNAL_TRUSTED_STORAGE_FILE_FOUND=1
-            fi
-        done
-        if [ $INTERNAL_TRUSTED_STORAGE_FILE_FOUND ==  "0" ]
-        then
-            echo "Couldn't find psa/internal_trusted_storage.h file in paths: ${INCLUDE_PATHS[@]}"
-            echo "$ITS_HEADER_FILE_REQ"
-            exit 1
-        fi
-    fi
-fi
-
-if [ $PSA_INITIAL_ATTESTATION_IMPLEMENTED == "1" ]
-then
-    # Check --include validity for initial_attestation suite
-    if [ -z "$INCLUDE" ]
-    then
-          echo "Error: --include option is not provided."
-          echo "$ATTESTATION_HEADER_FILE_REQ"
-          exit 1
-    else
-        for path in "${INCLUDE_PATHS[@]}"
-        do
-            if [ -f "$path/psa/initial_attestation.h" ]
-            then
-                export INITIAL_ATTESTATION_FILE_FOUND=1
-            fi
-            if [ -f "$path/psa/crypto.h" ]
-            then
-                export CRYPTO_FILE_FOUND=1
-            fi
-        done
-
-        if [ $INITIAL_ATTESTATION_FILE_FOUND ==  "0" ]
-        then
-            echo "Couldn't find psa/initial_attestation.h file in paths: ${INCLUDE_PATHS[@]}"
-            echo "$ATTESTATION_HEADER_FILE_REQ"
-            exit 1
-        elif [ $INITIAL_ATTESTATION_FILE_FOUND ==  "1" ]
-        then
-            if [ $CRYPTO_FILE_FOUND ==  "0" ]
-            then
-                echo "Couldn't find psa/crypto.h file in paths: ${INCLUDE_PATHS[@]}"
-                echo "$CRYPTO_HEADER_FILE_REQ"
-                exit 1
-            fi
-            if [ ! -d "$SOURCE/platform/targets/$TARGET/nspe/initial_attestation/ext" ]
-            then
-                git clone https://github.com/laurencelundblade/QCBOR.git $SOURCE/platform/targets/$TARGET/nspe/initial_attestation/ext
-                cd $SOURCE/platform/targets/$TARGET/nspe/initial_attestation/ext; git checkout da53227db1488dde0952bdff66c3d904dce270b3 ; cd -
-            else
-                echo "QCBOR library already cloned"
-            fi
-        fi
-    fi
-fi
-
-if [ -z "$TOOLCHAIN" ]
-then
-   export TOOLCHAIN=GNUARM
-   echo "--toolchain option is not provided, hence using default value \$TOOLCHAIN=$TOOLCHAIN"
-else
-   echo "Using \$TOOLCHAIN=$TOOLCHAIN"
-fi
-
-if [ $TOOLCHAIN != "GNUARM" ] && [ $TOOLCHAIN != "ARMCLANG" ]
-then
-   echo "Error: Unsupported value for --toolchain=$TOOLCHAIN.
-   Supported toolchain are GNUARM and ARMCLANG"
-   exit 1
-fi
-
-if [ -z "$CPU_ARCH" ]
-then
-   echo "Error: Provide cpu arch string as argument using --cpu_arch <string>"
-   echo "Supported CPU arch are armv8m_ml, armv8m_bl, armv7m"
-   exit 1
-else
-   echo "Using \$CPU_ARCH=$CPU_ARCH"
-fi
-
-if [ $CPU_ARCH != "armv8m_ml" ] && [ $CPU_ARCH != "armv8m_bl" ] && [ $CPU_ARCH != "armv7m" ]
-then
-   echo "Error: Unsupported value for --cpu_arch=$CPU_ARCH.
-   Supported CPU arch are armv8m_ml, armv8m_bl, armv7m"
-   exit 1
-fi
-
-if [ ! -z "$VERBOSE" ]
-then
-    if [ $VERBOSE != "1" ] && [ $VERBOSE != "2" ] &&
-       [ $VERBOSE != "3" ] && [ $VERBOSE != "4" ] &&
-       [ $VERBOSE != "5" ]
-    then
-        echo "Error: Unsupported value for --verbose=$VERBOSE."
-        echo "Supported print levels are:"
-        echo "1 - INFO & above."
-        echo "2 - DEBUG & above."
-        echo "3 - TEST & above."
-        echo "4 - WARN & ERROR."
-        echo "5 - ERROR."
-        exit 1
-    fi
-else
-    export VERBOSE=3
-fi
-
-if [ $INCLUDE_PANIC_TESTS == "1" ] && [ $WATCHDOG_AVAILABLE == "0" ]
-then
-   echo "
-Warning: You have set watchdog.num to 0 in $SOURCE/platform/targets/$TARGET/target.cfg
-Note - To test PSA APIs panic conditions, test harness may require to access watchdog timer
-to recover from panic and to be able to continue with next test.
-Ignore this warning if system under test has capability to reset the system
-when it encounters panic condition.
-"
-fi
-
-echo "----------Process input arguments- complete-------------"
-echo ""
-
-MAKE_OPTIONS=" SOURCE=$SOURCE "
-MAKE_OPTIONS+=" BUILD=$BUILD "
-MAKE_OPTIONS+=" TARGET=$TARGET "
-MAKE_OPTIONS+=" SUITE=$SUITE "
-MAKE_OPTIONS+=" TOOLCHAIN=$TOOLCHAIN "
-MAKE_OPTIONS+=" CPU_ARCH=$CPU_ARCH "
-MAKE_OPTIONS+=" VERBOSE=$VERBOSE "
-MAKE_OPTIONS+=" TEST_COMBINE_ARCHIVE=$TEST_COMBINE_ARCHIVE "
-MAKE_OPTIONS+=" INCLUDE_PANIC_TESTS=$INCLUDE_PANIC_TESTS "
-MAKE_OPTIONS+=" WATCHDOG_AVAILABLE=$WATCHDOG_AVAILABLE "
-MAKE_OPTIONS+=" SP_HEAP_MEM_SUPP=$SP_HEAP_MEM_SUPP "
-MAKE_OPTIONS+=" PSA_IPC_IMPLEMENTED=$PSA_IPC_IMPLEMENTED "
-MAKE_OPTIONS+=" PSA_CRYPTO_IMPLEMENTED=$PSA_CRYPTO_IMPLEMENTED "
-MAKE_OPTIONS+=" PSA_PROTECTED_STORAGE_IMPLEMENTED=$PSA_PROTECTED_STORAGE_IMPLEMENTED "
-MAKE_OPTIONS+=" PSA_INTERNAL_TRUSTED_STORAGE_IMPLEMENTED=$PSA_INTERNAL_TRUSTED_STORAGE_IMPLEMENTED "
-MAKE_OPTIONS+=" PSA_INITIAL_ATTESTATION_IMPLEMENTED=$PSA_INITIAL_ATTESTATION_IMPLEMENTED "
-MAKE_OPTIONS+=" USER_INCLUDE=\"$INCLUDE\" "
-
-#Build VAL/PAL static library and Tests ELFs
-echo "make -f $SOURCE/tools/makefiles/Makefile $MAKE_OPTIONS USER_INCLUDE=\"$INCLUDE\" all "
-make -f $SOURCE/tools/makefiles/Makefile $MAKE_OPTIONS USER_INCLUDE="$INCLUDE" all
diff --git a/api-tests/tools/scripts/target_cfg/CMakeLists.txt b/api-tests/tools/scripts/target_cfg/CMakeLists.txt
new file mode 100644
index 0000000..546c068
--- /dev/null
+++ b/api-tests/tools/scripts/target_cfg/CMakeLists.txt
@@ -0,0 +1,76 @@
+#/** @file
+# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# *  http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+# Set the minimum required version of CMake for the project
+cmake_minimum_required(VERSION 3.10)
+
+# cmake_policy
+cmake_policy(SET CMP0057 NEW)
+
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../tools/cmake)
+include("common/CMakeSettings")
+include("common/Utils")
+
+# Let the CMake look for C compiler
+project(TargetConfigGen LANGUAGES C)
+
+# Check whether required arguments are passed to CMake
+_check_arguments("OUT_DIR"
+		"TARGET"
+		"GENERATOR_FILE"
+		"INCLUDE_DIR"
+		"TARGET_CONFIGURATION_FILE"
+		"TGT_CONFIG_SOURCE_C"
+		"OUTPUT_HEADER"
+		"DATABASE_TABLE_NAME"
+		"DATABASE_TABLE_SECTION_NAME"
+		"TARGET_HEADER_GEN_INCLUDE_PATHS"
+)
+
+# add_custom_command to generate intermediate source file
+add_custom_command(
+	OUTPUT
+	${TGT_CONFIG_SOURCE_C}
+	COMMENT "[PSA] : Creating generator source ${TGT_CONFIG_SOURCE_C}"
+	COMMAND ${PYTHON_EXECUTABLE} ${GENERATOR_FILE} ${TARGET} ${INCLUDE_DIR}/val_target.h ${TARGET_CONFIGURATION_FILE} ${TGT_CONFIG_SOURCE_C} ${OUTPUT_HEADER} ${DATABASE_TABLE_NAME} ${DATABASE_TABLE_SECTION_NAME}
+)
+
+# Adding command to execute the generator
+add_custom_command(
+	OUTPUT
+	${OUTPUT_HEADER}
+	COMMENT "[PSA] : Creating output header ${OUTPUT_HEADER}"
+	COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}
+)
+
+# Adding executable
+add_executable(${PROJECT_NAME} ${TGT_CONFIG_SOURCE_C})
+foreach(include_path ${TARGET_HEADER_GEN_INCLUDE_PATHS})
+	target_include_directories(${PROJECT_NAME} PRIVATE ${include_path})
+endforeach()
+set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-m32 -w")
+set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-m32")
+
+# Adding target to tell we want OUTPUT_HEADER
+add_custom_target(
+	run_generator_output ALL
+	SOURCES ${OUTPUT_HEADER}
+)
+
+# install target to put the OUTPUT_HEADER to it's final location
+get_filename_component(INSTALL_DST "${OUT_DIR}" ABSOLUTE)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_HEADER} DESTINATION ${INSTALL_DST})
diff --git a/api-tests/tools/scripts/targetConfigGen.py b/api-tests/tools/scripts/target_cfg/targetConfigGen.py
similarity index 99%
rename from api-tests/tools/scripts/targetConfigGen.py
rename to api-tests/tools/scripts/target_cfg/targetConfigGen.py
index 6442f74..fd1f7e4 100644
--- a/api-tests/tools/scripts/targetConfigGen.py
+++ b/api-tests/tools/scripts/target_cfg/targetConfigGen.py
@@ -41,6 +41,9 @@
 unique_major_groups = []
 unique_minor_components = []
 
+if section_name == "NOSECTION":
+	section_name = ""
+
 def get_minor_major_map():
 	""" This method populates the dictionary which maps between every available minor component to their major group """
 	try:
diff --git a/api-tests/tools/scripts/test_elf_combine.pl b/api-tests/tools/scripts/test_elf_combine.pl
deleted file mode 100755
index fb50e32..0000000
--- a/api-tests/tools/scripts/test_elf_combine.pl
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/env perl
-#/** @file
-# * Copyright (c) 2018-2019, 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.
-#**/
-
-use File::Find;
-use File::Basename;
-
-#Inputs
-$test_list_file = $ARGV[0];
-
-@suite_out =  split("/.testlist.txt", $test_list_file);
-
-# Final output elf file
-$output_elf = "$suite_out[0]/test_elf_combine.bin";
-
-
-my @all_elf_paths;
-@test_list = `cat $test_list_file`;
-
-
-open(OUT, '>:raw', $output_elf) or die "Unable to open: $!";
-
-# Collecting all elf file paths
-
-foreach $test (@test_list)
-{
-	chomp($test);
-	push @all_elf_paths, "$suite_out[0]/$test/test.elf";
-	if (!(-e "$suite_out[0]/$test/test.elf"))
-	{
-		print "ELF not found - $suite_out[0]/$test/test.elf\n";
-		exit 1;
-	}
-}
-
-foreach $elf (@all_elf_paths) {
-
-    # Find elf sizes
-    $elf_size = -s $elf;
-
-    # Get readelf program header info from either elf and process it
-    $out = `readelf -l $elf`;
-    if($out =~ /LOAD(\s+)(0[xX][0-9a-fA-F]+)/)
-	{
-	   $program_header = hex($2);
-    }
-
-    # Determining test_id from elf at location pointed by program header
-    open(TEST_NS_ID, '<:raw', $elf) or die "Unable to open: $!";
-    seek(TEST_NS_ID, $program_header, 0);
-    read TEST_NS_ID, $test_id_raw, 4;
-
-    $test_id = unpack('L<', $test_id_raw);
-    close TEST_NS_ID;
-
-    printf("test_id:\t%4d, ", $test_id);
-    print "ELF:$elf,\tSIZE:$elf_size\n";
-
-    # 'L' unsigned-32 ; '<' Little endian
-    print OUT pack('L<', 0xFACEFACE);
-    print OUT pack('L<', $test_id);
-    print OUT pack('L<', $elf_size);
-
-    # Temporarily closing final ELF to concatenate ELFs
-    close OUT;
-    system("cat $elf >> $output_elf");
-    # Open final ELF again
-    open(OUT, '>>:raw', $output_elf) or die "Unable to open: $!";
-}
-print OUT pack('L<', 0xC3C3C3C3);
-close OUT;
