diff --git a/classes/obmc-phosphor-dbus-service.bbclass b/classes/obmc-phosphor-dbus-service.bbclass
index ebe87af..029d260 100644
--- a/classes/obmc-phosphor-dbus-service.bbclass
+++ b/classes/obmc-phosphor-dbus-service.bbclass
@@ -3,9 +3,9 @@
 #  DBUS_PACKAGES ?= "${PN}"
 #    The list of packages to which files should be added.
 #
-#  DBUS_SERVICE_${PN} += "org.openbmc.Foo"
+#  DBUS_SERVICE_${PN} += "org.openbmc.Foo.service"
 #    A list of dbus service names.  The class will look for a
-#    dbus configuration file with the same name with .conf
+#    dbus configuration file with the same base name with .conf
 #    appended.  If one is found, it is added to the package
 #    and used verbatim.  If it is not found, a default one
 #    (with very open permissions) is generated and used.
@@ -13,18 +13,11 @@
 #    Additionally the class will instantiate obmc-phosphor-systemd
 #    with any SYSTEMD_SERVICE_%s variables translated appropriately.
 #
-#  DBUS_ACTIVATED_SERVICE_${PN} += "org.openbmc.Foo"
-#    A list of services that should have dbus activation configured.
-#    Services that appear here need not be in DBUS_SERVICE_%s.
-#    If used, the search pattern for the systemd unit file is
-#    changed to be dbus-%s.service.  The class will look for a
-#    dbus activation file with the same name with .service appended.
-#    If one is found, it added to the package and used verbatim.
-#    If it is not found, a default one is generated and used.
-#
-#  DBUS_USER_${PN} = "dbususer"
-#  DBUS_USER_${unit} = "dbususer"
-#    The user a service/pkg should be configured to run as.
+#    If a service begins with 'dbus-' DBus activation will be
+#    configured.  The class will look for an activation file
+#    with the 'dbus-' prefix removed.  If found, it is added to
+#    the package and used verbatim.  If it is not found, a default
+#    one is generated and used.
 
 
 inherit dbus-dir
@@ -40,37 +33,49 @@
 
 
 python dbus_do_postinst() {
-    def make_default_dbus_config(d, service, user):
+    def make_default_dbus_config(d, unit, user):
+        bus = unit.base
+        if unit.is_template:
+            bus = '%s*' % bus
+
         path = d.getVar('D', True)
         path += d.getVar('dbus_system_confdir', True)
-        with open('%s/%s.conf' % (path, service), 'w+') as fd:
+        with open('%s/%s.conf' % (path, unit.base), 'w+') as fd:
             fd.write('<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"\n')
             fd.write('        "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">\n')
             fd.write('<busconfig>\n')
             fd.write('        <policy user="%s">\n' % user)
-            fd.write('                <allow own="%s"/>\n' % service)
-            fd.write('                <allow send_destination="%s"/>\n' % service)
+            fd.write('                <allow own="%s"/>\n' % bus)
+            fd.write('                <allow send_destination="%s"/>\n' % bus)
             fd.write('        </policy>\n')
             fd.write('</busconfig>\n')
             fd.close()
 
 
-    def make_default_dbus_activation(d, service, user):
+    def make_default_dbus_activation(d, unit, user):
+        dest = unit.base
+        sd_unit = unit.name
+        if unit.is_instance:
+            dest = '%s.%s' % (unit.base, unit.instance)
+            sd_unit = '%s@%s' % (unit.base, unit.instance)
+
         path = d.getVar('D', True)
         path += d.getVar('dbus_system_servicesdir', True)
-        with open('%s/%s.service' % (path, service), 'w+') as fd:
+        with open('%s/%s.service' % (path, dest), 'w+') as fd:
             fd.write('[D-BUS Service]\n')
-            fd.write('Name=%s\n' % service)
+            fd.write('Name=%s\n' % dest)
             fd.write('Exec=/bin/false\n')
             fd.write('User=%s\n' % user)
-            fd.write('SystemdService=dbus-%s.service\n' % service)
+            fd.write('SystemdService=dbus-%s.service\n' % sd_unit)
             fd.close()
 
 
     for service_user in listvar_to_list(d, '_DEFAULT_DBUS_CONFIGS'):
-        make_default_dbus_config(d, *service_user.split(':'))
+        service, user = service_user.split(':')
+        make_default_dbus_config(d, SystemdUnit(service), user)
     for service_user in listvar_to_list(d, '_DEFAULT_DBUS_ACTIVATIONS'):
-        make_default_dbus_activation(d, *service_user.split(':'))
+        service, user = service_user.split(':')
+        make_default_dbus_activation(d, SystemdUnit(service), user)
 }
 
 
@@ -79,77 +84,69 @@
 
     def get_user(d, service, pkg):
         user = d.getVar(
-            'DBUS_USER_%s' % service, True)
+            'SYSTEMD_USER_%s' % service, True)
         if user is None:
             user = d.getVar(
-                'DBUS_USER_%s' % pkg, True) or 'root'
+                'SYSTEMD_USER_%s' % pkg, True) or 'root'
         return user
 
 
