diff --git a/Makefile.dep b/Makefile.dep
index bde52cff2826800f0dbee312c9c4cf3317c41c03..95a1c4542ae6190bcf9720be724966fb49e9c0d1 100644
--- a/Makefile.dep
+++ b/Makefile.dep
@@ -605,6 +605,12 @@ ifneq (,$(filter devfs,$(USEMODULE)))
   USEMODULE += vfs
 endif
 
+ifneq (,$(filter vfs,$(USEMODULE)))
+    ifeq (native, $(BOARD))
+        USEMODULE += native_vfs
+    endif
+endif
+
 # include package dependencies
 -include $(USEPKG:%=$(RIOTPKG)/%/Makefile.dep)
 
diff --git a/cpu/native/Makefile b/cpu/native/Makefile
index c601d3323e7269b665185550674447586324b027..d66f5a971ea0efb69e044230e8599f7d466544a7 100644
--- a/cpu/native/Makefile
+++ b/cpu/native/Makefile
@@ -1,6 +1,7 @@
 MODULE = cpu
 
 DIRS += periph
+DIRS += vfs
 
 ifneq (,$(filter netdev2_tap,$(USEMODULE)))
 	DIRS += netdev2_tap
diff --git a/cpu/native/vfs/Makefile b/cpu/native/vfs/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..e3b46ebd7f4ee17b441870ab882eaeba88715b58
--- /dev/null
+++ b/cpu/native/vfs/Makefile
@@ -0,0 +1,3 @@
+MODULE=native_vfs
+
+include $(RIOTBASE)/Makefile.base
diff --git a/cpu/native/vfs/native_vfs.c b/cpu/native/vfs/native_vfs.c
new file mode 100644
index 0000000000000000000000000000000000000000..d3e18cc394cad121811a4e462548127de02a9298
--- /dev/null
+++ b/cpu/native/vfs/native_vfs.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2016 Kaspar Schleiser <kaspar@schleiser.de>
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser General
+ * Public License v2.1. See the file LICENSE in the top level directory for
+ * more details.
+ */
+
+/**
+ * @ingroup     native_cpu
+ * @{
+ *
+ * @file
+ * @brief       VFS wrappers for POSIX file I/O functions
+ *
+ * @author      Kaspar Schleiser <kaspar@schleiser.de>
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "vfs.h"
+
+int open(const char *name, int flags, ...)
+{
+    unsigned mode = 0;
+
+    if ((flags & O_CREAT)) {
+        va_list ap;
+        va_start(ap, flags);
+        mode = va_arg(ap, unsigned);
+        va_end(ap);
+    }
+
+    int fd = vfs_open(name, flags, mode);
+    if (fd < 0) {
+        /* vfs returns negative error codes */
+        errno = -fd;
+        return -1;
+    }
+    return fd;
+}
+
+ssize_t read(int fd, void *dest, size_t count)
+{
+    int res = vfs_read(fd, dest, count);
+
+    if (res < 0) {
+        /* vfs returns negative error codes */
+        errno = -res;
+        return -1;
+    }
+    return res;
+}
+
+ssize_t write(int fd, const void *src, size_t count)
+{
+    int res = vfs_write(fd, src, count);
+
+    if (res < 0) {
+        /* vfs returns negative error codes */
+        errno = -res;
+        return -1;
+    }
+    return res;
+}
+
+int close(int fd)
+{
+    int res = vfs_close(fd);
+
+    if (res < 0) {
+        /* vfs returns negative error codes */
+        errno = -res;
+        return -1;
+    }
+    return res;
+}
+
+int fcntl(int fd, int cmd, ...)
+{
+    unsigned long arg;
+    va_list ap;
+    va_start(ap, cmd);
+    arg = va_arg(ap, unsigned long);
+    va_end(ap);
+
+    int res = vfs_fcntl(fd, cmd, arg);
+
+    if (res < 0) {
+        /* vfs returns negative error codes */
+        errno = -res;
+        return -1;
+    }
+    return res;
+}
+
+
+off_t lseek(int fd, off_t off, int whence)
+{
+    int res = vfs_lseek(fd, off, whence);
+
+    if (res < 0) {
+        /* vfs returns negative error codes */
+        errno = -res;
+        return -1;
+    }
+    return res;
+}
+
+int fstat(int fd, struct stat *buf)
+{
+    int res = vfs_fstat(fd, buf);
+
+    if (res < 0) {
+        /* vfs returns negative error codes */
+        errno = -res;
+        return -1;
+    }
+    return 0;
+}
+
+int stat(const char *name, struct stat *st)
+{
+    int res = vfs_stat(name, st);
+
+    if (res < 0) {
+        /* vfs returns negative error codes */
+        errno = -res;
+        return -1;
+    }
+    return 0;
+}
+
+int unlink(const char *path)
+{
+    int res = vfs_unlink(path);
+
+    if (res < 0) {
+        /* vfs returns negative error codes */
+        errno = -res;
+        return -1;
+    }
+    return 0;
+}
+
+/** @} */
diff --git a/tests/unittests/tests-vfs/tests-vfs-mount-constfs.c b/tests/unittests/tests-vfs/tests-vfs-mount-constfs.c
index 88a96b510d03515702e887e730ba2de4f8fdaa5f..ab18da5a74567ba7c146a93d66021e502aad1a7a 100644
--- a/tests/unittests/tests-vfs/tests-vfs-mount-constfs.c
+++ b/tests/unittests/tests-vfs/tests-vfs-mount-constfs.c
@@ -171,7 +171,7 @@ static void test_vfs_constfs_read_lseek(void)
     TEST_ASSERT_EQUAL_INT(0, res);
 }
 
-#if MODULE_NEWLIB
+#if MODULE_NEWLIB || defined(BOARD_NATIVE)
 static void test_vfs_constfs__posix(void)
 {
     int res;
@@ -210,7 +210,7 @@ Test *tests_vfs_mount_constfs_tests(void)
         new_TestFixture(test_vfs_umount__invalid_mount),
         new_TestFixture(test_vfs_constfs_open),
         new_TestFixture(test_vfs_constfs_read_lseek),
-#if MODULE_NEWLIB
+#if MODULE_NEWLIB || defined(BOARD_NATIVE)
         new_TestFixture(test_vfs_constfs__posix),
 #endif
     };