diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 3134732..2a28196 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -12,8 +12,8 @@
 -   For this project, we will write Robot keyword definitions in either Robot
     or Python.  Robot code should be quite simple.  Therefore, if the algorithm
     in question is the least bit complex, please write it in Python.
--   Observe a maximum line length of 79 characters.
--   Avoid trailing space at the end of any line of Robot code.
+-   Observe a maximum line length of 79 characters.
+-   Avoid trailing space at the end of any line of Robot code.
 -   Avoid the use of tabs.
 -   Robot supports delimiting cells with either two or more spaces or with a
     pipe symbol (e.g. "\|"). Our team has chosen to use spaces rather than the
@@ -43,320 +43,634 @@
       ...    Run Keywords  Key1  parms
       ...    AND  Key2  parms
       ```
--   Use spaces to make conditions more readable:
-
-    Correct example:
-    ```
-    Run Keyword If  '${var1}' == '${0}'  My Keyword
-    ```
-    Incorrect example:
-    ```
-    Run Keyword If  '${var1}'=='${0}'  My Keyword
-    ```
--   When you define or call a Robot keyword, Robot pays no attention to spaces,
-    underscores or case.  However, our team will observe the following
-    conventions in both our definitions and our calls:
-    - Separate words with single spaces.
-    - Capitalize the first character of each word.
-    - Capitalize all characters in any word that is an acronym (e.g. JSON, BMC,
-      etc).
-
-    Examples:
-    ```
-    *** Keywords ***
-
-    This Is Correct
-
-        # This keyword name is correct.
-
-    this_is_incorrect
-
-        # This keyword name is incorrect because of 1) the
-        # underscores instead of spaces and 2) the failure to
-        # capitalize each word in the keyword.
-
-    soisthis
-
-        # This keyword name is incorrect because of 1) a failure to
-        # separate words with spaces and 2) a failure to capitalize
-        # each word in the keyword.
-
-    BMC Is An Acronym
-
-        # This keyword name is correct.  Note that "BMC" is an
-        # acronym and as such is entirely uppercase.
-    ```
--   Documentation strings:
-    -  Each documentation string should be phrased as an **English command**.
-       Punctuate it correctly with the first word capitalized and a period at
-       the end.
-
-       Correct example:
-        ```
-        Boot BMC
-            [Documentation]  Boot the BMC.
-        ```
-        Incorrect example:
-        ```
-        Boot BMC
-            [Documentation]  This keyword boots the BMC.
-
-            # The doc string above is not phrased as a command.
-        ```
-    -   Doc strings should be just one terse, descriptive sentence.
-        Remember that this doc string shows up in the HTML log file.  Put
-        additional commentary below in standard comment lines.
-
-        Correct example:
-        ```
-        Stop SOL Console Logging
-
-            [Documentation]  Stop system console logging and return log output.
-        ```
-        Incorrect example:
-        ```
-        Stop SOL Console Logging
-
-            [Documentation]  Stop system console logging.  If there are multiple
-            ...              system console processes, they will all be
-            ...              stopped.  If there is no existing log file this
-            ...              keyword will return an error message to that
-            ...              effect (and write that message to targ_file_path,
-            ...              if specified).  NOTE: This keyword will not fail
-            ...              if there is no running system console process.
-
-            # This doc string is way too long.
-        ```
--   Tags:
-    -   Create a tag for every test case with a tag name that mirrors the test case
-        name as follows:
-        ```
-        Create Intermediate File
-
-            [Tags]  Create_Intermediate_File
-        ```
--   Description of argument(s):
-    -   As shown in the following example, if your keyword has any arguments, include
-        a "**Description of argument(s)**" section.  This effectively serves as the
-        help text for anyone wanting to use or understand your keyword.  Include
-        real data examples wherever possible and applicable.  Leave at least 2 spaces
-        between the argument name and the description.  Align all description text as
-        shown in the example below.
-
-        Example:
-        ```
-        Get URL List
-            [Documentation]  Return list of URLs under given URL.
-            [Arguments]  ${openbmc_url}
-
-            # Description of argument(s):
-            # openbmc_url  URL for list operation (e.g.
-            #              "/xyz/openbmc_project/inventory").
-            # policy       Power restore policy (e.g "RESTORE_LAST_STATE",
-            #              ${RESTORE_LAST_STATE}).
-        ```
--   General variable naming conventions:
-    -   Variable names should be lower case with few exceptions:
-        -   Environment variables should be all upper case.
-        -   Variables intended to be set by Robot -v parameters may be all
-            upper case.
-    -   Words within a variable name should be separated by underscores:
-
-        Correct examples:
-        ```
-        ${host_name}
-        ${program_pid}
-        ```
-        Incorrect examples:
-        ```
-        ${HostName}
-        ${ProgramPid}
-        ```
--   Special variable naming conventions.
-
-    For certain very commonly used kinds of variables, please observe these
-    conventions in order to achieve consistency throughout the code.
-
-    -   hosts
-
-        When a variable is intended to contain **either** an IP address **or**
-        a host name (either long or short), please give it a suffix of "_host".
-
-        Examples:
-        ```
-        openbmc_host
-        os_host
-        pdu_host
-        openbmc_serial_host
-        ```
-    -   host names
-
-        For host names (long or short, e.g. "bmc1" or "bmc1.ibm.com"), use a
-        suffix of _host_name.
-
-        Examples:
-        ```
-        openbmc_host_name
-        os_host_name
-        pdu_host_name
-        openbmc_serial_host_name
-        ```
-    -   Short host names
-
-        For short host names (e.g. "bmc1"), use a suffix of _host_short_name.
-
-        Examples:
-        ```
-        openbmc_host_short_name
-        os_host_short_name
-        pdu_host_short_name
-        openbmc_serial_host_short_name
-        ```
-    -   IP addresses
-
-        For IP addresses, use a suffix of _ip.
-
-        Example:
-        ```
-        openbmc_ip
-        os_ip
-        pdu_ip
-        openbmc_serial_ip
-        ```
-    -   Files and directories:
-        -   Files:
-            -   If your variable is to contain only the file's name, use a suffix
-                of _file_name.
-
-                Examples:
-                ```
-                ffdc_file_name = "bmc1.170428.120200.ffdc"
-                ```
-            -   If your variable is to contain the path to a file, use a suffix of
-                _file_path.  Bear in mind that a file path can be relative or
-                absolute so that should not be a consideration in whether to use
-                the "_file_path" suffix.
-
-                Examples:
-                ```
-                status_file_path = "bmc1.170428.120200.status"
-                status_file_path = "subdir/bmc1.170428.120200.status"
-                status_file_path = "./bmc1.170428.120200.status"
-                status_file_path = "../bmc1.170428.120200.status"
-                status_file_path = "/home/user1/status/bmc1.170428.120200.status"
-                ```
-                To re-iterate, it doesn't matter whether the contents of the
-                variable are a relative or absolute path (as shown in the
-                examples above).  A file path is simply a value with enough
-                information in it for the program to find the file.
-
-            -   If the variable **must** contain an absolute path (which should be
-                the rare case), use a suffix _abs_file_path.
-
-        -   Directories:
-            -   Directory variables should follow the same conventions as file
-                variables.
-
-            -   If your variable is to contain only the directory's name, use a
-                suffix of _dir_name.
-
-                Example:
-                ```
-                ffdc_dir_name = "ffdc"
-                ```
-            -   If your variable is to contain the path to a directory, use a
-                suffix of _dir_path.  Bear in mind that a dir path can be
-                relative or absolute so that should not be a consideration in
-                whether to use _dir_path.
-
-                Examples:
-                ```
-                status_dir_path = "status/"
-                status_dir_path = "subdir/status"
-                status_dir_path = "./status/"
-                status_dir_path = "../status/"
-                status_dir_path = "/home/user1/status/"
-                ```
-                To re-iterate, it doesn't matter whether the contents of
-                the variable are a relative or absolute path (as shown in
-                the examples above).  A dir path is simply a value with
-                enough information in it for the program to find the
-                directory.
-
-            -   If the variable **must** contain an absolute path (which
-                should be the rare case), use a suffix _abs_dir_path.
-            -   IMPORTANT:  As a programming convention, do pre-
-                processing on all dir_path variables to ensure that they
-                contain a trailing slash.  If we follow that convention
-                religiously, that when changes are made in other parts of
-                the program, the programmer can count on the value having
-                a trailing slash.  Therefore they can safely do this kind
-                of thing:
-                ```
-                my_file_path = my_dir_path + my_file_name
-                ```
-    -   Setup/Teardown keywords
-
-        Use standardized names for setup and teardown keywords:
-        - Suite Setup Execution
-        - Suite Teardown Execution
-        - Test Setup Execution
-        - Test Teardown Execution
--   Traditional comments (i.e. using the hashtag style comments)
-    -   Please leave one space following the hashtag.
-        ```
-        #wrong
-
-        # Right
-        ```
-    -   Please use proper English punction:
-        -   Capitalize the first word in the sentence or phrase.
-        -   End sentences (or stand-alone phrases) with a period.
-
-    -   Do not keep commented out code in your program.  Instead, remove it
-        entirely.
-
+-   Use spaces to make conditions more readable:
+
+    Correct example:
+    ```
+    Run Keyword If  '${var1}' == '${0}'  My Keyword
+    ```
+    Incorrect example:
+    ```
+    Run Keyword If  '${var1}'=='${0}'  My Keyword
+    ```
+-   When you define or call a Robot keyword, Robot pays no attention to spaces,
+    underscores or case.  However, our team will observe the following
+    conventions in both our definitions and our calls:
+    - Separate words with single spaces.
+    - Capitalize the first character of each word.
+    - Capitalize all characters in any word that is an acronym (e.g. JSON, BMC,
+      etc).
+
+    Examples:
+    ```
+    *** Keywords ***
+
+    This Is Correct
+
+        # This keyword name is correct.
+
+    this_is_incorrect
+
+        # This keyword name is incorrect because of 1) the
+        # underscores instead of spaces and 2) the failure to
+        # capitalize each word in the keyword.
+
+    soisthis
+
+        # This keyword name is incorrect because of 1) a failure to
+        # separate words with spaces and 2) a failure to capitalize
+        # each word in the keyword.
+
+    BMC Is An Acronym
+
+        # This keyword name is correct.  Note that "BMC" is an
+        # acronym and as such is entirely uppercase.
+    ```
+-   Documentation strings:
+    -  Each documentation string should be phrased as an **English command**.
+       Punctuate it correctly with the first word capitalized and a period at
+       the end.
+
+       Correct example:
+        ```
+        Boot BMC
+            [Documentation]  Boot the BMC.
+        ```
+        Incorrect example:
+        ```
+        Boot BMC
+            [Documentation]  This keyword boots the BMC.
+
+            # The doc string above is not phrased as a command.
+        ```
+    -   Doc strings should be just one terse, descriptive sentence.
+        Remember that this doc string shows up in the HTML log file.  Put
+        additional commentary below in standard comment lines.
+
+        Correct example:
+        ```
+        Stop SOL Console Logging
+
+            [Documentation]  Stop system console logging and return log output.
+        ```
+        Incorrect example:
+        ```
+        Stop SOL Console Logging
+
+            [Documentation]  Stop system console logging.  If there are multiple
+            ...              system console processes, they will all be
+            ...              stopped.  If there is no existing log file this
+            ...              keyword will return an error message to that
+            ...              effect (and write that message to targ_file_path,
+            ...              if specified).  NOTE: This keyword will not fail
+            ...              if there is no running system console process.
+
+            # This doc string is way too long.
+        ```
+-   Tags:
+    -   Create a tag for every test case with a tag name that mirrors the test case
+        name as follows:
+        ```
+        Create Intermediate File
+
+            [Tags]  Create_Intermediate_File
+        ```
+-   Description of argument(s):
+    -   As shown in the following example, if your keyword has any arguments, include
+        a "**Description of argument(s)**" section.  This effectively serves as the
+        help text for anyone wanting to use or understand your keyword.  Include
+        real data examples wherever possible and applicable.  Leave at least 2 spaces
+        between the argument name and the description.  Align all description text as
+        shown in the example below.
+
+        Example:
+        ```
+        Get URL List
+            [Documentation]  Return list of URLs under given URL.
+            [Arguments]  ${openbmc_url}
+
+            # Description of argument(s):
+            # openbmc_url  URL for list operation (e.g.
+            #              "/xyz/openbmc_project/inventory").
+            # policy       Power restore policy (e.g "RESTORE_LAST_STATE",
+            #              ${RESTORE_LAST_STATE}).
+        ```
+-   General variable naming conventions:
+    -   Variable names should be lower case with few exceptions:
+        -   Environment variables should be all upper case.
+        -   Variables intended to be set by Robot -v parameters may be all
+            upper case.
+    -   Words within a variable name should be separated by underscores:
+
+        Correct examples:
+        ```
+        ${host_name}
+        ${program_pid}
+        ```
+        Incorrect examples:
+        ```
+        ${HostName}
+        ${ProgramPid}
+        ```
+-   Special variable naming conventions.
+
+    For certain very commonly used kinds of variables, please observe these
+    conventions in order to achieve consistency throughout the code.
+
+    -   hosts
+
+        When a variable is intended to contain **either** an IP address **or**
+        a host name (either long or short), please give it a suffix of "_host".
+
+        Examples:
+        ```
+        openbmc_host
+        os_host
+        pdu_host
+        openbmc_serial_host
+        ```
+    -   host names
+
+        For host names (long or short, e.g. "bmc1" or "bmc1.ibm.com"), use a
+        suffix of _host_name.
+
+        Examples:
+        ```
+        openbmc_host_name
+        os_host_name
+        pdu_host_name
+        openbmc_serial_host_name
+        ```
+    -   Short host names
+
+        For short host names (e.g. "bmc1"), use a suffix of _host_short_name.
+
+        Examples:
+        ```
+        openbmc_host_short_name
+        os_host_short_name
+        pdu_host_short_name
+        openbmc_serial_host_short_name
+        ```
+    -   IP addresses
+
+        For IP addresses, use a suffix of _ip.
+
+        Example:
+        ```
+        openbmc_ip
+        os_ip
+        pdu_ip
+        openbmc_serial_ip
+        ```
+    -   Files and directories:
+        -   Files:
+            -   If your variable is to contain only the file's name, use a suffix
+                of _file_name.
+
+                Examples:
+                ```
+                ffdc_file_name = "bmc1.170428.120200.ffdc"
+                ```
+            -   If your variable is to contain the path to a file, use a suffix of
+                _file_path.  Bear in mind that a file path can be relative or
+                absolute so that should not be a consideration in whether to use
+                the "_file_path" suffix.
+
+                Examples:
+                ```
+                status_file_path = "bmc1.170428.120200.status"
+                status_file_path = "subdir/bmc1.170428.120200.status"
+                status_file_path = "./bmc1.170428.120200.status"
+                status_file_path = "../bmc1.170428.120200.status"
+                status_file_path = "/home/user1/status/bmc1.170428.120200.status"
+                ```
+                To re-iterate, it doesn't matter whether the contents of the
+                variable are a relative or absolute path (as shown in the
+                examples above).  A file path is simply a value with enough
+                information in it for the program to find the file.
+
+            -   If the variable **must** contain an absolute path (which should be
+                the rare case), use a suffix _abs_file_path.
+
+        -   Directories:
+            -   Directory variables should follow the same conventions as file
+                variables.
+
+            -   If your variable is to contain only the directory's name, use a
+                suffix of _dir_name.
+
+                Example:
+                ```
+                ffdc_dir_name = "ffdc"
+                ```
+            -   If your variable is to contain the path to a directory, use a
+                suffix of _dir_path.  Bear in mind that a dir path can be
+                relative or absolute so that should not be a consideration in
+                whether to use _dir_path.
+
+                Examples:
+                ```
+                status_dir_path = "status/"
+                status_dir_path = "subdir/status"
+                status_dir_path = "./status/"
+                status_dir_path = "../status/"
+                status_dir_path = "/home/user1/status/"
+                ```
+                To re-iterate, it doesn't matter whether the contents of
+                the variable are a relative or absolute path (as shown in
+                the examples above).  A dir path is simply a value with
+                enough information in it for the program to find the
+                directory.
+
+            -   If the variable **must** contain an absolute path (which
+                should be the rare case), use a suffix _abs_dir_path.
+            -   IMPORTANT:  As a programming convention, do pre-
+                processing on all dir_path variables to ensure that they
+                contain a trailing slash.  If we follow that convention
+                religiously, that when changes are made in other parts of
+                the program, the programmer can count on the value having
+                a trailing slash.  Therefore they can safely do this kind
+                of thing:
+                ```
+                my_file_path = my_dir_path + my_file_name
+                ```
+    -   Setup/Teardown keywords
+
+        Use standardized names for setup and teardown keywords:
+        - Suite Setup Execution
+        - Suite Teardown Execution
+        - Test Setup Execution
+        - Test Teardown Execution
+-   Traditional comments (i.e. using the hashtag style comments)
+    -   Please leave one space following the hashtag.
+        ```
+        #wrong
+
+        # Right
+        ```
+    -   Please use proper English punction:
+        -   Capitalize the first word in the sentence or phrase.
+        -   End sentences (or stand-alone phrases) with a period.
+
+    -   Do not keep commented out code in your program.  Instead, remove it
+        entirely.
+
 Python Coding Guidelines
 -----------------------
--   The minimum required Python version is 2.7.x.
--   Run pep8 on all Python files and correct errors.
-
-    Example as run from a Linux command line:
-    ```
-    pep8 my_pgm.py
-
-    my_pgm.py:41:1: E302 expected 2 blank lines, found 1
-    my_pgm.py:58:52: W291 trailing whitespace
-    ```
--   Include doc strings in every function and follow the guidelines in
-    https://www.python.org/dev/peps/pep-0257/.
-
-    Example:
-    ```
-        r"""
-        Return the function name associated with the indicated stack frame.
-
-        Description of argument(s):
-        stack_frame_ix                  The index of the stack frame whose
-                                        function name should be returned.  If
-                                        the caller does not specify a value,
-                                        this function will set the value to 1
-                                        which is the index of the caller's
-                                        stack frame.  If the caller is the
-                                        wrapper function "print_func_name",
-                                        this function will bump it up by 1.
-        """
-    ```
--   As shown in the prior example, if your function has any arguments, include
-    a "Description of argument(s)" section.  This effectively serves as the
-    help text for anyone wanting to use or understand your function.  Include
-    real data examples wherever possible and applicable.
--   Function definitions:
-    -   Put each function parameter on its own line:
-        ```
-        def func1(parm1,
-
-                  parm2):
-        ```
--   Do not keep commented out code in your program.  Instead, remove it
-    entirely.
+-   The minimum required Python version is 2.7.x.
+-   Run pep8 on all Python files and correct errors.
+
+    Example as run from a Linux command line:
+    ```
+    pep8 my_pgm.py
+
+    my_pgm.py:41:1: E302 expected 2 blank lines, found 1
+    my_pgm.py:58:52: W291 trailing whitespace
+    ```
+-   Include doc strings in every function and follow the guidelines in
+    https://www.python.org/dev/peps/pep-0257/.
+
+    Example:
+    ```
+        r"""
+        Return the function name associated with the indicated stack frame.
+
+        Description of argument(s):
+        stack_frame_ix                  The index of the stack frame whose
+                                        function name should be returned.  If
+                                        the caller does not specify a value,
+                                        this function will set the value to 1
+                                        which is the index of the caller's
+                                        stack frame.  If the caller is the
+                                        wrapper function "print_func_name",
+                                        this function will bump it up by 1.
+        """
+    ```
+-   As shown in the prior example, if your function has any arguments, include
+    a "Description of argument(s)" section.  This effectively serves as the
+    help text for anyone wanting to use or understand your function.  Include
+    real data examples wherever possible and applicable.
+-   Function definitions:
+    -   Put each function parameter on its own line:
+        ```
+        def func1(parm1,
+
+                  parm2):
+        ```
+-   Do not keep commented out code in your program.  Instead, remove it
+    entirely.
+-   When you define or call a Robot keyword, Robot pays no attention to spaces,
+    underscores or case.  However, our team will observe the following
+    conventions in both our definitions and our calls:
+    - Separate words with single spaces.
+    - Capitalize the first character of each word.
+    - Capitalize all characters in any word that is an acronym (e.g. JSON, BMC,
+      etc).
+
+    Examples:
+    ```
+    *** Keywords ***
+
+    This Is Correct
+
+        # This keyword name is correct.
+
+    this_is_incorrect
+
+        # This keyword name is incorrect because of 1) the
+        # underscores instead of spaces and 2) the failure to
+        # capitalize each word in the keyword.
+
+    soisthis
+
+        # This keyword name is incorrect because of 1) a failure to
+        # separate words with spaces and 2) a failure to capitalize
+        # each word in the keyword.
+
+    BMC Is An Acronym
+
+        # This keyword name is correct.  Note that "BMC" is an
+        # acronym and as such is entirely uppercase.
+    ```
+-   Documentation strings:
+    -  Each documentation string should be phrased as an **English command**.
+       Punctuate it correctly with the first word capitalized and a period at
+       the end.
+
+       Correct example:
+        ```
+        Boot BMC
+            [Documentation]  Boot the BMC.
+        ```
+        Incorrect example:
+        ```
+        Boot BMC
+            [Documentation]  This keyword boots the BMC.
+
+            # The doc string above is not phrased as a command.
+        ```
+    -   Doc strings should be just one terse, descriptive sentence.
+        Remember that this doc string shows up in the HTML log file.  Put
+        additional commentary below in standard comment lines.
+
+        Correct example:
+        ```
+        Stop SOL Console Logging
+
+            [Documentation]  Stop system console logging and return log output.
+        ```
+        Incorrect example:
+        ```
+        Stop SOL Console Logging
+
+            [Documentation]  Stop system console logging.  If there are multiple
+            ...              system console processes, they will all be
+            ...              stopped.  If there is no existing log file this
+            ...              keyword will return an error message to that
+            ...              effect (and write that message to targ_file_path,
+            ...              if specified).  NOTE: This keyword will not fail
+            ...              if there is no running system console process.
+
+            # This doc string is way too long.
+        ```
+-   Tags:
+    -   Create a tag for every test case with a tag name that mirrors the test case
+        name as follows:
+        ```
+        Create Intermediate File
+
+            [Tags]  Create_Intermediate_File
+        ```
+-   General variable naming conventions:
+    -   Variable names should be lower case with few exceptions:
+        -   Environment variables should be all upper case.
+        -   Variables intended to be set by Robot -v parameters may be all
+            upper case.
+    -   Words within a variable name should be separated by underscores:
+
+        Correct examples:
+        ```
+        ${host_name}
+        ${program_pid}
+        ```
+        Incorrect examples:
+        ```
+        ${HostName}
+        ${ProgramPid}
+        ```
+-   Special variable naming conventions.
+
+    For certain very commonly used kinds of variables, please observe these
+    conventions in order to achieve consistency throughout the code.
+
+    -   hosts
+
+        When a variable is intended to contain **either** an IP address **or**
+        a host name (either long or short), please give it a suffix of "_host".
+
+        Examples:
+        ```
+        openbmc_host
+        os_host
+        pdu_host
+        openbmc_serial_host
+        ```
+    -   host names
+
+        For host names (long or short, e.g. "bmc1" or "bmc1.ibm.com"), use a
+        suffix of _host_name.
+
+        Examples:
+        ```
+        openbmc_host_name
+        os_host_name
+        pdu_host_name
+        openbmc_serial_host_name
+        ```
+    -   Short host names
+
+        For short host names (e.g. "bmc1"), use a suffix of _host_short_name.
+
+        Examples:
+        ```
+        openbmc_host_short_name
+        os_host_short_name
+        pdu_host_short_name
+        openbmc_serial_host_short_name
+        ```
+    -   IP addresses
+
+        For IP addresses, use a suffix of _ip.
+
+        Example:
+        ```
+        openbmc_ip
+        os_ip
+        pdu_ip
+        openbmc_serial_ip
+        ```
+-   Files and directories:
+    -   Files:
+        -   If your variable is to contain only the file's name, use a suffix
+            of _file_name.
+
+            Examples:
+            ```
+            ffdc_file_name = "bmc1.170428.120200.ffdc"
+            ```
+        -   If your variable is to contain the path to a file, use a suffix of
+            _file_path.  Bear in mind that a file path can be relative or
+            absolute so that should not be a consideration in whether to use
+            the "_file_path" suffix.
+
+            Examples:
+            ```
+            status_file_path = "bmc1.170428.120200.status"
+            status_file_path = "subdir/bmc1.170428.120200.status"
+            status_file_path = "./bmc1.170428.120200.status"
+            status_file_path = "../bmc1.170428.120200.status"
+            status_file_path = "/home/user1/status/bmc1.170428.120200.status"
+            ```
+            To re-iterate, it doesn't matter whether the contents of the
+            variable are a relative or absolute path (as shown in the
+            examples above).  A file path is simply a value with enough
+            information in it for the program to find the file.
+
+        -   If the variable **must** contain an absolute path (which should be
+            the rare case), use a suffix _abs_file_path.
+
+    -   Directories:
+        -   Directory variables should follow the same conventions as file
+            variables.
+
+        -   If your variable is to contain only the directory's name, use a
+            suffix of _dir_name.
+
+            Example:
+            ```
+            ffdc_dir_name = "ffdc"
+            ```
+        -   If your variable is to contain the path to a directory, use a
+            suffix of _dir_path.  Bear in mind that a dir path can be
+            relative or absolute so that should not be a consideration in
+            whether to use _dir_path.
+
+            Examples:
+            ```
+            status_dir_path = "status/"
+            status_dir_path = "subdir/status"
+            status_dir_path = "./status/"
+            status_dir_path = "../status/"
+            status_dir_path = "/home/user1/status/"
+            ```
+            To re-iterate, it doesn't matter whether the contents of
+            the variable are a relative or absolute path (as shown in
+            the examples above).  A dir path is simply a value with
+            enough information in it for the program to find the
+            directory.
+
+        -   If the variable **must** contain an absolute path (which
+            should be the rare case), use a suffix _abs_dir_path.
+        -   IMPORTANT:  As a programming convention, do pre-
+            processing on all dir_path variables to ensure that they
+            contain a trailing slash.  If we follow that convention
+            religiously, that when changes are made in other parts of
+            the program, the programmer can count on the value having
+            a trailing slash.  Therefore they can safely do this kind
+            of thing:
+            ```
+            my_file_path = my_dir_path + my_file_name
+            ```
+-   Traditional comments (i.e. using the hashtag style comments)
+    -   Please leave one space following the hashtag.
+        ```
+        #wrong
+
+        # Right
+        ```
+    -   Please use proper English punction:
+        -   Capitalize the first word in the sentence or phrase.
+        -   End sentences (or stand-alone phrases) with a period.
+
+    -   Do not keep commented out code in your program.  Instead, remove it
+        entirely.
+
+Python Coding Guidelines
+-----------------------
+-   Run pep8 on all Python files and correct errors.
+
+    Example as run from a Linux command line:
+    ```
+    pep8 my_pgm.py
+
+    my_pgm.py:41:1: E302 expected 2 blank lines, found 1
+    my_pgm.py:58:52: W291 trailing whitespace
+    ```
+-   Include doc strings in every function and follow the guidelines in
+    https://www.python.org/dev/peps/pep-0257/.
+
+    Example:
+    ```
+        r"""
+        Return the function name associated with the indicated stack frame.
+
+        Description of argument(s):
+        stack_frame_ix                  The index of the stack frame whose
+                                        function name should be returned.  If
+                                        the caller does not specify a value,
+                                        this function will set the value to 1
+                                        which is the index of the caller's
+                                        stack frame.  If the caller is the
+                                        wrapper function "print_func_name",
+                                        this function will bump it up by 1.
+        """
+    ```
+-   As shown in the prior example, if your function has any arguments, include
+    a "Description of argument(s)" section.  This effectively serves as the
+    help text for anyone wanting to use or understand your function.  Include
+    real data examples wherever possible and applicable.
+-   Function definitions:
+    -   Put each function parameter on its own line:
+        ```
+        def func1(parm1,
+
+                  parm2):
+        ```
+-   Do not keep commented out code in your program.  Instead, remove it
+    entirely.
+
+Template Usage Guidelines
+-------------------------
+We have several templates in the templates/ sub-directory. If there is a
+template that applies to your programming situation (Python, bash, etc.),
+it should be used to create new programs as in the following example
+
+- Example:
+
+    ```
+    $ cd templates
+    $ cp python_pgm_template ../bin/my_new_program
+    ```
+
+These templates have much of your preliminary work done for you and will help
+us all follow a similar structure.
+
+- Features:
+    - Help text and arg parsing started for you.
+    - Support for "stock" parameters like "quiet", "debug", "test_mode".
+    - "exit_function" and "signal_handler" defined.
+    - "validate_parms" function pre-created.
+    - "main" function follows conventional startup sequence:
+
+        ```
+            if not gen_get_options(parser, stock_list):
+                return False
+
+            if not validate_parms():
+                return False
+
+            qprint_pgm_header()
+
+            # Your code here.
+        ```
diff --git a/README.md b/README.md
index 68e2839..98a9bcd 100755
--- a/README.md
+++ b/README.md
@@ -92,167 +92,140 @@
     ```
 **Tox Command Line**
 
