diff --git a/tools/oem/ibm/gen_csv_results.py b/tools/oem/ibm/gen_csv_results.py
index 483a2c5..6236a97 100755
--- a/tools/oem/ibm/gen_csv_results.py
+++ b/tools/oem/ibm/gen_csv_results.py
@@ -1,25 +1,123 @@
-#!/usr/bin/python
+#!/usr/bin/env python
+
 r"""
-#############################################################
-#    @brief   Uses robot framework API to extract test result
-#             data from output.xml generated by robot tests.
-#             For more information on the Robot Framework API
-#             http://robot-framework.readthedocs.io/en/3.0
-#             /autodoc/robot.result.html
-#############################################################
+Use robot framework API to extract test result data from output.xml generated
+by robot tests. For more information on the Robot Framework API, see
+http://robot-framework.readthedocs.io/en/3.0/autodoc/robot.result.html
 """
-import sys
+
+import sys, os
 import getopt
 import csv
-from datetime import datetime
 import robot.errors
+import re
+from datetime import datetime
 from robot.api import ExecutionResult
 from robot.result.visitor import ResultVisitor
 from xml.etree import ElementTree
-import re
+
+# Remove the python library path to restore with local project path later.
+save_path_0 = sys.path[0]
+del sys.path[0]
+sys.path.append(os.path.join(os.path.dirname(__file__), "../../../lib"))
+
+from gen_arg import *
+from gen_print import *
+from gen_valid import *
+
+# Restore sys.path[0].
+sys.path.insert(0, save_path_0)
+
+parser = argparse.ArgumentParser(
+    usage='%(prog)s [OPTIONS]',
+    description="%(prog)s uses a robot framework API to extract test result\
+    data from output.xml generated by robot tests. For more information on the\
+    Robot Framework API, see\
+    http://robot-framework.readthedocs.io/en/3.0/autodoc/robot.result.html and\
+    https://gerrit.openbmc-project.xyz/#/c/8885/15/tools/oem/ibm/\
+    gen_csv_results.py",
+    formatter_class=argparse.ArgumentDefaultsHelpFormatter,
+    prefix_chars='-+')
+
+parser.add_argument(
+    '--source',
+    '-s',
+    help='The output.xml robot test result file path.')
+
+parser.add_argument(
+    '--dest',
+    '-d',
+    help='The directory path where the generated .csv files will go.')
+
+# Populate stock_list with options we want.
+stock_list = [("test_mode", 0), ("quiet", 0), ("debug", 0)]
+
+
+def exit_function(signal_number=0,
+                  frame=None):
+
+    r"""
+    Execute whenever the program ends normally or with the signals that we
+    catch (i.e. TERM, INT).
+    """
+
+    dprint_executing()
+
+    dprint_var(signal_number)
+
+    qprint_pgm_footer()
+
+
+def signal_handler(signal_number,
+                   frame):
+
+    r"""
+    Handle signals.  Without a function to catch a SIGTERM or SIGINT, the
+    program would terminate immediately with return code 143 and without
+    calling the exit_function.
+    """
+
+    # Our convention is to set up exit_function with atexit.register() so
+    # there is no need to explicitly call exit_function from here.
+
+    dprint_executing()
+
+    # Calling exit prevents us from returning to the code that was running
+    # when the signal was received.
+    exit(0)
+
+
+def validate_parms():
+
+    r"""
+    Validate program parameters, etc.  Return True or False (i.e. pass/fail)
+    accordingly.
+    """
+
+    if not valid_file_path(source):
+        return False
+
+    if not valid_dir_path(dest):
+        return False
+
+    gen_post_validation(exit_function, signal_handler)
+
+    return True
 
 
 def parse_output_xml(xml_file_path, csv_dir_path):
+
+    r"""
+    Parse the robot-generated output.xml file and extract various test
+    output data. Put the extracted information into a csv file in the "dest"
+    folder.
+
+    Description of argument(s):
+    xml_file_path  The path to a Robot-generated output.xml file.
+    csv_dir_path   The path to the directory that is to contain the .csv files
+                   generated by this function.
+    """
+
     result = ExecutionResult(xml_file_path)
     result.configure(stat_config={'suite_stat_level': 2,
                                   'tag_stat_combine': 'tagANDanother'})
@@ -112,16 +210,18 @@
 
 
 def xml_to_csv_time(xml_datetime):
+
     r"""
     Convert the time from %Y%m%d %H:%M:%S.%f format to %Y-%m-%d-%H-%M-%S format
     and return it.
 
-    Description of arguments:
-        datetime  The date in the following format: %Y%m%d %H:%M:%S.%f
-                  (This is the format typically found in an XML file.)
+    Description of argument(s):
+    datetime  The date in the following format: %Y%m%d %H:%M:%S.%f
+              (This is the format typically found in an XML file.)
 
     The date returned will be in the following format: %Y-%m-%d-%H-%M-%S
     """
+
     # 20170206 05:05:19.342
     l_str = datetime.strptime(xml_datetime, "%Y%m%d %H:%M:%S.%f")
     # 2017-02-06-05-05-19
@@ -130,13 +230,15 @@
 
 
 def get_system_details(xml_file_path):
+
     r"""
     Get the system data from output.xml generated by robot and return it.
     The list returned will be in the following order: [driver,platform]
 
-    Description of arguments:
-        xml_file_path  The relative or absolute path to the output.xml file.
+    Description of argument(s):
+    xml_file_path  The relative or absolute path to the output.xml file.
     """
+
     bmc_version = ""
     bmc_platform = ""
     with open(xml_file_path, 'rt') as output:
@@ -159,41 +261,22 @@
     return [str(bmc_version), str(bmc_platform)]
 
 
-def usage():
-    name = 'gen_csv_results.py'
-    print 'Usage: '
-    print name, '-s <source path> -d <destination path>'
-    print '\t-s | --source=  : output.xml robot test result file path'
-    print '\t-d | --dest=    : Where the *.csv file will be generated'
-    sys.exit()
+def main():
 
+    if not gen_get_options(parser, stock_list):
+        return False
 
-def main(argv):
+    if not validate_parms():
+        return False
 
-    source = ''
-    dest = ''
-    try:
-        opts, args = getopt.getopt(argv, "h:s:d:", ["source=", "dest="])
-    except getopt.GetoptError:
-        usage()
-
-    for opt, arg in opts:
-        if opt == '-h':
-            usage()
-        elif opt in ("-s", "--source"):
-            source = arg
-        elif opt in ("-d", "--dest"):
-            dest = arg
-
-    if source == '':
-        usage()
-        print 'ERROR: Provide input file path to robot generated output.xml '
-
-    if dest == '':
-        usage()
-        print 'ERROR: Destination directory where *.csv file will be generated'
+    qprint_pgm_header()
 
     parse_output_xml(source, dest)
 
-if __name__ == "__main__":
-    main(sys.argv[1:])
+    return True
+
+
+# Main
+
+if not main():
+    exit(1)
