diff --git a/src/entity_manager.cpp b/src/entity_manager.cpp
index d56a9f4..db1dfb8 100644
--- a/src/entity_manager.cpp
+++ b/src/entity_manager.cpp
@@ -76,6 +76,7 @@
 // todo: pass this through nicer
 std::shared_ptr<sdbusplus::asio::connection> systemBus;
 nlohmann::json lastJson;
+Topology topology;
 
 boost::asio::io_context io;
 
@@ -566,7 +567,7 @@
                 sdbusplus::asio::object_server& objServer)
 
 {
-    Topology topology;
+    std::map<std::string, std::string> newBoards; // path -> name
 
     // iterate through boards
     for (const auto& [boardId, boardConfig] : newConfiguration.items())
@@ -782,16 +783,26 @@
                 }
             }
 
-            topology.addBoard(boardPath, boardType, item);
+            topology.addBoard(boardPath, boardType, boardNameOrig, item);
         }
+
+        newBoards.emplace(boardPath, boardNameOrig);
     }
 
-    for (const auto& boardAssoc : topology.getAssocs())
+    for (const auto& [assocPath, assocPropValue] :
+         topology.getAssocs(newBoards))
     {
-        auto ifacePtr = objServer.add_interface(
-            boardAssoc.first, "xyz.openbmc_project.Association.Definitions");
+        auto findBoard = newBoards.find(assocPath);
+        if (findBoard == newBoards.end())
+        {
+            continue;
+        }
 
-        ifacePtr->register_property("Associations", boardAssoc.second);
+        auto ifacePtr = createInterface(
+            objServer, assocPath, "xyz.openbmc_project.Association.Definitions",
+            findBoard->second);
+
+        ifacePtr->register_property("Associations", assocPropValue);
         ifacePtr->initialize();
     }
 }
@@ -974,6 +985,7 @@
 
     ifaces.clear();
     systemConfiguration.erase(name);
+    topology.remove(device["Name"].get<std::string>());
     logDeviceRemoved(device);
 }
 
diff --git a/src/topology.cpp b/src/topology.cpp
index 02e7458..f2ee22b 100644
--- a/src/topology.cpp
+++ b/src/topology.cpp
@@ -3,6 +3,7 @@
 #include <iostream>
 
 void Topology::addBoard(const std::string& path, const std::string& boardType,
+                        const std::string& boardName,
                         const nlohmann::json& exposesItem)
 {
     auto findType = exposesItem.find("Type");
@@ -10,6 +11,9 @@
     {
         return;
     }
+
+    boardNames.try_emplace(boardName, path);
+
     PortType exposesType = findType->get<std::string>();
 
     if (exposesType == "DownstreamPort")
@@ -33,7 +37,8 @@
     }
 }
 
-std::unordered_map<std::string, std::vector<Association>> Topology::getAssocs()
+std::unordered_map<std::string, std::vector<Association>>
+    Topology::getAssocs(const std::map<Path, BoardName>& boards)
 {
     std::unordered_map<std::string, std::vector<Association>> result;
 
@@ -55,8 +60,12 @@
             {
                 for (const Path& downstream : downstreamMatch->second)
                 {
-                    result[downstream].emplace_back("contained_by",
-                                                    "containing", upstream);
+                    // The downstream path must be one we care about.
+                    if (boards.find(downstream) != boards.end())
+                    {
+                        result[downstream].emplace_back("contained_by",
+                                                        "containing", upstream);
+                    }
                 }
             }
         }
@@ -64,3 +73,57 @@
 
     return result;
 }
+
+void Topology::remove(const std::string& boardName)
+{
+    // Remove the board from boardNames, and then using the path
+    // found in boardNames remove it from upstreamPorts and
+    // downstreamPorts.
+    auto boardFind = boardNames.find(boardName);
+    if (boardFind == boardNames.end())
+    {
+        return;
+    }
+
+    std::string boardPath = boardFind->second;
+
+    boardNames.erase(boardFind);
+
+    for (auto it = upstreamPorts.begin(); it != upstreamPorts.end();)
+    {
+        auto pathIt = std::find(it->second.begin(), it->second.end(),
+                                boardPath);
+        if (pathIt != it->second.end())
+        {
+            it->second.erase(pathIt);
+        }
+
+        if (it->second.empty())
+        {
+            it = upstreamPorts.erase(it);
+        }
+        else
+        {
+            ++it;
+        }
+    }
+
+    for (auto it = downstreamPorts.begin(); it != downstreamPorts.end();)
+    {
+        auto pathIt = std::find(it->second.begin(), it->second.end(),
+                                boardPath);
+        if (pathIt != it->second.end())
+        {
+            it->second.erase(pathIt);
+        }
+
+        if (it->second.empty())
+        {
+            it = downstreamPorts.erase(it);
+        }
+        else
+        {
+            ++it;
+        }
+    }
+}
diff --git a/src/topology.hpp b/src/topology.hpp
index 18c9244..4ea5246 100644
--- a/src/topology.hpp
+++ b/src/topology.hpp
@@ -13,15 +13,20 @@
     explicit Topology() = default;
 
     void addBoard(const std::string& path, const std::string& boardType,
+                  const std::string& boardName,
                   const nlohmann::json& exposesItem);