-Install the python dependencies for tox
-```shell
+* Install the python dependencies for tox:
+    ```
     $ easy_install tox
     $ easy_install pip
-```
+    ```
 
-Initialize the following environment variable which will be used during testing
-```shell
+* Initialize the following environment variables which will be used during testing:
+    ```
     $ export OPENBMC_HOST=<openbmc machine ip address>
     $ export OPENBMC_PASSWORD=<openbmc password>
     $ export OPENBMC_USERNAME=<openbmc username>
     $ export OPENBMC_MODEL=[./data/Barreleye.py, ./data/Palmetto.py, etc]
     $ export IPMI_COMMAND=<Dbus/External>
     $ export IPMI_PASSWORD=<External IPMI password>
-```
-
-```shell
-
-    Use following parameters for PDU:
+    ```
+* For tests requiring PDU, set the following environment variables as well:
+    ```
     $ export PDU_IP=<PDU IP address>
     $ export PDU_USERNAME=<PDU username>
     $ export PDU_PASSWORD=<PDU password>
     $ export PDU_TYPE=<PDU type>
     $ export PDU_SLOT_NO=<SLOT number>
+    ```
+    Note: For PDU_TYPE we support only synaccess at the moment.
 
-    for PDU_TYPE we support only synaccess at the moment
-
-Use the following variables for Qemu test run
-==========================================================
+* For QEMU tests, set the following environment variables as well:
+    ```
     $ export SSH_PORT=<ssh port number>
     $ export HTTPS_PORT=<https port number>
