diff --git a/tools/dreport b/tools/dreport
deleted file mode 100755
index d37131c..0000000
--- a/tools/dreport
+++ /dev/null
@@ -1,682 +0,0 @@
-#! /bin/bash
-
-help=$"
-        dreport creates an archive(xz compressed) consisting of the following:
-                * Configuration information
-                * Debug information
-                * A summary report
-        The type parameter controls the content of the data. The generated
-        archive is stored in the user specified location.
-
-usage: dreport [OPTION]
-
-Options:
-        -n, —-name <name>     Name to be used for the archive.
-                              Default name format obmcdump_<id>_<epochtime>
-        -d, —-dir <directory> Archive directory to copy the compressed report.
-                              Default output directory is /tmp
-        -i, —-id <id>         Dump identifier to associate with the archive.
-                              Identifiers include numeric characters.
-                              Default dump identifier is 0
-        -t, —-type <type>     Data collection type. Valid types are
-                              "user", "core", "elog".
-                              Default type is "user" initiated.
-        -p, —-path <path>     Optional contents to be included in the archive.
-                              Valid paths are absolute file path or d-bus path
-                              based on type parameter.
-                                 -Absolute file path for "core" type.
-                                 -elog d-bus object for "elog" type.
-        -s, --size <size>     Maximum allowed size(in KB) of the archive.
-                              Report will be truncated in case size exceeds
-                              this limit. Default size is unlimited.
-        -v, —-verbose         Increase logging verbosity.
-        -V, --version         Output version information.
-        -q, —-quiet           Only log fatal errors to stderr
-        -h, —-help            Display this help and exit.
-"
-
-#CONSTANTS
-declare -r TRUE=1
-declare -r FALSE=0
-declare -r UNLIMITED="unlimited"
-declare -r SUMMARY_DUMP="summary"
-declare -r TYPE_USER="user"
-declare -r TYPE_CORE="core"
-declare -r TYPE_ELOG="elog"
-declare -r SUMMARY_LOG="summary.log"
-declare -r DREPORT_LOG="dreport.log"
-declare -r TMP_DIR="/tmp"
-declare -r EPOCHTIME=$(date +"%s")
-declare -r TIME_STAMP="date -u"
-
-#Error Codes
-declare -r SUCCESS="0"
-declare -r INTERNAL_FAILURE="1"
-declare -r RESOURCE_UNAVAILABLE="2"
-
-#VARIABLES
-declare -x name=""
-declare -x dump_dir="/tmp"
-declare -x dump_id="00000000"
-declare -x dump_type=$TYPE_USER
-declare -x verbose=$FALSE
-declare -x quiet=$FALSE
-declare -x dump_size="unlimited"
-declare -x name_dir=""
-declare -x optional_path=""
-declare -x dreport_log=""
-declare -x summary_log=""
-declare -x cur_dump_size=0
-declare -a command_list=("")
-declare -x pid="0"
-declare -x elog_id=""
-
-# @brief Initialize general command array
-#        Set of commands, which provide general debug information
-function runlevel_general()
-{
-command_list=(
-    get_fw_level
-    bmc_state
-    host_state
-    chassis_state
-    get_host_info
-    get_uname
-    get_uptime
-    get_disk_usage
-    get_host_info
-    get_cpuinfo
-    get_meminfo
-    get_top
-    )
-}
-
-# @brief Initialize user type command array
-function runlevel_user()
-{
-command_list=(
-    get_journal
-    get_elog_all
-    get_obmc_console
-    get_failed_services
-    )
-}
-
-# @brief Initialize core type command array
-function runlevel_core()
-{
-command_list=(
-    move_optional_file
-    get_proc_journal
-    get_failed_services
-    get_obmc_console
-    )
-}
-
-# @brief Initialize elog type command array
-function runlevel_elog()
-{
-command_list=(
-    get_proc_journal
-    get_elog
-    )
-}
-
-function get_fw_level()
-{
-    desc="Firmware Release"
-    command="cat /etc/os-release"
-    copy_loc="firmware_release.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_uname()
-{
-    desc="uname"
-    command="uname -a"
-    copy_loc="uname.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_uptime()
-{
-    desc="uptime"
-    command="uptime"
-    copy_loc="uptime.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_disk_usage()
-{
-    desc="Disk Usage"
-    command="df -hT"
-    copy_loc="disk_usage.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_journal()
-{
-    desc="Journal log"
-    command="journalctl -o json-pretty -r"
-    copy_loc="journal.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_proc_journal()
-{
-    desc="Process Journal log"
-    command="journalctl -o verbose _PID=$pid"
-    copy_loc="proc_journal.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_host_info()
-{
-    desc="Host information"
-    command="hostnamectl status"
-    copy_loc="hostnamectl.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_failed_services()
-{
-    desc="Failed Services"
-    command="systemctl --failed"
-    copy_loc="failed_services.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_obmc_console()
-{
-    desc="OBMC Console"
-    command="cat /var/log/obmc-console.log"
-    copy_loc="obmc_console.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_cpuinfo()
-{
-    desc="cpuinfo"
-    command="cat /proc/cpuinfo"
-    copy_loc="cpuinfo.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_meminfo()
-{
-    desc="meminfo"
-    command="cat /proc/meminfo"
-    copy_loc="meminfo.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function get_top()
-{
-    desc="top"
-    command="top -n 1 -b"
-    copy_loc="top.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function bmc_state()
-{
-    desc="BMC State"
-    command="busctl get-property \
-                    xyz.openbmc_project.State.BMC \
-                    /xyz/openbmc_project/state/bmc0 \
-                    xyz.openbmc_project.State.BMC \
-                    CurrentBMCState"
-    copy_loc="BMCState.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function host_state()
-{
-    desc="Host State"
-    command="busctl get-property \
-                    xyz.openbmc_project.State.Host \
-                    /xyz/openbmc_project/state/host0 \
-                    xyz.openbmc_project.State.Host \
-                    CurrentHostState"
-    copy_loc="HostState.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function chassis_state()
-{
-    desc="Chassis State"
-    command="busctl get-property \
-                    xyz.openbmc_project.State.Chassis \
-                    /xyz/openbmc_project/state/chassis0 \
-                    xyz.openbmc_project.State.Chassis \
-                    CurrentPowerState"
-    copy_loc="ChassisState.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-# @brief get all available elogs in BMC.
-function get_elog_all()
-{
-    desc="elog"
-
-    entries=$(busctl --list --no-pager tree \
-                     xyz.openbmc_project.Logging | grep \
-                     '/xyz/openbmc_project/logging/entry/')
-
-    #check for eSEL entries.
-    if [ -z "$entries" ]; then
-        log_info "No $desc entries"
-        return 0
-    fi
-
-    command="busctl --list --no-pager tree \
-                     xyz.openbmc_project.Logging | grep \
-                     '/xyz/openbmc_project/logging/entry/' \
-                     | xargs -I {} busctl --verbose --no-pager \
-                     call xyz.openbmc_project.Logging {} \
-                     org.freedesktop.DBus.Properties GetAll s \
-                     xyz.openbmc_project.Logging.Entry"
-    copy_loc="elog.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-# @brief get elog specific to global elog_id
-function get_elog()
-{
-    desc="elog id:$elog_id"
-
-    command="busctl --verbose --no-pager \
-                     call xyz.openbmc_project.Logging \
-                     $optional_path \
-                     org.freedesktop.DBus.Properties GetAll s \
-                     xyz.openbmc_project.Logging.Entry"
-    copy_loc="elog_$elog_id.log"
-    run_command "$command" "$copy_loc" "$desc"
-}
-
-function move_optional_file()
-{
-    desc="Move Optional file"
-
-    mv $optional_path $name_dir
-    if [ $? -ne 0 ]; then
-        log_error "Failed to move file $optional_path"
-        return 1
-    fi
-    if check_size "$name_dir/$(basename "$optional_path")"; then
-        log_info "Moving file $file_name"
-    else
-        log_warning "Skipping $file_name move"
-    fi
-}
-
-# @brief Run the requested command and save the output
-#        into temporary location for successful size check
-
-function run_command()
-{
-    command="$1"
-    copy_loc="$2"
-    desc="$3"
-
-    eval $command >> "$name_dir/$copy_loc"
-    if [ $? -ne 0 ]; then
-        log_error "Failed to collect $desc"
-        return 1
-    fi
-
-    if check_size "$name_dir/$copy_loc"; then
-        log_info "Collected $desc"
-    else
-        log_warning "Skipping $desc"
-    fi
-}
-
-# @brief Initiate data collection based on the type.
-# @return 0 on success, error code otherwise
-function collect_data()
-{
-    runlevel_general
-    capture_data "${command_list[@]}"
-
-    case $dump_type in
-        $TYPE_USER)
-            runlevel_user
-            capture_data "${command_list[@]}"
-            ;;
-        $TYPE_CORE)
-            set_core_pid
-            runlevel_core
-            capture_data "${command_list[@]}"
-            ;;
-        $TYPE_ELOG)
-            elog_id=$(basename "$optional_path")
-            set_elog_pid
-            runlevel_elog
-            capture_data "${command_list[@]}"
-            ;;
-
-        $SUMMARY_DUMP)
-            #No data collection is required.
-            ;;
-        *) # unknown option
-            log_error "Skipping: Unknown dump type: $dump_type"
-            ;;
-    esac
-}
-
-# @brief set pid by reading information from the optional path.
-#        dreport "core" type user provides core file as optional path parameter.
-#        As per coredump source code systemd-coredump uses below format
-#        https://github.com/systemd/systemd/blob/master/src/coredump/coredump.c
-#        /var/lib/systemd/coredump/core.%s.%s." SD_ID128_FORMAT_STR “.
-#        <process ID>.%s000000"
-function set_core_pid()
-{
-    #Escape bash characters in file name
-    file=$(printf %q "$optional_path")
-
-    #matching systemd-coredump core file format.
-    pid=$(echo $file | awk -F . '{ print $5}')
-}
-
-# @brief set elog pid by reading _PID information from the elog d-bus object.
-#        _PID information is stored  elog Additional data field
-#        Data format  "_PID=<pid>"
-function set_elog_pid()
-{
-    additional_data=$(busctl get-property xyz.openbmc_project.Logging \
-                             $optional_path \
-                             xyz.openbmc_project.Logging.Entry \
-                             AdditionalData)
-
-    #read _PID data.
-    if [ ! -z "$additional_data" ]; then
-        pid=$(echo $additional_data | \
-                   awk -F _PID= '{ print ($2+0)}')
-    fi
-}
-
-# @brief Capture debug data based on the input command array.
-#        and stores in to global temporary name specific location.
-# @param $1 Source array
-# @return 0 on success, error code otherwise
-function capture_data()
-{
-    source=("$@")
-
-    for ((i=0;i<${#source[@]};i+=1)); do
-        ${source[i]}
-    done
-
-    return 0
-}
-
-# @brief Calculate file or directory compressed size based on input
-#        and check whether the size in the the allowed size limit.
-#        Remove the file or directory from the name_dir
-#        if the check fails.
-# @param $1 Source file or directory
-# @return 0 on success, error code if size exceeds the limit.
-# Limitation: compress and tar will have few bytes size difference
-function check_size()
-{
-    source=$1
-
-    #No size check required incase dump_size is set to unlimited
-    if [ $dump_size = $UNLIMITED ]; then
-        return 0
-    fi
-
-    #get the file or directory size
-    if [[ -d $source ]] && [[ -n $source ]]; then
-        tar -cf "$source.tar" -C \
-                 $(dirname "$source") $(basename "$source")
-        size=$(stat -c%s "$source.tar")
-        rm "$source.tar"
-    else
-        size=$(stat -c%s "$source")
-    fi
-
-    if [ $((size + cur_dump_size)) -gt $dump_size ]; then
-        #Exceed the allowed limit,
-        #tar and compress the files and check the size
-        tar -Jcf "$name_dir.tar.xz" -C \
-                  $(dirname "$name_dir") $(basename "$name_dir")
-        size=$(stat -c%s "$name_dir.tar.xz")
-        if [ $size -gt $dump_size ]; then
-            #Remove the the specific data from the name_dir and contniue
-            rm "$source" "$name_dir.tar.xz"
-            return $RESOURCE_UNAVAILABLE
-        else
-            rm "$name_dir.tar.xz"
-        fi
-    fi
-
-    #Remove the compressed file from the name directory
-    cur_dump_size=$((size + cur_dump_size))
-    return $SUCCESS
-}
-
-# @brief Initial version of the summary log
-init_summary()
-{
-   log_summary "Name:          $name.tar.xz"
-   log_summary "Epochtime:     $EPOCHTIME"
-   log_summary "ID:            $dump_id"
-   log_summary "Type:          $dump_type"
-   log_summary "Optional path: $optional_path"
-}
-
-# @brief Check the validity of user inputs and initialize global
-#        variables. Create directory for temporary data collection
-# @return 0 on success, error code otherwise
-
-function initialize()
-{
-    #Dump file name
-    if [ -z $name ]; then
-        name=$"obmcdump_"$dump_id"_$EPOCHTIME"
-    fi
-
-    #Create temporary data directory.
-    mkdir -p "$TMP_DIR/$name"
-    if [ $? -ne 0 ]; then
-        echo "Error: Failed to create the temporary directory."
-        return $RESOURCE_UNAVAILABLE;
-    fi
-
-    #name directory
-    name_dir="$TMP_DIR/$name"
-
-    #dreport log file
-    dreport_log="$name_dir/$DREPORT_LOG"
-
-    #summary log file
-    summary_log="$name_dir/$SUMMARY_LOG"
-
-    #Type
-    if [[ !($dump_type = $TYPE_USER || \
-            $dump_type = $TYPE_CORE || \
-            $dump_type = $TYPE_ELOG) ]]; then
-       log_error "Invalid -type, Only summary log is available"
-       dump_type=$SUMMARY_DUMP
-    fi
-
-    #Size
-    #Check the input is integer.
-    if [ "$dump_size" -eq "$dump_size" ] 2>/dev/null; then
-       #Converts in to bytes.
-       dump_size="$((dump_size * 1024))"
-    else
-       dump_size=$UNLIMITED
-    fi
-
-    return $SUCCESS
-}
-
-# @brief Packaging the dump and transferring to dump location.
-function package()
-{
-    mkdir -p "$dump_dir"
-    if [ $? -ne 0 ]; then
-        log_error "Could not create the destination directory $dump_dir"
-        dest_dir=$TMP_DIR
-    fi
-
-    #tar and compress the files.
-    tar -Jcf "$name_dir.tar.xz" -C \
-             $(dirname "$name_dir") $(basename "$name_dir")
-
-    if [ $? -ne 0 ]; then
-        echo $($TIME_STAMP) "Could not create the compressed tar file"
-        rm -r "$name_dir"
-        return $INTERNAL_FAILURE
-    fi
-
-    #remove the temporary name specific directory
-    rm -r "$name_dir"
-
-    echo $($TIME_STAMP) "Report is available in $dump_dir"
-
-    if [ "$TMP_DIR" == "$dump_dir" ]; then
-       return $SUCCESS
-    fi
-
-    #copy the compressed tar file into the destination
-    cp "$name_dir.tar.xz" "$dump_dir"
-    if [ $? -ne 0 ]; then
-        echo "Failed to copy the $name_dir.tar.xz to $dump_dir"
-        rm "$name_dir.tar.xz"
-        return $INTERNAL_FAILURE
-    fi
-
-    #Remove the temporary copy of the file
-    rm "$name_dir.tar.xz"
-}
-
-# @brief log the error message
-# @param error message
-function log_error()
-{
-   echo $($TIME_STAMP) "ERROR: $@" >> $dreport_log
-   if ((quiet != TRUE)); then
-      echo $($TIME_STAMP) "ERROR: $@" >&2
-   fi
-}
-
-# @brief log warning message
-# @param warning message
-function log_warning()
-{
-    if ((verbose == TRUE)); then
-        echo $($TIME_STAMP) "WARNING: $@" >> $dreport_log
-        if ((quiet != TRUE)); then
-            echo $($TIME_STAMP) "WARNING: $@" >&2
-        fi
-    fi
-}
-
-# @brief log info message
-# @param info message
-function log_info()
-{
-    if ((verbose == TRUE)); then
-        echo $($TIME_STAMP) "INFO: $@" >> $dreport_log
-        if ((quiet != TRUE)); then
-            echo $($TIME_STAMP) "INFO: $@" >&1
-        fi
-    fi
-}
-
-# @brief log summary message
-# @param message
-function log_summary()
-{
-    echo $($TIME_STAMP) "$@" >> $summary_log
-    if ((quiet != TRUE)); then
-        echo $($TIME_STAMP) "$@" >&1
-    fi
-}
-
-# @brief Main function
-function main()
-{
-    #initialize the global variables and
-    #create temporary storage locations
-    initialize
-    result=$?
-    if [[ ${result} -ne $SUCCESS ]]; then
-        echo $($TIME_STAMP) "Error: Failed to initialize, Exiting"
-        exit;
-    fi
-
-    #Initilize the summary log
-    init_summary
-
-    #collect data based on the type.
-    collect_data
-
-    package  #package the dump
-    result=$?
-    if [[ ${result} -ne $SUCCESS ]]; then
-        echo $($TIME_STAMP) "Error: Failed to package, Exiting"
-    else
-        echo $($TIME_STAMP) "Sucessfully completed"
-        exit;
-    fi
-}
-
-TEMP=`getopt -o n:d:i:t:s:p:vVqh \
-      --long name:,dir:,dumpid:,type:,size:,path:,verbose,version,quiet,help \
-      -- "$@"`
-
-if [ $? -ne 0 ]
-then
-    echo "Error: Invalid options"
-    exit 1
-fi
-
-eval set -- "$TEMP"
-
-while [[ $# -gt 1 ]]; do
-    key="$1"
-    case $key in
-        -n|--name)
-            name=$2
-            shift 2;;
-        -d|--dir)
-            dump_dir=$2
-            shift 2;;
-        -i|--dumpid)
-            dump_id=$2
-            shift 2;;
-        -t|--type)
-            dump_type=$2
-            shift 2;;
-        -s|--size)
-            dump_size=$2
-            shift 2;;
-        -p|--path)
-            optional_path=$2
-            shift 2;;
-        -v|—-verbose)
-            verbose=$TRUE
-            shift;;
-        -V|--version)
-            shift;;
-        -q|—-quiet)
-            quiet=$TRUE
-            shift;;
-        -h|--help)
-            echo "$help"
-            exit;;
-        *) # unknown option
-            log_error "Unknown argument: $1"
-            log_info "$help"
-            exit 1;;
-    esac
-done
-
-main #main program
-exit $?
diff --git a/tools/dreport.d/dreport b/tools/dreport.d/dreport
new file mode 100755
index 0000000..908d6ec
--- /dev/null
+++ b/tools/dreport.d/dreport
@@ -0,0 +1,328 @@
+#! /bin/bash
+
+help=$"
+        dreport creates an archive(xz compressed) consisting of the following:
+                * Configuration information
+                * Debug information
+                * A summary report
+        The type parameter controls the content of the data. The generated
+        archive is stored in the user specified location.
+
+usage: dreport [OPTION]
+
+Options:
+        -n, —-name <name>     Name to be used for the archive.
+                              Default name format obmcdump_<id>_<epochtime>
+        -d, —-dir <directory> Archive directory to copy the compressed report.
+                              Default output directory is /tmp
+        -i, —-id <id>         Dump identifier to associate with the archive.
+                              Identifiers include numeric characters.
+                              Default dump identifier is 0
+        -t, —-type <type>     Data collection type. Valid types are
+                              "user", "core", "elog".
+                              Default type is "user" initiated.
+        -p, —-path <path>     Optional contents to be included in the archive.
+                              Valid paths are absolute file path or d-bus path
+                              based on type parameter.
+                                 -Absolute file path for "core" type.
+                                 -elog d-bus object for "elog" type.
+        -s, --size <size>     Maximum allowed size(in KB) of the archive.
+                              Report will be truncated in case size exceeds
+                              this limit. Default size is unlimited.
+        -v, —-verbose         Increase logging verbosity.
+        -V, --version         Output version information.
+        -q, —-quiet           Only log fatal errors to stderr
+        -h, —-help            Display this help and exit.
+"
+
+#CONSTANTS
+declare -rx TRUE=1
+declare -rx FALSE=0
+declare -rx UNLIMITED="unlimited"
+declare -rx SUMMARY_DUMP="summary"
+declare -rx TYPE_USER="user"
+declare -rx TYPE_CORE="core"
+declare -rx TYPE_ELOG="elog"
+declare -rx SUMMARY_LOG="summary.log"
+declare -rx DREPORT_LOG="dreport.log"
+declare -rx TMP_DIR="/tmp"
+declare -rx EPOCHTIME=$(date +"%s")
+declare -rx TIME_STAMP="date -u"
+declare -rx PLUGIN="pl_"
+declare -rx DREPORT_SOURCE="/usr/share/dreport.d"
+declare -rx DREPORT_INCLUDE="$DREPORT_SOURCE/include.d"
+
+#Error Codes
+declare -rx SUCCESS="0"
+declare -rx INTERNAL_FAILURE="1"
+declare -rx RESOURCE_UNAVAILABLE="2"
+
+#VARIABLES
+declare -x name=""
+declare -x dump_dir="/tmp"
+declare -x dump_id="00000000"
+declare -x dump_type=$TYPE_USER
+declare -x verbose=$FALSE
+declare -x quiet=$FALSE
+declare -x dump_size="unlimited"
+declare -x name_dir=""
+declare -x optional_path=""
+declare -x dreport_log=""
+declare -x summary_log=""
+declare -x cur_dump_size=0
+declare -x pid="0"
+declare -x elog_id=""
+
+#Source dreport common functions
+. $DREPORT_INCLUDE/functions
+
+# @brief Initiate data collection based on the type.
+# @return 0 on success, error code otherwise
+function collect_data()
+{
+    case $dump_type in
+        $TYPE_USER)
+            ;;
+        $TYPE_CORE)
+            log_summary "Core: $optional_path"
+            set_core_pid
+            ;;
+        $TYPE_ELOG)
+            log_summary "ELOG: $optional_path"
+            elog_id=$(basename "$optional_path")
+            set_elog_pid
+            ;;
+
+        $SUMMARY_DUMP)
+            #No data collection is required.
+            return
+            ;;
+        *) # unknown option
+            log_error "Skipping: Unknown dump type: $dump_type"
+            return
+            ;;
+    esac
+
+    plugin_path=$DREPORT_SOURCE/$PLUGIN$dump_type.d
+
+    # check plugin directory for this dump type?
+    if [ ! -d $plugin_path ]; then
+        log_error "$plugin_path does not exist, skipping dump collection"
+        return 0
+    fi
+
+    #Executes plugins based on the type.
+    for i in $plugin_path/* ; do
+       $i
+    done
+}
+
+# @brief set pid by reading information from the optional path.
+#        dreport "core" type user provides core file as optional path parameter.
+#        As per coredump source code systemd-coredump uses below format
+#        https://github.com/systemd/systemd/blob/master/src/coredump/coredump.c
+#        /var/lib/systemd/coredump/core.%s.%s." SD_ID128_FORMAT_STR “.
+#        <process ID>.%s000000"
+function set_core_pid()
+{
+    #Escape bash characters in file name
+    file=$(printf %q "$optional_path")
+
+    #matching systemd-coredump core file format.
+    pid=$(echo $file | awk -F . '{ print $5}')
+}
+
+# @brief set elog pid by reading _PID information from the elog d-bus object.
+#        _PID information is stored  elog Additional data field
+#        Data format  "_PID=<pid>"
+function set_elog_pid()
+{
+    additional_data=$(busctl get-property xyz.openbmc_project.Logging \
+                             $optional_path \
+                             xyz.openbmc_project.Logging.Entry \
+                             AdditionalData)
+
+    #read _PID data.
+    if [ ! -z "$additional_data" ]; then
+        pid=$(echo $additional_data | \
+                   awk -F _PID= '{ print ($2+0)}')
+    fi
+}
+
+# @brief Initial version of the summary log
+init_summary()
+{
+   log_summary "Name:          $name.tar.xz"
+   log_summary "Epochtime:     $EPOCHTIME"
+   log_summary "ID:            $dump_id"
+   log_summary "Type:          $dump_type"
+}
+
+# @brief Check the validity of user inputs and initialize global
+#        variables. Create directory for temporary data collection
+# @return 0 on success, error code otherwise
+
+function initialize()
+{
+    #Dump file name
+    if [ -z $name ]; then
+        name=$"obmcdump_"$dump_id"_$EPOCHTIME"
+    fi
+
+    #Create temporary data directory.
+    mkdir -p "$TMP_DIR/$name"
+    if [ $? -ne 0 ]; then
+        echo "Error: Failed to create the temporary directory."
+        return $RESOURCE_UNAVAILABLE;
+    fi
+
+    #name directory
+    name_dir="$TMP_DIR/$name"
+
+    #dreport log file
+    dreport_log="$name_dir/$DREPORT_LOG"
+
+    #summary log file
+    summary_log="$name_dir/$SUMMARY_LOG"
+
+    #Type
+    if [[ !($dump_type = $TYPE_USER || \
+            $dump_type = $TYPE_CORE || \
+            $dump_type = $TYPE_ELOG) ]]; then
+       log_error "Invalid -type, Only summary log is available"
+       dump_type=$SUMMARY_DUMP
+    fi
+
+    #Size
+    #Check the input is integer.
+    if [ "$dump_size" -eq "$dump_size" ] 2>/dev/null; then
+       #Converts in to bytes.
+       dump_size="$((dump_size * 1024))"
+    else
+       dump_size=$UNLIMITED
+    fi
+
+    return $SUCCESS
+}
+
+# @brief Packaging the dump and transferring to dump location.
+function package()
+{
+    mkdir -p "$dump_dir"
+    if [ $? -ne 0 ]; then
+        log_error "Could not create the destination directory $dump_dir"
+        dest_dir=$TMP_DIR
+    fi
+
+    #tar and compress the files.
+    tar -Jcf "$name_dir.tar.xz" -C \
+             $(dirname "$name_dir") $(basename "$name_dir")
+
+    if [ $? -ne 0 ]; then
+        echo $($TIME_STAMP) "Could not create the compressed tar file"
+        rm -r "$name_dir"
+        return $INTERNAL_FAILURE
+    fi
+
+    #remove the temporary name specific directory
+    rm -r "$name_dir"
+
+    echo $($TIME_STAMP) "Report is available in $dump_dir"
+
+    if [ "$TMP_DIR" == "$dump_dir" ]; then
+       return $SUCCESS
+    fi
+
+    #copy the compressed tar file into the destination
+    cp "$name_dir.tar.xz" "$dump_dir"
+    if [ $? -ne 0 ]; then
+        echo "Failed to copy the $name_dir.tar.xz to $dump_dir"
+        rm "$name_dir.tar.xz"
+        return $INTERNAL_FAILURE
+    fi
+
+    #Remove the temporary copy of the file
+    rm "$name_dir.tar.xz"
+}
+
+# @brief Main function
+function main()
+{
+    #initialize the global variables and
+    #create temporary storage locations
+    initialize
+    result=$?
+    if [[ ${result} -ne $SUCCESS ]]; then
+        echo $($TIME_STAMP) "Error: Failed to initialize, Exiting"
+        exit;
+    fi
+
+    #Initilize the summary log
+    init_summary
+
+    #collect data based on the type.
+    collect_data
+
+    package  #package the dump
+    result=$?
+    if [[ ${result} -ne $SUCCESS ]]; then
+        echo $($TIME_STAMP) "Error: Failed to package, Exiting"
+    else
+        echo $($TIME_STAMP) "Sucessfully completed"
+        exit;
+    fi
+}
+
+TEMP=`getopt -o n:d:i:t:s:p:vVqh \
+      --long name:,dir:,dumpid:,type:,size:,path:,verbose,version,quiet,help \
+      -- "$@"`
+
+if [ $? -ne 0 ]
+then
+    echo "Error: Invalid options"
+    exit 1
+fi
+
+eval set -- "$TEMP"
+
+while [[ $# -gt 1 ]]; do
+    key="$1"
+    case $key in
+        -n|--name)
+            name=$2
+            shift 2;;
+        -d|--dir)
+            dump_dir=$2
+            shift 2;;
+        -i|--dumpid)
+            dump_id=$2
+            shift 2;;
+        -t|--type)
+            dump_type=$2
+            shift 2;;
+        -s|--size)
+            dump_size=$2
+            shift 2;;
+        -p|--path)
+            optional_path=$2
+            shift 2;;
+        -v|—-verbose)
+            verbose=$TRUE
+            shift;;
+        -V|--version)
+            shift;;
+        -q|—-quiet)
+            quiet=$TRUE
+            shift;;
+        -h|--help)
+            echo "$help"
+            exit;;
+        *) # unknown option
+            log_error "Unknown argument: $1"
+            log_info "$help"
+            exit 1;;
+    esac
+done
+
+main #main program
+exit $?
