diff --git a/testdata/server-discovery-and-monitoring/unified/loadbalanced-emit-topology-changed-before-close.json b/testdata/server-discovery-and-monitoring/unified/loadbalanced-emit-topology-changed-before-close.json
new file mode 100644
index 0000000000..30c0657630
--- /dev/null
+++ b/testdata/server-discovery-and-monitoring/unified/loadbalanced-emit-topology-changed-before-close.json
@@ -0,0 +1,88 @@
+{
+  "description": "loadbalanced-emit-topology-description-changed-before-close",
+  "schemaVersion": "1.20",
+  "runOnRequirements": [
+    {
+      "topologies": [
+        "load-balanced"
+      ],
+      "minServerVersion": "4.4"
+    }
+  ],
+  "tests": [
+    {
+      "description": "Topology lifecycle",
+      "operations": [
+        {
+          "name": "createEntities",
+          "object": "testRunner",
+          "arguments": {
+            "entities": [
+              {
+                "client": {
+                  "id": "client",
+                  "observeEvents": [
+                    "topologyDescriptionChangedEvent",
+                    "topologyOpeningEvent",
+                    "topologyClosedEvent"
+                  ]
+                }
+              }
+            ]
+          }
+        },
+        {
+          "name": "waitForEvent",
+          "object": "testRunner",
+          "arguments": {
+            "client": "client",
+            "event": {
+              "topologyDescriptionChangedEvent": {}
+            },
+            "count": 2
+          }
+        },
+        {
+          "name": "close",
+          "object": "client"
+        }
+      ],
+      "expectEvents": [
+        {
+          "client": "client",
+          "eventType": "sdam",
+          "events": [
+            {
+              "topologyOpeningEvent": {}
+            },
+            {
+              "topologyDescriptionChangedEvent": {
+                "previousDescription": {
+                  "type": "Unknown"
+                },
+                "newDescription": {}
+              }
+            },
+            {
+              "topologyDescriptionChangedEvent": {
+                "newDescription": {
+                  "type": "LoadBalanced"
+                }
+              }
+            },
+            {
+              "topologyDescriptionChangedEvent": {
+                "newDescription": {
+                  "type": "Unknown"
+                }
+              }
+            },
+            {
+              "topologyClosedEvent": {}
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/testdata/server-discovery-and-monitoring/unified/loadbalanced-emit-topology-changed-before-close.yml b/testdata/server-discovery-and-monitoring/unified/loadbalanced-emit-topology-changed-before-close.yml
new file mode 100644
index 0000000000..c919a8cf8b
--- /dev/null
+++ b/testdata/server-discovery-and-monitoring/unified/loadbalanced-emit-topology-changed-before-close.yml
@@ -0,0 +1,49 @@
+description: "loadbalanced-emit-topology-description-changed-before-close"
+
+schemaVersion: "1.20"
+
+runOnRequirements:
+  - topologies:
+      - load-balanced
+    minServerVersion: "4.4" # awaitable hello
+
+tests:
+  - description: "Topology lifecycle"
+    operations:
+      - name: createEntities
+        object: testRunner
+        arguments:
+          entities:
+            - client:
+                id: &client client
+                observeEvents:
+                  - topologyDescriptionChangedEvent
+                  - topologyOpeningEvent
+                  - topologyClosedEvent
+      # ensure the topology has been fully discovered before closing the client.
+      # expected events are initial server discovery and server connect event.
+      - name: waitForEvent
+        object: testRunner
+        arguments:
+          client: *client
+          event:
+            topologyDescriptionChangedEvent: {}
+          count: 2
+      - name: close
+        object: *client
+    expectEvents:
+      - client: *client
+        eventType: sdam
+        events:
+          - topologyOpeningEvent: {}
+          - topologyDescriptionChangedEvent: # unknown -> unknown w disconnected server
+              previousDescription: 
+                type: "Unknown"
+              newDescription: {}
+          - topologyDescriptionChangedEvent:  # unknown w disconnected server -> loadBalanced
+              newDescription:
+                type: "LoadBalanced"
+          - topologyDescriptionChangedEvent:  # loadbalanced -> unknown
+              newDescription:
+                type: "Unknown"
+          - topologyClosedEvent: {}
diff --git a/testdata/server-discovery-and-monitoring/unified/logging-loadbalanced.json b/testdata/server-discovery-and-monitoring/unified/logging-loadbalanced.json
index 45440d2557..0ad3b0ceaa 100644
--- a/testdata/server-discovery-and-monitoring/unified/logging-loadbalanced.json
+++ b/testdata/server-discovery-and-monitoring/unified/logging-loadbalanced.json
@@ -132,6 +132,22 @@
                 }
               }
             },
+            {
+              "level": "debug",
+              "component": "topology",
+              "data": {
+                "message": "Topology description changed",
+                "topologyId": {
+                  "$$exists": true
+                },
+                "previousDescription": {
+                  "$$exists": true
+                },
+                "newDescription": {
+                  "$$exists": true
+                }
+              }
+            },
             {
               "level": "debug",
               "component": "topology",
diff --git a/testdata/server-discovery-and-monitoring/unified/logging-loadbalanced.yml b/testdata/server-discovery-and-monitoring/unified/logging-loadbalanced.yml
index 87ad4bcf5d..432ec354ed 100644
--- a/testdata/server-discovery-and-monitoring/unified/logging-loadbalanced.yml
+++ b/testdata/server-discovery-and-monitoring/unified/logging-loadbalanced.yml
@@ -67,6 +67,13 @@ tests:
               topologyId: { $$exists: true }
               serverHost: { $$type: string }
               serverPort: { $$type: [int, long] }
+          - level: debug
+            component: topology
+            data:
+              message: "Topology description changed"
+              topologyId: { $$exists: true }
+              previousDescription: { $$exists: true } # loadBalanced topology
+              newDescription: { $$exists: true } # unknown topology
           - level: debug
             component: topology
             data:
diff --git a/testdata/server-discovery-and-monitoring/unified/replicaset-emit-topology-changed-before-close.json b/testdata/server-discovery-and-monitoring/unified/replicaset-emit-topology-changed-before-close.json
new file mode 100644
index 0000000000..066a4ffee5
--- /dev/null
+++ b/testdata/server-discovery-and-monitoring/unified/replicaset-emit-topology-changed-before-close.json
@@ -0,0 +1,89 @@
+{
+  "description": "replicaset-emit-topology-description-changed-before-close",
+  "schemaVersion": "1.20",
+  "runOnRequirements": [
+    {
+      "topologies": [
+        "replicaset"
+      ],
+      "minServerVersion": "4.4"
+    }
+  ],
+  "tests": [
+    {
+      "description": "Topology lifecycle",
+      "operations": [
+        {
+          "name": "createEntities",
+          "object": "testRunner",
+          "arguments": {
+            "entities": [
+              {
+                "client": {
+                  "id": "client",
+                  "observeEvents": [
+                    "topologyDescriptionChangedEvent",
+                    "topologyOpeningEvent",
+                    "topologyClosedEvent"
+                  ]
+                }
+              }
+            ]
+          }
+        },
+        {
+          "name": "waitForEvent",
+          "object": "testRunner",
+          "arguments": {
+            "client": "client",
+            "event": {
+              "topologyDescriptionChangedEvent": {}
+            },
+            "count": 4
+          }
+        },
+        {
+          "name": "close",
+          "object": "client"
+        }
+      ],
+      "expectEvents": [
+        {
+          "client": "client",
+          "eventType": "sdam",
+          "ignoreExtraEvents": false,
+          "events": [
+            {
+              "topologyOpeningEvent": {}
+            },
+            {
+              "topologyDescriptionChangedEvent": {}
+            },
+            {
+              "topologyDescriptionChangedEvent": {}
+            },
+            {
+              "topologyDescriptionChangedEvent": {}
+            },
+            {
+              "topologyDescriptionChangedEvent": {}
+            },
+            {
+              "topologyDescriptionChangedEvent": {
+                "previousDescription": {
+                  "type": "ReplicaSetWithPrimary"
+                },
+                "newDescription": {
+                  "type": "Unknown"
+                }
+              }
+            },
+            {
+              "topologyClosedEvent": {}
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/testdata/server-discovery-and-monitoring/unified/replicaset-emit-topology-changed-before-close.yml b/testdata/server-discovery-and-monitoring/unified/replicaset-emit-topology-changed-before-close.yml
new file mode 100644
index 0000000000..d0a1158ea9
--- /dev/null
+++ b/testdata/server-discovery-and-monitoring/unified/replicaset-emit-topology-changed-before-close.yml
@@ -0,0 +1,49 @@
+description: "replicaset-emit-topology-description-changed-before-close"
+
+schemaVersion: "1.20"
+
+runOnRequirements:
+  - topologies:
+      - replicaset
+    minServerVersion: "4.4" # awaitable hello
+
+tests:
+  - description: "Topology lifecycle"
+    operations:
+      - name: createEntities
+        object: testRunner
+        arguments:
+          entities:
+            - client:
+                id: &client client
+                observeEvents:
+                  - topologyDescriptionChangedEvent
+                  - topologyOpeningEvent
+                  - topologyClosedEvent
+      # ensure the topology has been fully discovered before closing the client.
+      # expected events are initial server discovery and 3 server connect events.
+      - name: waitForEvent
+        object: testRunner
+        arguments:
+          client: *client
+          event:
+            topologyDescriptionChangedEvent: {}
+          count: 4
+      - name: close
+        object: *client
+    expectEvents:
+      - client: *client
+        eventType: sdam
+        ignoreExtraEvents: false
+        events:
+          - topologyOpeningEvent: {}
+          - topologyDescriptionChangedEvent: {} # unknown -> replset no primary
+          - topologyDescriptionChangedEvent: {} # server connected
+          - topologyDescriptionChangedEvent: {} # server connected
+          - topologyDescriptionChangedEvent: {} # server connected
+          - topologyDescriptionChangedEvent:  # replicaset -> unknown
+              previousDescription:
+                type: "ReplicaSetWithPrimary"
+              newDescription:
+                type: "Unknown"
+          - topologyClosedEvent: {}
diff --git a/testdata/server-discovery-and-monitoring/unified/sharded-emit-topology-changed-before-close.json b/testdata/server-discovery-and-monitoring/unified/sharded-emit-topology-changed-before-close.json
new file mode 100644
index 0000000000..98fb585531
--- /dev/null
+++ b/testdata/server-discovery-and-monitoring/unified/sharded-emit-topology-changed-before-close.json
@@ -0,0 +1,108 @@
+{
+  "description": "sharded-emit-topology-description-changed-before-close",
+  "schemaVersion": "1.20",
+  "runOnRequirements": [
+    {
+      "topologies": [
+        "sharded"
+      ],
+      "minServerVersion": "4.4"
+    }
+  ],
+  "tests": [
+    {
+      "description": "Topology lifecycle",
+      "operations": [
+        {
+          "name": "createEntities",
+          "object": "testRunner",
+          "arguments": {
+            "entities": [
+              {
+                "client": {
+                  "id": "client",
+                  "observeEvents": [
+                    "topologyDescriptionChangedEvent",
+                    "topologyOpeningEvent",
+                    "topologyClosedEvent"
+                  ],
+                  "useMultipleMongoses": true
+                }
+              }
+            ]
+          }
+        },
+        {
+          "name": "waitForEvent",
+          "object": "testRunner",
+          "arguments": {
+            "client": "client",
+            "event": {
+              "topologyDescriptionChangedEvent": {}
+            },
+            "count": 3
+          }
+        },
+        {
+          "name": "close",
+          "object": "client"
+        }
+      ],
+      "expectEvents": [
+        {
+          "client": "client",
+          "eventType": "sdam",
+          "ignoreExtraEvents": false,
+          "events": [
+            {
+              "topologyOpeningEvent": {}
+            },
+            {
+              "topologyDescriptionChangedEvent": {
+                "previousDescription": {
+                  "type": "Unknown"
+                },
+                "newDescription": {
+                  "type": "Unknown"
+                }
+              }
+            },
+            {
+              "topologyDescriptionChangedEvent": {
+                "previousDescription": {
+                  "type": "Unknown"
+                },
+                "newDescription": {
+                  "type": "Sharded"
+                }
+              }
+            },
+            {
+              "topologyDescriptionChangedEvent": {
+                "previousDescription": {
+                  "type": "Sharded"
+                },
+                "newDescription": {
+                  "type": "Sharded"
+                }
+              }
+            },
+            {
+              "topologyDescriptionChangedEvent": {
+                "previousDescription": {
+                  "type": "Sharded"
+                },
+                "newDescription": {
+                  "type": "Unknown"
+                }
+              }
+            },
+            {
+              "topologyClosedEvent": {}
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/testdata/server-discovery-and-monitoring/unified/sharded-emit-topology-changed-before-close.yml b/testdata/server-discovery-and-monitoring/unified/sharded-emit-topology-changed-before-close.yml
new file mode 100644
index 0000000000..cb6cc5ad4d
--- /dev/null
+++ b/testdata/server-discovery-and-monitoring/unified/sharded-emit-topology-changed-before-close.yml
@@ -0,0 +1,62 @@
+description: "sharded-emit-topology-description-changed-before-close"
+
+schemaVersion: "1.20"
+
+runOnRequirements:
+  - topologies:
+      - sharded
+    minServerVersion: "4.4" # awaitable hello
+
+tests:
+  - description: "Topology lifecycle"
+    operations:
+      - name: createEntities
+        object: testRunner
+        arguments:
+          entities:
+            - client:
+                id: &client client
+                observeEvents:
+                  - topologyDescriptionChangedEvent
+                  - topologyOpeningEvent
+                  - topologyClosedEvent
+                useMultipleMongoses: true
+      # ensure the topology has been fully discovered before closing the client.
+      # expected events are initial cluster type change from unknown to sharded and connect events
+      # for each of 2 servers
+      - name: waitForEvent
+        object: testRunner
+        arguments:
+          client: *client
+          event:
+            topologyDescriptionChangedEvent: {}
+          count: 3
+      - name: close
+        object: *client
+    expectEvents:
+      - client: *client
+        eventType: sdam
+        ignoreExtraEvents: false
+        events:
+          - topologyOpeningEvent: {}
+          - topologyDescriptionChangedEvent: # unknown -> unknown w disconnected server
+              previousDescription: 
+                type: "Unknown"
+              newDescription:
+                type: "Unknown"
+          - topologyDescriptionChangedEvent:  # server connected
+              previousDescription:
+                type: "Unknown"
+              newDescription:
+                type: "Sharded"
+          - topologyDescriptionChangedEvent:  # server connected
+              previousDescription:
+                type: "Sharded"
+              newDescription:
+                type: "Sharded"
+          - topologyDescriptionChangedEvent:  # sharded -> unknown
+              previousDescription:
+                type: "Sharded"
+              newDescription:
+                type: "Unknown"
+          - topologyClosedEvent: {}
diff --git a/testdata/server-discovery-and-monitoring/unified/standalone-emit-topology-changed-before-close.json b/testdata/server-discovery-and-monitoring/unified/standalone-emit-topology-changed-before-close.json
new file mode 100644
index 0000000000..27b5444d54
--- /dev/null
+++ b/testdata/server-discovery-and-monitoring/unified/standalone-emit-topology-changed-before-close.json
@@ -0,0 +1,97 @@
+{
+  "description": "standalone-emit-topology-description-changed-before-close",
+  "schemaVersion": "1.20",
+  "runOnRequirements": [
+    {
+      "topologies": [
+        "single"
+      ],
+      "minServerVersion": "4.4"
+    }
+  ],
+  "tests": [
+    {
+      "description": "Topology lifecycle",
+      "operations": [
+        {
+          "name": "createEntities",
+          "object": "testRunner",
+          "arguments": {
+            "entities": [
+              {
+                "client": {
+                  "id": "client",
+                  "observeEvents": [
+                    "topologyDescriptionChangedEvent",
+                    "topologyOpeningEvent",
+                    "topologyClosedEvent"
+                  ]
+                }
+              }
+            ]
+          }
+        },
+        {
+          "name": "waitForEvent",
+          "object": "testRunner",
+          "arguments": {
+            "client": "client",
+            "event": {
+              "topologyDescriptionChangedEvent": {}
+            },
+            "count": 2
+          }
+        },
+        {
+          "name": "close",
+          "object": "client"
+        }
+      ],
+      "expectEvents": [
+        {
+          "client": "client",
+          "eventType": "sdam",
+          "ignoreExtraEvents": false,
+          "events": [
+            {
+              "topologyOpeningEvent": {}
+            },
+            {
+              "topologyDescriptionChangedEvent": {
+                "previousDescription": {
+                  "type": "Unknown"
+                },
+                "newDescription": {
+                  "type": "Unknown"
+                }
+              }
+            },
+            {
+              "topologyDescriptionChangedEvent": {
+                "previousDescription": {
+                  "type": "Unknown"
+                },
+                "newDescription": {
+                  "type": "Single"
+                }
+              }
+            },
+            {
+              "topologyDescriptionChangedEvent": {
+                "previousDescription": {
+                  "type": "Single"
+                },
+                "newDescription": {
+                  "type": "Unknown"
+                }
+              }
+            },
+            {
+              "topologyClosedEvent": {}
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/testdata/server-discovery-and-monitoring/unified/standalone-emit-topology-changed-before-close.yml b/testdata/server-discovery-and-monitoring/unified/standalone-emit-topology-changed-before-close.yml
new file mode 100644
index 0000000000..20fa380bd5
--- /dev/null
+++ b/testdata/server-discovery-and-monitoring/unified/standalone-emit-topology-changed-before-close.yml
@@ -0,0 +1,55 @@
+description: "standalone-emit-topology-description-changed-before-close"
+
+schemaVersion: "1.20"
+
+runOnRequirements:
+  - topologies:
+      - single
+    minServerVersion: "4.4" # awaitable hello
+
+tests:
+  - description: "Topology lifecycle"
+    operations:
+      - name: createEntities
+        object: testRunner
+        arguments:
+          entities:
+            - client:
+                id: &client client
+                observeEvents:
+                  - topologyDescriptionChangedEvent
+                  - topologyOpeningEvent
+                  - topologyClosedEvent
+      # ensure the topology has been fully discovered before closing the client.
+      # expected events are initial server discovery and server connect event.
+      - name: waitForEvent
+        object: testRunner
+        arguments:
+          client: *client
+          event:
+            topologyDescriptionChangedEvent: {}
+          count: 2
+      - name: close
+        object: *client
+    expectEvents:
+      - client: *client
+        eventType: sdam
+        ignoreExtraEvents: false 
+        events:
+          - topologyOpeningEvent: {}
+          - topologyDescriptionChangedEvent: # unknown -> unknown w disconnected server
+              previousDescription: 
+                type: "Unknown"
+              newDescription: 
+                type: "Unknown"
+          - topologyDescriptionChangedEvent:  # unknown w disconnected server -> standalone 
+              previousDescription:
+                type: "Unknown"
+              newDescription:
+                type: "Single"
+          - topologyDescriptionChangedEvent:  # standalone -> unknown
+              previousDescription:
+                type: "Single"
+              newDescription:
+                type: "Unknown"
+          - topologyClosedEvent: {}