diff --git a/include/error_monitors/cpu_mismatch_monitor.hpp b/include/error_monitors/cpu_mismatch_monitor.hpp
new file mode 100644
index 0000000..5a99da2
--- /dev/null
+++ b/include/error_monitors/cpu_mismatch_monitor.hpp
@@ -0,0 +1,113 @@
+/*
+// 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 <systemd/sd-journal.h>
+
+#include <error_monitors/base_monitor.hpp>
+#include <gpiod.hpp>
+#include <host_error_monitor.hpp>
+#include <sdbusplus/asio/object_server.hpp>
+
+#include <iostream>
+
+namespace host_error_monitor::cpu_mismatch_monitor
+{
+static constexpr bool debug = false;
+
+class CPUMismatchMonitor : public host_error_monitor::base_monitor::BaseMonitor
+{
+    size_t cpuNum;
+    gpiod::line cpuMismatchLine;
+
+    void cpuMismatchLog()
+    {
+        sd_journal_send("MESSAGE=HostError: CPU %d mismatch", cpuNum,
+                        "PRIORITY=%i", LOG_ERR, "REDFISH_MESSAGE_ID=%s",
+                        "OpenBMC.0.1.CPUMismatch", "REDFISH_MESSAGE_ARGS=%d",
+                        cpuNum, NULL);
+    }
+
+    bool requestCPUMismatchInput()
+    {
+        // Find the GPIO line
+        cpuMismatchLine = gpiod::find_line(signalName);
+        if (!cpuMismatchLine)
+        {
+            std::cerr << "Failed to find the " << signalName << " line.\n";
+            return false;
+        }
+
+        // Request GPIO input
+        try
+        {
+            cpuMismatchLine.request(
+                {"host-error-monitor", gpiod::line_request::DIRECTION_INPUT});
+        }
+        catch (std::exception&)
+        {
+            std::cerr << "Failed to request " << signalName << " input\n";
+            return false;
+        }
+
+        return true;
+    }
+
+    bool cpuMismatchAsserted()
+    {
+        if constexpr (debug)
+        {
+            std::cerr << "Checking " << signalName << " state\n";
+        }
+
+        return (cpuMismatchLine.get_value() == 1);
+    }
+
+    void cpuMismatchAssertHandler()
+    {
+        std::cerr << signalName << " asserted\n";
+        cpuMismatchLog();
+    }
+
+    void checkCPUMismatch()
+    {
+        if (cpuMismatchAsserted())
+        {
+            cpuMismatchAssertHandler();
+        }
+    }
+
+  public:
+    CPUMismatchMonitor(boost::asio::io_service& io,
+                       std::shared_ptr<sdbusplus::asio::connection> conn,
+                       const std::string& signalName, const size_t cpuNum) :
+        BaseMonitor(io, conn, signalName),
+        cpuNum(cpuNum)
+    {
+        // Request GPIO input
+        if (!requestCPUMismatchInput())
+        {
+            return;
+        }
+        checkCPUMismatch();
+        valid = true;
+    }
+
+    void hostOn() override
+    {
+        checkCPUMismatch();
+    }
+};
+} // namespace host_error_monitor::cpu_mismatch_monitor
diff --git a/src/host_error_monitor.cpp b/src/host_error_monitor.cpp
index ddfb54a..b502a3d 100644
--- a/src/host_error_monitor.cpp
+++ b/src/host_error_monitor.cpp
@@ -99,11 +99,6 @@
 static boost::asio::posix::stream_descriptor cpu1MemtripEvent(io);
 static gpiod::line cpu2MemtripLine;
 static boost::asio::posix::stream_descriptor cpu2MemtripEvent(io);
-//---------------------------------
-// CPU_MISMATCH function related definition
-//---------------------------------
-static gpiod::line cpu1MismatchLine;
-static gpiod::line cpu2MismatchLine;
 
 // beep function for CPU error
 const static constexpr uint8_t beepCPUIERR = 4;
@@ -199,15 +194,6 @@
                     cpuNumber.c_str(), NULL);
 }
 
-static void cpuMismatchLog(const int cpuNum)
-{
-    std::string msg = "CPU " + std::to_string(cpuNum) + " mismatch";
-
-    sd_journal_send("MESSAGE= %s", msg.c_str(), "PRIORITY=%i", LOG_ERR,
-                    "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.CPUMismatch",
-                    "REDFISH_MESSAGE_ARGS=%d", cpuNum, NULL);
-}
-
 static void cpuVRHotLog(const std::string& vr)
 {
     std::string msg = vr + " Voltage Regulator Overheated.";
@@ -1320,18 +1306,6 @@
 
 static void initializeErrorState()
 {
-    // Handle CPU1_MISMATCH if it's asserted now
-    if (cpu1MismatchLine.get_value() == 1)
-    {
-        cpuMismatchLog(1);
-    }
-
-    // Handle CPU2_MISMATCH if it's asserted now
-    if (cpu2MismatchLine.get_value() == 1)
-    {
-        cpuMismatchLog(2);
-    }
-
     // Handle CPU_CATERR if it's asserted now
     if (caterrLine.get_value() == 0)
     {
@@ -1493,20 +1467,6 @@
     std::shared_ptr<sdbusplus::bus::match::match> hostStateMonitor =
         host_error_monitor::startHostStateMonitor();
 
-    // Request CPU1_MISMATCH GPIO events
-    if (!host_error_monitor::requestGPIOInput(
-            "CPU1_MISMATCH", host_error_monitor::cpu1MismatchLine))
-    {
-        return -1;
-    }
-
-    // Request CPU2_MISMATCH GPIO events
-    if (!host_error_monitor::requestGPIOInput(
-            "CPU2_MISMATCH", host_error_monitor::cpu2MismatchLine))
-    {
-        return -1;
-    }
-
     // Request CPU_CATERR GPIO events
     if (!host_error_monitor::requestGPIOEvents(
             "CPU_CATERR", host_error_monitor::caterrHandler,
