diff --git a/control/gen-fan-zone-defs.py b/control/gen-fan-zone-defs.py
index 43d98bc..644ce54 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -10,238 +10,7 @@
 import yaml
 from argparse import ArgumentParser
 from mako.template import Template
-
-tmpl = '''\
-<%!
-def indent(str, depth):
-    return ''.join(4*' '*depth+line for line in str.splitlines(True))
-%>\
-<%def name="genHandler(sig)" buffered="True">
-%if ('type' in sig['sparams']) and \
-    (sig['sparams']['type'] is not None):
-${sig['signal']}<${sig['sparams']['type']}>(
-%else:
-${sig['signal']}(
-%endif
-%for spk in sig['sparams']['params']:
-${sig['sparams'][spk]},
-%endfor
-%if ('type' in sig['hparams']) and \
-    (sig['hparams']['type'] is not None):
-handler::${sig['handler']}<${sig['hparams']['type']}>(
-%else:
-handler::${sig['handler']}(
-%endif
-%for i, hpk in enumerate(sig['hparams']['params']):
-    %if (i+1) != len(sig['hparams']['params']):
-    ${sig['hparams'][hpk]},
-    %else:
-    ${sig['hparams'][hpk]}
-    %endif
-%endfor
-))
-</%def>\
-<%def name="genSSE(event)" buffered="True">
-Group{
-%for group in event['groups']:
-%for member in group['members']:
-{
-    "${member['object']}",
-    {"${member['interface']}",
-     "${member['property']}"}
-},
-%endfor
-%endfor
-},
-std::vector<Action>{
-%for a in event['action']:
-%if len(a['parameters']) != 0:
-make_action(action::${a['name']}(
-%else:
-make_action(action::${a['name']}
-%endif
-%for i, p in enumerate(a['parameters']):
-%if (i+1) != len(a['parameters']):
-    ${p},
-%else:
-    ${p})
-%endif
-%endfor
-),
-%endfor
-},
-Timer{
-    ${event['timer']['interval']},
-    ${event['timer']['type']}
-},
-std::vector<Signal>{
-%for s in event['signals']:
-    Signal{
-        match::${s['match']}(
-        %for i, mp in enumerate(s['mparams']):
-        %if (i+1) != len(s['mparams']):
-        "${mp}",
-        %else:
-        "${mp}"
-        %endif
-        %endfor
-        ),
-        make_handler(\
-        ${indent(genHandler(sig=s), 3)}\
-        )
-    },
-%endfor
-}
-</%def>\
-/* This is a generated file. */
-#include "manager.hpp"
-#include "functor.hpp"
-#include "actions.hpp"
-#include "handlers.hpp"
-#include "preconditions.hpp"
-#include "matches.hpp"
-
-using namespace phosphor::fan::control;
-
-const unsigned int Manager::_powerOnDelay{${mgr_data['power_on_delay']}};
-
-const std::vector<ZoneGroup> Manager::_zoneLayouts
-{
-%for zone_group in zones:
-    ZoneGroup{
-        std::vector<Condition>{
-        %for condition in zone_group['conditions']:
-            Condition{
-                "${condition['type']}",
-                std::vector<ConditionProperty>{
-                %for property in condition['properties']:
-                    ConditionProperty{
-                        "${property['property']}",
-                        "${property['interface']}",
-                        "${property['path']}",
-                        static_cast<${property['type']}>(${property['value']}),
-                    },
-                    %endfor
-                },
-            },
-            %endfor
-        },
-        std::vector<ZoneDefinition>{
-        %for zone in zone_group['zones']:
-            ZoneDefinition{
-                ${zone['num']},
-                ${zone['full_speed']},
-                ${zone['default_floor']},
-                ${zone['increase_delay']},
-                ${zone['decrease_interval']},
-                std::vector<FanDefinition>{
-                %for fan in zone['fans']:
-                    FanDefinition{
-                        "${fan['name']}",
-                        std::vector<std::string>{
-                        %for sensor in fan['sensors']:
-                            "${sensor}",
-                        %endfor
-                        },
-                        "${fan['target_interface']}"
-                    },
-                %endfor
-                },
-                std::vector<SetSpeedEvent>{
-                %for event in zone['events']:
-                    %if ('pc' in event) and \
-                        (event['pc'] is not None):
-                    SetSpeedEvent{
-                        Group{
-                        %for group in event['pc']['pcgrps']:
-                        %for member in group['members']:
-                        {
-                            "${member['object']}",
-                            {"${member['interface']}",
-                             "${member['property']}"}
-                        },
-                        %endfor
-                        %endfor
-                        },
-                        std::vector<Action>{
-                        %for i, a in enumerate(event['pc']['pcact']):
-                        %if len(a['params']) != 0:
-                        make_action(
-                            precondition::${a['name']}(
-                        %else:
-                        make_action(
-                            precondition::${a['name']}
-                        %endif
-                        %for p in a['params']:
-                        ${p['type']}${p['open']}
-                        %for j, v in enumerate(p['values']):
-                        %if (j+1) != len(p['values']):
-                            ${v['value']},
-                        %else:
-                            ${v['value']}
-                        %endif
-                        %endfor
-                        ${p['close']},
-                        %endfor
-                        %if (i+1) != len(event['pc']['pcact']):
-                        %if len(a['params']) != 0:
-                        )),
-                        %else:
-                        ),
-                        %endif
-                        %endif
-                        %endfor
-                    std::vector<SetSpeedEvent>{
-                    %for pcevt in event['pc']['pcevts']:
-                    SetSpeedEvent{\
-                    ${indent(genSSE(event=pcevt), 6)}\
-                    },
-                    %endfor
-                    %else:
-                    SetSpeedEvent{\
-                    ${indent(genSSE(event=event), 6)}
-                    %endif
-                    %if ('pc' in event) and (event['pc'] is not None):
-                    }
-                        %if len(event['pc']['pcact'][-1]['params']) != 0:
-                        )),
-                        %else:
-                        ),
-                        %endif
-                        },
-                        Timer{
-                            ${event['pc']['pctime']['interval']},
-                            ${event['pc']['pctime']['type']}
-                        },
-                        std::vector<Signal>{
-                        %for s in event['pc']['pcsigs']:
-                            Signal{
-                                match::${s['match']}(
-                                %for i, mp in enumerate(s['mparams']):
-                                %if (i+1) != len(s['mparams']):
-                                "${mp}",
-                                %else:
-                                "${mp}"
-                                %endif
-                                %endfor
-                                ),
-                                make_handler(\
-                                ${indent(genHandler(sig=s), 9)}\
-                                )
-                            },
-                        %endfor
-                        }
-                    %endif
-                    },
-                %endfor
-                }
-            },
-        %endfor
-        }
-    },
-%endfor
-};
-'''
+from mako.lookup import TemplateLookup
 
 
 def convertToMap(listOfDict):
