diff --git a/src/pdmgen.py b/src/pdmgen.py
index fcda960..61546eb 100755
--- a/src/pdmgen.py
+++ b/src/pdmgen.py
@@ -22,6 +22,7 @@
 from argparse import ArgumentParser
 from sdbusplus.renderer import Renderer
 from sdbusplus.namedelement import NamedElement
+import sdbusplus.property
 
 
 class InvalidConfigError(BaseException):
@@ -159,6 +160,54 @@
         super(Path, self).setup(objs)
 
 
+class Property(ConfigEntry):
+    '''Property/interface/metadata association.'''
+
+    def __init__(self, *a, **kw):
+        super(Property, self).__init__(**kw)
+
+    def factory(self, objs):
+        '''Create interface, property name and metadata elements.'''
+
+        args = {
+            'class': 'interface',
+            'interface': 'element',
+            'name': self.name['interface']
+        }
+        add_unique(ConfigEntry(
+            configfile=self.configfile, **args), objs)
+
+        args = {
+            'class': 'propertyname',
+            'propertyname': 'element',
+            'name': self.name['property']
+        }
+        add_unique(ConfigEntry(
+            configfile=self.configfile, **args), objs)
+
+        args = {
+            'class': 'meta',
+            'meta': 'element',
+            'name': self.name['meta']
+        }
+        add_unique(ConfigEntry(
+            configfile=self.configfile, **args), objs)
+
+        super(Property, self).factory(objs)
+
+    def setup(self, objs):
+        '''Resolve interface, property and metadata to indicies.'''
+
+        self.interface = get_index(
+            objs, 'interface', self.name['interface'])
+        self.prop = get_index(
+            objs, 'propertyname', self.name['property'])
+        self.meta = get_index(
+            objs, 'meta', self.name['meta'])
+
+        super(Property, self).setup(objs)
+
+
 class Group(ConfigEntry):
     '''Pop the members keyword for groups.'''
 
@@ -215,6 +264,36 @@
         super(GroupOfPaths, self).setup(objs)
 
 
+class GroupOfProperties(ImplicitGroup):
+    '''Property group config file directive.'''
+
+    def __init__(self, *a, **kw):
+        self.datatype = sdbusplus.property.Property(
+            name=kw.get('name'),
+            type=kw.pop('type')).cppTypeName
+
+        super(GroupOfProperties, self).__init__(**kw)
+
+    def setup(self, objs):
+        '''Resolve group members.'''
+
+        def map_member(x):
+            iface = get_index(
+                objs, 'interface', x['interface'])
+            prop = get_index(
+                objs, 'propertyname', x['property'])
+            meta = get_index(
+                objs, 'meta', x['meta'])
+
+            return (iface, prop, meta)
+
+        self.members = map(
+            map_member,
+            self.members)
+
+        super(GroupOfProperties, self).setup(objs)
+
+
 class Everything(Renderer):
     '''Parse/render entry point.'''
 
@@ -230,6 +309,12 @@
             'pathgroup': {
                 'path': GroupOfPaths,
             },
+            'propertygroup': {
+                'property': GroupOfProperties,
+            },
+            'property': {
+                'element': Property,
+            },
         }
 
         if cls not in class_map:
@@ -312,6 +397,10 @@
         self.paths = kw.pop('pathname', [])
         self.meta = kw.pop('meta', [])
         self.pathgroups = kw.pop('pathgroup', [])
+        self.interfaces = kw.pop('interface', [])
+        self.properties = kw.pop('property', [])
+        self.propertynames = kw.pop('propertyname', [])
+        self.propertygroups = kw.pop('propertygroup', [])
 
         super(Everything, self).__init__(**kw)
 
@@ -323,9 +412,13 @@
                     loader,
                     args.template,
                     meta=self.meta,
+                    properties=self.properties,
+                    propertynames=self.propertynames,
+                    interfaces=self.interfaces,
                     paths=self.paths,
                     pathmeta=self.pathmeta,
                     pathgroups=self.pathgroups,
+                    propertygroups=self.propertygroups,
                     indent=Indent()))
 
 if __name__ == '__main__':
