diff --git a/Makefile b/Makefile
index 1af4840aeed565072ff81a9710af9531b0f29402..bfa9efc9e9e3c7bb5356e3314513e1d6a794bf14 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@ BINARY_DIR = /usr/bin
 SYSTEMD_DIR = /etc/systemd/system
 
 DAEMON = daemon
-CLIENTS = dummy cpu_temp
+CLIENTS = dummy cpu_temp mem_usage
 
 SYSTEM_NAME = sibyl
 
diff --git a/clients/CMakeLists.txt b/clients/CMakeLists.txt
index b2abca374ba8ae98875041c30d1782e7ecd55fce..bc5c339dbea9470357b947efbfa19de940a79a1f 100644
--- a/clients/CMakeLists.txt
+++ b/clients/CMakeLists.txt
@@ -1,2 +1,3 @@
 add_subdirectory(cpu_temp)
 add_subdirectory(dummy)
+add_subdirectory(mem_usage)
diff --git a/clients/mem_usage/CMakeLists.txt b/clients/mem_usage/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8d70dcb22a3f4843ba6757ee9f8f01bb117405ca
--- /dev/null
+++ b/clients/mem_usage/CMakeLists.txt
@@ -0,0 +1,7 @@
+add_executable(mem_usage
+    src/mem_usage.c
+)
+
+target_link_libraries(mem_usage
+    PRIVATE common
+)
diff --git a/clients/mem_usage/src/mem_usage.c b/clients/mem_usage/src/mem_usage.c
new file mode 100644
index 0000000000000000000000000000000000000000..c54f8fa828897be57edb7de36a3fdb636ae3c4e9
--- /dev/null
+++ b/clients/mem_usage/src/mem_usage.c
@@ -0,0 +1,54 @@
+#include "../../../common/include/measurement.h"
+#include "../../../common/include/userspace_comm.h"
+#include <errno.h>
+#include <fcntl.h>
+#include <linux/sysinfo.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/sysinfo.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int main(int argc, char *argv[]) {
+  if (argc < 3 || argc > 3) {
+    printf("Invalid arguments provided");
+    return EXIT_FAILURE;
+  }
+
+  userspace_send_handle_t userspace_send_handle;
+  if (create_userspace_send_handle(&userspace_send_handle) == -1) {
+    perror("Failed to open message queue");
+    return EXIT_FAILURE;
+  }
+
+  int id = atoi(argv[1]);
+  int sleep_ms = atoi(argv[2]);
+
+  printf("Started mem usage (id: %d, delay: %dms)\n", id, sleep_ms);
+
+  while (1) {
+    struct sysinfo meminfo;
+    sysinfo(&meminfo);
+
+    measurement_t measurement = {
+        .data.uint64 = meminfo.totalram - meminfo.freeram,
+        .datatype = UINT64,
+        .id = id,
+    };
+
+    if (send_userspace_message(&userspace_send_handle, measurement) == -1) {
+      if (errno == EIDRM || errno == EINVAL) {
+        printf("Message queue got closed\n");
+        break;
+      }
+      perror("Failed to send message");
+    }
+
+    usleep(sleep_ms * 1000);
+  }
+
+  destroy_userspace_send_handle(&userspace_send_handle);
+
+  return EXIT_SUCCESS;
+}
diff --git a/systemd/clients/sibyl-mem-usage.service b/systemd/clients/sibyl-mem-usage.service
new file mode 100644
index 0000000000000000000000000000000000000000..58ae2bf903ed0a7fff78b0b9af489b3d8ddeb698
--- /dev/null
+++ b/systemd/clients/sibyl-mem-usage.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Sibyl Client Memory Usage (incl. Caches & Buffers)
+Wants=sibyl-daemon.service
+After=sibyl-daemon.service
+
+[Service]
+ExecStart=/usr/bin/sibyl-mem-usage 3 250
+Restart=always
+
+[Install]
+WantedBy=multi-user.target