diff --git a/epicardium/ble/filetransfer.c b/epicardium/ble/filetransfer.c
index 03181390c573edb90e5be63ede43ed3b0b33b161..e3cb411e607946b7ebac6fff5e9d3e2b1b1db35f 100644
--- a/epicardium/ble/filetransfer.c
+++ b/epicardium/ble/filetransfer.c
@@ -40,6 +40,7 @@
 #include "FreeRTOS.h"
 #include "crc32.h"
 
+#include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdbool.h>
@@ -227,6 +228,38 @@ static void sendCrcResponse(
 	AttsHandleValueNtf(connId, FILE_TRANS_CENTRAL_RX_VAL_HDL, len, answer);
 }
 
+/*
+ * This function splits the path into the folders and the file name and 
+ * creates all the missing folders.
+ * This function modifies the given parameter!
+ */
+static int bleFileCreateOrOpen(char *filepath)
+{
+	char *path;
+	char *fileName = NULL;
+	int ret;
+
+	while (true) {
+		path     = strtok(filepath, "/");
+		filepath = NULL;
+		if (path == NULL)
+			break;
+
+		/* ignore relative paths */
+		if (strcmp(path, "..") == 0 || strcmp(path, ".") == 0)
+			continue;
+
+		if (fileName) {
+			ret = epic_file_mkdir(fileName);
+			if (ret)
+				return ret;
+		}
+		fileName = path;
+	}
+
+	return epic_file_open(filepath, "w");
+}
+
 static uint8_t bleFileOpen(dmConnId_t connId, uint8_t *pValue, uint16_t len)
 {
 	char filepath[100];
@@ -242,7 +275,7 @@ static uint8_t bleFileOpen(dmConnId_t connId, uint8_t *pValue, uint16_t len)
 	if (file_fd != -1)
 		epic_file_close(file_fd);
 
-	file_fd = epic_file_open(filepath, "w");
+	file_fd = bleFileCreateOrOpen(filepath);
 	if (file_fd < 0) {
 		sendCrcResponse(connId, 'e', 0, NULL, "open failed");
 		return ATT_ERR_RESOURCES;