diff --git a/cli.cpp b/cli.cpp
index 4e42b22b81164d56bc9103bf971ea5c30d3ce08a..a8d0e903d2ab32769d34d97b940e5093d25870a7 100644
--- a/cli.cpp
+++ b/cli.cpp
@@ -356,6 +356,17 @@ void Cli::loop (Stream& input)
             else
                 answer(false);
         }
+        else if (kw(F("FS-TEST")))
+        {
+            copyNextToTemp();
+            if (_temp.length() > 0)
+            {
+                testw(_temp.c_str(), &Serial);
+                answer(true);
+            }
+            else
+                answer(false);
+        }
         else
         {
             Serial.printf("%sinvalid command '%s'\n", _msgHeader, _currentInput.c_str() + _currentWordIndex);
diff --git a/fs.cpp b/fs.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..16592cd0a95102142aa8397fb42c02a2a59737ad
--- /dev/null
+++ b/fs.cpp
@@ -0,0 +1,85 @@
+
+#include <ESP8266WebServer.h>
+#include <ESPWebDAV.h>
+#include <LittleFS.h>
+#include <StreamString.h>
+
+#include "fs.h"
+
+ESPWebDAVCore* dav = nullptr;
+ESP8266WebServer* http = nullptr;
+FS* filesystem = nullptr;
+const char* fsMsgHeader = nullptr;
+
+bool fs_init (const char* msgHeader)
+{
+    fsMsgHeader = msgHeader;
+    filesystem = &LittleFS;
+    if (!filesystem->begin() && (!filesystem->format() || !filesystem->begin()))
+        return false;
+    http = new (std::nothrow) ESP8266WebServer(HTTPORT);
+    if (!http)
+        return false;
+    dav = new (std::nothrow) ESPWebDAVCore;
+    if (!dav)
+    {
+        delete http;
+        return false;
+    }
+    dav->begin(filesystem);
+    http->addHook(hookWebDAVForWebserver(DAVROOT, *dav));
+    return true;
+}
+
+
+void ls (Print* out)
+{
+    if (dav)
+    {
+        out->printf("#%sLS:\n", fsMsgHeader);
+        dav->dir("/", out);
+    }
+}
+
+void format (Print* out)
+{
+    if (filesystem)
+    {
+        out->printf("%sformatting\n", fsMsgHeader);
+        out->flush();
+        filesystem->format();
+        out->printf("%smkdir %s\n", fsMsgHeader, DAVROOT);
+        filesystem->mkdir(DAVROOT);
+    }
+}
+
+void cat (const char* filename, Stream* out)
+{
+    if (filesystem)
+    {
+        File f = filesystem->open(filename, "r");
+        if (!f)
+            out->printf("%scat: '%s' not found\n", fsMsgHeader, filename);
+        else
+        {
+            out->printf("%s>>>>FILE name:'%s' fullname:'%s' size=%zd\n", fsMsgHeader, f.name(), f.fullName(), f.size());
+            f.sendSize(out, f.size());
+            out->printf("%s<<<<FILE\n", fsMsgHeader);
+        }
+    }
+}
+
+void testw (const char* filename, Stream* out)
+{
+    if (filesystem)
+    {
+        File f = filesystem->open(filename, "w");
+        if (!f)
+            out->printf("%stest: '%s' can't write\n", fsMsgHeader, filename);
+        else
+        {
+            StreamString blah = "blah";
+            blah.sendAll(f);
+        }
+    }
+}
diff --git a/fs.h b/fs.h
new file mode 100644
index 0000000000000000000000000000000000000000..1c690dc5d4b400188cbdacad5f9167de756c209b
--- /dev/null
+++ b/fs.h
@@ -0,0 +1,19 @@
+
+#pragma once
+
+#include <ESP8266WebServer.h>
+#include <WebDav4WebServer.h>
+
+#ifndef DAVROOT
+#define DAVROOT "/dav"
+#endif
+
+#ifndef HTTPORT
+#define HTTPORT 80
+#endif
+
+bool fs_init (const char* msgHeader);
+void ls (Print* out);
+void format (Print* out);
+void cat (const char* filename, Stream* out);
+void testw (const char* filename, Stream* out);
diff --git a/pousseseringue-arduino.cpp b/pousseseringue-arduino.cpp
index 07efe24557731b57c157a5f73fc1a32006faca3d..16b75474b76797b15ba0b62cf647c879abd07a28 100644
--- a/pousseseringue-arduino.cpp
+++ b/pousseseringue-arduino.cpp
@@ -278,22 +278,11 @@ void setup()
     oled.clear();
     oled.println("Booting...\n");
 
-    if (fs_init(msgHeader))
-    {
-        Serial.printf("FS initialized, dav http server started\n");
-    }
-    else
-    {
-        Serial.printf("FS: could not be started\n");
-    }
-
     //syringe.setPhysical(MOTOR_STEPS * MICROSTEPS_CONF, M4_MMREV, /*forwardClockWise*/true, /*emergencySensorBehind*/false);
     syringe.setPhysical(MOTOR_STEPS * MICROSTEPS_CONF, M5_MMREV, /*forwardClockWise*/false, /*emergencySensorBehind*/true);
 
     pinMode(SLEEP, OUTPUT);
     digitalWrite(SLEEP, 0);
-
-
 #endif // !CORE_MOCK
 
     uint8_t mac[6];
@@ -345,6 +334,17 @@ void setup()
 
     // check if emergency button is pressed at boot time
     syringe.setEmergency(digitalRead(COURSE));
+
+#if 0
+    if (fs_init(msgHeader))
+    {
+        Serial.printf("FS initialized, dav http server started\n");
+    }
+    else
+    {
+        Serial.printf("FS: could not be started\n");
+    }
+#endif
 }