diff --git a/include/PSUEvent.hpp b/include/PSUEvent.hpp
index 623806b..f5bc155 100644
--- a/include/PSUEvent.hpp
+++ b/include/PSUEvent.hpp
@@ -27,8 +27,10 @@
 {
   public:
     PSUSubEvent(std::shared_ptr<sdbusplus::asio::dbus_interface> eventInterface,
-                const std::string& path, boost::asio::io_service& io,
-                const std::string& groupEventName, const std::string& eventName,
+                const std::string& path,
+                std::shared_ptr<sdbusplus::asio::connection>& conn,
+                boost::asio::io_service& io, const std::string& groupEventName,
+                const std::string& eventName,
                 std::shared_ptr<std::set<std::string>> asserts,
                 std::shared_ptr<std::set<std::string>> combineEvent,
                 std::shared_ptr<bool> state, const std::string& psuName);
@@ -51,6 +53,8 @@
     void setupRead(void);
     void handleResponse(const boost::system::error_code& err);
     void updateValue(const int& newValue);
+    void beep(const uint8_t& beepPriority);
+    static constexpr uint8_t beepPSUFailure = 2;
     boost::asio::posix::stream_descriptor inputDev;
     static constexpr unsigned int eventPollMs = 1000;
     static constexpr size_t warnAfterErrorCount = 10;
@@ -58,6 +62,7 @@
     std::string fanName;
     std::string assertMessage;
     std::string deassertMessage;
+    std::shared_ptr<sdbusplus::asio::connection> systemBus;
 };
 
 class PSUCombineEvent
@@ -65,6 +70,7 @@
   public:
     PSUCombineEvent(
         sdbusplus::asio::object_server& objectSever,
+        std::shared_ptr<sdbusplus::asio::connection>& conn,
         boost::asio::io_service& io, const std::string& psuName,
         boost::container::flat_map<std::string, std::vector<std::string>>&
             eventPathList,
diff --git a/src/PSUEvent.cpp b/src/PSUEvent.cpp
index 0849500..1e228fe 100644
--- a/src/PSUEvent.cpp
+++ b/src/PSUEvent.cpp
@@ -30,8 +30,9 @@
 #include <vector>
 
 PSUCombineEvent::PSUCombineEvent(
-    sdbusplus::asio::object_server& objectServer, boost::asio::io_service& io,
-    const std::string& psuName,
+    sdbusplus::asio::object_server& objectServer,
+    std::shared_ptr<sdbusplus::asio::connection>& conn,
+    boost::asio::io_service& io, const std::string& psuName,
     boost::container::flat_map<std::string, std::vector<std::string>>&
         eventPathList,
     boost::container::flat_map<
@@ -65,7 +66,7 @@
         for (const auto& path : pathList.second)
         {
             events[eventPSUName].emplace_back(std::make_unique<PSUSubEvent>(
-                eventInterface, path, io, eventName, eventName, assert,
+                eventInterface, path, conn, io, eventName, eventName, assert,
                 combineEvent, state, psuName));
             asserts.emplace_back(assert);
             states.emplace_back(state);
@@ -85,7 +86,7 @@
             for (const auto& path : pathList.second)
             {
                 events[eventPSUName].emplace_back(std::make_unique<PSUSubEvent>(
-                    eventInterface, path, io, groupEventName,
+                    eventInterface, path, conn, io, groupEventName,
                     groupPathList.first, assert, combineEvent, state, psuName));
                 asserts.emplace_back(assert);
                 states.emplace_back(state);
@@ -128,15 +129,16 @@
 
 PSUSubEvent::PSUSubEvent(
     std::shared_ptr<sdbusplus::asio::dbus_interface> eventInterface,
-    const std::string& path, boost::asio::io_service& io,
-    const std::string& groupEventName, const std::string& eventName,
+    const std::string& path, std::shared_ptr<sdbusplus::asio::connection>& conn,
+    boost::asio::io_service& io, const std::string& groupEventName,
+    const std::string& eventName,
     std::shared_ptr<std::set<std::string>> asserts,
     std::shared_ptr<std::set<std::string>> combineEvent,
     std::shared_ptr<bool> state, const std::string& psuName) :
     eventInterface(eventInterface),
     asserts(asserts), combineEvent(combineEvent), assertState(state),
     errCount(0), path(path), eventName(eventName), waitTimer(io), inputDev(io),
-    psuName(psuName), groupEventName(groupEventName)
+    psuName(psuName), groupEventName(groupEventName), systemBus(conn)
 {
     fd = open(path.c_str(), O_RDONLY);
     if (fd < 0)
@@ -303,6 +305,15 @@
             *assertState = true;
             if (!assertMessage.empty())
             {
+                // For failure and configure error, spec requires a beep
+                if ((assertMessage == "OpenBMC.0.1.PowerSupplyFailed") ||
+                    (assertMessage ==
+                     "OpenBMC.0.1.PowerSupplyConfigurationError"))
+                {
+                    std::cout << " beep for " << assertMessage << "\n";
+                    beep(beepPSUFailure);
+                }
+
                 // Fan Failed has two args
                 std::string sendMessage = eventName + " assert";
                 if (assertMessage == "OpenBMC.0.1.PowerSupplyFanFailed")
@@ -332,3 +343,17 @@
     }
     value = newValue;
 }
+
+void PSUSubEvent::beep(const uint8_t& beepPriority)
+{
+    systemBus->async_method_call(
+        [](boost::system::error_code ec) {
+            if (ec)
+            {
+                std::cerr << "beep error (ec = " << ec << ")\n";
+                return;
+            }
+        },
+        "xyz.openbmc_project.BeepCode", "/xyz/openbmc_project/BeepCode",
+        "xyz.openbmc_project.BeepCode", "Beep", uint8_t(beepPriority));
+}
diff --git a/src/PSUSensorMain.cpp b/src/PSUSensorMain.cpp
index 19286f6..90c7950 100644
--- a/src/PSUSensorMain.cpp
+++ b/src/PSUSensorMain.cpp
@@ -748,9 +748,9 @@
         // OperationalStatus event
         combineEvents[*psuName + "OperationalStatus"] = nullptr;
         combineEvents[*psuName + "OperationalStatus"] =
-            std::make_unique<PSUCombineEvent>(objectServer, io, *psuName,
-                                              eventPathList, groupEventPathList,
-                                              "OperationalStatus");
+            std::make_unique<PSUCombineEvent>(
+                objectServer, dbusConnection, io, *psuName, eventPathList,
+                groupEventPathList, "OperationalStatus");
     }
 
     if constexpr (DEBUG)