-    def add_dbus_config(d, service, pkg):
-        path = bb.utils.which(searchpaths, '%s.conf' % service)
+    def add_dbus_config(d, unit, pkg):
+        path = bb.utils.which(searchpaths, '%s.conf' % unit.base)
         if not os.path.isfile(path):
-            user = get_user(d, service, pkg)
+            user = get_user(d, unit.name, pkg)
             set_append(d, '_DEFAULT_DBUS_CONFIGS', '%s:%s' % (
-                service, user))
+                unit.name, user))
         else:
-            set_append(d, 'SRC_URI', 'file://%s.conf' % service)
-            set_append(d, '_INSTALL_DBUS_CONFIGS', '%s.conf' % service)
+            set_append(d, 'SRC_URI', 'file://%s.conf' % unit.base)
+            set_append(d, '_INSTALL_DBUS_CONFIGS', '%s.conf' % unit.base)
         set_append(d, 'FILES_%s' % pkg, '%s%s.conf' \
-            % (d.getVar('dbus_system_confdir', True), service))
+            % (d.getVar('dbus_system_confdir', True), unit.base))
 
 
-    def add_sd_unit(d, prefix, service, pkg):
-        set_append(
-            d, 'SYSTEMD_SERVICE_%s' % pkg, '%s%s.service' % (
-                prefix, service))
-        set_append(d, 'SYSTEMD_SUBSTITUTIONS',
-            'BUSNAME:%s:%s%s.service' % (service, prefix, service))
+    def add_dbus_activation(d, unit, pkg):
+        if not unit.is_activated or unit.is_template:
+            return
+        search_match = '%s.service' % unit.base
+        if unit.is_instance:
+            search_match = '%s.%s.service' % (unit.base, unit.instance)
 
+        path = bb.utils.which(searchpaths, search_match)
 
-    def add_sd_user(d, prefix, service, pkg):
-        var = None
-        user = d.getVar(
-            'DBUS_USER_%s' % service, True)
-        if user:
-            var = 'SYSTEMD_USER_%s%s.service' % (prefix, service)
-        else:
-            user = d.getVar(
-                'DBUS_USER_%s' % pkg, True)
-            if user:
-                var = 'SYSTEMD_USER_%s' % pkg
-
-        if var and user not in listvar_to_list(d, var):
-            set_append(d, var, user)
-
-
-    def add_dbus_activation(d, service, pkg):
-        path = bb.utils.which(searchpaths, '%s.service' % service)
         if not os.path.isfile(path):
-            user = get_user(d, service, pkg)
+            user = get_user(d, unit.base, pkg)
             set_append(d, '_DEFAULT_DBUS_ACTIVATIONS', '%s:%s' % (
-                service, user))
+                unit.name, user))
         else:
-            set_append(d, 'SRC_URI', 'file://%s.service' % service)
-            set_append(d, '_INSTALL_DBUS_ACTIVATIONS', '%s.service' % service)
-        set_append(d, 'FILES_%s' % pkg, '%s%s.service' \
-            % (d.getVar('dbus_system_servicesdir', True), service))
+            set_append(d, 'SRC_URI', 'file://%s' % search_match)
+            set_append(d, '_INSTALL_DBUS_ACTIVATIONS', search_match)
+        set_append(d, 'FILES_%s' % pkg, '%s%s' \
+            % (d.getVar('dbus_system_servicesdir', True), search_match))
 
 
     for pkg in listvar_to_list(d, 'DBUS_PACKAGES'):
         if pkg not in (d.getVar('SYSTEMD_PACKAGES', True) or ''):
             set_append(d, 'SYSTEMD_PACKAGES', pkg)
 
-        services = listvar_to_list(d, 'DBUS_SERVICE_%s' % pkg)
-        auto = listvar_to_list(d, 'DBUS_ACTIVATED_SERVICE_%s' % pkg)
+        svc = listvar_to_list(d, 'DBUS_SERVICE_%s' % pkg)
+        svc = [SystemdUnit(x) for x in svc]
+        inst = [x for x in svc if x.is_instance]
+        tmpl = [x.template for x in svc if x.is_instance]
+        tmpl = list(set(tmpl))
+        tmpl = [SystemdUnit(x) for x in tmpl]
+        svc = [x for x in svc if not x.is_instance]
 
-        for service in set(services).union(auto):
-            prefix = 'dbus-' if service in auto else ''
-            add_dbus_config(d, service, pkg)
-            add_sd_unit(d, prefix, service, pkg)
-            add_sd_user(d, prefix, service, pkg)
-            if prefix:
-                add_dbus_activation(d, service, pkg)
+        for unit in inst:
+            set_append(
+                d, 'SYSTEMD_SERVICE_%s' % pkg, unit.name)
+
+        for unit in tmpl + svc:
+            add_dbus_config(d, unit, pkg)
+            add_dbus_activation(d, unit, pkg)
+            set_append(
+                d, 'SYSTEMD_SERVICE_%s' % pkg, unit.name)
+            set_append(d, 'SYSTEMD_SUBSTITUTIONS',
+                'BUSNAME:%s:%s' % (unit.base, unit.name))
 }
 
 
