diff --git a/epicardium/ble/ble.c b/epicardium/ble/ble.c
index a7f10ea50aa207903bf09dce56e91e117afddd59..dbf52946a712e24fcb8fc9234da31cc6a418b5a2 100644
--- a/epicardium/ble/ble.c
+++ b/epicardium/ble/ble.c
@@ -1,7 +1,7 @@
 #include "epicardium.h"
 #include "modules/log.h"
 
-#include "fs_util.h"
+#include "fs/fs_util.h"
 #include "wsf_types.h"
 #include "wsf_buf.h"
 #include "wsf_trace.h"
diff --git a/epicardium/ble/ble_main.c b/epicardium/ble/ble_main.c
index 4336624d64a7a7fd4f64767cbc22d1962333479b..17da918f7be5e4df59880361d37a059f36956c5a 100644
--- a/epicardium/ble/ble_main.c
+++ b/epicardium/ble/ble_main.c
@@ -17,7 +17,7 @@
 #include <string.h>
 #include "wsf_types.h"
 #include "util/bstream.h"
-#include "fs_util.h"
+#include "fs/fs_util.h"
 #include "wsf_msg.h"
 #include "wsf_trace.h"
 #include "hci_api.h"
diff --git a/epicardium/fs/fs_util.c b/epicardium/fs/fs_util.c
new file mode 100644
index 0000000000000000000000000000000000000000..1266df23207994c4db4a9d6281d280a86025d14e
--- /dev/null
+++ b/epicardium/fs/fs_util.c
@@ -0,0 +1,92 @@
+#include "fs_util.h"
+
+#include "epicardium.h"
+
+#include <stdint.h>
+#include <string.h>
+
+int fs_read_file(char *filename, void *data, int len)
+{
+	int fd = epic_file_open(filename, "r");
+	if (fd < 0) {
+		return fd;
+	}
+
+	int res = epic_file_read(fd, data, len);
+	epic_file_close(fd);
+
+	return res;
+}
+
+int fs_read_text_file(char *filename, char *data, int len)
+{
+	int readbytes;
+
+	if (len < 1)
+		return -1;
+	readbytes = fs_read_file(filename, data, len - 1);
+	if (readbytes < 0) {
+		data[0] = 0;
+		return readbytes;
+	};
+	data[readbytes] = 0;
+	while (readbytes > 0 && data[readbytes - 1] < 0x20) {
+		data[--readbytes] = 0;
+	};
+	return readbytes;
+}
+
+int fs_write_file(char *filename, const void *data, int len)
+{
+	int fd = epic_file_open(filename, "w");
+	if (fd < 0) {
+		return fd;
+	}
+
+	int res = epic_file_write(fd, data, len);
+	epic_file_close(fd);
+
+	return res;
+}
+
+int fs_get_file_size(char *filename)
+{
+	struct epic_stat stat;
+	int res = epic_file_stat(filename, &stat);
+	return res < 0 ? res : (int)stat.size;
+}
+
+#if 0
+#include "ff.h"
+FATFS FatFs;          /* File system object for logical drive */
+FS_USAGE FsUsage;
+/* TODO: Port functions from r0ket/rad10 libs */
+int fs_info(FATFS *fs)
+{
+    memcpy(fs, &FatFs, sizeof(FATFS));
+    return 0;
+}
+int fs_usage(FATFS *fs, FS_USAGE *fs_usage)
+{
+    FRESULT res;
+    DWORD tot_clust, fre_clust, sec_size;
+
+    res = f_getfree("/", &fre_clust, &fs);
+    if(res != FR_OK)
+        return -res;
+
+    // sectore size = sectors per cluster *  sector size
+#if FF_MAX_SS == FF_MIN_SS
+    sec_size = fs->csize * FF_MAX_SS;
+#else
+    sec_size = fs->csize * fs.ssize;
+#endif
+
+    // total/free sectors * sectore size
+    tot_clust = fs->n_fatent - 2;
+    fs_usage->total = tot_clust * sec_size; //FatFs.ssize;
+    fs_usage->free = fre_clust * sec_size; //FatFs.ssize;
+
+    return 0;
+}
+#endif
diff --git a/lib/ff13/util/fs_util.h b/epicardium/fs/fs_util.h
similarity index 100%
rename from lib/ff13/util/fs_util.h
rename to epicardium/fs/fs_util.h
diff --git a/epicardium/meson.build b/epicardium/meson.build
index a6a6c05261c16ced283c4d8591b335237f6acd37..0d10151a0bc31e64daeeca645d8e2ff5bd79fcd1 100644
--- a/epicardium/meson.build
+++ b/epicardium/meson.build
@@ -86,6 +86,7 @@ elf = executable(
   'main.c',
   'support.c',
   'fs/filesystem_fat.c',
+  'fs/fs_util.c',
   module_sources,
   l0der_sources,
   ble_sources,
diff --git a/epicardium/modules/config.c b/epicardium/modules/config.c
index 9f3e75f43a2fc08cb30e8a556633bf94c94f5488..7371f02a94d984b67b60b3652651015484eb582a 100644
--- a/epicardium/modules/config.c
+++ b/epicardium/modules/config.c
@@ -272,10 +272,10 @@ void load_config(void)
 			char newline;
 			rc = epic_file_read(fd, &newline, 1);
 			if (rc < 0 || (newline != '\n' && newline != '\r')) {
-				LOG_ERR("card10.cfg", "seek failed, aborting");
+				LOG_ERR("card10.cfg", "read failed, aborting");
 				LOG_DEBUG(
 					"card10.cfg",
-					"seek failed at read-back of newline: rc: %d read: %d",
+					"read failed at read-back of newline: rc: %d read: %d",
 					rc,
 					(int)newline
 				);
@@ -305,7 +305,7 @@ static size_t read_config_offset(size_t seek_offset, char *buf, size_t buf_len)
 
 	int rc = epic_file_seek(fd, seek_offset, SEEK_SET);
 	if (rc < 0) {
-		LOG_ERR("card10.cfg", "seek failed, aborting");
+		LOG_ERR("card10.cfg", "seek2 failed (%d), aborting", rc);
 		return 0;
 	}
 
diff --git a/lib/ff13/meson.build b/lib/ff13/meson.build
index fe2b3dc8beeca963e991af54770917eece0945e1..63f069c18b055ca9d5004ff6bd6cbe5295427490 100644
--- a/lib/ff13/meson.build
+++ b/lib/ff13/meson.build
@@ -1,6 +1,5 @@
 includes = include_directories(
   './Source/',
-  './util/',
 )
 
 sources = files(
@@ -8,7 +7,6 @@ sources = files(
   './Source/ff.c',
   './Source/ffsystem.c',
   './Source/ffunicode.c',
-  './util/fs_util.c',
 )
 
 lib = static_library(
diff --git a/lib/ff13/util/fs_util.c b/lib/ff13/util/fs_util.c
deleted file mode 100644
index f576de73285568e4f7b712d6780f42cbb2655b3a..0000000000000000000000000000000000000000
--- a/lib/ff13/util/fs_util.c
+++ /dev/null
@@ -1,106 +0,0 @@
-#include "fs_util.h"
-#include "ff.h"
-#include <stdint.h>
-#include <string.h>
-
-FATFS FatFs;          /* File system object for logical drive */
-FS_USAGE FsUsage;
-
-
-int fs_info(FATFS *fs)
-{
-    memcpy(fs, &FatFs, sizeof(FATFS));
-    return 0;
-}
-int fs_usage(FATFS *fs, FS_USAGE *fs_usage)
-{
-    FRESULT res;
-    DWORD tot_clust, fre_clust, sec_size;
-
-    res = f_getfree("/", &fre_clust, &fs);
-    if(res != FR_OK)
-        return -res;
-
-    // sectore size = sectors per cluster *  sector size
-#if FF_MAX_SS == FF_MIN_SS
-    sec_size = fs->csize * FF_MAX_SS;
-#else
-    sec_size = fs->csize * fs.ssize;
-#endif
-
-    // total/free sectors * sectore size
-    tot_clust = fs->n_fatent - 2;
-    fs_usage->total = tot_clust * sec_size; //FatFs.ssize;
-    fs_usage->free = fre_clust * sec_size; //FatFs.ssize;
-
-    return 0;
-}
-
-int fs_read_file(char * filename, void * data, int len){
-    FIL file;
-    UINT readbytes;
-    int res;
-
-    res=f_open(&file, filename, FA_OPEN_EXISTING|FA_READ);
-    if(res){
-        return -1;
-    };
-
-    res = f_read(&file, data, len, &readbytes);
-    if(res){
-        return -1;
-    };
-
-    f_close(&file);
-
-	return readbytes;
-}
-
-int fs_read_text_file(char * filename, char * data, int len){
-    int readbytes;
-
-    if(len<1) return -1;
-    readbytes=fs_read_file(filename,data,len-1);
-    if(readbytes<0){
-        data[0]=0;
-        return readbytes;
-    };
-    data[readbytes]=0;
-    while(readbytes>0 && data[readbytes-1]<0x20){
-        data[--readbytes]=0;
-    };
-    return readbytes;
-}
-
-
-int fs_write_file(char * filename, const void * data, int len){
-    FIL file;
-    UINT writebytes;
-    int res;
-
-	res=f_open(&file, filename, FA_CREATE_ALWAYS|FA_WRITE);
-    if(res){
-        return -res;
-    };
-
-    res = f_write(&file, data, len, &writebytes);
-    if(res){
-        return -res;
-    };
-    f_close(&file);
-
-	return writebytes;
-}
-
-int fs_get_file_size(char * filename){
-    FILINFO finfo;
-    int res;
-
-    /// XXX: Untested
-    res=f_stat(filename, &finfo);
-    if(res){
-        return -1;
-    }
-
-    return finfo.fsize;
-}