diff --git a/analyzer/analyzer_main.cpp b/analyzer/analyzer_main.cpp
index 5df6295..4041b6a 100644
--- a/analyzer/analyzer_main.cpp
+++ b/analyzer/analyzer_main.cpp
@@ -126,13 +126,6 @@
         // Create and commit a PEL.
         uint32_t logId = std::get<1>(createPel(isoData, servData));
 
-        // Write guard records to persistent storage.
-        // TODO: The PEL ID will be required, but interface is still unknown.
-        for (const auto& guard : servData.getGuardList())
-        {
-            guard.apply();
-        }
-
         // Gather/return information needed for dump.
         // TODO: Need ID from root cause. At the moment, HUID does not exist in
         //       devtree. Will need a better ID definition.
diff --git a/analyzer/guard.cpp b/analyzer/guard.cpp
deleted file mode 100644
index 2acd2c1..0000000
--- a/analyzer/guard.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <analyzer/guard.hpp>
-#include <util/trace.hpp>
-
-namespace analyzer
-{
-
-//------------------------------------------------------------------------------
-
-void Guard::apply() const
-{
-    // TODO
-    trace::err("Guard::apply() currently not supported");
-}
-
-//------------------------------------------------------------------------------
-
-} // namespace analyzer
diff --git a/analyzer/guard.hpp b/analyzer/guard.hpp
deleted file mode 100644
index d3cabdd..0000000
--- a/analyzer/guard.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#pragma once
-
-#include <map>
-#include <string>
-
-namespace analyzer
-{
-
-/**
- * @brief A service event requiring hardware to be guarded.
- */
-class Guard
-{
-  public:
-    /** Supported guard types. */
-    enum class Type
-    {
-        NONE,      ///< Do not guard
-        FATAL,     ///< Guard on fatal error (cannot recover resource)
-        NON_FATAL, ///< Guard on non-fatal error (can recover resource)
-    };
-
-  public:
-    /**
-     * @brief Constructor from components.
-     * @param i_path The hardware path to guard.
-     * @param i_type The guard type.
-     */
-    Guard(const std::string& i_path, Type i_type) :
-        iv_path(i_path), iv_type(i_type)
-    {}
-
-  private:
-    /** The hardware path to guard. */
-    const std::string iv_path;
-
-    /** The guard type. */
-    const Type iv_type;
-
-  public:
-    /** @brief Writes guard record to persistent storage. */
-    void apply() const;
-
-    /** @return A string representation of the guard type enum. */
-    std::string getString() const
-    {
-        // clang-format off
-        static const std::map<Type, std::string> m =
-        {
-            {Type::NONE,      "NONE"},
-            {Type::FATAL,     "FATAL"},
-            {Type::NON_FATAL, "NON_FATAL"},
-        };
-        // clang-format on
-
-        return m.at(iv_type);
-    }
-};
-
-} // namespace analyzer
diff --git a/analyzer/meson.build b/analyzer/meson.build
index 9324392..be37557 100644
--- a/analyzer/meson.build
+++ b/analyzer/meson.build
@@ -3,7 +3,6 @@
     'analyzer_main.cpp',
     'create_pel.cpp',
     'filter-root-cause.cpp',
-    'guard.cpp',
     'hei_user_interface.cpp',
     'initialize_isolator.cpp',
     'ras-data/ras-data-parser.cpp',
diff --git a/analyzer/resolution.cpp b/analyzer/resolution.cpp
index 1f105eb..ae4edd0 100644
--- a/analyzer/resolution.cpp
+++ b/analyzer/resolution.cpp
@@ -157,21 +157,15 @@
     // Get the target for the hardware callout.
     auto target = __getUnitTarget(__getRootCauseChipTarget(io_sd), iv_unitPath);
 
-    // Get the entity path for this target.
-    auto entityPath = util::pdbg::getPhysDevPath(target);
-
     // Add the actual callout to the service data.
     __calloutTarget(io_sd, target, iv_priority, iv_guard);
 
-    // Add the guard info to the service data.
-    Guard guard = io_sd.addGuard(entityPath, iv_guard);
-
     // Add the callout FFDC to the service data.
     nlohmann::json ffdc;
     ffdc["Callout Type"] = "Hardware Callout";
-    ffdc["Target"]       = entityPath;
+    ffdc["Target"]       = util::pdbg::getPhysDevPath(target);
     ffdc["Priority"]     = iv_priority.getRegistryString();