-    std::unordered_map<std::string, std::vector<Association>> getAssocs();
+    std::unordered_map<std::string, std::vector<Association>>
+        getAssocs(const std::map<std::string, std::string>& boards);
+    void remove(const std::string& boardName);
 
   private:
     using Path = std::string;
     using BoardType = std::string;
+    using BoardName = std::string;
     using PortType = std::string;
 
     std::unordered_map<PortType, std::vector<Path>> upstreamPorts;
     std::unordered_map<PortType, std::vector<Path>> downstreamPorts;
     std::unordered_map<Path, BoardType> boardTypes;
+    std::unordered_map<BoardName, Path> boardNames;
 };
diff --git a/test/test_topology.cpp b/test/test_topology.cpp
index 76ab54a..f9beee3 100644
--- a/test/test_topology.cpp
+++ b/test/test_topology.cpp
@@ -35,11 +35,14 @@
     }
 )");
 
+using BoardMap = std::map<std::string, std::string>;
+
 TEST(Topology, Empty)
 {
     Topology topo;
+    BoardMap boards;
 
-    auto assocs = topo.getAssocs();
+    auto assocs = topo.getAssocs(boards);
 
     EXPECT_EQ(assocs.size(), 0);
 }
@@ -47,11 +50,12 @@
 TEST(Topology, EmptyExposes)
 {
     Topology topo;
+    BoardMap boards{{subchassisPath, "BoardA"}, {superchassisPath, "BoardB"}};
 
-    topo.addBoard(subchassisPath, "Chassis", nlohmann::json());
-    topo.addBoard(superchassisPath, "Chassis", nlohmann::json());
+    topo.addBoard(subchassisPath, "Chassis", "BoardA", nlohmann::json());
+    topo.addBoard(superchassisPath, "Chassis", "BoardB", nlohmann::json());
 
-    auto assocs = topo.getAssocs();
+    auto assocs = topo.getAssocs(boards);
 
     EXPECT_EQ(assocs.size(), 0);
 }
@@ -66,11 +70,14 @@
     )");
 
     Topology topo;
+    BoardMap boards{{subchassisPath, "BoardA"}, {superchassisPath, "BoardB"}};
 
-    topo.addBoard(subchassisPath, "Chassis", subchassisMissingConnectsTo);
-    topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
+    topo.addBoard(subchassisPath, "Chassis", "BoardA",
+                  subchassisMissingConnectsTo);
+    topo.addBoard(superchassisPath, "Chassis", "BoardB",
+                  superchassisExposesItem);
 
-    auto assocs = topo.getAssocs();
+    auto assocs = topo.getAssocs(boards);
 
     EXPECT_EQ(assocs.size(), 0);
 }
@@ -78,11 +85,12 @@
 TEST(Topology, OtherExposes)
 {
     Topology topo;
+    BoardMap boards{{subchassisPath, "BoardA"}, {superchassisPath, "BoardB"}};
 
-    topo.addBoard(subchassisPath, "Chassis", otherExposesItem);
-    topo.addBoard(superchassisPath, "Chassis", otherExposesItem);
+    topo.addBoard(subchassisPath, "Chassis", "BoardA", otherExposesItem);
+    topo.addBoard(superchassisPath, "Chassis", "BoardB", otherExposesItem);
 
-    auto assocs = topo.getAssocs();
+    auto assocs = topo.getAssocs(boards);
 
     EXPECT_EQ(assocs.size(), 0);
 }
