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))
