diff --git a/lib/connection_client.robot b/lib/connection_client.robot
index b67996c..e3bbdff 100755
--- a/lib/connection_client.robot
+++ b/lib/connection_client.robot
@@ -53,6 +53,14 @@
 
     Login  ${username}  ${password}
 
+Open Connection for SCP
+    Import Library      SCPLibrary      WITH NAME       scp
+    Run Keyword If  '${SSH_PORT}' == '${EMPTY}'  scp.Open connection  ${OPENBMC_HOST}
+    ...  username=${OPENBMC_USERNAME}  password=${OPENBMC_PASSWORD}
+    ...  ELSE   Run Keyword    scp.Open connection  ${OPENBMC_HOST}  port=${SSH_PORT}
+    ...  username=${OPENBMC_USERNAME}  password=${OPENBMC_PASSWORD}
+
+
 User input SSH and HTTPs Ports
     [Documentation]   Update the global SSH and HTTPs port variable for QEMU
     ${port_num}=    Convert To Integer    ${SSH_PORT}
diff --git a/lib/openbmc_ffdc.robot b/lib/openbmc_ffdc.robot
new file mode 100644
index 0000000..eb0bd71
--- /dev/null
+++ b/lib/openbmc_ffdc.robot
@@ -0,0 +1,156 @@
+*** Settings ***
+Documentation      This module is for collecting data on test case failure
+...                for openbmc systems. It will collect the data with a
+...                default name openbmc_ffdc_report.txt under directory
+...                logs/testSuite/testcaseName/ on failure.
+
+Library            String
+Library            DateTime
+Library            openbmc_ffdc_list.py
+
+Resource           resource.txt
+Resource           connection_client.robot
+
+*** Variables ***
+
+${PRINT_LINE}      ------------------------------------------------------------------------
+
+${MSG_INTRO}       This document contains the following information:
+${MSG_DETAIL}      ${\n}\t\t[ Detailed Logs Captured Section ]
+${HEADER_MSG}      ${\n}${PRINT_LINE}${\n}\t\tOPEN BMC TEST FAILURE DATA CAPTURE
+...                ${\n}\t\t----------------------------------
+...                ${\n}${\n}TEST SUITE FILE\t\t: ${SUITE_NAME} ${\n}
+${FOOTER_MSG}      ${PRINT_LINE} ${\n}
+
+${FFDC_LOG_PATH}   ${EXECDIR}${/}logs${/}
+
+*** Keywords ***
+
+Log FFDC
+    [Documentation]   Generic FFDC entry point. Place holder to hook in
+    ...               other data collection
+
+    Log FFDC If Test Case Failed
+
+
+Log FFDC If Test Case Failed
+    [Documentation]   Main entry point to gather logs on Test case failure
+
+    # Return from here if the test case is a PASS
+    Return From Keyword If  '${TEST_STATUS}' != 'FAIL'
+
+    ${cur_time}=       get current time stamp
+    Log To Console     ${\n}FFDC Collection Started \t: ${cur_time}
+    # Log directory setup
+    ${suite_dir}=      get strip string   ${SUITE_NAME}
+    ${testname_dir}=   get strip string   ${TEST_NAME}
+
+    Set Suite Variable   ${FFDC_DIR_PATH}   ${FFDC_LOG_PATH}${suite_dir}${/}${testname_dir}
+
+    # -- FFDC workspace create --
+    create ffdc directory
+    openbmc header message
+
+    # -- FFDC processing entry point --
+    Execute FFDC command list on BMC
+
+    ${cur_time}=       get current time stamp
+    Log To Console     FFDC Collection Completed \t: ${cur_time}
+    Log                ${\n}${FFDC_DIR_PATH}
+
+
+create ffdc directory
+    [Documentation]    Creates directory and report file
+    Create Directory   ${FFDC_DIR_PATH}
+    create ffdc report file
+
+
+create ffdc report file
+    [Documentation]     Create a generic file name for ffdc
+    Set Suite Variable  ${FFDC_FILE_PATH}   ${FFDC_DIR_PATH}${/}openbmc_ffdc_report.txt
+    Create File         ${FFDC_FILE_PATH}
+
+
+write data to file
+    [Documentation]     Write data to the ffdc report document
+    [Arguments]         ${data}=""
+    Append To File      ${FFDC_FILE_PATH}   ${data}
+
+
+get current time stamp
+    [Documentation]     Get the current time stamp data
+    ${cur_time}=    Get Current Date      result_format=%Y-%m-%d %H:%M:%S,%f
+    [return]   ${cur_time}
+
+openbmc header message
+    [Documentation]     Write header message to the report document
+    ${cur_time}=    get current time stamp
+    write data to file    ${HEADER_MSG}
+    write data to file    TEST CASE NAME\t\t: ${TEST_NAME}${\n}
+    write data to file    FAILURE TIME STAMP\t: ${cur_time}${\n}
+    write data to file    ${\n}${MSG_INTRO}${\n}
+
+    # --- FFDC header notes ---
+    @{entries}=     Get ffdc index
+    :FOR  ${index}  IN   @{entries}
+    \   write data to file   * ${index.upper()}
+    \   write data to file   ${\n}
+
+    write data to file    ${FOOTER_MSG}
+    write data to file    ${MSG_DETAIL}
+
+write cmd output to ffdc file
+    [Documentation]     Write cmd output data to the report document
+    [Arguments]         ${data_str}=""   ${data_cmd}=""
+    write data to file  ${\n}${FOOTER_MSG}
+    write data to file  ${ENTRY_CMD_TYPE.upper()} : ${data_str}\t
+    write data to file  Executed : ${data_cmd} ${\n}
+    write data to file  ${FOOTER_MSG}
+
+
+Execute FFDC command list on BMC
+    [Documentation]    Get the commands, connect to BMC and execute commands
+    ${con_status}=   Run Keyword And Return Status    Open Connection And Log In
+    Run Keyword And Return If   ${con_status} == ${False}  Log  Open Connection Failed
+
+    @{entries}=     Get ffdc index
+    :FOR  ${index}  IN   @{entries}
+    \     Loop through ffdc dict list and execute   ${index}
+
+
+Loop through ffdc dict list and execute
+    [Documentation]    Feed in key pair list from dictionary to execute
+    [Arguments]        ${data_str}=
+    @{ffdc_default_list}=    Get ffdc cmd    ${data_str}
+
+    Set Suite Variable   ${ENTRY_CMD_TYPE}   ${data_str}
+    :FOR  ${cmd}  IN  @{ffdc_default_list}
+    \    Execute command and write to ffdc    ${cmd[0]}  ${cmd[1]}
+
+
+Execute command and write to ffdc
+    [Documentation]    Execute command on bmc box and write to ffdc
+    [Arguments]        ${data_str}=""   ${data_cmd}=""
+    write cmd output to ffdc file   ${data_str}  ${data_cmd}
+
+    ${stdout}  ${stderr}=    Execute Command    ${data_cmd}   return_stderr=True
+    # Write stdout data on success and error msg to the file on failure
+    Run Keyword If   '${stderr}' == '${EMPTY}'   write data to file   ${stdout} ${\n}
+    ...  ELSE  Run Keyword   write data to file  ${stderr} ${\n}
+    write data to file    ${FOOTER_MSG}
+
+
+Offload file list from BMC
+    [Documentation]    Copy files to current log directory
+    ${con_status}=     Run Keyword And Return Status    Open Connection for SCP
+    Run Keyword And Return If   ${con_status} == ${False}  Log  SCP Connection Failed
+
+    # --- Files to be copied ---
+    @{ffdc_default_list}=    Get ffdc file    BMC Files
+    Set Suite Variable   ${ENTRY_CMD_TYPE}    BMC Files
+
+    :FOR  ${cmd}  IN  @{ffdc_default_list}
+    # Get File from server to current test FFDC directory
+    \    write cmd output to ffdc file  ${cmd[0]}  scp file ${cmd[1]}
+    \    scp.Get File    ${cmd[1]}  ${FFDC_DIR_PATH}
+
diff --git a/lib/openbmc_ffdc_list.py b/lib/openbmc_ffdc_list.py
new file mode 100644
index 0000000..3a2950a
--- /dev/null
+++ b/lib/openbmc_ffdc_list.py
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+'''
+#############################################################
+#    @file     openbmc_ffdc_list.py
+#    @author:  George Keishing
+#
+#    @brief    List for FFDC ( First failure data capture )
+#              commands and files to be collected as a part
+#              of the test case failure.
+#############################################################
+'''
+
+#-------------------
+# FFDC default list
+#-------------------
+
+#-----------------------------------------------------------------
+#Dict Name {  Index string : { Key String :  Comand string} }
+#-----------------------------------------------------------------
+FFDC_CMD = {
+             'DRIVER INFO' :
+                     {
+                        'FW Level' : 'cat /etc/os-release',
+                        'OS Details' : 'uname -a',
+                        'Build Info' : 'cat /etc/version',
+                     },
+             'BMC DATA' :
+                     {
+                        'System journal log' : 'journalctl --no-pager',
+                        'Displays processor activity' : 'top -n 1 -b',
+                     },
+             'APPLICATION DATA' :
+                     {
+                        'BMC state' : '/usr/sbin/obmcutil  state',
+                     },
+           }
+
+# add file list needed to be offload from BMC
+FFDC_FILE = {
+             'BMC FILES' :
+                     {
+                        # Sample example how to add the file that
+                        # is needed to be offloaded
+                        #'Release info' : '/etc/os-release',
+                     },
+           }
+
+#-----------------------------------------------------------------
+
+
+# base class for FFDC default list
+class openbmc_ffdc_list():
+
+    ########################################################################
+    #   @@brief   This method returns the list from the dictionary for cmds
+    #   @param    i_type: @type string: string index lookup
+    #   @return   List of key pair from the dictionary
+    ########################################################################
+    def get_ffdc_cmd(self,i_type):
+        return FFDC_CMD[i_type].items()
+
+    ########################################################################
+    #   @@brief   This method returns the list from the dictionary for scp
+    #   @param    i_type: @type string: string index lookup
+    #   @return   List of key pair from the dictionary
+    ########################################################################
+    def get_ffdc_file(self,i_type):
+        return FFDC_FILE[i_type].items()
+
+    ########################################################################
+    #   @@brief   This method returns the list index from dictionary
+    #   @return   List of index to the dictionary
+    ########################################################################
+    def get_ffdc_index(self):
+        return FFDC_CMD.keys()
+
+    ########################################################################
+    #   @brief    Returns the stripped strings
+    #   @param    i_str: @type string: string name
+    #   @return   Remove all special chars and return the string
+    ########################################################################
+    def get_strip_string(self, i_str):
+        return ''.join(e for e in i_str if e.isalnum())
+
