diff --git a/meson.build b/meson.build
index 0e8a289..bc5e1b8 100644
--- a/meson.build
+++ b/meson.build
@@ -3,7 +3,8 @@
         default_options: [
           'warning_level=3',
           'werror=true',
-          'cpp_std=c++17'
+          'cpp_std=c++17',
+          'b_lto=true',
         ])
 
 systemd = dependency('systemd')
diff --git a/src/activation.cpp b/src/activation.cpp
index e69de29..8bfed0b 100644
--- a/src/activation.cpp
+++ b/src/activation.cpp
@@ -0,0 +1,27 @@
+#include "activation.hpp"
+
+namespace phosphor
+{
+namespace software
+{
+namespace updater
+{
+
+namespace softwareServer = sdbusplus::xyz::openbmc_project::Software::server;
+
+auto Activation::activation(Activations value) -> Activations
+{
+    // TODO
+    return softwareServer::Activation::activation(value);
+}
+
+auto Activation::requestedActivation(RequestedActivations value)
+    -> RequestedActivations
+{
+    // TODO
+    return softwareServer::Activation::requestedActivation(value);
+}
+
+} // namespace updater
+} // namespace software
+} // namespace phosphor
diff --git a/src/activation.hpp b/src/activation.hpp
new file mode 100644
index 0000000..6ba2b75
--- /dev/null
+++ b/src/activation.hpp
@@ -0,0 +1,83 @@
+#pragma once
+
+#include "config.h"
+
+#include <sdbusplus/server.hpp>
+#include <xyz/openbmc_project/Software/Activation/server.hpp>
+#include <xyz/openbmc_project/Software/ExtendedVersion/server.hpp>
+
+namespace phosphor
+{
+namespace software
+{
+namespace updater
+{
+
+using ActivationInherit = sdbusplus::server::object::object<
+    sdbusplus::xyz::openbmc_project::Software::server::ExtendedVersion,
+    sdbusplus::xyz::openbmc_project::Software::server::Activation>;
+
+/** @class Activation
+ *  @brief OpenBMC activation software management implementation.
+ *  @details A concrete implementation for
+ *  xyz.openbmc_project.Software.Activation DBus API.
+ */
+class Activation : public ActivationInherit
+{
+  public:
+    /** @brief Constructs Activation Software Manager
+     *
+     * @param[in] bus    - The Dbus bus object
+     * @param[in] path   - The Dbus object path
+     * @param[in] versionId  - The software version id
+     * @param[in] extVersion - The extended version
+     * @param[in] activationStatus - The status of Activation
+     */
+    Activation(sdbusplus::bus::bus& bus, const std::string& path,
+               const std::string& versionId, const std::string& extVersion,
+               sdbusplus::xyz::openbmc_project::Software::server::Activation::
+                   Activations activationStatus) :
+        ActivationInherit(bus, path.c_str(), true),
+        bus(bus), path(path), versionId(versionId)
+    {
+        // Set Properties.
+        extendedVersion(extVersion);
+        activation(activationStatus);
+
+        // Emit deferred signal.
+        emit_object_added();
+    }
+
+    /** @brief Overloaded Activation property setter function
+     *
+     * @param[in] value - One of Activation::Activations
+     *
+     * @return Success or exception thrown
+     */
+    Activations activation(Activations value) override;
+
+    /** @brief Activation */
+    using ActivationInherit::activation;
+
+    /** @brief Overloaded requestedActivation property setter function
+     *
+     * @param[in] value - One of Activation::RequestedActivations
+     *
+     * @return Success or exception thrown
+     */
+    RequestedActivations
+        requestedActivation(RequestedActivations value) override;
+
+    /** @brief Persistent sdbusplus DBus bus connection */
+    sdbusplus::bus::bus& bus;
+
+    /** @brief Persistent DBus object path */
+    std::string path;
+
+    /** @brief Version id */
+    std::string versionId;
+};
+
+} // namespace updater
+} // namespace software
+} // namespace phosphor
diff --git a/src/item_updater.cpp b/src/item_updater.cpp
new file mode 100644
index 0000000..9a08f2e
--- /dev/null
+++ b/src/item_updater.cpp
@@ -0,0 +1,173 @@
+#include "config.h"
+
+#include "item_updater.hpp"
+
+#include <filesystem>
+#include <phosphor-logging/elog-errors.hpp>
+#include <phosphor-logging/log.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+namespace phosphor
+{
+namespace software
+{
+namespace updater
+{
+namespace server = sdbusplus::xyz::openbmc_project::Software::server;
+namespace fs = std::filesystem;
+
+using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+using namespace phosphor::logging;
+
+void ItemUpdater::createActivation(sdbusplus::message::message& m)
+{
+    using SVersion = server::Version;
+    using VersionPurpose = SVersion::VersionPurpose;
+    namespace msg = sdbusplus::message;
+    namespace variant_ns = msg::variant_ns;
+
+    sdbusplus::message::object_path objPath;
+    std::map<std::string, std::map<std::string, msg::variant<std::string>>>
+        interfaces;
+    m.read(objPath, interfaces);
+
+    std::string path(std::move(objPath));
+    std::string filePath;
+    auto purpose = VersionPurpose::Unknown;
+    std::string version;
+
+    for (const auto& [interfaceName, propertyMap] : interfaces)
+    {
+        if (interfaceName == VERSION_IFACE)
+        {
+            for (const auto& [propertyName, propertyValue] : propertyMap)
+            {
+                if (propertyName == "Purpose")
+                {
+                    // Only process the PSU images
+                    auto value = SVersion::convertVersionPurposeFromString(
+                        variant_ns::get<std::string>(propertyValue));
+
+                    if (value == VersionPurpose::PSU)
+                    {
+                        purpose = value;
+                    }
+                }
+                else if (propertyName == "Version")
+                {
+                    version = variant_ns::get<std::string>(propertyValue);
+                }
+            }
+        }
+        else if (interfaceName == FILEPATH_IFACE)
+        {
+            const auto& it = propertyMap.find("Path");
+            if (it != propertyMap.end())
+            {
+                filePath = variant_ns::get<std::string>(it->second);
+            }
+        }
+    }
+    if ((filePath.empty()) || (purpose == VersionPurpose::Unknown))
+    {
+        return;
+    }
+
+    // Version id is the last item in the path
+    auto pos = path.rfind("/");
+    if (pos == std::string::npos)
+    {
+        log<level::ERR>("No version id found in object path",
+                        entry("OBJPATH=%s", path.c_str()));
+        return;
+    }
+
+    auto versionId = path.substr(pos + 1);
+
+    if (activations.find(versionId) == activations.end())
+    {
+        // Determine the Activation state by processing the given image dir.
+        auto activationState = server::Activation::Activations::Ready;
+
+        fs::path manifestPath(filePath);
+        manifestPath /= MANIFEST_FILE;
+        std::string extendedVersion =
+            (Version::getValue(
+                 manifestPath.string(),
+                 std::map<std::string, std::string>{{"extended_version", ""}}))
+                .begin()
+                ->second;
+
+        auto activation = createActivationObject(
+            path, versionId, extendedVersion, activationState);
+        activations.emplace(versionId, std::move(activation));
+
+        auto versionPtr =
+            createVersionObject(path, versionId, version, purpose, filePath);
+        versions.emplace(versionId, std::move(versionPtr));
+    }
+    return;
+}
+
+void ItemUpdater::erase(std::string versionId)
+{
+    auto it = versions.find(versionId);
+    if (it == versions.end())
+    {
+        log<level::ERR>(("Error: Failed to find version " + versionId +
+                         " in item updater versions map."
+                         " Unable to remove.")
+                            .c_str());
+    }
+    else
+    {
+        versions.erase(versionId);
+    }
+
+    // Removing entry in activations map
+    auto ita = activations.find(versionId);
+    if (ita == activations.end())
+    {
+        log<level::ERR>(("Error: Failed to find version " + versionId +
+                         " in item updater activations map."
+                         " Unable to remove.")
+                            .c_str());
+    }
+    else
+    {
+        activations.erase(versionId);
+    }
+}
+
+void ItemUpdater::deleteAll()
+{
+    // TODO: when PSU's running firmware is implemented, delete all versions
+    // that are not the running firmware.
+}
+
+std::unique_ptr<Activation> ItemUpdater::createActivationObject(
+    const std::string& path, const std::string& versionId,
+    const std::string& extVersion,
+    sdbusplus::xyz::openbmc_project::Software::server::Activation::Activations
+        activationStatus)
+{
+    return std::make_unique<Activation>(bus, path, versionId, extVersion,
+                                        activationStatus);
+}
+
+std::unique_ptr<Version> ItemUpdater::createVersionObject(
+    const std::string& objPath, const std::string& versionId,
+    const std::string& versionString,
+    sdbusplus::xyz::openbmc_project::Software::server::Version::VersionPurpose
+        versionPurpose,
+    const std::string& filePath)
+{
+    auto version = std::make_unique<Version>(
+        bus, objPath, versionId, versionString, versionPurpose, filePath,
+        std::bind(&ItemUpdater::erase, this, std::placeholders::_1));
+    return version;
+}
+
+} // namespace updater
+} // namespace software
+} // namespace phosphor
diff --git a/src/item_updater.hpp b/src/item_updater.hpp
new file mode 100644
index 0000000..bc86af1
--- /dev/null
+++ b/src/item_updater.hpp
@@ -0,0 +1,97 @@
+#pragma once
+
+#include "config.h"
+
+#include "activation.hpp"
+#include "version.hpp"
+
+#include <sdbusplus/server.hpp>
+#include <xyz/openbmc_project/Collection/DeleteAll/server.hpp>
+
+namespace phosphor
+{
+namespace software
+{
+namespace updater
+{
+
+class Version;
+
+using ItemUpdaterInherit = sdbusplus::server::object::object<
+    sdbusplus::xyz::openbmc_project::Collection::server::DeleteAll>;
+namespace MatchRules = sdbusplus::bus::match::rules;
+
+/** @class ItemUpdater
+ *  @brief Manages the activation of the PSU version items.
+ */
+class ItemUpdater : public ItemUpdaterInherit
+{
+  public:
+    /** @brief Constructs ItemUpdater
+     *
+     * @param[in] bus    - The D-Bus bus object
+     * @param[in] path   - The D-Bus path
+     */
+    ItemUpdater(sdbusplus::bus::bus& bus, const std::string& path) :
+        ItemUpdaterInherit(bus, path.c_str()), bus(bus),
+        versionMatch(bus,
+                     MatchRules::interfacesAdded() +
+                         MatchRules::path(SOFTWARE_OBJPATH),
+                     std::bind(std::mem_fn(&ItemUpdater::createActivation),
+                               this, std::placeholders::_1))
+    {
+    }
+
+    /** @brief Deletes version
+     *
+     *  @param[in] versionId - Id of the version to delete
+     */
+    void erase(std::string versionId);
+
+    /**
+     * @brief Erases any non-active versions.
+     */
+    void deleteAll();
+
+  private:
+    /** @brief Callback function for Software.Version match.
+     *  @details Creates an Activation D-Bus object.
+     *
+     * @param[in]  msg       - Data associated with subscribed signal
+     */
+    void createActivation(sdbusplus::message::message& msg);
+
+    /** @brief Create Activation object */
+    std::unique_ptr<Activation> createActivationObject(
+        const std::string& path, const std::string& versionId,
+        const std::string& extVersion,
+        sdbusplus::xyz::openbmc_project::Software::server::Activation::
+            Activations activationStatus);
+
+    /** @brief Create Version object */
+    std::unique_ptr<Version>
+        createVersionObject(const std::string& objPath,
+                            const std::string& versionId,
+                            const std::string& versionString,
+                            sdbusplus::xyz::openbmc_project::Software::server::
+                                Version::VersionPurpose versionPurpose,
+                            const std::string& filePath);
+
+    /** @brief Persistent sdbusplus D-Bus bus connection. */
+    sdbusplus::bus::bus& bus;
+
+    /** @brief Persistent map of Activation D-Bus objects and their
+     * version id */
+    std::map<std::string, std::unique_ptr<Activation>> activations;
+
+    /** @brief Persistent map of Version D-Bus objects and their
+     * version id */
+    std::map<std::string, std::unique_ptr<Version>> versions;
+
+    /** @brief sdbusplus signal match for Software.Version */
+    sdbusplus::bus::match_t versionMatch;
+};
+
+} // namespace updater
+} // namespace software
+} // namespace phosphor
diff --git a/src/main.cpp b/src/main.cpp
index 905869d..fe9062e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,4 +1,27 @@
-int main()
+#include "config.h"
+
+#include "item_updater.hpp"
+
+#include <phosphor-logging/log.hpp>
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server/manager.hpp>
+#include <system_error>
+
+int main(int /* argc */, char* /* argv */[])
 {
+    auto bus = sdbusplus::bus::new_default();
+
+    // Add sdbusplus ObjectManager.
+    sdbusplus::server::manager::manager objManager(bus, SOFTWARE_OBJPATH);
+
+    phosphor::software::updater::ItemUpdater updater(bus, SOFTWARE_OBJPATH);
+
+    bus.request_name(BUSNAME_UPDATER);
+
+    while (true)
+    {
+        bus.process_discard();
+        bus.wait();
+    }
     return 0;
 }
