diff --git a/interface/src/tfm_audit_api.c b/interface/src/tfm_audit_api.c
index 9ce86ef..fd4fc67 100644
--- a/interface/src/tfm_audit_api.c
+++ b/interface/src/tfm_audit_api.c
@@ -5,71 +5,100 @@
  *
  */
 
-#include "tfm_audit_veneers.h"
 #include "psa_audit_api.h"
+#include "tfm_veneers.h"
 #include "tfm_ns_lock.h"
-#include "audit_wrappers.h"
 
-enum psa_audit_err psa_audit_retrieve_record(const uint32_t record_index,
-                                             const uint32_t buffer_size,
-                                             const uint8_t *token,
-                                             const uint32_t token_size,
-                                             uint8_t *buffer,
-                                             uint32_t *record_size)
+#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
+
+#define API_DISPATCH(sfn_name)                               \
+    tfm_ns_lock_dispatch((veneer_fn)tfm_##sfn_name##_veneer, \
+        (uint32_t)in_vec, (uint32_t)ARRAY_SIZE(in_vec),      \
+        (uint32_t)out_vec, (uint32_t)ARRAY_SIZE(out_vec))
+
+#define API_DISPATCH_NO_INVEC(sfn_name)                      \
+    tfm_ns_lock_dispatch((veneer_fn)tfm_##sfn_name##_veneer, \
+        (uint32_t)NULL, 0,                                   \
+        (uint32_t)out_vec, (uint32_t)ARRAY_SIZE(out_vec))
+
+#define API_DISPATCH_NO_OUTVEC(sfn_name)                     \
+    tfm_ns_lock_dispatch((veneer_fn)tfm_##sfn_name##_veneer, \
+        (uint32_t)in_vec, (uint32_t)ARRAY_SIZE(in_vec),      \
+        (uint32_t)NULL, 0)
+
+psa_status_t psa_audit_retrieve_record(const uint32_t record_index,
+                                       const uint32_t buffer_size,
+                                       const uint8_t *token,
+                                       const uint32_t token_size,
+                                       uint8_t *buffer,
+                                       uint32_t *record_size)
 {
-    const struct audit_core_retrieve_input input_s =
-                                       {.record_index = record_index,
-                                        .buffer_size = buffer_size,
-                                        .token = token,
-                                        .token_size = token_size};
+    psa_status_t status;
+    psa_invec in_vec[] = {
+        {.base = &record_index, .len = sizeof(uint32_t)},
+        {.base = token, .len = token_size},
+    };
+    psa_outvec out_vec[] = {
+        {.base = buffer, .len = buffer_size},
+    };
 
-    struct audit_core_retrieve_output output_s = {.buffer = buffer,
-                                                  .record_size = record_size};
+    status = API_DISPATCH(audit_core_retrieve_record);
 
-    return (enum psa_audit_err) tfm_ns_lock_dispatch((veneer_fn)tfm_audit_veneer_retrieve_record,
-                                (uint32_t)&input_s,
-                                (uint32_t)&output_s,
-                                0,
-                                0);
+    *record_size = out_vec[0].len;
+
+    return status;
 }
 
-enum psa_audit_err psa_audit_get_info(uint32_t *num_records,
-                                      uint32_t *size)
+psa_status_t psa_audit_get_info(uint32_t *num_records, uint32_t *size)
 {
-    return (enum psa_audit_err) tfm_ns_lock_dispatch((veneer_fn)tfm_audit_veneer_get_info,
-                                (uint32_t)num_records,
-                                (uint32_t)size,
-                                0,
-                                0);
+    psa_status_t status;
+    psa_outvec out_vec[] = {
+        {.base = num_records, .len = sizeof(uint32_t)},
+        {.base = size, .len = sizeof(uint32_t)},
+    };
+
+    status = API_DISPATCH_NO_INVEC(audit_core_get_info);
+
+    return status;
 }
 
-enum psa_audit_err psa_audit_get_record_info(const uint32_t record_index,
-                                             uint32_t *size)
+psa_status_t psa_audit_get_record_info(const uint32_t record_index,
+                                       uint32_t *size)
 {
-    return (enum psa_audit_err) tfm_ns_lock_dispatch((veneer_fn)tfm_audit_veneer_get_record_info,
-                                (uint32_t)record_index,
-                                (uint32_t)size,
-                                0,
-                                0);
+    psa_status_t status;
+    psa_invec in_vec[] = {
+        {.base = &record_index, .len = sizeof(uint32_t)},
+    };
+    psa_outvec out_vec[] = {
+        {.base = size, .len = sizeof(uint32_t)},
+    };
+
+    status = API_DISPATCH(audit_core_get_record_info);
+
+    return status;
 }
 
-enum psa_audit_err psa_audit_delete_record(const uint32_t record_index,
-                                           const uint8_t *token,
-                                           const uint32_t token_size)
+psa_status_t psa_audit_delete_record(const uint32_t record_index,
+                                     const uint8_t *token,
+                                     const uint32_t token_size)
 {
-    return (enum psa_audit_err) tfm_ns_lock_dispatch((veneer_fn)tfm_audit_veneer_delete_record,
-                                (uint32_t)record_index,
-                                (uint32_t)token,
-                                (uint32_t)token_size,
-                                0);
+    psa_status_t status;
+    psa_invec in_vec[] = {
+        {.base = &record_index, .len = sizeof(uint32_t)},
+        {.base = token, .len = token_size},
+    };
+
+    status = API_DISPATCH_NO_OUTVEC(audit_core_delete_record);
+
+    return status;
 }
 
-enum psa_audit_err psa_audit_add_record(const struct psa_audit_record *record)
+psa_status_t psa_audit_add_record(const struct psa_audit_record *record)
 {
     /* This API supports only Secure world calls. As this is the implementation
      * of the Non-Secure interface, always directly return an error without
-     * routing the call to TF-M in the Secure world
+     * routing the call to TF-M in the Secure world.
      */
     (void)record;
-    return PSA_AUDIT_ERR_NOT_SUPPORTED;
+    return PSA_ERROR_NOT_PERMITTED;
 }