-
-Use the following variables for BIOS update testing
-==========================================================
+    ```
+* For BIOS tests, set the following environment variables as well:
+    ```
     $ export PNOR_IMAGE_PATH=<path to>/<machine>.pnor
+    ```
 
-```
-
-Run tests
-```shell
+* Run tests:
+    ```
     $ tox -e tests
-```
+    ```
 
-How to test individual test
-```shell
-    One specific test
-    $ tox -e default -- -t '"DIMM0 no fault"' tests/test_sensors.robot
+* How to run individual test:
 
-    No preset environment variables, default configuration for all supported systems.
+    One specific test:
+    ```
+    $ tox -e default -- --include Power_On_Test  tests/test_basic_poweron.robot
+    ```
+    No preset environment variables, default configuration for all supported
+    systems:
+    ```
     $ OPENBMC_HOST=x.x.x.x tox -e default -- tests
-
-    No preset environment variables, one test case from one test suite
-    $ OPENBMC_HOST=x.x.x.x tox -e barreleye -- -t '"DIMM0 no fault"' tests/test_sensors.robot
-
-    No preset environment variables, one test suite  for a palmetto system
-    $ OPENBMC_HOST=x.x.x.x tox -e palmetto -- tests/test_sensors.robot
-
-    No preset environment variables, the entire test suite for a barreleye system
-    $ OPENBMC_HOST=x.x.x.x tox -e barreleye -- tests
-
+    ```
+    No preset environment variables, one test case from a test suite:
+    ```
+    $ OPENBMC_HOST=x.x.x.x tox -e default -- --include Power_On_Test tests/test_basic_poweron.robot
+    ```
+    No preset environment variables, the entire test suite:
+    ```
+    $ OPENBMC_HOST=x.x.x.x tox -e default -- tests
+    ```
     Default CI test bucket list:
+
     No preset environment variables, the entire test suite excluding test
-    cases using argument file.
-    $ OPENBMC_HOST=x.x.x.x tox -e barreleye -- --argumentfile test_lists/skip_test tests
+    cases using argument file:
+    ```
+    $ OPENBMC_HOST=x.x.x.x tox -e default -- --argumentfile test_lists/skip_test tests
+    ```
 
     Exclude test list for supported systems:
+    ```
     Barrleye:  test_lists/skip_test_barreleye
     Palmetto:  test_lists/skip_test_palmetto
     Witherspoon:  test_lists/skip_test_witherspoon
