diff --git a/storage/yaml_fs/__init__.py b/storage/yaml_fs/__init__.py
new file mode 100644
index 0000000..0eff9ed
--- /dev/null
+++ b/storage/yaml_fs/__init__.py
@@ -0,0 +1,59 @@
+#
+# -*- coding: utf-8 -*-
+#
+# This file is part of reclass (http://github.com/madduck/reclass)
+#
+# Copyright © 2007–13 martin f. krafft <madduck@madduck.net>
+# Released under the terms of the Artistic Licence 2.0
+#
+import os
+from storage import NodeStorageBase
+from yamlfile import YamlFile
+from directory import Directory
+
+FILE_EXTENSION = '.yml'
+
+class ExternalNodeStorage(NodeStorageBase):
+
+    def __init__(self, nodes_uri, classes_uri):
+        super(ExternalNodeStorage, self).__init__(nodes_uri, classes_uri)
+
+    def _read_nodeinfo(self, name, base_uri, seen):
+        path = os.path.join(base_uri, name + FILE_EXTENSION)
+        entity = YamlFile(path).entity
+        seen[name] = True
+        for klass in entity.classes:
+            if klass not in seen:
+                ret = self._read_nodeinfo(klass, self.classes_uri, seen)[0]
+                ret.merge(entity)
+                entity = ret
+        return entity, path
+
+    def _list_inventory(self):
+        d = Directory(self.nodes_uri)
+
+        entities = {}
+
+        def register_fn(dirpath, filenames):
+            for f in filter(lambda f: f.endswith(FILE_EXTENSION), filenames):
+                name = f[:-len(FILE_EXTENSION)]
+                nodeinfo = self.nodeinfo(name)
+                entities[name] = nodeinfo
+
+        d.walk(register_fn)
+
+        applications = {}
+        classes = {}
+        for f, nodeinfo in entities.iteritems():
+            for a in nodeinfo['applications']:
+                if a in applications:
+                    applications[a].append(f)
+                else:
+                    applications[a] = [f]
+            for c in nodeinfo['classes']:
+                if c in classes:
+                    classes[c].append(f)
+                else:
+                    classes[c] = [f]
+
+        return entities, applications, classes
diff --git a/storage/yaml_fs/directory.py b/storage/yaml_fs/directory.py
new file mode 100644
index 0000000..c085731
--- /dev/null
+++ b/storage/yaml_fs/directory.py
@@ -0,0 +1,53 @@
+#
+# -*- coding: utf-8 -*-
+#
+# This file is part of reclass (http://github.com/madduck/reclass)
+#
+# Copyright © 2007–13 martin f. krafft <madduck@madduck.net>
+# Released under the terms of the Artistic Licence 2.0
+#
+import os
+import sys
+
+SKIPDIRS = ( '.git' , '.svn' , 'CVS', 'SCCS', '.hg', '_darcs' )
+FILE_EXTENSION = '.yml'
+
+def vvv(msg):
+    #print >>sys.stderr, msg
+    pass
+
+class Directory(object):
+
+    def __init__(self, path, fileclass=None):
+        ''' Initialise a directory object '''
+        self._path = path
+        self._fileclass = fileclass
+        self._files = {}
+
+    def _register_files(self, dirpath, filenames):
+        for f in filter(lambda f: f.endswith(FILE_EXTENSION), filenames):
+            vvv('REGISTER {0}'.format(f))
+            f = os.path.join(dirpath, f)
+            ptr = None if not self._fileclass else self._fileclass(f)
+            self._files[f] = ptr
+
+    files = property(lambda self: self._files)
+
+    def walk(self, register_fn=None):
+        def _error(error):
+            raise Exception('{0}: {1} ({2})'.format(error.filename, error.strerror, error.errno))
+        if not callable(register_fn): register_fn = self._register_files
+        for dirpath, dirnames, filenames in os.walk(self._path,
+                                                      topdown=True,
+                                                      onerror=_error,
+                                                      followlinks=True):
+            vvv('RECURSE {0}, {1} files, {2} subdirectories'.format(
+                dirpath.replace(os.getcwd(), '.'), len(filenames), len(dirnames)))
+            for d in SKIPDIRS:
+                if d in dirnames:
+                    vvv('   SKIP subdirectory {0}'.format(d))
+                    dirnames.remove(d)
+            register_fn(dirpath, filenames)
+
+    def __repr__(self):
+        return '<{0} {1}>'.format(self.__class__.__name__, self._path)
diff --git a/storage/yaml_fs/tests/classes/basenode.yml b/storage/yaml_fs/tests/classes/basenode.yml
new file mode 100644
index 0000000..d9d997a
--- /dev/null
+++ b/storage/yaml_fs/tests/classes/basenode.yml
@@ -0,0 +1,5 @@
+applications:
+- motd
+- firewall
+parameters:
+  realm: madduck.net
diff --git a/storage/yaml_fs/tests/classes/debiannode.yml b/storage/yaml_fs/tests/classes/debiannode.yml
new file mode 100644
index 0000000..43e35e4
--- /dev/null
+++ b/storage/yaml_fs/tests/classes/debiannode.yml
@@ -0,0 +1,4 @@
+classes:
+- basenode
+applications:
+- apt
diff --git a/storage/yaml_fs/tests/classes/debiannode@sid.yml b/storage/yaml_fs/tests/classes/debiannode@sid.yml
new file mode 100644
index 0000000..806612a
--- /dev/null
+++ b/storage/yaml_fs/tests/classes/debiannode@sid.yml
@@ -0,0 +1,4 @@
+classes:
+- debiannode
+parameters:
+  debian_codename: sid
diff --git a/storage/yaml_fs/tests/classes/debiannode@squeeze.yml b/storage/yaml_fs/tests/classes/debiannode@squeeze.yml
new file mode 100644
index 0000000..08075b5
--- /dev/null
+++ b/storage/yaml_fs/tests/classes/debiannode@squeeze.yml
@@ -0,0 +1,4 @@
+classes:
+- debiannode
+parameters:
+  debian_codename: squeeze
diff --git a/storage/yaml_fs/tests/classes/debiannode@wheezy.yml b/storage/yaml_fs/tests/classes/debiannode@wheezy.yml
new file mode 100644
index 0000000..5ced15a
--- /dev/null
+++ b/storage/yaml_fs/tests/classes/debiannode@wheezy.yml
@@ -0,0 +1,4 @@
+classes:
+- debiannode
+parameters:
+  debian_codename: wheezy
diff --git a/storage/yaml_fs/tests/classes/hosted@munich.yml b/storage/yaml_fs/tests/classes/hosted@munich.yml
new file mode 100644
index 0000000..1d14dad
--- /dev/null
+++ b/storage/yaml_fs/tests/classes/hosted@munich.yml
@@ -0,0 +1,4 @@
+parameters:
+  location: munich
+  apt:
+    mirror_base: uni-erlangen
diff --git a/storage/yaml_fs/tests/classes/hosted@zurich.yml b/storage/yaml_fs/tests/classes/hosted@zurich.yml
new file mode 100644
index 0000000..050af27
--- /dev/null
+++ b/storage/yaml_fs/tests/classes/hosted@zurich.yml
@@ -0,0 +1,4 @@
+parameters:
+  location: zurich
+  apt:
+    mirror_base: switch
diff --git a/storage/yaml_fs/tests/classes/mailserver.yml b/storage/yaml_fs/tests/classes/mailserver.yml
new file mode 100644
index 0000000..37d6673
--- /dev/null
+++ b/storage/yaml_fs/tests/classes/mailserver.yml
@@ -0,0 +1,5 @@
+applications:
+- postfix
+parameters:
+  firewall:
+    openport: 25/tcp
diff --git a/storage/yaml_fs/tests/classes/subdir/subclass.yml b/storage/yaml_fs/tests/classes/subdir/subclass.yml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/storage/yaml_fs/tests/classes/subdir/subclass.yml
diff --git a/storage/yaml_fs/tests/classes/webserver.yml b/storage/yaml_fs/tests/classes/webserver.yml
new file mode 100644
index 0000000..5db36ff
--- /dev/null
+++ b/storage/yaml_fs/tests/classes/webserver.yml
@@ -0,0 +1,5 @@
+applications:
+- lighttpd
+parameters:
+  firewall:
+    openport: 80/tcp
diff --git a/storage/yaml_fs/tests/nodes/blue.yml b/storage/yaml_fs/tests/nodes/blue.yml
new file mode 100644
index 0000000..d7d06ee
--- /dev/null
+++ b/storage/yaml_fs/tests/nodes/blue.yml
@@ -0,0 +1,9 @@
+classes:
+- debiannode@squeeze
+- hosted@munich
+- mailserver
+- webserver
+parameters:
+  motd:
+    greeting: This node is $nodename
+  colour: blue
diff --git a/storage/yaml_fs/tests/nodes/green.yml b/storage/yaml_fs/tests/nodes/green.yml
new file mode 100644
index 0000000..1f3d6d6
--- /dev/null
+++ b/storage/yaml_fs/tests/nodes/green.yml
@@ -0,0 +1,10 @@
+classes:
+- debiannode@wheezy
+- hosted@zurich
+- mailserver
+applications:
+- ~firewall
+parameters:
+  motd:
+    greeting: This node is $nodename
+  colour: green
diff --git a/storage/yaml_fs/tests/nodes/red.yml b/storage/yaml_fs/tests/nodes/red.yml
new file mode 100644
index 0000000..5fe618d
--- /dev/null
+++ b/storage/yaml_fs/tests/nodes/red.yml
@@ -0,0 +1,8 @@
+classes:
+- debiannode@sid
+- hosted@zurich
+- webserver
+parameters:
+  motd:
+    greeting: This node is $nodename
+  colour: red
diff --git a/storage/yaml_fs/tests/test_directory.py b/storage/yaml_fs/tests/test_directory.py
new file mode 100644
index 0000000..4c2604a
--- /dev/null
+++ b/storage/yaml_fs/tests/test_directory.py
@@ -0,0 +1,30 @@
+#
+# -*- coding: utf-8 -*-
+#
+# This file is part of reclass (http://github.com/madduck/reclass)
+#
+# Copyright © 2007–13 martin f. krafft <madduck@madduck.net>
+# Released under the terms of the Artistic Licence 2.0
+#
+import storage.yaml_fs.directory as directory
+import os, sys
+
+TESTDIR = os.path.join(sys.path[0], 'classes')
+FILECOUNT = 10
+
+class TestDirectory:
+
+    def setUp(self):
+        self._dir = directory.Directory(TESTDIR)
+
+    def test_walk_registry(self):
+        def count_fn(d, f):
+            count_fn.c += len(f)
+        count_fn.c = 0
+        self._dir.walk(register_fn=count_fn)
+        assert count_fn.c == FILECOUNT
+
+    def test_walk(self):
+        self._dir.walk()
+        assert len(self._dir.files) == FILECOUNT
+
diff --git a/storage/yaml_fs/tests/test_yaml_fs.py b/storage/yaml_fs/tests/test_yaml_fs.py
new file mode 100644
index 0000000..d2cdf29
--- /dev/null
+++ b/storage/yaml_fs/tests/test_yaml_fs.py
@@ -0,0 +1,64 @@
+#
+# -*- coding: utf-8 -*-
+#
+# This file is part of reclass (http://github.com/madduck/reclass)
+#
+# Copyright © 2007–13 martin f. krafft <madduck@madduck.net>
+# Released under the terms of the Artistic Licence 2.0
+#
+from storage.yaml_fs import ExternalNodeStorage
+
+import os
+
+PWD = os.path.dirname(__file__)
+HOSTS = ['red', 'blue', 'green']
+MEMBERSHIPS = {'apt_hosts': HOSTS,
+               'motd_hosts': HOSTS,
+               'firewall_hosts': HOSTS[:2],
+               'lighttpd_hosts': HOSTS[:2],
+               'postfix_hosts': HOSTS[1:],
+               'basenode': HOSTS,
+               'debiannode': HOSTS,
+               'debiannode@sid': HOSTS[0:1],
+               'debiannode@wheezy': HOSTS[2:3],
+               'debiannode@squeeze': HOSTS[1:2],
+               'hosted@munich': HOSTS[1:2],
+               'hosted@zurich': [HOSTS[0], HOSTS[2]],
+               'mailserver': HOSTS[1:],
+               'webserver': HOSTS[:2]
+              }
+
+class TestYamlFs:
+
+    def setUp(self):
+        self._storage = ExternalNodeStorage(os.path.join(PWD, 'nodes'),
+                                            os.path.join(PWD, 'classes'))
+        self._inventory = self._storage.inventory()
+
+    def test_inventory_setup(self):
+        assert isinstance(self._inventory, dict)
+        assert len(self._inventory) == len(MEMBERSHIPS)
+        for i in MEMBERSHIPS.iterkeys():
+            assert i in self._inventory
+
+    def test_inventory_memberships(self):
+        for app, members in self._inventory.iteritems():
+            for i in MEMBERSHIPS[app]:
+                print i
+                assert i in members
+        for app, members in MEMBERSHIPS.iteritems():
+            for i in self._inventory[app]:
+                print i
+                assert i in members
+
+    def test_host_meta(self):
+        for n in HOSTS:
+            node = self._storage.nodeinfo(n)
+            assert 'RECLASS' in node
+
+    def test_host_entity(self):
+        for n in HOSTS:
+            node = self._storage.nodeinfo(n)
+            assert 'applications' in node
+            assert 'classes' in node
+            assert 'parameters' in node
diff --git a/storage/yaml_fs/tests/test_yamlfile.py b/storage/yaml_fs/tests/test_yamlfile.py
new file mode 100644
index 0000000..d8302f1
--- /dev/null
+++ b/storage/yaml_fs/tests/test_yamlfile.py
@@ -0,0 +1,28 @@
+#
+# -*- coding: utf-8 -*-
+#
+# This file is part of reclass (http://github.com/madduck/reclass)
+#
+# Copyright © 2007–13 martin f. krafft <madduck@madduck.net>
+# Released under the terms of the Artistic Licence 2.0
+#
+import storage.yaml_fs.yamlfile as yamlfile
+import os, sys
+
+TESTFILE = os.path.join(sys.path[0], 'nodes', 'blue.yml')
+
+class TestYamlFile:
+
+    def setUp(self):
+        self._file = yamlfile.YamlFile(TESTFILE)
+
+    def test_data(self):
+        e = self._file.entity
+        c = e.classes
+        assert len(c) == 4
+        assert hasattr(c, 'merge')
+        p = e.parameters
+        assert len(p) == 2
+        assert 'motd' in p
+        assert 'colour' in p
+        assert hasattr(p, 'merge')
diff --git a/storage/yaml_fs/yamlfile.py b/storage/yaml_fs/yamlfile.py
new file mode 100644
index 0000000..0d1175a
--- /dev/null
+++ b/storage/yaml_fs/yamlfile.py
@@ -0,0 +1,37 @@
+#
+# -*- coding: utf-8 -*-
+#
+# This file is part of reclass (http://github.com/madduck/reclass)
+#
+# Copyright © 2007–13 martin f. krafft <madduck@madduck.net>
+# Released under the terms of the Artistic Licence 2.0
+#
+import datatypes
+import yaml
+
+class YamlFile(object):
+
+    def __init__(self, path):
+        ''' Initialise a yamlfile object '''
+        self._path = path
+        self._data = dict()
+        self._read()
+
+    def _read(self):
+        fp = file(self._path)
+        self._data = yaml.safe_load(fp)
+        self._name = self._data.get('name', self._path)
+        fp.close()
+
+    name = property(lambda self: self._name)
+
+    def _get_entity(self):
+        classes = datatypes.Classes(self._data.get('classes', []))
+        parameters = datatypes.Parameters(self._data.get('parameters', {}))
+        applications = datatypes.Applications(self._data.get('applications', []))
+        return datatypes.Entity(classes, parameters, applications)
+    entity = property(lambda self: self._get_entity())
+
+    def __repr__(self):
+        return '<{0} {1}, {2}>'.format(self.__class__.__name__, self._name,
+                                       self._data.keys())