@@ -90,11 +98,13 @@
 TEST(Topology, NoMatchSubchassis)
 {
     Topology topo;
+    BoardMap boards{{subchassisPath, "BoardA"}, {superchassisPath, "BoardB"}};
 
-    topo.addBoard(subchassisPath, "Chassis", otherExposesItem);
-    topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
+    topo.addBoard(subchassisPath, "Chassis", "BoardA", otherExposesItem);
+    topo.addBoard(superchassisPath, "Chassis", "BoardB",
+                  superchassisExposesItem);
 
-    auto assocs = topo.getAssocs();
+    auto assocs = topo.getAssocs(boards);
 
     EXPECT_EQ(assocs.size(), 0);
 }
@@ -102,11 +112,12 @@
 TEST(Topology, NoMatchSuperchassis)
 {
     Topology topo;
+    BoardMap boards{{subchassisPath, "BoardA"}, {superchassisPath, "BoardB"}};
 
-    topo.addBoard(subchassisPath, "Chassis", subchassisExposesItem);
-    topo.addBoard(superchassisPath, "Chassis", otherExposesItem);
+    topo.addBoard(subchassisPath, "Chassis", "BoardA", subchassisExposesItem);
+    topo.addBoard(superchassisPath, "Chassis", "BoardB", otherExposesItem);
 
-    auto assocs = topo.getAssocs();
+    auto assocs = topo.getAssocs(boards);
 
     EXPECT_EQ(assocs.size(), 0);
 }
@@ -114,26 +125,48 @@
 TEST(Topology, Basic)
 {
     Topology topo;
+    BoardMap boards{{subchassisPath, "BoardA"}, {superchassisPath, "BoardB"}};
 
-    topo.addBoard(subchassisPath, "Chassis", subchassisExposesItem);
-    topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
+    topo.addBoard(subchassisPath, "Chassis", "BoardA", subchassisExposesItem);
+    topo.addBoard(superchassisPath, "Chassis", "BoardB",
+                  superchassisExposesItem);
 
-    auto assocs = topo.getAssocs();
+    auto assocs = topo.getAssocs(boards);
 
     EXPECT_EQ(assocs.size(), 1);
     EXPECT_EQ(assocs[subchassisPath].size(), 1);
     EXPECT_EQ(assocs[subchassisPath][0], subchassisAssoc);
 }
 
+TEST(Topology, NoNewBoards)
+{
+    Topology topo;
+    BoardMap boards;
+
+    topo.addBoard(subchassisPath, "Chassis", "BoardA", subchassisExposesItem);
+    topo.addBoard(superchassisPath, "Chassis", "BoardB",
+                  superchassisExposesItem);
+
+    // Boards A and B aren't new, so no assocs are returned.
+    auto assocs = topo.getAssocs(boards);
+
+    EXPECT_EQ(assocs.size(), 0);
+}
+
 TEST(Topology, 2Subchassis)
 {
     Topology topo;
+    BoardMap boards{{subchassisPath, "BoardA"},
+                    {subchassisPath + "2", "BoardB"},
+                    {superchassisPath, "BoardC"}};
 
-    topo.addBoard(subchassisPath, "Chassis", subchassisExposesItem);
-    topo.addBoard(subchassisPath + "2", "Chassis", subchassisExposesItem);
-    topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
+    topo.addBoard(subchassisPath, "Chassis", "BoardA", subchassisExposesItem);
+    topo.addBoard(subchassisPath + "2", "Chassis", "BoardB",
+                  subchassisExposesItem);
+    topo.addBoard(superchassisPath, "Chassis", "BoardC",
+                  superchassisExposesItem);
 
-    auto assocs = topo.getAssocs();
+    auto assocs = topo.getAssocs(boards);
 
     EXPECT_EQ(assocs.size(), 2);
     EXPECT_EQ(assocs[subchassisPath].size(), 1);
@@ -142,18 +175,42 @@
     EXPECT_EQ(assocs[subchassisPath + "2"][0], subchassisAssoc);
 }
 