-    ffdc["Guard Type"]   = guard.getString();
+    ffdc["Guard"]        = iv_guard;
     io_sd.addCalloutFFDC(ffdc);
 }
 
@@ -191,17 +185,13 @@
     // Callout the TX endpoint.
     __calloutTarget(io_sd, txTarget, iv_priority, iv_guard);
 
-    // Guard the TX endpoint.
-    Guard txGuard =
-        io_sd.addGuard(util::pdbg::getPhysDevPath(txTarget), iv_guard);
-
     // Add the callout FFDC to the service data.
     nlohmann::json ffdc;
     ffdc["Callout Type"] = "Connected Callout";
     ffdc["Bus Type"]     = iv_busType.getString();
     ffdc["Target"]       = util::pdbg::getPhysDevPath(txTarget);
     ffdc["Priority"]     = iv_priority.getRegistryString();
-    ffdc["Guard Type"]   = txGuard.getString();
+    ffdc["Guard"]        = iv_guard;
     io_sd.addCalloutFFDC(ffdc);
 }
 
@@ -228,16 +218,6 @@
     // TODO: For P10 (OMI bus and XBUS), the callout is simply the backplane.
     __calloutBackplane(io_sd, iv_priority);
 
-    // Guard the RX endpoint.
-    Guard guard =
-        io_sd.addGuard(util::pdbg::getPhysDevPath(rxTarget), iv_guard);
-
-    // Guard the TX endpoint.
-    // No need to check return because it is the same as RX target.
-    io_sd.addGuard(util::pdbg::getPhysDevPath(txTarget), iv_guard);
-
-    // TODO: Currently no guard for "everything else in between".
-
     // Add the callout FFDC to the service data.
     nlohmann::json ffdc;
     ffdc["Callout Type"] = "Bus Callout";
@@ -245,7 +225,7 @@
     ffdc["RX Target"]    = util::pdbg::getPhysDevPath(rxTarget);
     ffdc["TX Target"]    = util::pdbg::getPhysDevPath(txTarget);
     ffdc["Priority"]     = iv_priority.getRegistryString();
-    ffdc["Guard Type"]   = guard.getString();
+    ffdc["Guard"]        = iv_guard;
     io_sd.addCalloutFFDC(ffdc);
 }
 
diff --git a/analyzer/service_data.hpp b/analyzer/service_data.hpp
index ac90707..953a96d 100644
--- a/analyzer/service_data.hpp
+++ b/analyzer/service_data.hpp
@@ -1,7 +1,6 @@
 #pragma once
 
 #include <analyzer/callout.hpp>
-#include <analyzer/guard.hpp>
 #include <hei_main.hpp>
 #include <nlohmann/json.hpp>
 
@@ -49,11 +48,6 @@
      *  callout list (unit paths, bus types, etc.). */
     nlohmann::json iv_calloutFFDC = nlohmann::json::array();
 
-    /** The list of hardware guard requests. Some information will be added to
-     *  the PEL, but the actual guard record will be created after submitting
-     *  the PEL. */
-    std::vector<Guard> iv_guardList;
-
   public:
     /** @return The signature of the root cause attention. */
     const libhei::Signature& getRootCause() const
@@ -84,26 +78,6 @@
         iv_calloutFFDC.push_back(i_ffdc);
     }
 
-    /**
-     * @brief  Add a guard request to the guard list.
-     * @param  i_path  Entity path for the target part.
-     * @param  i_guard True, if the part should be guarded. False, otherwise.
-     * @return A reference to the object just added to the guard list.
-     */
-    const Guard& addGuard(const std::string& i_path, bool i_guard)
-    {
-        Guard::Type guardType = Guard::Type::NONE;
-        if (i_guard)
-        {
-            // The guard type is dependent on the presence of a system checkstop
-            // attention.
-            guardType =
-                queryCheckstop() ? Guard::Type::FATAL : Guard::Type::NON_FATAL;
-        }
-
-        return iv_guardList.emplace_back(i_path, guardType);
-    }
-
     /** @brief Accessor to iv_calloutList. */
     const nlohmann::json& getCalloutList() const
     {
@@ -115,12 +89,6 @@
     {
         return iv_calloutFFDC;
     }
-
-    /** @brief Accessor to iv_guardList. */
-    const std::vector<Guard>& getGuardList() const
-    {
-        return iv_guardList;
-    }
 };
 
 } // namespace analyzer
