diff --git a/service/CMakeLists.txt b/service/CMakeLists.txt
new file mode 100644
index 0000000..10377f1
--- /dev/null
+++ b/service/CMakeLists.txt
@@ -0,0 +1,50 @@
+cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
+project(intel-pfr-manager CXX)
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
+
+set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+
+include(GNUInstallDirs)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
+
+set(SRC_FILES src/mainapp.cpp src/pfr_mgr.cpp)
+
+find_package(Boost REQUIRED)
+include_directories(${Boost_INCLUDE_DIRS})
+add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
+add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED)
+add_definitions(-DBOOST_ALL_NO_LIB)
+add_definitions(-DBOOST_NO_RTTI)
+add_definitions(-DBOOST_NO_TYPEID)
+add_definitions(-DBOOST_ASIO_DISABLE_THREADS)
+
+# import libsystemd
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(SYSTEMD libsystemd REQUIRED)
+include_directories(${SYSTEMD_INCLUDE_DIRS})
+link_directories(${SYSTEMD_LIBRARY_DIRS})
+
+# import sdbusplus
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(SDBUSPLUSPLUS sdbusplus REQUIRED)
+include_directories(${SDBUSPLUSPLUS_INCLUDE_DIRS})
+link_directories(${SDBUSPLUSPLUS_LIBRARY_DIRS})
+find_program(SDBUSPLUSPLUS sdbus++)
+
+# import phosphor-logging
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(LOGGING phosphor-logging REQUIRED)
+include_directories(${LOGGING_INCLUDE_DIRS})
+link_directories(${LOGGING_LIBRARY_DIRS})
+
+add_executable(${PROJECT_NAME} ${SRC_FILES})
+target_link_libraries(${PROJECT_NAME} systemd)
+target_link_libraries(${PROJECT_NAME} "${SDBUSPLUSPLUS_LIBRARIES} -lstdc++fs")
+target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
+target_link_libraries(${PROJECT_NAME} phosphor_logging)
+target_link_libraries(${PROJECT_NAME} pfr)
+target_link_libraries(${PROJECT_NAME} i2c)
+
+install(TARGETS ${PROJECT_NAME} DESTINATION bin)
diff --git a/service/inc/pfr_mgr.hpp b/service/inc/pfr_mgr.hpp
new file mode 100644
index 0000000..d1bd7e5
--- /dev/null
+++ b/service/inc/pfr_mgr.hpp
@@ -0,0 +1,65 @@
+/*
+// Copyright (c) 2019 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#pragma once
+
+#include <string>
+#include <sdbusplus/asio/object_server.hpp>
+#include <phosphor-logging/log.hpp>
+#include <boost/asio.hpp>
+
+namespace intel
+{
+namespace pfr
+{
+
+class PfrVersion
+{
+  public:
+    PfrVersion(sdbusplus::asio::object_server &srv_,
+               std::shared_ptr<sdbusplus::asio::connection> &conn_,
+               const std::string &path_);
+    ~PfrVersion() = default;
+
+    std::shared_ptr<sdbusplus::asio::connection> conn;
+
+  private:
+    sdbusplus::asio::object_server &server;
+
+    std::string path;
+    std::string version;
+    std::string purpose;
+};
+
+class PfrConfig
+{
+  public:
+    PfrConfig(sdbusplus::asio::object_server &srv_,
+              std::shared_ptr<sdbusplus::asio::connection> &conn_);
+    ~PfrConfig() = default;
+
+    std::shared_ptr<sdbusplus::asio::connection> conn;
+
+  private:
+    sdbusplus::asio::object_server &server;
+
+    bool getPFRProvisionedState();
+    std::string getBIOSVersion(uint8_t type);
+    std::string getBMCVersion(uint8_t type);
+};
+
+} // namespace pfr
+} // namespace intel
diff --git a/service/src/mainapp.cpp b/service/src/mainapp.cpp
new file mode 100644
index 0000000..d1f2b20
--- /dev/null
+++ b/service/src/mainapp.cpp
@@ -0,0 +1,45 @@
+/*
+// Copyright (c) 2019 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#include "pfr_mgr.hpp"
+
+static std::array<std::string, 5> listVersionPaths = {
+    "bmc_active", "bmc_recovery", "bios_active", "bios_recovery", "cpld"};
+
+int main()
+{
+    // setup connection to dbus
+    boost::asio::io_service io;
+    auto conn = std::make_shared<sdbusplus::asio::connection>(io);
+    conn->request_name("xyz.openbmc_project.Intel.PFR.Manager");
+    auto server = sdbusplus::asio::object_server(conn, true);
+
+    // Create Intel PFR attributes object and interface
+    intel::pfr::PfrConfig obj(server, conn);
+
+    // Create Software objects using Versions interface
+    for (const auto& path : listVersionPaths)
+    {
+        intel::pfr::PfrVersion obj(server, conn, path);
+    }
+
+    phosphor::logging::log<phosphor::logging::level::INFO>(
+        "Intel PFR service started successfully");
+
+    io.run();
+
+    return 0;
+}
diff --git a/service/src/pfr_mgr.cpp b/service/src/pfr_mgr.cpp
new file mode 100644
index 0000000..91a9504
--- /dev/null
+++ b/service/src/pfr_mgr.cpp
@@ -0,0 +1,104 @@
+/*
+// Copyright (c) 2019 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#include "pfr_mgr.hpp"
+#include "pfr.hpp"
+
+namespace intel
+{
+namespace pfr
+{
+
+static constexpr uint8_t activeImage = 0;
+static constexpr uint8_t recoveryImage = 1;
+
+PfrVersion::PfrVersion(sdbusplus::asio::object_server &srv_,
+                       std::shared_ptr<sdbusplus::asio::connection> &conn_,
+                       const std::string &path_) :
+    server(srv_),
+    conn(conn_), path(path_)
+{
+    if (path == "bmc_active")
+    {
+        purpose = "xyz.openbmc_project.Software.Version.VersionPurpose.BMC";
+        ImageType imgType = ImageType::bmcActive;
+        version = getVersionInfoCPLD(imgType);
+    }
+    else if (path == "bmc_recovery")
+    {
+        purpose = "xyz.openbmc_project.Software.Version.VersionPurpose.BMC";
+        ImageType imgType = ImageType::bmcRecovery;
+        version = getVersionInfoCPLD(imgType);
+    }
+    else if (path == "bios_active")
+    {
+        purpose = "xyz.openbmc_project.Software.Version.VersionPurpose.Host";
+        ImageType imgType = ImageType::biosActive;
+        version = getVersionInfoCPLD(imgType);
+    }
+    else if (path == "bios_recovery")
+    {
+        purpose = "xyz.openbmc_project.Software.Version.VersionPurpose.Host";
+        ImageType imgType = ImageType::biosRecovery;
+        version = getVersionInfoCPLD(imgType);
+    }
+    else if (path == "cpld")
+    {
+        purpose = "xyz.openbmc_project.Software.Version.VersionPurpose.Other";
+        ImageType imgType = ImageType::cpld;
+        version = getVersionInfoCPLD(imgType);
+    }
+    else
+    {
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Invalid path specified for PfrVersion");
+        return;
+    }
+
+    std::string objPath = "/xyz/openbmc_project/software/" + path;
+    auto iface =
+        server.add_interface(objPath, "xyz.openbmc_project.Software.Version");
+    iface->register_property("Purpose", purpose);
+    iface->register_property("Version", version);
+
+    iface->initialize();
+}
+
+bool PfrConfig::getPFRProvisionedState()
+{
+    bool ufmProvisioned = false;
+    bool ufmLocked = false;
+    getProvisioningStatus(ufmLocked, ufmProvisioned);
+
+    return ufmProvisioned;
+}
+
+PfrConfig::PfrConfig(sdbusplus::asio::object_server &srv_,
+                     std::shared_ptr<sdbusplus::asio::connection> &conn_) :
+    server(srv_),
+    conn(conn_)
+{
+    auto pfrIntf =
+        server.add_interface("/xyz/openbmc_project/intel_pfr",
+                             "xyz.openbmc_project.Intel_PFR.Attributes");
+
+    pfrIntf->register_property("provisioned_state", getPFRProvisionedState());
+
+    pfrIntf->initialize();
+}
+
+} // namespace pfr
+} // namespace intel
