diff --git a/activation.cpp b/activation.cpp
index af8f1e9..9d2ba4a 100644
--- a/activation.cpp
+++ b/activation.cpp
@@ -34,6 +34,11 @@
     return;
 }
 
+void Activation::delete_()
+{
+    parent.erase(versionId);
+}
+
 auto Activation::activation(Activations value) ->
         Activations
 {
diff --git a/activation.hpp b/activation.hpp
index d22ed91..cf4b5c2 100644
--- a/activation.hpp
+++ b/activation.hpp
@@ -6,6 +6,7 @@
 #include "xyz/openbmc_project/Software/RedundancyPriority/server.hpp"
 #include "xyz/openbmc_project/Software/ActivationProgress/server.hpp"
 #include "org/openbmc/Associations/server.hpp"
+#include "xyz/openbmc_project/Object/Delete/server.hpp"
 
 namespace phosphor
 {
@@ -18,7 +19,8 @@
      std::vector<std::tuple<std::string, std::string, std::string>>;
 using ActivationInherit = sdbusplus::server::object::object<
     sdbusplus::xyz::openbmc_project::Software::server::Activation,
-    sdbusplus::org::openbmc::server::Associations>;
+    sdbusplus::org::openbmc::server::Associations,
+    sdbusplus::xyz::openbmc_project::Object::server::Delete>;
 using ActivationBlocksTransitionInherit = sdbusplus::server::object::object<
  sdbusplus::xyz::openbmc_project::Software::server::ActivationBlocksTransition>;
 using RedundancyPriorityInherit = sdbusplus::server::object::object<
@@ -263,6 +265,11 @@
          */
         void unsubscribeFromSystemdSignals();
 
+        /**
+         * @brief delete the d-bus object.
+         */
+        void delete_() override;
+
         /** @brief Persistent sdbusplus DBus bus connection */
         sdbusplus::bus::bus& bus;
 
diff --git a/image_manager.cpp b/image_manager.cpp
index 5242d8b..357d3c2 100644
--- a/image_manager.cpp
+++ b/image_manager.cpp
@@ -172,10 +172,7 @@
                                   objPath,
                                   version,
                                   purpose,
-                                  imageDirPath.string(),
-                                  std::bind(&Manager::erase,
-                                            this,
-                                            std::placeholders::_1))));
+                                  imageDirPath.string())));
 
     return 0;
 }
@@ -196,6 +193,29 @@
     this->versions.erase(entryId);
 }
 
