diff --git a/redundant-bmc/manager.cpp b/redundant-bmc/manager.cpp
new file mode 100644
index 0000000..7ad79b3
--- /dev/null
+++ b/redundant-bmc/manager.cpp
@@ -0,0 +1,32 @@
+#include "manager.hpp"
+
+#include "role_determination.hpp"
+
+#include <phosphor-logging/lg2.hpp>
+
+namespace bmc::redundancy
+{
+
+Manager::Manager(sdbusplus::async::context& ctx) :
+    ctx(ctx),
+    redundancyInterface(ctx.get_bus(), RedundancyInterface::instance_path)
+{
+    ctx.spawn(startup());
+}
+
+sdbusplus::async::task<> Manager::startup()
+{
+    determineRole();
+    co_return;
+}
+
+void Manager::determineRole()
+{
+    auto role = role_determination::run();
+
+    lg2::info("Role Determined: {ROLE}", "ROLE", role);
+
+    redundancyInterface.role(role);
+}
+
+} // namespace bmc::redundancy
diff --git a/redundant-bmc/manager.hpp b/redundant-bmc/manager.hpp
new file mode 100644
index 0000000..c40dc91
--- /dev/null
+++ b/redundant-bmc/manager.hpp
@@ -0,0 +1,50 @@
+#pragma once
+#include <sdbusplus/async/context.hpp>
+#include <xyz/openbmc_project/State/BMC/Redundancy/server.hpp>
+
+namespace bmc::redundancy
+{
+
+using RedundancyIntf =
+    sdbusplus::xyz::openbmc_project::State::BMC::server::Redundancy;
+using RedundancyInterface = sdbusplus::server::object_t<RedundancyIntf>;
+
+class Manager
+{
+  public:
+    ~Manager() = default;
+    Manager(const Manager&) = delete;
+    Manager& operator=(const Manager&) = delete;
+    Manager(Manager&&) = delete;
+    Manager& operator=(Manager&&) = delete;
+
+    /**
+     * @brief Constructor
+     *
+     * @param cts - The async context object
+     */
+    explicit Manager(sdbusplus::async::context& ctx);
+
+  private:
+    /**
+     * @brief Kicks off the Manager startup as a coroutine
+     */
+    sdbusplus::async::task<> startup();
+
+    /**
+     * @brief Determines the BMC role, active or passive
+     */
+    void determineRole();
+
+    /**
+     * @brief The async context object
+     */
+    sdbusplus::async::context& ctx;
+
+    /**
+     * @brief The Redundancy D-Bus interface
+     */
+    RedundancyInterface redundancyInterface;
+};
+
+} // namespace bmc::redundancy
diff --git a/redundant-bmc/meson.build b/redundant-bmc/meson.build
new file mode 100644
index 0000000..27fe26a
--- /dev/null
+++ b/redundant-bmc/meson.build
@@ -0,0 +1,40 @@
+librbmc_sources = files(
+  'manager.cpp',
+  'role_determination.cpp',
+)
+
+librbmc_deps = [
+  sdbusplus,
+  phosphordbusinterfaces,
+  phosphorlogging,
+]
+
+librbmc_lib = static_library(
+  'rbmc',
+  librbmc_sources,
+  dependencies: [
+    librbmc_deps
+  ]
+)
+
+librbmc_dep = declare_dependency(
+  include_directories: include_directories('.'),
+  link_with: librbmc_lib,
+  dependencies: [
+    sdbusplus,
+    phosphordbusinterfaces,
+    phosphorlogging,
+  ]
+)
+
+executable('phosphor-rbmc-state-manager',
+           'rbmc_state_manager_main.cpp',
+            dependencies: [
+                librbmc_dep
+            ],
+    install: true
+)
+
+if get_option('tests').allowed()
+    subdir('test')
+endif
\ No newline at end of file
diff --git a/redundant-bmc/rbmc_state_manager_main.cpp b/redundant-bmc/rbmc_state_manager_main.cpp
new file mode 100644
index 0000000..b2196de
--- /dev/null
+++ b/redundant-bmc/rbmc_state_manager_main.cpp
@@ -0,0 +1,21 @@
+#include "manager.hpp"
+
+#include <sdbusplus/async.hpp>
+
+int main()
+{
+    sdbusplus::async::context ctx;
+    sdbusplus::server::manager_t objMgr{
+        ctx, bmc::redundancy::RedundancyInterface::instance_path};
+
+    bmc::redundancy::Manager manager{ctx};
+
+    ctx.spawn([](sdbusplus::async::context& ctx) -> sdbusplus::async::task<> {
+        ctx.request_name(bmc::redundancy::RedundancyInterface::default_service);
+        co_return;
+    }(ctx));
+
+    ctx.run();
+
+    return 0;
+}
diff --git a/redundant-bmc/role_determination.cpp b/redundant-bmc/role_determination.cpp
new file mode 100644
index 0000000..ef28c06
--- /dev/null
+++ b/redundant-bmc/role_determination.cpp
@@ -0,0 +1,14 @@
+#include "role_determination.hpp"
+
+namespace role_determination
+{
+using Redundancy =
+    sdbusplus::common::xyz::openbmc_project::state::bmc::Redundancy;
+
+Redundancy::Role run()
+{
+    using enum Redundancy::Role;
+    return Passive;
+}
+
+} // namespace role_determination
diff --git a/redundant-bmc/role_determination.hpp b/redundant-bmc/role_determination.hpp
new file mode 100644
index 0000000..69ae2c9
--- /dev/null
+++ b/redundant-bmc/role_determination.hpp
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <xyz/openbmc_project/State/BMC/Redundancy/common.hpp>
+
+namespace role_determination
+{
+
+/**
+ * @brief Determines if this BMC should claim the Active or Passive role.
+ *
+ * @return The role
+ */
+sdbusplus::common::xyz::openbmc_project::state::bmc::Redundancy::Role run();
+
+} // namespace role_determination
diff --git a/redundant-bmc/test/meson.build b/redundant-bmc/test/meson.build
new file mode 100644
index 0000000..60edfc6
--- /dev/null
+++ b/redundant-bmc/test/meson.build
@@ -0,0 +1,15 @@
+test('rbmc-state-manager-tests',
+  executable('rbmc-state-manager-tests',
+    'role_determination_test.cpp',
+    dependencies: [
+      gtest,
+      phosphordbusinterfaces,
+      sdbusplus,
+      phosphorlogging,
+    ],
+    link_with: [
+      librbmc_lib
+    ],
+    include_directories: '../'
+  )
+)
diff --git a/redundant-bmc/test/role_determination_test.cpp b/redundant-bmc/test/role_determination_test.cpp
new file mode 100644
index 0000000..1fab501
--- /dev/null
+++ b/redundant-bmc/test/role_determination_test.cpp
@@ -0,0 +1,13 @@
+#include "role_determination.hpp"
+
+#include <gtest/gtest.h>
+
+using Role =
+    sdbusplus::common::xyz::openbmc_project::state::bmc::Redundancy::Role;
+
+namespace rd = role_determination;
+
+TEST(RoleDeterminationTest, RoleDeterminationTest)
+{
+    EXPECT_EQ(rd::run(), Role::Passive);
+}