diff --git a/src/meson.build b/src/meson.build
index 85263c8..4a13228 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -2,11 +2,27 @@
 phosphor_logging = dependency('phosphor-logging')
 sdbusplus = dependency('sdbusplus')
 
+add_project_link_arguments(['-lstdc++fs'], language: 'cpp')
+
+cdata = configuration_data()
+cdata.set_quoted('SOFTWARE_OBJPATH', '/xyz/openbmc_project/software')
+cdata.set_quoted('VERSION_IFACE', 'xyz.openbmc_project.Software.Version')
+cdata.set_quoted('FILEPATH_IFACE', 'xyz.openbmc_project.Common.FilePath')
+cdata.set_quoted('BUSNAME_UPDATER', 'xyz.openbmc_project.Software.Psu.Updater')
+cdata.set_quoted('MANIFEST_FILE', 'MANIFEST')
+
+configure_file(output: 'config.h',
+  configuration: cdata,
+)
+configuration_inc = include_directories('.')
+
 executable(
   'phosphor-psu-code-manager',
   'activation.cpp',
+  'item_updater.cpp',
   'main.cpp',
-  implicit_include_directories: false,
+  'version.cpp',
+  include_directories: configuration_inc,
   dependencies: [
     phosphor_logging,
     phosphor_dbus_interfaces,
diff --git a/src/version.cpp b/src/version.cpp
new file mode 100644
index 0000000..7940d2e
--- /dev/null
+++ b/src/version.cpp
@@ -0,0 +1,81 @@
+#include "version.hpp"
+
+#include "item_updater.hpp"
+
+#include <fstream>
+#include <iostream>
+#include <phosphor-logging/elog-errors.hpp>
+#include <phosphor-logging/log.hpp>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+namespace phosphor
+{
+namespace software
+{
+namespace updater
+{
+
+using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+using namespace phosphor::logging;
+using Argument = xyz::openbmc_project::Common::InvalidArgument;
+
+std::map<std::string, std::string>
+    Version::getValue(const std::string& filePath,
+                      std::map<std::string, std::string> keys)
+{
+    if (filePath.empty())
+    {
+        log<level::ERR>("Error filePath is empty");
+        elog<InvalidArgument>(Argument::ARGUMENT_NAME("FilePath"),
+                              Argument::ARGUMENT_VALUE(filePath.c_str()));
+    }
+
+    std::ifstream efile;
+    std::string line;
+    efile.exceptions(std::ifstream::failbit | std::ifstream::badbit |
+                     std::ifstream::eofbit);
+
+    try
+    {
+        efile.open(filePath);
+        while (getline(efile, line))
+        {
+            for (auto& key : keys)
+            {
+                auto value = key.first + "=";
+                auto keySize = value.length();
+                if (line.compare(0, keySize, value) == 0)
+                {
+                    key.second = line.substr(keySize);
+                    break;
+                }
+            }
+        }
+        efile.close();
+    }
+    catch (const std::exception& e)
+    {
+        if (!efile.eof())
+        {
+            log<level::ERR>("Error in reading file");
+        }
+        efile.close();
+    }
+
+    return keys;
+}
+
+void Delete::delete_()
+{
+    if (version.eraseCallback)
+    {
+        version.eraseCallback(version.getVersionId());
+    }
+}
+
+} // namespace updater
+} // namespace software
+} // namespace phosphor
diff --git a/src/version.hpp b/src/version.hpp
new file mode 100644
index 0000000..102d26a
--- /dev/null
+++ b/src/version.hpp
@@ -0,0 +1,154 @@
+#pragma once
+
+#include "config.h"
+
+#include <sdbusplus/bus.hpp>
+#include <xyz/openbmc_project/Common/FilePath/server.hpp>
+#include <xyz/openbmc_project/Object/Delete/server.hpp>
+#include <xyz/openbmc_project/Software/Version/server.hpp>
+
+namespace phosphor
+{
+namespace software
+{
+namespace updater
+{
+
+using eraseFunc = std::function<void(std::string)>;
+
+using VersionInherit = sdbusplus::server::object::object<
+    sdbusplus::xyz::openbmc_project::Software::server::Version,
+    sdbusplus::xyz::openbmc_project::Common::server::FilePath>;
+using DeleteInherit = sdbusplus::server::object::object<
+    sdbusplus::xyz::openbmc_project::Object::server::Delete>;
+
+namespace sdbusRule = sdbusplus::bus::match::rules;
+
+class Version;
+
+/** @class Delete
+ *  @brief OpenBMC Delete implementation.
+ *  @details A concrete implementation for xyz.openbmc_project.Object.Delete
+ *  D-Bus API.
+ */
+class Delete : public DeleteInherit
+{
+  public:
+    /** @brief Constructs Delete.
+     *
+     *  @param[in] bus    - The D-Bus bus object
+     *  @param[in] path   - The D-Bus object path
+     *  @param[in] version - The Version object.
+     */
+    Delete(sdbusplus::bus::bus& bus, const std::string& path,
+           Version& version) :
+        DeleteInherit(bus, path.c_str(), true),
+        version(version), bus(bus), path(path)
+    {
+        std::vector<std::string> interfaces({interface});
+        bus.emit_interfaces_added(path.c_str(), interfaces);
+    }
+
+    ~Delete()
+    {
+        std::vector<std::string> interfaces({interface});
+        bus.emit_interfaces_removed(path.c_str(), interfaces);
+    }
+
+    /**
+     * @brief Delete the D-Bus object.
+     *        Overrides the default delete function by calling
+     *        Version class erase Method.
+     **/
+    void delete_() override;
+
+  private:
+    /** @brief The Version Object. */
+    Version& version;
+
+    static constexpr auto interface = "xyz.openbmc_project.Object.Delete";
+    sdbusplus::bus::bus& bus;
+    std::string path;
+};
+
+/** @class Version
+ *  @brief OpenBMC version software management implementation.
+ *  @details A concrete implementation for xyz.openbmc_project.Software.Version
+ *  D-Bus API.
+ */
+class Version : public VersionInherit
+{
+  public:
+    /** @brief Constructs Version Software Manager.
+     *
+     * @param[in] bus            - The D-Bus bus object
+     * @param[in] objPath        - The D-Bus object path
+     * @param[in] versionId      - The version Id
+     * @param[in] versionString  - The version string
+     * @param[in] versionPurpose - The version purpose
+     * @param[in] filePath       - The image filesystem path
+     * @param[in] callback       - The eraseFunc callback
+     */
+    Version(sdbusplus::bus::bus& bus, const std::string& objPath,
+            const std::string& versionId, const std::string& versionString,
+            VersionPurpose versionPurpose, const std::string& filePath,
+            eraseFunc callback) :
+        VersionInherit(bus, (objPath).c_str(), true),
+        eraseCallback(callback), bus(bus), objPath(objPath),
+        versionId(versionId), versionStr(versionString)
+    {
+        // Set properties.
+        purpose(versionPurpose);
+        version(versionString);
+        path(filePath);
+
+        deleteObject = std::make_unique<Delete>(bus, objPath, *this);
+
+        // Emit deferred signal.
+        emit_object_added();
+    }
+
+    /**
+     * @brief Return the version id
+     */
+    std::string getVersionId() const
+    {
+        return versionId;
+    }
+
+    /**
+     * @brief Read the manifest file to get the value of the key.
+     *
+     * @param[in] filePath - The path to the file which contains the value
+     *                       of keys.
+     * @param[in] keys     - A map of keys with empty values.
+     *
+     * @return The map of keys with filled values.
+     **/
+    static std::map<std::string, std::string>
+        getValue(const std::string& filePath,
+                 std::map<std::string, std::string> keys);
+
+    /** @brief Persistent Delete D-Bus object */
+    std::unique_ptr<Delete> deleteObject;
+
+    /** @brief The temUpdater's erase callback. */
+    eraseFunc eraseCallback;
+
+  private:
+    /** @brief Persistent sdbusplus DBus bus connection */
+    sdbusplus::bus::bus& bus;
+
+    /** @brief Persistent DBus object path */
+    std::string objPath;
+
+    /** @brief This Version's version Id */
+    const std::string versionId;
+
+    /** @brief This Version's version string */
+    const std::string versionStr;
+};
+
+} // namespace updater
+} // namespace software
+} // namespace phosphor
