diff --git a/xyz.openbmc_project.Logging.Entry.cpp b/xyz.openbmc_project.Logging.Entry.cpp
new file mode 100644
index 0000000..cdf91f5
--- /dev/null
+++ b/xyz.openbmc_project.Logging.Entry.cpp
@@ -0,0 +1,400 @@
+#include <algorithm>
+#include <sdbusplus/server.hpp>
+#include <sdbusplus/exception.hpp>
+#include <xyz/openbmc_project/Logging/Entry/server.hpp>
+
+namespace sdbusplus
+{
+namespace xyz
+{
+namespace openbmc_project
+{
+namespace Logging
+{
+namespace server
+{
+
+Entry::Entry(bus::bus& bus, const char* path)
+        : _xyz_openbmc_project_Logging_Entry_interface(
+                bus, path, _interface, _vtable, this)
+{
+}
+
+
+
+auto Entry::id() const ->
+        uint32_t
+{
+    return _id;
+}
+
+int Entry::_callback_get_Id(
+        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<Entry*>(context);
+        m.append(convertForMessage(o->id()));
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+auto Entry::id(uint32_t value) ->
+        uint32_t
+{
+    if (_id != value)
+    {
+        _id = value;
+        _xyz_openbmc_project_Logging_Entry_interface.property_changed("Id");
+    }
+
+    return _id;
+}
+
+int Entry::_callback_set_Id(
+        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<Entry*>(context);
+
+        uint32_t v{};
+        m.read(v);
+        o->id(v);
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace Entry
+{
+static const auto _property_Id =
+    utility::tuple_to_array(message::types::type_id<
+            uint32_t>());
+}
+}
+auto Entry::severity() const ->
+        Level
+{
+    return _severity;
+}
+
+int Entry::_callback_get_Severity(
+        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<Entry*>(context);
+        m.append(convertForMessage(o->severity()));
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+auto Entry::severity(Level value) ->
+        Level
+{
+    if (_severity != value)
+    {
+        _severity = value;
+        _xyz_openbmc_project_Logging_Entry_interface.property_changed("Severity");
+    }
+
+    return _severity;
+}
+
+int Entry::_callback_set_Severity(
+        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<Entry*>(context);
+
+        std::string v{};
+        m.read(v);
+        o->severity(convertLevelFromString(v));
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace Entry
+{
+static const auto _property_Severity =
+    utility::tuple_to_array(message::types::type_id<
+            std::string>());
+}
+}
+auto Entry::message() const ->
+        std::string
+{
+    return _message;
+}
+
+int Entry::_callback_get_Message(
+        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<Entry*>(context);
+        m.append(convertForMessage(o->message()));
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+auto Entry::message(std::string value) ->
+        std::string
+{
+    if (_message != value)
+    {
+        _message = value;
+        _xyz_openbmc_project_Logging_Entry_interface.property_changed("Message");
+    }
+
+    return _message;
+}
+
+int Entry::_callback_set_Message(
+        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<Entry*>(context);
+
+        std::string v{};
+        m.read(v);
+        o->message(v);
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace Entry
+{
+static const auto _property_Message =
+    utility::tuple_to_array(message::types::type_id<
+            std::string>());
+}
+}
+auto Entry::additionalData() const ->
+        std::vector<std::string>
+{
+    return _additionalData;
+}
+
+int Entry::_callback_get_AdditionalData(
+        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<Entry*>(context);
+        m.append(convertForMessage(o->additionalData()));
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+auto Entry::additionalData(std::vector<std::string> value) ->
+        std::vector<std::string>
+{
+    if (_additionalData != value)
+    {
+        _additionalData = value;
+        _xyz_openbmc_project_Logging_Entry_interface.property_changed("AdditionalData");
+    }
+
+    return _additionalData;
+}
+
+int Entry::_callback_set_AdditionalData(
+        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<Entry*>(context);
+
+        std::vector<std::string> v{};
+        m.read(v);
+        o->additionalData(v);
+    }
+    catch(sdbusplus::internal_exception_t& e)
+    {
+        sd_bus_error_set_const(error, e.name(), e.description());
+        return -EINVAL;
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace Entry
+{
+static const auto _property_AdditionalData =
+    utility::tuple_to_array(message::types::type_id<
+            std::vector<std::string>>());
+}
+}
+
+
+namespace
+{
+/** String to enum mapping for Entry::Level */
+static const std::tuple<const char*, Entry::Level> mappingEntryLevel[] =
+        {
+            std::make_tuple( "xyz.openbmc_project.Logging.Entry.Level.Emergency",                 Entry::Level::Emergency ),
+            std::make_tuple( "xyz.openbmc_project.Logging.Entry.Level.Alert",                 Entry::Level::Alert ),
+            std::make_tuple( "xyz.openbmc_project.Logging.Entry.Level.Critical",                 Entry::Level::Critical ),
+            std::make_tuple( "xyz.openbmc_project.Logging.Entry.Level.Error",                 Entry::Level::Error ),
+            std::make_tuple( "xyz.openbmc_project.Logging.Entry.Level.Warning",                 Entry::Level::Warning ),
+            std::make_tuple( "xyz.openbmc_project.Logging.Entry.Level.Notice",                 Entry::Level::Notice ),
+            std::make_tuple( "xyz.openbmc_project.Logging.Entry.Level.Informational",                 Entry::Level::Informational ),
+            std::make_tuple( "xyz.openbmc_project.Logging.Entry.Level.Debug",                 Entry::Level::Debug ),
+        };
+
+} // anonymous namespace
+
+auto Entry::convertLevelFromString(std::string& s) ->
+        Level
+{
+    auto i = std::find_if(
+            std::begin(mappingEntryLevel),
+            std::end(mappingEntryLevel),
+            [&s](auto& e){ return 0 == strcmp(s.c_str(), std::get<0>(e)); } );
+    if (std::end(mappingEntryLevel) == i)
+    {
+        throw sdbusplus::exception::InvalidEnumString();
+    }
+    else
+    {
+        return std::get<1>(*i);
+    }
+}
+
+std::string convertForMessage(Entry::Level v)
+{
+    auto i = std::find_if(
+            std::begin(mappingEntryLevel),
+            std::end(mappingEntryLevel),
+            [v](auto& e){ return v == std::get<1>(e); });
+    return std::get<0>(*i);
+}
+
+const vtable::vtable_t Entry::_vtable[] = {
+    vtable::start(),
+    vtable::property("Id",
+                     details::Entry::_property_Id
+                        .data(),
+                     _callback_get_Id,
+                     _callback_set_Id,
+                     vtable::property_::emits_change),
+    vtable::property("Severity",
+                     details::Entry::_property_Severity
+                        .data(),
+                     _callback_get_Severity,
+                     _callback_set_Severity,
+                     vtable::property_::emits_change),
+    vtable::property("Message",
+                     details::Entry::_property_Message
+                        .data(),
+                     _callback_get_Message,
+                     _callback_set_Message,
+                     vtable::property_::emits_change),
+    vtable::property("AdditionalData",
+                     details::Entry::_property_AdditionalData
+                        .data(),
+                     _callback_get_AdditionalData,
+                     _callback_set_AdditionalData,
+                     vtable::property_::emits_change),
+    vtable::end()
+};
+
+} // namespace server
+} // namespace Logging
+} // namespace openbmc_project
+} // namespace xyz
+} // namespace sdbusplus
+