+void Manager::removeVersion(sdbusplus::message::message& msg)
+{
+    namespace mesg = sdbusplus::message;
+
+    mesg::object_path objPath;
+
+    msg.read(objPath);
+    std::string path(std::move(objPath));
+
+    // Version id is the last item in the path
+    auto pos = path.rfind("/");
+    if (pos == std::string::npos)
+    {
+        log<level::INFO>("No version id found in object path",
+                        entry("OBJPATH=%s", path));
+        return;
+    }
+
+    auto versionId = path.substr(pos + 1);
+
+    erase(versionId);
+}
+
 int Manager::unTar(const std::string& tarFilePath,
                    const std::string& extractDirPath)
 {
diff --git a/image_manager.hpp b/image_manager.hpp
index b0b8b89..5c69536 100644
--- a/image_manager.hpp
+++ b/image_manager.hpp
@@ -1,4 +1,5 @@
 #pragma once
+#include <sdbusplus/server.hpp>
 #include "version.hpp"
 
 namespace phosphor
@@ -8,6 +9,8 @@
 namespace manager
 {
 
+namespace MatchRules = sdbusplus::bus::match::rules;
+
 /** @class Manager
  *  @brief Contains a map of Version dbus objects.
  *  @details The software image manager class that contains the Version dbus
@@ -20,7 +23,16 @@
          *
          * @param[in] bus - The Dbus bus object
          */
-        Manager(sdbusplus::bus::bus& bus) : bus(bus){};
+        Manager(sdbusplus::bus::bus& bus) :
+                bus(bus),
+                versionMatch(
+                        bus,
+                        MatchRules::interfacesRemoved() +
+                        MatchRules::path(SOFTWARE_OBJPATH),
+                        std::bind(
+                                std::mem_fn(&Manager::removeVersion),
+                                this,
+                                std::placeholders::_1)){};
 
         /**
          * @brief Verify and untar the tarball. Verify the manifest file.
@@ -40,6 +52,13 @@
         void erase(std::string entryId);
 
     private:
+        /** @brief Callback function for Software.Version match.
+         *  @details Removes a version object.
+         *
+         * @param[in]  msg - Data associated with subscribed signal
+         */
+        void removeVersion(sdbusplus::message::message& msg);
+
         /** @brief Persistent map of Version dbus objects and their
           * version id */
         std::map<std::string, std::unique_ptr<Version>> versions;
@@ -47,6 +66,9 @@
         /** @brief Persistent sdbusplus DBus bus connection. */
         sdbusplus::bus::bus& bus;
 
+        /** @brief sdbusplus signal match for Software.Version */
+        sdbusplus::bus::match_t versionMatch;
+
         /**
          * @brief Untar the tarball.
          *
diff --git a/item_updater.cpp b/item_updater.cpp
index d230755..64bd270 100644
--- a/item_updater.cpp
+++ b/item_updater.cpp
@@ -130,10 +130,7 @@
                                 path,
                                 version,
                                 purpose,
-                                filePath,
-                                std::bind(&ItemUpdater::erase,
-                                          this,
-                                          std::placeholders::_1))));
+                                filePath)));
     }
     else
     {
@@ -221,10 +218,7 @@
                                      path,
                                      version,
                                      purpose,
-                                     "",
-                                     std::bind(&ItemUpdater::erase,
-                                       this,
-                                       std::placeholders::_1))));
+                                     "")));
         }
     }
     return;
diff --git a/version.cpp b/version.cpp
index 35df88f..b564416 100644
--- a/version.cpp
+++ b/version.cpp
@@ -101,15 +101,6 @@
     return version;
 }
 
-void Version::delete_()
-{
-    if (eraseCallback)
-    {
-        eraseCallback(getId(version()));
-    }
-}
-
 } // namespace manager
 } // namespace software
 } // namepsace phosphor
-
diff --git a/version.hpp b/version.hpp
old mode 100755
new mode 100644
index cbc2bd7..3d17213
--- a/version.hpp
+++ b/version.hpp
@@ -2,7 +2,6 @@
 
 #include <sdbusplus/bus.hpp>
 #include "xyz/openbmc_project/Software/Version/server.hpp"
-#include "xyz/openbmc_project/Object/Delete/server.hpp"
 #include "xyz/openbmc_project/Common/FilePath/server.hpp"
 #include <functional>
 
@@ -17,7 +16,6 @@
 
 using VersionInherit = sdbusplus::server::object::object<
     sdbusplus::xyz::openbmc_project::Software::server::Version,
-    sdbusplus::xyz::openbmc_project::Object::server::Delete,
     sdbusplus::xyz::openbmc_project::Common::server::FilePath>;
 
 /** @class Version
@@ -35,18 +33,14 @@
          * @param[in] versionId      - The version identifier
          * @param[in] versionPurpose - The version purpose
          * @param[in] filePath       - The image filesystem path
-         * @param[in] callback       - The parent's erase callback
          */
         Version(sdbusplus::bus::bus& bus,
                 const std::string& objPath,
                 const std::string& versionId,
                 VersionPurpose versionPurpose,
-                const std::string& filePath,
-                eraseFunc callback) : VersionInherit(
+                const std::string& filePath) : VersionInherit(
                     bus, (objPath).c_str(), true)
         {
-            // Bind erase method
-            eraseCallback = callback;
             // Set properties.
             purpose(versionPurpose);
             version(versionId);
@@ -79,21 +73,8 @@
          * @return The version identifier.
          */
         static std::string getBMCVersion(const std::string& releaseFilePath);
-
-        /**
-         * @brief Delete the d-bus object and image.
-         */
-        void delete_() override;
-
-
-    private:
-        /**
-         * @brief The parent's erase callback.
-         */
-        eraseFunc eraseCallback;
 };
 
 } // namespace manager
 } // namespace software
 } // namespace phosphor
-
