diff --git a/include/bridgingcommands.hpp b/include/bridgingcommands.hpp
index bffc76e..db3e99d 100644
--- a/include/bridgingcommands.hpp
+++ b/include/bridgingcommands.hpp
@@ -232,40 +232,12 @@
 /**
  * @brief Get Message Flags Response
  */
-typedef struct
-{
-    uint8_t flags;
-
-    constexpr void receiveMessageBitSet(uint8_t value)
-    {
-        flags |= (value & 1);
-    }
-
-    constexpr void eventMessageBitSet(uint8_t value)
-    {
-        flags |= (value & 1) << 1;
-    }
-
-    constexpr void watchdogTimeoutBitSet(uint8_t value)
-    {
-        flags |= (value & 1) << 3;
-    }
-
-    constexpr void oem0BitSet(uint8_t value)
-    {
-        flags |= (value & 1) << 5;
-    }
-
-    constexpr void oem1BitSet(uint8_t value)
-    {
-        flags |= (value & 1) << 6;
-    }
-
-    constexpr void oem2BitSet(uint8_t value)
-    {
-        flags |= (value & 1) << 7;
-    }
-} __attribute__((packed)) sGetMessageFlagsResp;
+constexpr uint8_t getMsgFlagReceiveMessageBit = 0;
+constexpr uint8_t getMsgFlagEventMessageBit = 1;
+constexpr uint8_t getMsgFlagWatchdogPreTimeOutBit = 3;
+constexpr uint8_t getMsgFlagOEM0Bit = 5;
+constexpr uint8_t getMsgFlagOEM1Bit = 6;
+constexpr uint8_t getMsgFlagOEM2Bit = 7;
 
 /**
  * @brief Clear Message Flags Request
@@ -313,6 +285,7 @@
 {
   public:
     Bridging() = default;
+    std::size_t getResponseQueueSize();
 
     ipmi_return_codes sendMessageHandler(ipmi_request_t request,
                                          ipmi_response_t response,
@@ -326,14 +299,9 @@
                                                ipmi_response_t response,
                                                ipmi_data_len_t dataLen);
 
-    ipmi_return_codes getMessageFlagsHandler(ipmi_request_t request,
-                                             ipmi_response_t response,
-                                             ipmi_data_len_t dataLen);
-
     enum IpmiAppBridgingCmds
     {
         ipmiCmdClearMessageFlags = 0x30,
-        ipmiCmdGetMessageFlags = 0x31,
         ipmiCmdGetMessage = 0x33,
         ipmiCmdSendMessage = 0x34,
     };
diff --git a/src/bridgingcommands.cpp b/src/bridgingcommands.cpp
index 9cc8879..88d29b4 100644
--- a/src/bridgingcommands.cpp
+++ b/src/bridgingcommands.cpp
@@ -14,15 +14,24 @@
 // limitations under the License.
 */
 
+#include <bitset>
 #include <bridgingcommands.hpp>
 #include <cstring>
 #include <ipmid/api.hpp>
+#include <ipmid/utils.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/bus/match.hpp>
 #include <sdbusplus/message.hpp>
 #include <vector>
 
+static constexpr const char *wdtService = "xyz.openbmc_project.Watchdog";
+static constexpr const char *wdtInterface =
+    "xyz.openbmc_project.State.Watchdog";
+static constexpr const char *wdtObjPath = "/xyz/openbmc_project/watchdog/host0";
+static constexpr const char *wdtInterruptFlagProp =
+    "PreTimeoutInterruptOccurFlag";
+
 static constexpr const char *ipmbBus = "xyz.openbmc_project.Ipmi.Channel.Ipmb";
 static constexpr const char *ipmbObj = "/xyz/openbmc_project/Ipmi/Channel/Ipmb";
 static constexpr const char *ipmbIntf = "org.openbmc.Ipmb";
@@ -390,38 +399,6 @@
     return IPMI_CC_OK;
 }
 
