diff --git a/lib/bmc_ssh_utils.py b/lib/bmc_ssh_utils.py
new file mode 100755
index 0000000..94ccf3d
--- /dev/null
+++ b/lib/bmc_ssh_utils.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python
+
+r"""
+This module provides many valuable bmc ssh functions such as
+bmc_execute_command.
+"""
+
+import sys
+import exceptions
+import re
+import gen_print as gp
+import gen_valid as gv
+import gen_robot_ssh as grs
+from robot.libraries.BuiltIn import BuiltIn
+
+
+###############################################################################
+def bmc_execute_command(cmd_buf,
+                        print_out=0,
+                        print_err=0,
+                        ignore_err=0,
+                        fork=0,
+                        quiet=None,
+                        test_mode=None):
+
+    r"""
+    Run the given command in an BMC SSH session and return the stdout, stderr
+    and the return code.
+
+    This function will obtain the global values for OPENBMC_HOST,
+    OPENBMC_USERNAME, etc.
+
+    Description of arguments:
+    cmd_buf                         The command string to be run in an SSH
+                                    session.
+    print_out                       If this is set, this function will print
+                                    the stdout/stderr generated by the shell
+                                    command.
+    print_err                       If show_err is set, this function will
+                                    print a standardized error report if the
+                                    shell command returns non-zero.
+    ignore_err                      Indicates that errors encountered on the
+                                    sshlib.execute_command are to be ignored.
+    fork                            Indicates that sshlib.start is to be used
+                                    rather than sshlib.execute_command.
+    quiet                           Indicates whether this function should run
+                                    the pissuing() function prints an
+                                    "Issuing: <cmd string>" to stdout.  This
+                                    defaults to the global quiet value.
+    test_mode                       If test_mode is set, this function will
+                                    not actually run the command.  This
+                                    defaults to the global test_mode value.
+    """
+
+    # Get global BMC variable values.
+    openbmc_host = BuiltIn().get_variable_value("${OPENBMC_HOST}", default="")
+    openbmc_username = BuiltIn().get_variable_value("${OPENBMC_USERNAME}",
+                                                    default="")
+    openbmc_password = BuiltIn().get_variable_value("${OPENBMC_PASSWORD}",
+                                                    default="")
+
+    if not gv.valid_value(openbmc_host):
+        return "", "", 1
+    if not gv.valid_value(openbmc_username):
+        return "", "", 1
+    if not gv.valid_value(openbmc_password):
+        return "", "", 1
+
+    open_connection_args = {'host': openbmc_host, 'alias': 'bmc_connection',
+                            'timeout': '25.0', 'prompt': '# '}
+    login_args = {'username': openbmc_username, 'password': openbmc_password}
+
+    return grs.execute_ssh_command(cmd_buf, open_connection_args, login_args,
+                                   print_out, print_err, ignore_err, fork,
+                                   quiet, test_mode)
+
+###############################################################################
+
+
+###############################################################################
+def os_execute_command(cmd_buf,
+                       print_out=0,
+                       print_err=0,
+                       ignore_err=0,
+                       fork=0,
+                       quiet=None,
+                       test_mode=None):
+
+    r"""
+    Run the given command in an OS SSH session and return the stdout, stderr
+    and the return code.
+
+    This function will obtain the global values for OS_HOST, OS_USERNAME, etc.
+
+    Description of arguments:
+    cmd_buf                         The command string to be run in an SSH
+                                    session.
+    print_out                       If this is set, this function will print
+                                    the stdout/stderr generated by the shell
+                                    command.
+    print_err                       If show_err is set, this function will
+                                    print a standardized error report if the
+                                    shell command returns non-zero.
+    ignore_err                      Indicates that errors encountered on the
+                                    sshlib.execute_command are to be ignored.
+    fork                            Indicates that sshlib.start is to be used
+                                    rather than sshlib.execute_command.
+    quiet                           Indicates whether this function should run
+                                    the pissuing() function prints an
+                                    "Issuing: <cmd string>" to stdout.  This
+                                    defaults to the global quiet value.
+    test_mode                       If test_mode is set, this function will
+                                    not actually run the command.  This
+                                    defaults to the global test_mode value.
+    """
+
+    # Get global OS variable values.
+    os_host = BuiltIn().get_variable_value("${OS_HOST}", default="")
+    os_username = BuiltIn().get_variable_value("${OS_USERNAME}",
+                                               default="")
+    os_password = BuiltIn().get_variable_value("${OS_PASSWORD}",
+                                               default="")
+
+    if not gv.valid_value(os_host):
+        return "", "", 1
+    if not gv.valid_value(os_username):
+        return "", "", 1
+    if not gv.valid_value(os_password):
+        return "", "", 1
+
+    open_connection_args = {'host': os_host, 'alias': 'os_connection'}
+    login_args = {'username': os_username, 'password': os_password}
+
+    return grs.execute_ssh_command(cmd_buf, open_connection_args, login_args,
+                                   print_out, print_err, ignore_err, fork,
+                                   quiet, test_mode)
+
+###############################################################################