-```
+    ```
 
-It can also be run by passing variables from the cli...
-```shell
-    Run one test suite using using pybot
-    $  pybot -v OPENBMC_HOST:<ip> -v OPENBMC_USERNAME:root -v OPENBMC_PASSWORD:0penBmc -v OPENBMC_MODEL:<model path> tests/test_time.robot
-
-    Run entire test suite using using pybot
-    $  pybot -v OPENBMC_HOST:<ip> -v OPENBMC_USERNAME:root -v OPENBMC_PASSWORD:0penBmc -v OPENBMC_MODEL:<model path> tests
-
-    Run entire test suite using external ipmitool
-    $  pybot -v OPENBMC_HOST:<ip> -v OPENBMC_USERNAME:root -v OPENBMC_PASSWORD:0penBmc -v IPMI_COMMAND:External -v IPMI_PASSWORD:PASSW0RD -v OPENBMC_MODEL:<model path> tests
-```
-
-Run extended tests
-```shell
-    Set the preset environment variables, run test suite for a barreleye system
-    $ OPENBMC_HOST=x.x.x.x tox -e barreleye -- extended/test_power_restore.robot
-
-    Similarly for Network, PDU and update BIOS
+* Run extended tests:
 
     For BMC code update, download the system type *.all.tar image from https://openpower.xyz
     and run as follows:
 
-    For Barreleye system
-    python -m robot -v OPENBMC_HOST:x.x.x.x -v FILE_PATH:downloaded_path/barreleye-xxxx.all.tar  extended/code_update/update_bmc.robot
-
-    For loop test (Default iteration is 10)
-    python -m robot -v OPENBMC_HOST:x.x.x.x -v OPENBMC_SYSTEMMODEL:xxxxxx -v ITERATION:n -v LOOP_TEST_COMMAND:xxxxxx extended/full_suite_regression.robot
-    Below is sample command using tox to test only fw version using Barreleye system for 5 times
+    For Barreleye system:
+    ```
+    $ robot -v OPENBMC_HOST:x.x.x.x -v FILE_PATH:downloaded_path/barreleye-xxxx.all.tar  extended/code_update/update_bmc.robot
+    ```
+    For loop test (default iteration is 10):
+    ```
+    $ robot -v OPENBMC_HOST:x.x.x.x -v OPENBMC_SYSTEMMODEL:xxxxxx -v ITERATION:n -v LOOP_TEST_COMMAND:xxxxxx extended/full_suite_regression.robot
+    ```
+    Example using tox testing a test suite for 5 times:
+    ```
     OPENBMC_HOST=x.x.x.x  LOOP_TEST_COMMAND="--argumentfile test_lists/skip_test tests/test_fw_version.robot" ITERATION=5  OPENBMC_SYSTEMMODEL=barreleye tox -e barreleye -- ./extended/full_suite_regression.robot