+TEST(Topology, OneNewBoard)
+{
+    Topology topo;
+    BoardMap boards{{subchassisPath, "BoardA"}};
+
+    topo.addBoard(subchassisPath, "Chassis", "BoardA", subchassisExposesItem);
+    topo.addBoard(subchassisPath + "2", "Chassis", "BoardB",
+                  subchassisExposesItem);
+    topo.addBoard(superchassisPath, "Chassis", "BoardC",
+                  superchassisExposesItem);
+
+    // Only the assoc for BoardA should be returned
+    auto assocs = topo.getAssocs(boards);
+
+    EXPECT_EQ(assocs.size(), 1);
+    EXPECT_EQ(assocs[subchassisPath].size(), 1);
+    EXPECT_EQ(assocs[subchassisPath][0], subchassisAssoc);
+}
+
 TEST(Topology, 2Superchassis)
 {
     const Association subchassisAssoc2 =
         std::make_tuple("contained_by", "containing", superchassisPath + "2");
 
     Topology topo;
+    BoardMap boards{{subchassisPath, "BoardA"},
+                    {superchassisPath, "BoardB"},
+                    {superchassisPath + "2", "BoardC"}};
 
-    topo.addBoard(subchassisPath, "Chassis", subchassisExposesItem);
-    topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
-    topo.addBoard(superchassisPath + "2", "Chassis", superchassisExposesItem);
+    topo.addBoard(subchassisPath, "Chassis", "BoardA", subchassisExposesItem);
+    topo.addBoard(superchassisPath, "Chassis", "BoardB",
+                  superchassisExposesItem);
+    topo.addBoard(superchassisPath + "2", "Chassis", "BoardC",
+                  superchassisExposesItem);
 
-    auto assocs = topo.getAssocs();
+    auto assocs = topo.getAssocs(boards);
 
     EXPECT_EQ(assocs.size(), 1);
     EXPECT_EQ(assocs[subchassisPath].size(), 2);
@@ -168,13 +225,20 @@
         std::make_tuple("contained_by", "containing", superchassisPath + "2");
 
     Topology topo;
+    BoardMap boards{{subchassisPath, "BoardA"},
+                    {subchassisPath + "2", "BoardB"},
+                    {superchassisPath, "BoardC"},
+                    {superchassisPath + "2", "BoardD"}};
 
-    topo.addBoard(subchassisPath, "Chassis", subchassisExposesItem);
-    topo.addBoard(subchassisPath + "2", "Chassis", subchassisExposesItem);
-    topo.addBoard(superchassisPath, "Chassis", superchassisExposesItem);
-    topo.addBoard(superchassisPath + "2", "Chassis", superchassisExposesItem);
+    topo.addBoard(subchassisPath, "Chassis", "BoardA", subchassisExposesItem);
+    topo.addBoard(subchassisPath + "2", "Chassis", "BoardB",
+                  subchassisExposesItem);
+    topo.addBoard(superchassisPath, "Chassis", "BoardC",
+                  superchassisExposesItem);
+    topo.addBoard(superchassisPath + "2", "Chassis", "BoardD",
+                  superchassisExposesItem);
 
-    auto assocs = topo.getAssocs();
+    auto assocs = topo.getAssocs(boards);
 
     EXPECT_EQ(assocs.size(), 2);
     EXPECT_EQ(assocs[subchassisPath].size(), 2);
@@ -185,3 +249,43 @@
     EXPECT_THAT(assocs[subchassisPath + "2"],
                 UnorderedElementsAre(subchassisAssoc, subchassisAssoc2));
 }
+
+TEST(Topology, Remove)
+{
+    Topology topo;
+    BoardMap boards{{subchassisPath, "BoardA"},
+                    {subchassisPath + "2", "BoardB"},
+                    {superchassisPath, "BoardC"}};
+
+    topo.addBoard(subchassisPath, "Chassis", "BoardA", subchassisExposesItem);
+    topo.addBoard(subchassisPath + "2", "Chassis", "BoardB",
+                  subchassisExposesItem);
+    topo.addBoard(superchassisPath, "Chassis", "BoardC",
+                  superchassisExposesItem);
+
+    {
+        auto assocs = topo.getAssocs(boards);
+
+        EXPECT_EQ(assocs.size(), 2);
+        EXPECT_EQ(assocs[subchassisPath].size(), 1);
+        EXPECT_EQ(assocs[subchassisPath][0], subchassisAssoc);
+        EXPECT_EQ(assocs[subchassisPath + "2"].size(), 1);
+        EXPECT_EQ(assocs[subchassisPath + "2"][0], subchassisAssoc);
+    }
+
+    {
+        topo.remove("BoardA");
+        auto assocs = topo.getAssocs(boards);
+
+        EXPECT_EQ(assocs.size(), 1);
+        EXPECT_EQ(assocs[subchassisPath + "2"].size(), 1);
+        EXPECT_EQ(assocs[subchassisPath + "2"][0], subchassisAssoc);
+    }
+
+    {
+        topo.remove("BoardB");
+        auto assocs = topo.getAssocs(boards);
+
+        EXPECT_EQ(assocs.size(), 0);
+    }
+}