@@ -857,7 +626,18 @@
     if manager_config.get('power_on_delay') is None:
         manager_config['power_on_delay'] = 0
 
+    tmpls_dir = os.path.join(
+        os.path.dirname(os.path.realpath(__file__)),
+        "templates")
     output_file = os.path.join(args.output_dir, "fan_zone_defs.cpp")
+    if sys.version_info < (3, 0):
+        lkup = TemplateLookup(
+            directories=tmpls_dir.split(),
+            disable_unicode=True)
+    else:
+        lkup = TemplateLookup(
+            directories=tmpls_dir.split())
+    tmpl = lkup.get_template('fan_zone_defs.mako.cpp')
     with open(output_file, 'w') as output:
-        output.write(Template(tmpl).render(zones=zone_config,
-                     mgr_data=manager_config))
+        output.write(tmpl.render(zones=zone_config,
+                                 mgr_data=manager_config))
diff --git a/control/templates/defs.mako b/control/templates/defs.mako
new file mode 100644
index 0000000..0980f81
--- /dev/null
+++ b/control/templates/defs.mako
@@ -0,0 +1,83 @@
+<%!
+def indent(str, depth):
+    return ''.join(4*' '*depth+line for line in str.splitlines(True))
+%>\
+
+<%def name="genHandler(sig)" buffered="True">
+%if ('type' in sig['sparams']) and \
+    (sig['sparams']['type'] is not None):
+${sig['signal']}<${sig['sparams']['type']}>(
+%else:
+${sig['signal']}(
+%endif
+%for spk in sig['sparams']['params']:
+${sig['sparams'][spk]},
+%endfor
+%if ('type' in sig['hparams']) and \
+    (sig['hparams']['type'] is not None):
+handler::${sig['handler']}<${sig['hparams']['type']}>(
+%else:
+handler::${sig['handler']}(
+%endif
+%for i, hpk in enumerate(sig['hparams']['params']):
+    %if (i+1) != len(sig['hparams']['params']):
+    ${sig['hparams'][hpk]},
+    %else:
+    ${sig['hparams'][hpk]}
+    %endif
+%endfor
+))
+</%def>\
+
+<%def name="genSSE(event)" buffered="True">
+Group{
+%for group in event['groups']:
+%for member in group['members']:
+{
+    "${member['object']}",
+    {"${member['interface']}",
+     "${member['property']}"}
+},
+%endfor
+%endfor
+},
+std::vector<Action>{
+%for a in event['action']:
+%if len(a['parameters']) != 0:
+make_action(action::${a['name']}(
+%else:
+make_action(action::${a['name']}
+%endif
+%for i, p in enumerate(a['parameters']):
+%if (i+1) != len(a['parameters']):
+    ${p},
+%else:
+    ${p})
+%endif
+%endfor
+),
+%endfor
+},
+Timer{
+    ${event['timer']['interval']},
+    ${event['timer']['type']}
+},
+std::vector<Signal>{
+%for s in event['signals']:
+    Signal{
+        match::${s['match']}(
+        %for i, mp in enumerate(s['mparams']):
+        %if (i+1) != len(s['mparams']):
+        "${mp}",
+        %else:
+        "${mp}"
+        %endif
+        %endfor
+        ),
+        make_handler(\
+        ${indent(genHandler(sig=s), 3)}\
+        )
+    },
+%endfor
+}
+</%def>\
diff --git a/control/templates/fan_zone_defs.mako.cpp b/control/templates/fan_zone_defs.mako.cpp
new file mode 100644
index 0000000..e735e0d
--- /dev/null
+++ b/control/templates/fan_zone_defs.mako.cpp
@@ -0,0 +1,154 @@
+<%include file="defs.mako"/>\
+<%namespace file="defs.mako" import="*"/>\
+<%!
+def indent(str, depth):
+    return ''.join(4*' '*depth+line for line in str.splitlines(True))
+%>\
+/* This is a generated file. */
+#include "manager.hpp"
+#include "functor.hpp"
+#include "actions.hpp"
+#include "handlers.hpp"
+#include "preconditions.hpp"
+#include "matches.hpp"
+
+using namespace phosphor::fan::control;
+
+const unsigned int Manager::_powerOnDelay{${mgr_data['power_on_delay']}};
+
+const std::vector<ZoneGroup> Manager::_zoneLayouts
+{
+%for zone_group in zones:
+    ZoneGroup{
+        std::vector<Condition>{
+        %for condition in zone_group['conditions']:
+            Condition{
+                "${condition['type']}",
+                std::vector<ConditionProperty>{
+                %for property in condition['properties']:
+                    ConditionProperty{
+                        "${property['property']}",
+                        "${property['interface']}",
+                        "${property['path']}",
+                        static_cast<${property['type']}>(${property['value']}),
+                    },
+                    %endfor
+                },
+            },
+            %endfor
+        },
+        std::vector<ZoneDefinition>{
+        %for zone in zone_group['zones']:
+            ZoneDefinition{
+                ${zone['num']},
+                ${zone['full_speed']},
+                ${zone['default_floor']},
+                ${zone['increase_delay']},
+                ${zone['decrease_interval']},
+                std::vector<FanDefinition>{
+                %for fan in zone['fans']:
+                    FanDefinition{
+                        "${fan['name']}",
+                        std::vector<std::string>{
+                        %for sensor in fan['sensors']:
+                            "${sensor}",
+                        %endfor
+                        },
+                        "${fan['target_interface']}"
+                    },
+                %endfor
+                },
+                std::vector<SetSpeedEvent>{
+                %for event in zone['events']:
+                    %if ('pc' in event) and \
+                        (event['pc'] is not None):
+                    SetSpeedEvent{
+                        Group{
+                        %for group in event['pc']['pcgrps']:
+                        %for member in group['members']:
+                        {
+                            "${member['object']}",
+                            {"${member['interface']}",
+                             "${member['property']}"}
+                        },
+                        %endfor
+                        %endfor
+                        },
+                        std::vector<Action>{
+                        %for i, a in enumerate(event['pc']['pcact']):
+                        %if len(a['params']) != 0:
+                        make_action(
+                            precondition::${a['name']}(
+                        %else:
+                        make_action(
+                            precondition::${a['name']}
+                        %endif
+                        %for p in a['params']:
+                        ${p['type']}${p['open']}
+                        %for j, v in enumerate(p['values']):
+                        %if (j+1) != len(p['values']):
+                            ${v['value']},
+                        %else:
+                            ${v['value']}
+                        %endif
+                        %endfor
+                        ${p['close']},
+                        %endfor
+                        %if (i+1) != len(event['pc']['pcact']):
+                        %if len(a['params']) != 0:
+                        )),
+                        %else:
+                        ),
+                        %endif
+                        %endif
+                        %endfor
+                    std::vector<SetSpeedEvent>{
+                    %for pcevt in event['pc']['pcevts']:
+                    SetSpeedEvent{\
+                    ${indent(genSSE(event=pcevt), 6)}\
+                    },
+                    %endfor
+                    %else:
+                    SetSpeedEvent{\
+                    ${indent(genSSE(event=event), 6)}
+                    %endif
+                    %if ('pc' in event) and (event['pc'] is not None):
+                    }
+                        %if len(event['pc']['pcact'][-1]['params']) != 0:
+                        )),
+                        %else:
+                        ),
+                        %endif
+                        },
+                        Timer{
+                            ${event['pc']['pctime']['interval']},
+                            ${event['pc']['pctime']['type']}
+                        },
+                        std::vector<Signal>{
+                        %for s in event['pc']['pcsigs']:
+                            Signal{
+                                match::${s['match']}(
+                                %for i, mp in enumerate(s['mparams']):
+                                %if (i+1) != len(s['mparams']):
+                                "${mp}",
+                                %else:
+                                "${mp}"
+                                %endif
+                                %endfor
+                                ),
+                                make_handler(\
+                                ${indent(genHandler(sig=s), 9)}\
+                                )
+                            },
+                        %endfor
+                        }
+                    %endif
+                    },
+                %endfor
+                }
+            },
+        %endfor
+        }
+    },
+%endfor
+};
