diff --git a/.ci_scripts/run_cppcheck.sh b/.ci_scripts/run_cppcheck.sh
new file mode 100755
index 0000000000000000000000000000000000000000..fa0d3122f1a326fd0111236f8c1a7b7145c6729e
--- /dev/null
+++ b/.ci_scripts/run_cppcheck.sh
@@ -0,0 +1,18 @@
+EXITCODE=0
+
+# Pattern matching on all source files
+for file in $(find $GITHUB_WORKSPACE/include $GITHUB_WORKSPACE/src $GITHUB_WORKSPACE/test -name *.h -o -name *.c)
+do
+    if [[ "$file" != *"/hashmap.c" ]]
+    then
+        # Run cppcheck on each file
+        cppcheck --error-exitcode=1 "$file"
+        # If the exit code is not 0, set EXITCODE to 1
+        if [[ $? -ne 0 ]]
+        then
+            EXITCODE=1
+        fi
+    fi
+done
+
+exit $EXITCODE
diff --git a/.ci_scripts/run_tests.sh b/.ci_scripts/run_tests.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8404a1a027d11ae17b9d114e43bf92ac2b66f566
--- /dev/null
+++ b/.ci_scripts/run_tests.sh
@@ -0,0 +1,20 @@
+EXITCODE=0
+VALGRIND_SUPP="$GITHUB_WORKSPACE/.ci_scripts/valgrind.supp"
+
+for file in $GITHUB_WORKSPACE/bin/test/*
+do
+    if [[ $# -eq 1 && $1 == valgrind ]]
+    then
+        valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --suppressions="$VALGRIND_SUPP" --error-exitcode=1 "$file"
+    else
+        "$file"
+    fi
+
+    # If the exit code is not 0, set EXITCODE to 1
+    if [[ $? -ne 0 ]]
+    then
+        EXITCODE=1
+    fi
+done
+
+exit $EXITCODE
diff --git a/.ci_scripts/valgrind.supp b/.ci_scripts/valgrind.supp
new file mode 100644
index 0000000000000000000000000000000000000000..58737389074fd2a9549e627f0d0aa9236260b6a6
--- /dev/null
+++ b/.ci_scripts/valgrind.supp
@@ -0,0 +1,137 @@
+{
+   suppr_1
+   Memcheck:Param
+   socketcall.sendto(msg)
+   fun:sendto
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   fun:nft_run_cmd_from_buffer
+   fun:exec_nft_cmd
+   fun:test_exec_nft_cmd
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   fun:CU_run_all_tests
+   fun:main
+}
+
+{
+   suppr_2
+   Memcheck:Param
+   sendmsg(msg.msg_iov[0])
+   fun:sendmsg
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   fun:nft_run_cmd_from_buffer
+   fun:exec_nft_cmd
+   fun:test_exec_nft_cmd
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   fun:CU_run_all_tests
+   fun:main
+}
+
+{
+   suppr_3
+   Memcheck:Param
+   sendmsg(msg.msg_iov[0])
+   fun:sendmsg
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   fun:nft_run_cmd_from_buffer
+   fun:exec_nft_cmd_verbose
+   fun:test_exec_nft_cmd_verbose
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   fun:CU_run_all_tests
+   fun:main
+}
+
+{
+   suppr_4
+   Memcheck:Param
+   socketcall.sendto(msg)
+   fun:sendto
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   fun:nft_run_cmd_from_buffer
+   fun:exec_nft_cmd_verbose
+   fun:delete_nft_rule
+   fun:test_delete_nft_rule
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   fun:CU_run_all_tests
+   fun:main
+}
+
+{
+   suppr_5
+   Memcheck:Param
+   socketcall.sendto(msg)
+   fun:sendto
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   fun:nft_run_cmd_from_buffer
+   fun:exec_nft_cmd_verbose
+   fun:delete_nft_rule
+   fun:test_delete_nft_rule
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   fun:CU_run_all_tests
+}
+
+{
+   suppr_6
+   Memcheck:Param
+   socketcall.sendto(msg)
+   fun:sendto
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   fun:nft_run_cmd_from_buffer
+   fun:exec_nft_cmd_verbose
+   fun:delete_nft_rule
+   fun:test_delete_nft_rule
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   fun:CU_run_all_tests
+   fun:main
+}
+
+{
+   suppr_7
+   Memcheck:Param
+   socketcall.sendto(msg)
+   fun:sendto
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   fun:nft_run_cmd_from_buffer
+   fun:exec_nft_cmd_verbose
+   fun:delete_nft_rule
+   fun:test_delete_nft_rule
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   fun:CU_run_all_tests
+   fun:main
+}
+
+{
+   suppr_8
+   Memcheck:Param
+   socketcall.sendto(msg)
+   fun:sendto
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   obj:/usr/lib/x86_64-linux-gnu/libnftables.so.1.1.0
+   fun:nft_run_cmd_from_buffer
+   fun:exec_nft_cmd_verbose
+   fun:delete_nft_rule
+   fun:test_delete_nft_rule
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   obj:/usr/lib/x86_64-linux-gnu/libcunit.so.1.0.1
+   fun:CU_run_all_tests
+}
diff --git a/.github/workflows/unit-tests.yaml b/.github/workflows/unit-tests.yaml
index e377e7550c6f067b9c71c7251891f9bed7e03307..271081cb36049582bcc2f45ba096bbb914a10da4 100644
--- a/.github/workflows/unit-tests.yaml
+++ b/.github/workflows/unit-tests.yaml
@@ -12,16 +12,16 @@ jobs:
         uses: actions/checkout@v3
 
       - name: Install required packages
-        run: sudo $GITHUB_WORKSPACE/.ci_scripts/full-test/install_packages.sh
+        run: sudo $GITHUB_WORKSPACE/.ci_scripts/install_packages.sh
 
       - name: Build project with CMake
         run: $GITHUB_WORKSPACE/build.sh -d $GITHUB_WORKSPACE
 
       - name: Run CUnit tests
-        run: $GITHUB_WORKSPACE/.ci_scripts/full-test/run_tests.sh
+        run: $GITHUB_WORKSPACE/.ci_scripts/run_tests.sh
 
       - name: Run Valgrind on CUnit tests
-        run: $GITHUB_WORKSPACE/.ci_scripts/full-test/run_tests.sh valgrind
+        run: $GITHUB_WORKSPACE/.ci_scripts/run_tests.sh valgrind
 
       - name: Run cppcheck on source files
-        run: $GITHUB_WORKSPACE/.ci_scripts/full-test/run_cppcheck.sh
+        run: $GITHUB_WORKSPACE/.ci_scripts/run_cppcheck.sh