-```
+    ```
 
-Jenkins jobs tox commands
-```shell
-    HW CI tox command
-    Set the preset environment variables, run HW CI test for a barreleye system
-    $ OPENBMC_HOST=x.x.x.x tox -e barreleye -- --argumentfile test_lists/HW_CI tests
+**Jenkins jobs tox commands**
+* HW CI tox command:
+    ```
+    $ OPENBMC_HOST=x.x.x.x tox -e default -- --argumentfile test_lists/HW_CI tests
+    ```
 
-```
+**Tools**
 
-Template to be used to create new stand-alone python programs.
-```shell
+* Github script:
 
-If you wish to create a new python stand-alone program, please copy bin/python_pgm_template to your new name and then begin your work.  Example:
+    Command to get GitHub issues (any GitHub repository) report in CSV format:
 
-cd bin
-cp python_pgm_template my_new_program
+    Note: On Prompt "Enter your GitHub Password:" enter your GitHub password.
 
-This template has much of your preliminary work done for you and it will help us all follow a similar structure.
+    Usage:
+    ```
+    $ cd tools/
+    $ python github_issues_to_csv <github user> <github repo>
+    ```
+    Example for getting openbmc issues:
+    ```
+    $ python github_issues_to_csv <github user>  openbmc/openbmc
+    ```
+    Example for getting openbmc-test-automation issues:
+    ```
+    $ python github_issues_to_csv <github user>  openbmc/openbmc-test-automation
+    ```
 
-Features:
-- Help text and argparsing started for you.
-- Support for "stock" parameters like quiet, debug, test_mode.
-- exit_function and signal_handler defined.
-- validate_parms function pre-created.
-- main function follows conventional startup:
+* Generate Robot test cases documentation:
 
-    if not gen_get_options(parser, stock_list):
-        return False
+    Usage:
+    ```
+    $ ./generate_test_document <Robot test directory path> <test case document file path>
+    ```
 
-    if not validate_parms():
-        return False
+    Example for generating tests cases documentation for tests directory:
+    ```
+    $ ./generate_test_document tests testsdirectoryTCdocs.html
+    ```
 
-    qprint_pgm_header()
-
-    # Your code here.
-
-```
-
-Command to get GitHub issues (any GitHub repository) report in CSV format
-Note: On Prompt "Enter your GitHub Password:" enter your GitHub password.
-```shell
-python ./tools/github_issues_to_csv <github user> <github repo>
-
-Example for getting openbmc issues
-python ./tools/github_issues_to_csv <github user>  openbmc/openbmc
-
-Example for getting openbmc-test-automation issues
-python ./tools/github_issues_to_csv <github user>  openbmc/openbmc-test-automation
-```
-
-
-Command to generate Robot test cases test documentations
-
-```shell
-./tools/generate_test_document <Robot test cases directory path> <test case document file path>
-
-Example for generating tests cases documentation for tests directory
-./tools/generate_test_document tests testsdirectoryTCdocs.html
-
-Example for generating tests cases documentation (tests,gui,extended TCs)
-# Note: Invoke the tool with out argument
-./tools/generate_test_document
-```
+    Example for generating tests cases documentation (tests, gui, extended TCs):
+    Note: Invoke the tool without argument:
+    ```
+    $ ./generate_test_document
+    ```
