diff --git a/framework/psasim/test/Makefile b/framework/psasim/test/Makefile
new file mode 100644
index 0000000..07d1586
--- /dev/null
+++ b/framework/psasim/test/Makefile
@@ -0,0 +1,12 @@
+INCLUDE := -I../include/ -I./psa_manifest
+
+.PHONY: all clean
+
+all:
+	psa_autogen manifest.json
+	$(CC) psa_ff_bootstrap_TEST_PARTITION.c -lpsaff -o partition
+	$(CC) client.c -lpsaff -o client
+
+clean:
+	rm -rf psa_manifest
+	rm -f client partition psa_ff_bootstrap_TEST_PARTITION.c
diff --git a/framework/psasim/test/client.c b/framework/psasim/test/client.c
new file mode 100644
index 0000000..c768a71
--- /dev/null
+++ b/framework/psasim/test/client.c
@@ -0,0 +1,48 @@
+/* psasim test client */
+
+/*
+ *  Copyright The Mbed TLS Contributors
+ *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+ */
+
+#include <psa/client.h>
+#include "psa_manifest/sid.h"
+#include <stdio.h>
+#include <unistd.h>
+
+int main()
+{
+
+    const char *text = "FOOBARCOOL!!";
+
+    char output[100] = { 0 };
+    printf("My PID is %d\n", getpid());
+
+    printf("The version of the service is %u\n", psa_version(PSA_SID_SHA256_SID));
+    psa_handle_t h = psa_connect(PSA_SID_SHA256_SID, 1);
+
+    if (h < 0) {
+        printf("Couldn't connect %d\n", h);
+        return 1;
+    } else {
+        int type = 2;
+        puts("Calling!");
+        puts("Trying without invec");
+        printf("Answer to my call was %d (no invec)\n", psa_call(h, type, NULL, 0, NULL, 0));
+        psa_invec invecs[1];
+        psa_outvec outvecs[1];
+        invecs[0].base = text;
+        invecs[0].len = 24;
+        outvecs[0].base = output;
+        outvecs[0].len = 99;
+
+        printf("My iovec size should be %lu\n", invecs[0].len);
+        printf("Answer to my call was %d (with invec)\n", psa_call(h, type, invecs, 1, outvecs, 1));
+        printf("Here's the payload I recieved: %s\n", output);
+        printf("Apparently the server wrote %lu bytes in outvec %d\n", outvecs[0].len, 0);
+        puts("Closing handle");
+        psa_close(h);
+    }
+
+    return 0;
+}
diff --git a/framework/psasim/test/manifest.json b/framework/psasim/test/manifest.json
new file mode 100644
index 0000000..0ab83ef
--- /dev/null
+++ b/framework/psasim/test/manifest.json
@@ -0,0 +1,29 @@
+{
+   "psa_framework_version":1.0,
+   "name":"TEST_PARTITION",
+   "type":"PSA-ROT",
+   "priority":"LOW",
+   "entry_point":"psa_sha256_main",
+   "stack_size":"0x400",
+   "heap_size":"0x100",
+   "services":[
+      {
+         "name":"PSA_SID_SHA256",
+         "sid":"0x0000F000",
+         "signal":"PSA_SHA256",
+         "non_secure_clients": "true",
+         "minor_version":1,
+         "minor_policy":"STRICT"
+      }
+   ],
+   "irqs": [
+        {
+                "source": "SIGINT",
+                "signal": "SIGINT_SIG"
+        },
+        {
+                "source": "SIGTSTP",
+                "signal": "SIGSTP_SIG"
+        }
+   ]
+}
diff --git a/framework/psasim/test/server.c b/framework/psasim/test/server.c
new file mode 100644
index 0000000..bbd90f2
--- /dev/null
+++ b/framework/psasim/test/server.c
@@ -0,0 +1,105 @@
+/* psasim test server */
+
+/*
+ *  Copyright The Mbed TLS Contributors
+ *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+ */
+
+#include <psa/service.h>
+#include "psa_manifest/manifest.h"
+#include <unistd.h>
+#include <stdio.h>
+
+void printbits(uint32_t num)
+{
+    for (int i = 0; i < 32; i++) {
+        if ((num >> (31-i) & 0x1)) {
+            printf("1");
+        } else {
+            printf("0");
+        }
+    }
+    printf("\n");
+}
+
+#define BUF_SIZE 25
+
+int psa_sha256_main()
+{
+    psa_status_t ret = PSA_ERROR_PROGRAMMER_ERROR;
+    psa_msg_t msg = { -1 };
+    char foo[BUF_SIZE] = { 0 };
+    const int magic_num = 66;
+
+    puts("Starting");
+
+    while (1) {
+        puts("Calling psa_wait");
+        psa_signal_t signals = psa_wait(PSA_WAIT_ANY, PSA_BLOCK);
+
+        if (signals > 0) {
+            printbits(signals);
+        }
+
+        if (signals & PSA_SHA256_SIGNAL) {
+            puts("Oooh a signal!");
+
+            if (PSA_SUCCESS == psa_get(PSA_SHA256_SIGNAL, &msg)) {
+                printf("My handle is %d\n", msg.handle);
+                printf("My rhandle is %p\n", (int *) msg.rhandle);
+                switch (msg.type) {
+                    case PSA_IPC_CONNECT:
+                        puts("Got a connection message");
+                        psa_set_rhandle(msg.handle, (void *) &magic_num);
+                        ret = PSA_SUCCESS;
+                        break;
+                    case PSA_IPC_DISCONNECT:
+                        puts("Got a disconnection message");
+                        ret = PSA_SUCCESS;
+                        break;
+
+                    default:
+                        printf("Got an IPC call of type %d\n", msg.type);
+                        ret = 42;
+                        size_t size = msg.in_size[0];
+
+                        if ((size > 0) && (size <= sizeof(foo))) {
+                            psa_read(msg.handle, 0, foo, 6);
+                            foo[(BUF_SIZE-1)] = '\0';
+                            printf("Reading payload: %s\n", foo);
+                            psa_read(msg.handle, 0, foo+6, 6);
+                            foo[(BUF_SIZE-1)] = '\0';
+                            printf("Reading payload: %s\n", foo);
+                        }
+
+                        size = msg.out_size[0];
+                        if ((size > 0)) {
+                            puts("Writing response");
+                            psa_write(msg.handle, 0, "RESP", 4);
+                            psa_write(msg.handle, 0, "ONSE", 4);
+                        }
+
+                        if (msg.client_id > 0) {
+                            psa_notify(msg.client_id);
+                        } else {
+                            puts("Client is non-secure, so won't notify");
+                        }
+
+                }
+
+                psa_reply(msg.handle, ret);
+            } else {
+                puts("Failed to retrieve message");
+            }
+        } else if (SIGSTP_SIG & signals) {
+            puts("Recieved SIGSTP signal. Gonna EOI it.");
+            psa_eoi(SIGSTP_SIG);
+        } else if (SIGINT_SIG & signals) {
+            puts("Handling interrupt!\n");
+            puts("Gracefully quitting");
+            psa_panic();
+        } else {
+            puts("No signal asserted");
+        }
+    }
+}
