diff --git a/TODO b/TODO
index de087ab..90e59c0 100644
--- a/TODO
+++ b/TODO
@@ -5,3 +5,6 @@
 - Tests for outputters
 - Improve testing of yaml_fs, maybe with more realistic examples
 - Configurable file extension (.yaml/.yml, or support both)
+- Remove applications_hosts, or factor it out to the Ansible adapter, as it's
+  not really relevant to Salt or reclass in general. And remove 'groups' from
+  the inventory return.
diff --git a/reclass.py.in b/reclass.py.in
index 061aa60..19c0aa1 100644
--- a/reclass.py.in
+++ b/reclass.py.in
@@ -18,47 +18,28 @@
 from reclass.output import OutputLoader
 from reclass.storage import StorageBackendLoader
 import reclass.errors
-
-def get_options(config_file=None):
-    return reclass.config.get_options(__name__, __version__, __description__, config_file)
-
-def get_data(storage_type, nodes_uri, classes_uri, applications_postfix, node):
-    storage_class = StorageBackendLoader(storage_type).load()
-    storage = storage_class(nodes_uri, classes_uri, applications_postfix)
-    if node is False:
-        ret = storage.inventory()
-    else:
-        ret = storage.nodeinfo(node)
-        ret['RECLASS']['timestamp'] = time.strftime('%c')
-
-    return ret
-
-def output(data, fmt, pretty_print=False):
-    output_class = OutputLoader(fmt).load()
-    outputter = output_class()
-    return outputter.dump(data, pretty_print=pretty_print)
+from reclass import get_data, output
 
 def _error(msg, rc):
     print >>sys.stderr, msg
     sys.exit(rc)
 
-if __name__ == '__main__':
-    __name__ = __prog__
-    config_file = None
-    for d in (os.getcwd(), os.path.dirname(sys.argv[0])):
-        f = os.path.join(d, __name__ + '-config.yml')
-        if os.access(f, os.R_OK):
-            config_file = f
-            break
-    try:
-        options = get_options(config_file)
-        nodes_uri, classes_uri = reclass.config.path_mangler(options.inventory_base_uri,
-                                                             options.nodes_uri,
-                                                             options.classes_uri)
-        data = get_data(options.storage_type, nodes_uri, classes_uri,
-                        options.applications_postfix, options.node)
-        print output(data, options.output, options.pretty_print)
-        sys.exit(posix.EX_OK)
+config_file = None
+for d in (os.getcwd(), os.path.dirname(sys.argv[0])):
+    f = os.path.join(d, __name__ + '-config.yml')
+    if os.access(f, os.R_OK):
+        config_file = f
+        break
+try:
+    options = reclass.config.get_options(__name__, __version__,
+                                         __description__, config_file)
+    nodes_uri, classes_uri = reclass.config.path_mangler(options.inventory_base_uri,
+                                                            options.nodes_uri,
+                                                            options.classes_uri)
+    data = get_data(options.storage_type, nodes_uri, classes_uri,
+                    options.applications_postfix, options.node)
+    print output(data, options.output, options.pretty_print)
+    sys.exit(posix.EX_OK)
 
-    except reclass.errors.ReclassException, e:
-        _error(e.message, e.rc)
+except reclass.errors.ReclassException, e:
+    _error(e.message, e.rc)
diff --git a/reclass/__init__.py b/reclass/__init__.py
index 162e1e8..63492e6 100644
--- a/reclass/__init__.py
+++ b/reclass/__init__.py
@@ -10,9 +10,6 @@
 from output import OutputLoader
 from storage import StorageBackendLoader
 
-def get_options(config_file=None):
-    return config.get_options(__name__, __version__, __description__, config_file)
-
 def get_data(storage_type, nodes_uri, classes_uri, applications_postfix, node):
     storage_class = StorageBackendLoader(storage_type).load()
     storage = storage_class(nodes_uri, classes_uri, applications_postfix)
diff --git a/reclass/adapters/ansible.py b/reclass/adapters/ansible.py
index 0fd1c85..3820d2f 100644
--- a/reclass/adapters/ansible.py
+++ b/reclass/adapters/ansible.py
@@ -78,6 +78,10 @@
                 data['parameters']['RECLASS'][i] = data[i]
             data = data['parameters']
 
+        else:
+            # Ansible inventory is only the list of groups
+            data = data['groups']
+
         print output(data, options['output'], options['pretty_print'])
 
     except ReclassException, e:
diff --git a/reclass/storage/__init__.py b/reclass/storage/__init__.py
index ad509bd..2b845d2 100644
--- a/reclass/storage/__init__.py
+++ b/reclass/storage/__init__.py
@@ -39,10 +39,17 @@
         raise NotImplementedError, "Storage class does not implement inventory listing"
 
     def inventory(self):
-        entity, applications, classes = self._list_inventory()
-        ret = classes
-        ret.update([(k + self._applications_postfix,v) for k,v in applications.iteritems()])
-        return ret
+        entities, applications, classes = self._list_inventory()
+        groups = classes.copy()
+        groups.update([(k + self._applications_postfix,v) for k,v in applications.iteritems()])
+        return {'RECLASS' : {'timestamp': _get_timestamp(),
+                             'application_postfix': self._applications_postfix},
+                'nodes': entities,
+                'classes': classes,
+                'applications': applications,
+                'groups': groups
+               }
+
 
 class StorageBackendLoader(object):
 
