diff --git a/programs/fuzz/CMakeLists.txt b/programs/fuzz/CMakeLists.txt
index 54b07b4..5dbc928 100644
--- a/programs/fuzz/CMakeLists.txt
+++ b/programs/fuzz/CMakeLists.txt
@@ -37,12 +37,13 @@
     # This emulates "if ( ... IN_LIST ... )" which becomes available in CMake 3.3
     list(FIND executables_with_common_c ${exe} exe_index)
     if(${exe_index} GREATER -1)
-        list(APPEND exe_sources common.c)
+        list(APPEND exe_sources ../../tf-psa-crypto/programs/fuzz/common.c)
     endif()
 
     add_executable(${exe} ${exe_sources})
     set_base_compile_options(${exe})
     target_include_directories(${exe} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../framework/tests/include
+                                              ${CMAKE_CURRENT_SOURCE_DIR}/../../tf-psa-crypto/programs/fuzz/
                                               ${CMAKE_CURRENT_SOURCE_DIR}/../../tests/include)
 
     if (NOT FUZZINGENGINE_LIB)
diff --git a/programs/fuzz/common.c b/programs/fuzz/common.c
deleted file mode 100644
index 41fa858..0000000
--- a/programs/fuzz/common.c
+++ /dev/null
@@ -1,107 +0,0 @@
-#define MBEDTLS_DECLARE_PRIVATE_IDENTIFIERS
-
-#include "common.h"
-#include <limits.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include "mbedtls/ctr_drbg.h"
-
-#if defined(MBEDTLS_PLATFORM_TIME_ALT)
-mbedtls_time_t dummy_constant_time(mbedtls_time_t *time)
-{
-    (void) time;
-    return 0x5af2a056;
-}
-#endif
-
-void dummy_init(void)
-{
-#if defined(MBEDTLS_PLATFORM_TIME_ALT)
-    mbedtls_platform_set_time(dummy_constant_time);
-#else
-    fprintf(stderr, "Warning: fuzzing without constant time\n");
-#endif
-}
-
-int dummy_send(void *ctx, const unsigned char *buf, size_t len)
-{
-    //silence warning about unused parameter
-    (void) ctx;
-    (void) buf;
-
-    //pretends we wrote everything ok
-    if (len > INT_MAX) {
-        return -1;
-    }
-    return (int) len;
-}
-
-int fuzz_recv(void *ctx, unsigned char *buf, size_t len)
-{
-    //reads from the buffer from fuzzer
-    fuzzBufferOffset_t *biomemfuzz = (fuzzBufferOffset_t *) ctx;
-
-    if (biomemfuzz->Offset == biomemfuzz->Size) {
-        //EOF
-        return 0;
-    }
-    if (len > INT_MAX) {
-        return -1;
-    }
-    if (len + biomemfuzz->Offset > biomemfuzz->Size) {
-        //do not overflow
-        len = biomemfuzz->Size - biomemfuzz->Offset;
-    }
-    memcpy(buf, biomemfuzz->Data + biomemfuzz->Offset, len);
-    biomemfuzz->Offset += len;
-    return (int) len;
-}
-
-int dummy_random(void *p_rng, unsigned char *output, size_t output_len)
-{
-    int ret;
-    size_t i;
-
-#if defined(MBEDTLS_CTR_DRBG_C)
-    //mbedtls_ctr_drbg_random requires a valid mbedtls_ctr_drbg_context in p_rng
-    if (p_rng != NULL) {
-        //use mbedtls_ctr_drbg_random to find bugs in it
-        ret = mbedtls_ctr_drbg_random(p_rng, output, output_len);
-    } else {
-        //fall through to pseudo-random
-        ret = 0;
-    }
-#else
-    (void) p_rng;
-    ret = 0;
-#endif
-    for (i = 0; i < output_len; i++) {
-        //replace result with pseudo random
-        output[i] = (unsigned char) rand();
-    }
-    return ret;
-}
-
-int dummy_entropy(void *data, unsigned char *output, size_t len)
-{
-    size_t i;
-    (void) data;
-
-    //use mbedtls_entropy_func to find bugs in it
-    //test performance impact of entropy
-    //ret = mbedtls_entropy_func(data, output, len);
-    for (i = 0; i < len; i++) {
-        //replace result with pseudo random
-        output[i] = (unsigned char) rand();
-    }
-    return 0;
-}
-
-int fuzz_recv_timeout(void *ctx, unsigned char *buf, size_t len,
-                      uint32_t timeout)
-{
-    (void) timeout;
-
-    return fuzz_recv(ctx, buf, len);
-}
diff --git a/programs/fuzz/common.h b/programs/fuzz/common.h
deleted file mode 100644
index 88dceac..0000000
--- a/programs/fuzz/common.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "mbedtls/build_info.h"
-
-#if defined(MBEDTLS_HAVE_TIME)
-#include "mbedtls/platform_time.h"
-#endif
-#include <stddef.h>
-#include <stdint.h>
-
-typedef struct fuzzBufferOffset {
-    const uint8_t *Data;
-    size_t Size;
-    size_t Offset;
-} fuzzBufferOffset_t;
-
-#if defined(MBEDTLS_HAVE_TIME)
-mbedtls_time_t dummy_constant_time(mbedtls_time_t *time);
-#endif
-void dummy_init(void);
-
-int dummy_send(void *ctx, const unsigned char *buf, size_t len);
-int fuzz_recv(void *ctx, unsigned char *buf, size_t len);
-int dummy_random(void *p_rng, unsigned char *output, size_t output_len);
-int dummy_entropy(void *data, unsigned char *output, size_t len);
-int fuzz_recv_timeout(void *ctx, unsigned char *buf, size_t len,
-                      uint32_t timeout);
-
-/* Implemented in the fuzz_*.c sources and required by onefile.c */
-int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
