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;
 };
