diff --git a/generated.mako.cpp b/generated.mako.cpp
index 8534674..a024d19 100644
--- a/generated.mako.cpp
+++ b/generated.mako.cpp
@@ -1,16 +1,10 @@
 ## This file is a template.  The comment below is emitted
 ## into the rendered file; feel free to edit this file.
 // This file was auto generated.  Do not edit.
-<%
-    def interface_type(interface):
-        lst = interface.split('.')
-        lst.insert(-1, 'server')
-        return '::'.join(lst)
-%>
 #include "manager.hpp"
 #include "utils.hpp"
 % for i in interfaces:
-#include <${'/'.join(i.split('.') + ['server.hpp'])}>
+#include <${i.header()}>
 % endfor
 
 namespace phosphor
@@ -23,10 +17,10 @@
 const Manager::Makers Manager::_makers{
 % for i in interfaces:
     {
-        "${i}",
+        "${str(i)}",
         details::MakeInterface<
             details::ServerObject<
-                sdbusplus::${interface_type(i)}>>::make,
+                ${i.namespace()}>>::make,
     },
 % endfor
 };
@@ -34,47 +28,71 @@
 const Manager::Events Manager::_events{
 % for e in events:
     {
-    % if e.get('description'):
-        // ${e['description']}
+    % if e.description:
+        // ${e.description.strip()}
     % endif
         std::make_tuple(
-            std::vector<details::EventBasePtr>({
-                std::make_shared<details::DbusSignal>(
-        % for i, s in enumerate(e['signature'].items()):
-            % if i + 1 == len(e['signature']):
-            ${'"{0}=\'{1}\'"'.format(*s)},
+            std::vector<details::EventBasePtr>(
+                {
+    % if e.cls == 'match':
+                    std::make_shared<details::DbusSignal>(
+        % for i, s in enumerate(e.signatures[0].sig.items()):
+            % if i == 0:
+                        ${'"{0}=\'{1}\',"'.format(*s)}
+            % elif i + 1 == len(e.signatures[0].sig):
+                            ${'"{0}=\'{1}\'"'.format(*s)},
             % else:
-            ${'"{0}=\'{1}\',"'.format(*s)}
+                            ${'"{0}=\'{1}\',"'.format(*s)}
             % endif
         % endfor
-            % if e['filter'].get('args'):
-                details::make_filter(filters::${e['filter']['type']}(
-                % for i, a in enumerate(e['filter']['args']):
-                    % if i + 1 == len(e['filter']['args']):
-                "${a['value']}")))}),
+        % if e.filters[0].pointer:
+                        details::make_filter(${e.filters[0].bare_method()})),
+        % else:
+            % if e.filters[0].args:
+                        details::make_filter(
+                            ${e.filters[0].bare_method()}(
+                % for i, arg in enumerate(e.filters[0].args):
+                    % if i + 1 != len(e.filters[0].args):
+                                ${arg.cppArg()},
                     % else:
-                "${a['value']}",
+                                ${arg.cppArg()}))),
                     % endif
                 % endfor
             % else:
-                details::make_filter(filters::${e['filter']['type']}))}),
+                        details::make_filter(
+                            ${e.filters[0].bare_method()}()),
             % endif
-            % if e['action'].get('args'):
-            std::vector<details::ActionBasePtr>({details::make_action(actions::${e['action']['type']}(
-                % for i, a in enumerate(e['action']['args']):
-                    % if i + 1 == len(e['action']['args']):
-                "${a['value']}"))})
-                    % else:
-                "${a['value']}",
-                    % endif
-                % endfor
-            % else:
+        % endif
+    % endif
+                }
+            ),
             std::vector<details::ActionBasePtr>(
-                            {details::make_action(actions::${e['action']['type']})})
+                {
+    % for action in e.actions:
+        % if action.pointer:
+                    details::make_action(${action.bare_method()}),
+        % else:
+            % if action.args:
+                    details::make_action(
+                        ${action.bare_method()}(
+                % for i, arg in enumerate(action.args):
+                    % if i + 1 != len(action.args):
+                            ${arg.cppArg()},
+                    % else:
+                            ${arg.cppArg()})),
+                    % endif
+                % endfor
+            % else:
+                        details::make_action(
+                            ${action.bare_method()}()),
             % endif
-        ),
+        % endif
+    % endfor
+                }
+            )
+        )
     },
-% endfor
+%endfor
 };
 
 } // namespace manager
