diff --git a/Makefile.am b/Makefile.am
index e992c8b..1527ac8 100755
--- a/Makefile.am
+++ b/Makefile.am
@@ -5,8 +5,10 @@
 
 phosphor_version_software_manager_SOURCES = \
 	version_software_manager.cpp \
-	xyz.openbmc_project.Software.Version.cpp \
-	version_software_manager_main.cpp \
-	xyz.openbmc_project.Software.Activation.cpp
+	version_software_manager_main.cpp
 
-phosphor_version_software_manager_LDFLAGS = $(SYSTEMD_LIBS)
+generic_cxxflags = $(SYSTEMD_CFLAGS) $(PHOSPHOR_DBUS_INTERFACES_CFLAGS) $(SDBUSPLUS_CFLAGS)
+generic_ldflags = $(SYSTEMD_LIBS) $(PHOSPHOR_DBUS_INTERFACES_LIBS) $(SDBUSPLUS_LIBS)
+
+phosphor_version_software_manager_CXXFLAGS = $(generic_cxxflags)
+phosphor_version_software_manager_LDFLAGS = $(generic_ldflags)
diff --git a/configure.ac b/configure.ac
index a7e9b9c..6b2a5e1 100755
--- a/configure.ac
+++ b/configure.ac
@@ -12,6 +12,10 @@
 
 # Check for libraries
 PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 221])
+PKG_CHECK_MODULES([PHOSPHOR_DBUS_INTERFACES], [phosphor-dbus-interfaces],,\
+    AC_MSG_ERROR(["Requires phosphor-dbus-interfaces package."]))
+PKG_CHECK_MODULES([SDBUSPLUS], [sdbusplus],,
+    AC_MSG_ERROR(["Requires sdbusplus package."]))
 
 # Checks for library functions
 LT_INIT # Required for systemd linking
