diff --git a/include/host_error_monitor.hpp b/include/host_error_monitor.hpp
new file mode 100644
index 0000000..eee1fab
--- /dev/null
+++ b/include/host_error_monitor.hpp
@@ -0,0 +1,95 @@
+/*
+// Copyright (c) 2021 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+#pragma once
+#include <sdbusplus/asio/object_server.hpp>
+
+#include <iostream>
+
+namespace host_error_monitor
+{
+bool hostIsOff();
+
+void startPowerCycle(std::shared_ptr<sdbusplus::asio::connection> conn)
+{
+    conn->async_method_call(
+        [](boost::system::error_code ec) {
+            if (ec)
+            {
+                std::cerr << "failed to set Chassis State\n";
+            }
+        },
+        "xyz.openbmc_project.State.Chassis",
+        "/xyz/openbmc_project/state/chassis0",
+        "org.freedesktop.DBus.Properties", "Set",
+        "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition",
+        std::variant<std::string>{
+            "xyz.openbmc_project.State.Chassis.Transition.PowerCycle"});
+}
+
+void startWarmReset(std::shared_ptr<sdbusplus::asio::connection> conn)
+{
+    conn->async_method_call(
+        [](boost::system::error_code ec) {
+            if (ec)
+            {
+                std::cerr << "failed to set Host State\n";
+            }
+        },
+        "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0",
+        "org.freedesktop.DBus.Properties", "Set",
+        "xyz.openbmc_project.State.Host", "RequestedHostTransition",
+        std::variant<std::string>{
+            "xyz.openbmc_project.State.Host.Transition.ForceWarmReboot"});
+}
+
+void startCrashdumpAndRecovery(
+    std::shared_ptr<sdbusplus::asio::connection> conn, bool recoverSystem,
+    const std::string& triggerType)
+{
+    static bool recover;
+    recover = recoverSystem;
+    std::cerr << "Starting crashdump\n";
+    static std::shared_ptr<sdbusplus::bus::match::match> crashdumpCompleteMatch;
+
+    if (!crashdumpCompleteMatch)
+    {
+        crashdumpCompleteMatch = std::make_shared<sdbusplus::bus::match::match>(
+            *conn,
+            "type='signal',interface='com.intel.crashdump.Stored',member='"
+            "CrashdumpComplete'",
+            [conn](sdbusplus::message::message& msg) {
+                std::cerr << "Crashdump completed\n";
+                if (recover)
+                {
+                    std::cerr << "Recovering the system\n";
+                    startWarmReset(conn);
+                }
+                crashdumpCompleteMatch.reset();
+            });
+    }
+
+    conn->async_method_call(
+        [](boost::system::error_code ec) {
+            if (ec)
+            {
+                std::cerr << "failed to start Crashdump\n";
+            }
+        },
+        "com.intel.crashdump", "/com/intel/crashdump",
+        "com.intel.crashdump.Stored", "GenerateStoredLog", triggerType);
+}
+
+} // namespace host_error_monitor
diff --git a/src/host_error_monitor.cpp b/src/host_error_monitor.cpp
index d52a5dc..7937d9b 100644
--- a/src/host_error_monitor.cpp
+++ b/src/host_error_monitor.cpp
@@ -20,6 +20,7 @@
 #include <boost/asio/posix/stream_descriptor.hpp>
 #include <boost/asio/steady_timer.hpp>
 #include <gpiod.hpp>
+#include <host_error_monitor.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 
 #include <bitset>
@@ -39,6 +40,10 @@
 static const constexpr char* rootPath = "/xyz/openbmc_project/CallbackManager";
 
 static bool hostOff = true;
+bool hostIsOff()
+{
+    return hostOff;
+}
 
 static size_t caterrTimeoutMs = 2000;
 const static constexpr size_t caterrTimeoutMsMax = 600000; // 10 minutes maximum
@@ -398,70 +403,6 @@
     return true;
 }
 
-static void startPowerCycle()
-{
-    conn->async_method_call(
-        [](boost::system::error_code ec) {
-            if (ec)
-            {
-                std::cerr << "failed to set Chassis State\n";
-            }
-        },
-        "xyz.openbmc_project.State.Chassis",
-        "/xyz/openbmc_project/state/chassis0",
-        "org.freedesktop.DBus.Properties", "Set",
-        "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition",
-        std::variant<std::string>{
-            "xyz.openbmc_project.State.Chassis.Transition.PowerCycle"});
-}
-
-static void startWarmReset()
-{
-    conn->async_method_call(
-        [](boost::system::error_code ec) {
-            if (ec)
-            {
-                std::cerr << "failed to set Host State\n";
-            }
-        },
-        "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0",
-        "org.freedesktop.DBus.Properties", "Set",
-        "xyz.openbmc_project.State.Host", "RequestedHostTransition",
-        std::variant<std::string>{
-            "xyz.openbmc_project.State.Host.Transition.ForceWarmReboot"});
-}
-
-static void startCrashdumpAndRecovery(bool recoverSystem,
-                                      const std::string& triggerType)
-{
-    std::cerr << "Starting crashdump\n";
-    static std::shared_ptr<sdbusplus::bus::match::match> crashdumpCompleteMatch;
-
-    crashdumpCompleteMatch = std::make_shared<sdbusplus::bus::match::match>(
-        *conn,
-        "type='signal',interface='com.intel.crashdump.Stored',member='"
-        "CrashdumpComplete'",
-        [recoverSystem](sdbusplus::message::message& msg) {
-            std::cerr << "Crashdump completed\n";
-            if (recoverSystem)
-            {
-                std::cerr << "Recovering the system\n";
-                startWarmReset();
-            }
-            crashdumpCompleteMatch.reset();
-        });
-
-    conn->async_method_call(
-        [](boost::system::error_code ec) {
-            if (ec)
-            {
-                std::cerr << "failed to start Crashdump\n";
-            }
-        },
-        "com.intel.crashdump", "/com/intel/crashdump",
-        "com.intel.crashdump.Stored", "GenerateStoredLog", triggerType);
-}
-
 static void incrementCPUErrorCount(int cpuNum)
 {
     std::string propertyName = "ErrorCountCPU" + std::to_string(cpuNum + 1);
@@ -761,7 +702,7 @@
                     std::cerr << "Unable to read reset on CATERR value\n";
                     return;
                 }
-                startCrashdumpAndRecovery(*reset, "IERR");
+                startCrashdumpAndRecovery(conn, *reset, "IERR");
             },
             "xyz.openbmc_project.Settings",
             "/xyz/openbmc_project/control/processor_error_config",
@@ -1341,7 +1282,7 @@
                     std::cerr << "Unable to read reset on ERR2 value\n";
                     return;
                 }
-                startCrashdumpAndRecovery(*reset, "ERR2 Timeout");
+                startCrashdumpAndRecovery(conn, *reset, "ERR2 Timeout");
             },
             "xyz.openbmc_project.Settings",
             "/xyz/openbmc_project/control/processor_error_config",
@@ -1418,7 +1359,7 @@
                 if (*reset)
                 {
                     std::cerr << "Recovering the system\n";
-                    startWarmReset();
+                    startWarmReset(conn);
                 }
 #endif
             },