-ipmi_return_codes Bridging::getMessageFlagsHandler(ipmi_request_t request,
-                                                   ipmi_response_t response,
-                                                   ipmi_data_len_t dataLen)
-{
-    if (*dataLen != 0)
-    {
-        *dataLen = 0;
-        return IPMI_CC_REQ_DATA_LEN_INVALID;
-    }
-
-    auto getMsgFlagsRes = reinterpret_cast<sGetMessageFlagsResp *>(response);
-
-    std::memset(getMsgFlagsRes, 0, sizeof(sGetMessageFlagsResp));
-
-    // preserve current (legacy) behaviour
-    getMsgFlagsRes->eventMessageBitSet(1);
-
-    // set message fields
-    if (responseQueue.size() > 0)
-    {
-        getMsgFlagsRes->receiveMessageBitSet(1);
-    }
-    else
-    {
-        getMsgFlagsRes->receiveMessageBitSet(0);
-    }
-
-    *dataLen = sizeof(sGetMessageFlagsResp);
-
-    return IPMI_CC_OK;
-}
-
 ipmi_return_codes Bridging::clearMessageFlagsHandler(ipmi_request_t request,
                                                      ipmi_response_t response,
                                                      ipmi_data_len_t dataLen)
@@ -461,16 +438,50 @@
     return retCode;
 }
 
-ipmi_ret_t ipmiAppGetMessageFlags(ipmi_netfn_t netFn, ipmi_cmd_t cmd,
-                                  ipmi_request_t request,
-                                  ipmi_response_t response,
-                                  ipmi_data_len_t dataLen,
-                                  ipmi_context_t context)
+std::size_t Bridging::getResponseQueueSize()
 {
-    ipmi_ret_t retCode = IPMI_CC_OK;
-    retCode = bridging.getMessageFlagsHandler(request, response, dataLen);
+    return responseQueue.size();
+}
 
-    return retCode;
+/**
+@brief This command is used to retrive present message available states.
+
+@return IPMI completion code plus Flags as response data on success.
+**/
+ipmi::RspType<std::bitset<8>> ipmiAppGetMessageFlags()
+{
+    std::bitset<8> getMsgFlagsRes;
+
+    getMsgFlagsRes.set(getMsgFlagEventMessageBit);
+
+    // set message fields
+    if (bridging.getResponseQueueSize() > 0)
+    {
+        getMsgFlagsRes.set(getMsgFlagReceiveMessageBit);
+    }
+    else
+    {
+        getMsgFlagsRes.reset(getMsgFlagReceiveMessageBit);
+    }
+
+    try
+    {
+        std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
+        ipmi::Value variant = ipmi::getDbusProperty(
+            *dbus, wdtService, wdtObjPath, wdtInterface, wdtInterruptFlagProp);
+        if (std::get<bool>(variant))
+        {
+            getMsgFlagsRes.set(getMsgFlagWatchdogPreTimeOutBit);
+        }
+    }
+    catch (sdbusplus::exception::SdBusError &e)
+    {
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "ipmiAppGetMessageFlags, dbus call exception");
+        return ipmi::responseUnspecifiedError();
+    }
+
+    return ipmi::responseSuccess(getMsgFlagsRes);
 }
 
 ipmi_ret_t ipmiAppClearMessageFlags(ipmi_netfn_t netFn, ipmi_cmd_t cmd,
@@ -494,9 +505,9 @@
         NETFUN_APP, Bridging::IpmiAppBridgingCmds::ipmiCmdClearMessageFlags,
         NULL, ipmiAppClearMessageFlags, PRIVILEGE_USER);
 
-    ipmi_register_callback(
-        NETFUN_APP, Bridging::IpmiAppBridgingCmds::ipmiCmdGetMessageFlags, NULL,
-        ipmiAppGetMessageFlags, PRIVILEGE_USER);
+    ipmi::registerHandler(ipmi::prioOemBase, ipmi::netFnApp,
+                          ipmi::app::cmdGetMessageFlags, ipmi::Privilege::User,
+                          ipmiAppGetMessageFlags);
 
     ipmi_register_callback(NETFUN_APP,
                            Bridging::IpmiAppBridgingCmds::ipmiCmdGetMessage,