diff --git a/xyz.openbmc_project.Software.Activation.cpp b/xyz.openbmc_project.Software.Activation.cpp
deleted file mode 100644
index 9001113..0000000
--- a/xyz.openbmc_project.Software.Activation.cpp
+++ /dev/null
@@ -1,275 +0,0 @@
-#include <algorithm>
-#include <sdbusplus/server.hpp>
-#include <sdbusplus/exception.hpp>
-#include <xyz/openbmc_project/Software/Activation/server.hpp>
-
-namespace sdbusplus
-{
-namespace xyz
-{
-namespace openbmc_project
-{
-namespace Software
-{
-namespace server
-{
-
-Activation::Activation(bus::bus& bus, const char* path)
-        : _xyz_openbmc_project_Software_Activation_interface(
-                bus, path, _interface, _vtable, this)
-{
-}
-
-
-
-auto Activation::activation() const ->
-        Activations
-{
-    return _activation;
-}
-
-int Activation::_callback_get_Activation(
-        sd_bus* bus, const char* path, const char* interface,
-        const char* property, sd_bus_message* reply, void* context,
-        sd_bus_error* error)
-{
-    using sdbusplus::server::binding::details::convertForMessage;
-
-    try
-    {
-        auto m = message::message(sd_bus_message_ref(reply));
-
-        auto o = static_cast<Activation*>(context);
-        m.append(convertForMessage(o->activation()));
-    }
-    catch(sdbusplus::internal_exception_t& e)
-    {
-        sd_bus_error_set_const(error, e.name(), e.description());
-        return -EINVAL;
-    }
-
-    return true;
-}
-
-auto Activation::activation(Activations value) ->
-        Activations
-{
-    if (_activation != value)
-    {
-        _activation = value;
-        _xyz_openbmc_project_Software_Activation_interface.property_changed("Activation");
-    }
-
-    return _activation;
-}
-
-int Activation::_callback_set_Activation(
-        sd_bus* bus, const char* path, const char* interface,
-        const char* property, sd_bus_message* value, void* context,
-        sd_bus_error* error)
-{
-    try
-    {
-        auto m = message::message(sd_bus_message_ref(value));
-
-        auto o = static_cast<Activation*>(context);
-
-        std::string v{};
-        m.read(v);
-        o->activation(convertActivationsFromString(v));
-    }
-    catch(sdbusplus::internal_exception_t& e)
-    {
-        sd_bus_error_set_const(error, e.name(), e.description());
-        return -EINVAL;
-    }
-
-    return true;
-}
-
-namespace details
-{
-namespace Activation
-{
-static const auto _property_Activation =
-    utility::tuple_to_array(message::types::type_id<
-            std::string>());
-}
-}
-auto Activation::requestedActivation() const ->
-        RequestedActivations
-{
-    return _requestedActivation;
-}
-
-int Activation::_callback_get_RequestedActivation(
-        sd_bus* bus, const char* path, const char* interface,
-        const char* property, sd_bus_message* reply, void* context,
-        sd_bus_error* error)
-{
-    using sdbusplus::server::binding::details::convertForMessage;
-
-    try
-    {
-        auto m = message::message(sd_bus_message_ref(reply));
-
-        auto o = static_cast<Activation*>(context);
-        m.append(convertForMessage(o->requestedActivation()));
-    }
-    catch(sdbusplus::internal_exception_t& e)
-    {
-        sd_bus_error_set_const(error, e.name(), e.description());
-        return -EINVAL;
-    }
-
-    return true;
-}
-
-auto Activation::requestedActivation(RequestedActivations value) ->
-        RequestedActivations
-{
-    if (_requestedActivation != value)
-    {
-        _requestedActivation = value;
-        _xyz_openbmc_project_Software_Activation_interface.property_changed("RequestedActivation");
-    }
-
-    return _requestedActivation;
-}
-
-int Activation::_callback_set_RequestedActivation(
-        sd_bus* bus, const char* path, const char* interface,
-        const char* property, sd_bus_message* value, void* context,
-        sd_bus_error* error)
-{
-    try
-    {
-        auto m = message::message(sd_bus_message_ref(value));
-
-        auto o = static_cast<Activation*>(context);
-
-        std::string v{};
-        m.read(v);
-        o->requestedActivation(convertRequestedActivationsFromString(v));
-    }
-    catch(sdbusplus::internal_exception_t& e)
-    {
-        sd_bus_error_set_const(error, e.name(), e.description());
-        return -EINVAL;
-    }
-
-    return true;
-}
-
-namespace details
-{
-namespace Activation
-{
-static const auto _property_RequestedActivation =
-    utility::tuple_to_array(message::types::type_id<
-            std::string>());
-}
-}
-
-
-namespace
-{
-/** String to enum mapping for Activation::Activations */
-static const std::tuple<const char*, Activation::Activations> mappingActivationActivations[] =
-        {
-            std::make_tuple( "xyz.openbmc_project.Software.Activation.Activations.NotReady",                 Activation::Activations::NotReady ),
-            std::make_tuple( "xyz.openbmc_project.Software.Activation.Activations.Invalid",                 Activation::Activations::Invalid ),
-            std::make_tuple( "xyz.openbmc_project.Software.Activation.Activations.Ready",                 Activation::Activations::Ready ),
-            std::make_tuple( "xyz.openbmc_project.Software.Activation.Activations.Activating",                 Activation::Activations::Activating ),
-            std::make_tuple( "xyz.openbmc_project.Software.Activation.Activations.Active",                 Activation::Activations::Active ),
-            std::make_tuple( "xyz.openbmc_project.Software.Activation.Activations.Failed",                 Activation::Activations::Failed ),
-        };
-
-} // anonymous namespace
-
-auto Activation::convertActivationsFromString(std::string& s) ->
-        Activations
-{
-    auto i = std::find_if(
-            std::begin(mappingActivationActivations),
-            std::end(mappingActivationActivations),
-            [&s](auto& e){ return 0 == strcmp(s.c_str(), std::get<0>(e)); } );
-    if (std::end(mappingActivationActivations) == i)
-    {
-        throw sdbusplus::exception::InvalidEnumString();
-    }
-    else
-    {
-        return std::get<1>(*i);
-    }
-}
-
-std::string convertForMessage(Activation::Activations v)
-{
-    auto i = std::find_if(
-            std::begin(mappingActivationActivations),
-            std::end(mappingActivationActivations),
-            [v](auto& e){ return v == std::get<1>(e); });
-    return std::get<0>(*i);
-}
-
-namespace
-{
-/** String to enum mapping for Activation::RequestedActivations */
-static const std::tuple<const char*, Activation::RequestedActivations> mappingActivationRequestedActivations[] =
-        {
-            std::make_tuple( "xyz.openbmc_project.Software.Activation.RequestedActivations.None",                 Activation::RequestedActivations::None ),
-            std::make_tuple( "xyz.openbmc_project.Software.Activation.RequestedActivations.Active",                 Activation::RequestedActivations::Active ),
-        };
-
-} // anonymous namespace
-
-auto Activation::convertRequestedActivationsFromString(std::string& s) ->
-        RequestedActivations
-{
-    auto i = std::find_if(
-            std::begin(mappingActivationRequestedActivations),
-            std::end(mappingActivationRequestedActivations),
-            [&s](auto& e){ return 0 == strcmp(s.c_str(), std::get<0>(e)); } );
-    if (std::end(mappingActivationRequestedActivations) == i)
-    {
-        throw sdbusplus::exception::InvalidEnumString();
-    }
-    else
-    {
-        return std::get<1>(*i);
-    }
-}
-
-std::string convertForMessage(Activation::RequestedActivations v)
-{
-    auto i = std::find_if(
-            std::begin(mappingActivationRequestedActivations),
-            std::end(mappingActivationRequestedActivations),
-            [v](auto& e){ return v == std::get<1>(e); });
-    return std::get<0>(*i);
-}
-
-const vtable::vtable_t Activation::_vtable[] = {
-    vtable::start(),
-    vtable::property("Activation",
-                     details::Activation::_property_Activation
-                        .data(),
-                     _callback_get_Activation,
-                     _callback_set_Activation,
-                     vtable::property_::emits_change),
-    vtable::property("RequestedActivation",
-                     details::Activation::_property_RequestedActivation
-                        .data(),
-                     _callback_get_RequestedActivation,
-                     _callback_set_RequestedActivation,
-                     vtable::property_::emits_change),
-    vtable::end()
-};
-
-} // namespace server
-} // namespace Software
-} // namespace openbmc_project
-} // namespace xyz
-} // namespace sdbusplus
-
diff --git a/xyz.openbmc_project.Software.Version.cpp b/xyz.openbmc_project.Software.Version.cpp
deleted file mode 100755
index 015447f..0000000
--- a/xyz.openbmc_project.Software.Version.cpp
+++ /dev/null
@@ -1,237 +0,0 @@
-#include <algorithm>
-#include <sdbusplus/server.hpp>
-#include <sdbusplus/exception.hpp>
-#include <xyz/openbmc_project/Software/Version/server.hpp>
-
-namespace sdbusplus
-{
-namespace xyz
-{
-namespace openbmc_project
-{
-namespace Software
-{
-namespace server
-{
-
-Version::Version(bus::bus& bus, const char* path)
-        : _xyz_openbmc_project_Software_Version_interface(
-                bus, path, _interface, _vtable, this)
-{
-}
-
-
-
-auto Version::version() const ->
-        std::string
-{
-    return _version;
-}
-
-int Version::_callback_get_Version(
-        sd_bus* bus, const char* path, const char* interface,
-        const char* property, sd_bus_message* reply, void* context,
-        sd_bus_error* error)
-{
-    using sdbusplus::server::binding::details::convertForMessage;
-
-    try
-    {
-        auto m = message::message(sd_bus_message_ref(reply));
-
-        auto o = static_cast<Version*>(context);
-        m.append(convertForMessage(o->version()));
-    }
-    catch(sdbusplus::internal_exception_t& e)
-    {
-        sd_bus_error_set_const(error, e.name(), e.description());
-        return -EINVAL;
-    }
-
-    return true;
-}
-
-auto Version::version(std::string value) ->
-        std::string
-{
-    if (_version != value)
-    {
-        _version = value;
-        _xyz_openbmc_project_Software_Version_interface.property_changed("Version");
-    }
-
-    return _version;
-}
-
-int Version::_callback_set_Version(
-        sd_bus* bus, const char* path, const char* interface,
-        const char* property, sd_bus_message* value, void* context,
-        sd_bus_error* error)
-{
-    try
-    {
-        auto m = message::message(sd_bus_message_ref(value));
-
-        auto o = static_cast<Version*>(context);
-
-        std::string v{};
-        m.read(v);
-        o->version(v);
-    }
-    catch(sdbusplus::internal_exception_t& e)
-    {
-        sd_bus_error_set_const(error, e.name(), e.description());
-        return -EINVAL;
-    }
-
-    return true;
-}
-
-namespace details
-{
-namespace Version
-{
-static const auto _property_Version =
-    utility::tuple_to_array(message::types::type_id<
-            std::string>());
-}
-}
-auto Version::purpose() const ->
-        VersionPurpose
-{
-    return _purpose;
-}
-
-int Version::_callback_get_Purpose(
-        sd_bus* bus, const char* path, const char* interface,
-        const char* property, sd_bus_message* reply, void* context,
-        sd_bus_error* error)
-{
-    using sdbusplus::server::binding::details::convertForMessage;
-
-    try
-    {
-        auto m = message::message(sd_bus_message_ref(reply));
-
-        auto o = static_cast<Version*>(context);
-        m.append(convertForMessage(o->purpose()));
-    }
-    catch(sdbusplus::internal_exception_t& e)
-    {
-        sd_bus_error_set_const(error, e.name(), e.description());
-        return -EINVAL;
-    }
-
-    return true;
-}
-
-auto Version::purpose(VersionPurpose value) ->
-        VersionPurpose
-{
-    if (_purpose != value)
-    {
-        _purpose = value;
-        _xyz_openbmc_project_Software_Version_interface.property_changed("Purpose");
-    }
-
-    return _purpose;
-}
-
-int Version::_callback_set_Purpose(
-        sd_bus* bus, const char* path, const char* interface,
-        const char* property, sd_bus_message* value, void* context,
-        sd_bus_error* error)
-{
-    try
-    {
-        auto m = message::message(sd_bus_message_ref(value));
-
-        auto o = static_cast<Version*>(context);
-
-        std::string v{};
-        m.read(v);
-        o->purpose(convertVersionPurposeFromString(v));
-    }
-    catch(sdbusplus::internal_exception_t& e)
-    {
-        sd_bus_error_set_const(error, e.name(), e.description());
-        return -EINVAL;
-    }
-
-    return true;
-}
-
-namespace details
-{
-namespace Version
-{
-static const auto _property_Purpose =
-    utility::tuple_to_array(message::types::type_id<
-            std::string>());
-}
-}
-
-
-namespace
-{
-/** String to enum mapping for Version::VersionPurpose */
-static const std::tuple<const char*, Version::VersionPurpose> mappingVersionVersionPurpose[] =
-        {
-            std::make_tuple( "xyz.openbmc_project.Software.Version.VersionPurpose.Unknown",                 Version::VersionPurpose::Unknown ),
-            std::make_tuple( "xyz.openbmc_project.Software.Version.VersionPurpose.Other",                 Version::VersionPurpose::Other ),
-            std::make_tuple( "xyz.openbmc_project.Software.Version.VersionPurpose.System",                 Version::VersionPurpose::System ),
-            std::make_tuple( "xyz.openbmc_project.Software.Version.VersionPurpose.BMC",                 Version::VersionPurpose::BMC ),
-            std::make_tuple( "xyz.openbmc_project.Software.Version.VersionPurpose.Host",                 Version::VersionPurpose::Host ),
-        };
-
-} // anonymous namespace
-
-auto Version::convertVersionPurposeFromString(std::string& s) ->
-        VersionPurpose
-{
-    auto i = std::find_if(
-            std::begin(mappingVersionVersionPurpose),
-            std::end(mappingVersionVersionPurpose),
-            [&s](auto& e){ return 0 == strcmp(s.c_str(), std::get<0>(e)); } );
-    if (std::end(mappingVersionVersionPurpose) == i)
-    {
-        throw sdbusplus::exception::InvalidEnumString();
-    }
-    else
-    {
-        return std::get<1>(*i);
-    }
-}
-
-std::string convertForMessage(Version::VersionPurpose v)
-{
-    auto i = std::find_if(
-            std::begin(mappingVersionVersionPurpose),
-            std::end(mappingVersionVersionPurpose),
-            [v](auto& e){ return v == std::get<1>(e); });
-    return std::get<0>(*i);
-}
-
-const vtable::vtable_t Version::_vtable[] = {
-    vtable::start(),
-    vtable::property("Version",
-                     details::Version::_property_Version
-                        .data(),
-                     _callback_get_Version,
-                     _callback_set_Version,
-                     vtable::property_::emits_change),
-    vtable::property("Purpose",
-                     details::Version::_property_Purpose
-                        .data(),
-                     _callback_get_Purpose,
-                     _callback_set_Purpose,
-                     vtable::property_::emits_change),
-    vtable::end()
-};
-
-} // namespace server
-} // namespace Software
-} // namespace openbmc_project
-} // namespace xyz
-} // namespace sdbusplus
-
diff --git a/xyz/openbmc_project/Software/Activation/server.hpp b/xyz/openbmc_project/Software/Activation/server.hpp
deleted file mode 100644
index 011d202..0000000
--- a/xyz/openbmc_project/Software/Activation/server.hpp
+++ /dev/null
@@ -1,136 +0,0 @@
-#pragma once
-#include <tuple>
-#include <systemd/sd-bus.h>
-#include <sdbusplus/server.hpp>
-
-namespace sdbusplus
-{
-namespace xyz
-{
-namespace openbmc_project
-{
-namespace Software
-{
-namespace server
-{
-
-class Activation
-{
-    public:
-        /* Define all of the basic class operations:
-         *     Not allowed:
-         *         - Default constructor to avoid nullptrs.
-         *         - Copy operations due to internal unique_ptr.
-         *         - Move operations due to 'this' being registered as the
-         *           'context' with sdbus.
-         *     Allowed:
-         *         - Destructor.
-         */
-        Activation() = delete;
-        Activation(const Activation&) = delete;
-        Activation& operator=(const Activation&) = delete;
-        Activation(Activation&&) = delete;
-        Activation& operator=(Activation&&) = delete;
-        virtual ~Activation() = default;
-
-        /** @brief Constructor to put object onto bus at a dbus path.
-         *  @param[in] bus - Bus to attach to.
-         *  @param[in] path - Path to attach at.
-         */
-        Activation(bus::bus& bus, const char* path);
-
-        enum class Activations
-        {
-            NotReady,
-            Invalid,
-            Ready,
-            Activating,
-            Active,
-            Failed,
-        };
-        enum class RequestedActivations
-        {
-            None,
-            Active,
-        };
-
-
-
-        /** Get value of Activation */
-        virtual Activations activation() const;
-        /** Set value of Activation */
-        virtual Activations activation(Activations value);
-        /** Get value of RequestedActivation */
-        virtual RequestedActivations requestedActivation() const;
-        /** Set value of RequestedActivation */
-        virtual RequestedActivations requestedActivation(RequestedActivations value);
-
-    /** @brief Convert a string to an appropriate enum value.
-     *  @param[in] s - The string to convert in the form of
-     *                 "xyz.openbmc_project.Software.Activation.<value name>"
-     *  @return - The enum value.
-     */
-    static Activations convertActivationsFromString(std::string& s);
-    /** @brief Convert a string to an appropriate enum value.
-     *  @param[in] s - The string to convert in the form of
-     *                 "xyz.openbmc_project.Software.Activation.<value name>"
-     *  @return - The enum value.
-     */
-    static RequestedActivations convertRequestedActivationsFromString(std::string& s);
-
-    private:
-
-        /** @brief sd-bus callback for get-property 'Activation' */
-        static int _callback_get_Activation(
-            sd_bus*, const char*, const char*, const char*,
-            sd_bus_message*, void*, sd_bus_error*);
-        /** @brief sd-bus callback for set-property 'Activation' */
-        static int _callback_set_Activation(
-            sd_bus*, const char*, const char*, const char*,
-            sd_bus_message*, void*, sd_bus_error*);
-
-        /** @brief sd-bus callback for get-property 'RequestedActivation' */
-        static int _callback_get_RequestedActivation(
-            sd_bus*, const char*, const char*, const char*,
-            sd_bus_message*, void*, sd_bus_error*);
-        /** @brief sd-bus callback for set-property 'RequestedActivation' */
-        static int _callback_set_RequestedActivation(
-            sd_bus*, const char*, const char*, const char*,
-            sd_bus_message*, void*, sd_bus_error*);
-
-
-        static constexpr auto _interface = "xyz.openbmc_project.Software.Activation";
-        static const vtable::vtable_t _vtable[];
-        sdbusplus::server::interface::interface
-                _xyz_openbmc_project_Software_Activation_interface;
-
-        Activations _activation{};
-        RequestedActivations _requestedActivation{};
-
-};
-
-/* Specialization of sdbusplus::server::bindings::details::convertForMessage
- * for enum-type Activation::Activations.
- *
- * This converts from the enum to a constant c-string representing the enum.
- *
- * @param[in] e - Enum value to convert.
- * @return C-string representing the name for the enum value.
- */
-std::string convertForMessage(Activation::Activations e);
-/* Specialization of sdbusplus::server::bindings::details::convertForMessage
- * for enum-type Activation::RequestedActivations.
- *
- * This converts from the enum to a constant c-string representing the enum.
- *
- * @param[in] e - Enum value to convert.
- * @return C-string representing the name for the enum value.
- */
-std::string convertForMessage(Activation::RequestedActivations e);
-
-} // namespace server
-} // namespace Software
-} // namespace openbmc_project
-} // namespace xyz
-} // namespace sdbusplus
-
diff --git a/xyz/openbmc_project/Software/Version/server.hpp b/xyz/openbmc_project/Software/Version/server.hpp
deleted file mode 100755
index d92b48a..0000000
--- a/xyz/openbmc_project/Software/Version/server.hpp
+++ /dev/null
@@ -1,115 +0,0 @@
-#pragma once
-#include <tuple>
-#include <systemd/sd-bus.h>
-#include <sdbusplus/server.hpp>
-
-namespace sdbusplus
-{
-namespace xyz
-{
-namespace openbmc_project
-{
-namespace Software
-{
-namespace server
-{
-
-class Version
-{
-    public:
-        /* Define all of the basic class operations:
-         *     Not allowed:
-         *         - Default constructor to avoid nullptrs.
-         *         - Copy operations due to internal unique_ptr.
-         *         - Move operations due to 'this' being registered as the
-         *           'context' with sdbus.
-         *     Allowed:
-         *         - Destructor.
-         */
-        Version() = delete;
-        Version(const Version&) = delete;
-        Version& operator=(const Version&) = delete;
-        Version(Version&&) = delete;
-        Version& operator=(Version&&) = delete;
-        virtual ~Version() = default;
-
-        /** @brief Constructor to put object onto bus at a dbus path.
-         *  @param[in] bus - Bus to attach to.
-         *  @param[in] path - Path to attach at.
-         */
-        Version(bus::bus& bus, const char* path);
-
-        enum class VersionPurpose
-        {
-            Unknown,
-            Other,
-            System,
-            BMC,
-            Host,
-        };
-
-
-
-        /** Get value of Version */
-        virtual std::string version() const;
-        /** Set value of Version */
-        virtual std::string version(std::string value);
-        /** Get value of Purpose */
-        virtual VersionPurpose purpose() const;
-        /** Set value of Purpose */
-        virtual VersionPurpose purpose(VersionPurpose value);
-
-    /** @brief Convert a string to an appropriate enum value.
-     *  @param[in] s - The string to convert in the form of
-     *                 "xyz.openbmc_project.Software.Version.<value name>"
-     *  @return - The enum value.
-     */
-    static VersionPurpose convertVersionPurposeFromString(std::string& s);
-
-    private:
-
-        /** @brief sd-bus callback for get-property 'Version' */
-        static int _callback_get_Version(
-            sd_bus*, const char*, const char*, const char*,
-            sd_bus_message*, void*, sd_bus_error*);
-        /** @brief sd-bus callback for set-property 'Version' */
-        static int _callback_set_Version(
-            sd_bus*, const char*, const char*, const char*,
-            sd_bus_message*, void*, sd_bus_error*);
-
-        /** @brief sd-bus callback for get-property 'Purpose' */
-        static int _callback_get_Purpose(
-            sd_bus*, const char*, const char*, const char*,
-            sd_bus_message*, void*, sd_bus_error*);
-        /** @brief sd-bus callback for set-property 'Purpose' */
-        static int _callback_set_Purpose(
-            sd_bus*, const char*, const char*, const char*,
-            sd_bus_message*, void*, sd_bus_error*);
-
-
-        static constexpr auto _interface = "xyz.openbmc_project.Software.Version";
-        static const vtable::vtable_t _vtable[];
-        sdbusplus::server::interface::interface
-                _xyz_openbmc_project_Software_Version_interface;
-
-        std::string _version{};
-        VersionPurpose _purpose{};
-
-};
-
-/* Specialization of sdbusplus::server::bindings::details::convertForMessage
- * for enum-type Version::VersionPurpose.
- *
- * This converts from the enum to a constant c-string representing the enum.
- *
- * @param[in] e - Enum value to convert.
- * @return C-string representing the name for the enum value.
- */
-std::string convertForMessage(Version::VersionPurpose e);
-
-} // namespace server
-} // namespace Software
-} // namespace openbmc_project
-} // namespace xyz
-} // namespace sdbusplus
-
