diff --git a/gen-fan-detect-defs.py b/gen-fan-detect-defs.py
index 1b95193..4fd0d4a 100755
--- a/gen-fan-detect-defs.py
+++ b/gen-fan-detect-defs.py
@@ -10,7 +10,31 @@
 import sys
 import yaml
 from argparse import ArgumentParser
-# TODO Convert to using a mako template
+from mako.template import Template
+
+tmpl = '''/* This is a generated file. */
+#include "fan_detect_defs.hpp"
+
+const std::map<std::string, std::set<phosphor::fan::Properties>>
+fanDetectMap = {
+%for methods in presence:
+    %for method in methods:
+    <% m = method.lower() %> \
+    {"${m}", {
+        %for fan in methods[method]:
+            std::make_tuple("${fan['Inventory']}",
+                            "${fan['Description']}",
+                            std::vector<std::string>{
+            %for s in fan['Sensors']:
+                                                    "${s}",
+            %endfor
+                                                    }),
+        %endfor
+    %endfor
+    }},
+%endfor
+};
+'''
 
 
 def get_filename():
@@ -23,103 +47,6 @@
     return header_file
 
 
-def create_and_add_header(header_file):
-    """
-    Creates the header file based on the header filename value given within.
-    The associated fan presence detection application includes this header.
-
-    Parameter descriptions:
-    header_file           Header filename to create
-    """
-    with open(header_file, 'w') as ofile:
-        ofile.write("/* WARNING: This header contains code generated ")
-        ofile.write("by " + __file__ + " */\n")
-        ofile.write("/* !!! DO NOT EDIT THIS FILE BY HAND !!! */\n")
-        ofile.write("#include \"fan_detect_defs.hpp\"\n\n")
-        ofile.write("const std::map<std::string, ")
-        ofile.write("std::set<phosphor::fan::Properties>>")
-        ofile.write("\nfanDetectMap = {\n")
-
-
-def add_detect(header_fd, dmethod):
-    """
-    Adds the detection method map entry for listing the fan(s) that should be
-    detected using the supported method.
-
-    Parameter descriptions:
-    header_fd           Header file to add the detection method to
-    dmethod             The detection method to be added
-    """
-    header_fd.write("    {\"" + dmethod + "\",{\n")
-
-
-def add_fan(header_fd, fan_info):
-    """
-    Adds each fan's yaml entry presence detection information to the
-    corresponding header file for the defined detection method
-
-    Parameter descriptions:
-    header_fd           Header file to add fan information to
-    fan_info            Fan presence detection information
-    """
-    tab = ' ' * 4
-    header_fd.write(tab * 2 + "std::make_tuple(\"" +
-                    fan_info['Inventory'] + "\",\n")
-    header_fd.write(tab * 6 + "\"" +fan_info['Description'] + "\",\n")
-    header_fd.write(tab * 6 + "std::vector<std::string>({")
-    for sensors in fan_info['Sensors']:
-        if sensors != fan_info['Sensors'][-1]:
-            header_fd.write("\"" + sensors + "\",")
-        else:
-            header_fd.write("\"" + sensors + "\"})),\n")
-
-
-def close_detect(header_fd):
-    """
-    Closes the current detection method map entry.
-
-    Parameter descriptions:
-    header_fd           Header file to add detection method closing to
-    """
-    header_fd.write("    }},\n")
-
-
-def add_closing(header_fd):
-    """
-    Appends final closing tags to the header file given. This essentially
-    ends writing to the header file generated.
-
-    Parameter descriptions:
-    header_fd           Header file to add closing tags to
-    """
-    header_fd.write("};\n")
-
-
-def parse_yaml(yaml_file):
-    """
-    Parse the given yaml file, creating a header file for each 'Detection'
-    types found to be included within the app supporting presence detection
-    by that type.
-
-    Parameter descriptions:
-    yaml_file           File to be parsed for fan presences definitions
-    """
-    with open(yaml_file, 'r') as input_file:
-        yaml_input = yaml.safe_load(input_file)
-        header_file = get_filename()
-        create_and_add_header(header_file)
-        header_fd = open(header_file, 'a')
-        if yaml_input:
-            for detect in yaml_input:
-                for dmethod in detect:
-                    add_detect(header_fd, dmethod.replace(" ", "-").lower())
-                    for fan in detect[dmethod]:
-                        add_fan(header_fd, fan)
-                    close_detect(header_fd)
-        add_closing(header_fd)
-        header_fd.close()
-
-
 if __name__ == '__main__':
     parser = ArgumentParser()
     # Input yaml containing how each fan's presence detection should be done
@@ -136,4 +63,10 @@
         print "Unable to find input yaml file " + yaml_file
         exit(1)
 
-    parse_yaml(yaml_file)
+    with open(yaml_file, 'r') as yaml_input:
+        presence_data = yaml.safe_load(yaml_input) or {}
+
+    output_file = get_filename()
+
+    with open(output_file, 'w') as out:
+        out.write(Template(tmpl).render(presence=presence_data))
