diff --git a/fxjs/xfa/cjx_node.cpp b/fxjs/xfa/cjx_node.cpp
index bf10c0f..3dcee6c 100644
--- a/fxjs/xfa/cjx_node.cpp
+++ b/fxjs/xfa/cjx_node.cpp
@@ -331,16 +331,16 @@
     int32_t index = 0;
     while (pNewChild) {
       CXFA_Node* pItem = pNewChild->GetNextSibling();
-      pFakeRoot->RemoveChild(pNewChild, true);
-      GetXFANode()->InsertChild(index++, pNewChild);
+      pFakeRoot->RemoveChildAndNotify(pNewChild, true);
+      GetXFANode()->InsertChildAndNotify(index++, pNewChild);
       pNewChild->SetFlagAndNotify(XFA_NodeFlag_Initialized);
       pNewChild = pItem;
     }
 
     while (pChild) {
       CXFA_Node* pItem = pChild->GetNextSibling();
-      GetXFANode()->RemoveChild(pChild, true);
-      pFakeRoot->InsertChild(pChild, nullptr);
+      GetXFANode()->RemoveChildAndNotify(pChild, true);
+      pFakeRoot->InsertChildAndNotify(pChild, nullptr);
       pChild = pItem;
     }
 
@@ -359,8 +359,8 @@
     CXFA_Node* pChild = pFakeRoot->GetFirstChild();
     while (pChild) {
       CXFA_Node* pItem = pChild->GetNextSibling();
-      pFakeRoot->RemoveChild(pChild, true);
-      GetXFANode()->InsertChild(pChild, nullptr);
+      pFakeRoot->RemoveChildAndNotify(pChild, true);
+      GetXFANode()->InsertChildAndNotify(pChild, nullptr);
       pChild->SetFlagAndNotify(XFA_NodeFlag_Initialized);
       pChild = pItem;
     }
diff --git a/fxjs/xfa/cjx_object.cpp b/fxjs/xfa/cjx_object.cpp
index 63eb003..a151fba 100644
--- a/fxjs/xfa/cjx_object.cpp
+++ b/fxjs/xfa/cjx_object.cpp
@@ -581,7 +581,7 @@
           }
           if (iSize == 0) {
             while (CXFA_Node* pChildNode = pBind->GetFirstChild()) {
-              pBind->RemoveChild(pChildNode, true);
+              pBind->RemoveChildAndNotify(pChildNode, true);
             }
           } else {
             std::vector<CXFA_Node*> valueNodes = pBind->GetNodeList(
@@ -596,13 +596,13 @@
                 pValueNodes->JSObject()->SetCData(XFA_Attribute::Name, L"value",
                                                   false, false);
                 pValueNodes->CreateXMLMappingNode();
-                pBind->InsertChild(pValueNodes, nullptr);
+                pBind->InsertChildAndNotify(pValueNodes, nullptr);
               }
               pValueNodes = nullptr;
             } else if (iDatas > iSize) {
               size_t iDelNodes = iDatas - iSize;
               while (iDelNodes-- > 0) {
-                pBind->RemoveChild(pBind->GetFirstChild(), true);
+                pBind->RemoveChildAndNotify(pBind->GetFirstChild(), true);
               }
             }
             int32_t i = 0;
@@ -670,7 +670,8 @@
                 ->CreateSamePacketNode(wsContentType.EqualsASCII("text/xml")
                                            ? XFA_Element::Sharpxml
                                            : XFA_Element::Sharptext);
-        ToNode(GetXFAObject())->InsertChild(pContentRawDataNode, nullptr);
+        ToNode(GetXFAObject())
+            ->InsertChildAndNotify(pContentRawDataNode, nullptr);
       }
       pContentRawDataNode->JSObject()->SetContent(
           wsContent, wsXMLValue, bNotify, bScriptModify, bSyncData);
@@ -762,7 +763,8 @@
         }
         pContentRawDataNode =
             ToNode(GetXFAObject())->CreateSamePacketNode(element);
-        ToNode(GetXFAObject())->InsertChild(pContentRawDataNode, nullptr);
+        ToNode(GetXFAObject())
+            ->InsertChildAndNotify(pContentRawDataNode, nullptr);
       }
       return pContentRawDataNode->JSObject()->TryContent(bScriptModify, true);
     }
@@ -864,7 +866,7 @@
     if (!pNewNode)
       return nullptr;
 
-    xfaNode->InsertChild(pNewNode, nullptr);
+    xfaNode->InsertChildAndNotify(pNewNode, nullptr);
     pNewNode->SetFlagAndNotify(XFA_NodeFlag_Initialized);
   }
   return pNewNode;
@@ -1187,7 +1189,7 @@
   CXFA_Node* pHeadChild = ToNode(GetXFAObject())->GetFirstChild();
   while (pHeadChild) {
     CXFA_Node* pSibling = pHeadChild->GetNextSibling();
-    ToNode(GetXFAObject())->RemoveChild(pHeadChild, true);
+    ToNode(GetXFAObject())->RemoveChildAndNotify(pHeadChild, true);
     pHeadChild = pSibling;
   }
 
@@ -1195,8 +1197,8 @@
   pHeadChild = pProtoForm->GetFirstChild();
   while (pHeadChild) {
     CXFA_Node* pSibling = pHeadChild->GetNextSibling();
-    pProtoForm->RemoveChild(pHeadChild, true);
-    ToNode(GetXFAObject())->InsertChild(pHeadChild, nullptr);
+    pProtoForm->RemoveChildAndNotify(pHeadChild, true);
+    ToNode(GetXFAObject())->InsertChildAndNotify(pHeadChild, nullptr);
     pHeadChild = pSibling;
   }
   GetDocument()->FreeOwnedNode(pProtoForm);
diff --git a/xfa/fxfa/cxfa_ffwidgethandler.cpp b/xfa/fxfa/cxfa_ffwidgethandler.cpp
index ee43004..138b7f0 100644
--- a/xfa/fxfa/cxfa_ffwidgethandler.cpp
+++ b/xfa/fxfa/cxfa_ffwidgethandler.cpp
@@ -519,7 +519,7 @@
 
   CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(false);
   if (pParent)
-    pParent->InsertChild(pNewFormItem, pBefore);
+    pParent->InsertChildAndNotify(pNewFormItem, pBefore);
   return pNewFormItem;
 }
 
@@ -535,7 +535,7 @@
                          pBefore ? pBefore->GetTemplateNodeIfExists() : nullptr)
           ->Clone(false);
   if (pParent)
-    pParent->InsertChild(pNewNode, pBefore);
+    pParent->InsertChildAndNotify(pNewNode, pBefore);
   return pNewNode;
 }
 
@@ -546,7 +546,7 @@
   CXFA_Node* pNewTemplateNode =
       pXFADoc->CreateNode(XFA_PacketType::Template, eElement);
   if (pParent)
-    pParent->InsertChild(pNewTemplateNode, pBefore);
+    pParent->InsertChildAndNotify(pNewTemplateNode, pBefore);
   return pNewTemplateNode;
 }
 
diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
index 0a22d25..99a6e45 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
@@ -445,7 +445,7 @@
       pCurLayoutItem = pNextLayoutItem;
     }
   }
-  pGenerateNode->GetParent()->RemoveChild(pGenerateNode, true);
+  pGenerateNode->GetParent()->RemoveChildAndNotify(pGenerateNode, true);
 }
 
 uint8_t HAlignEnumToInt(XFA_AttributeValue eHAlign) {
@@ -1490,9 +1490,9 @@
     pFormNode = pFormNode->GetParent();
   }
   if (pLeaderNode && pFormNode)
-    pFormNode->RemoveChild(pLeaderNode, true);
+    pFormNode->RemoveChildAndNotify(pLeaderNode, true);
   if (pTrailerNode && pFormNode)
-    pFormNode->RemoveChild(pTrailerNode, true);
+    pFormNode->RemoveChildAndNotify(pTrailerNode, true);
   if (pTrailerItem)
     XFA_ReleaseLayoutItem(pTrailerItem);
 }
diff --git a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
index 700eba5..b191b9c 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
@@ -419,7 +419,7 @@
     if (!pPageArea)
       return false;
 
-    m_pTemplatePageSetRoot->InsertChild(pPageArea, nullptr);
+    m_pTemplatePageSetRoot->InsertChildAndNotify(pPageArea, nullptr);
     pPageArea->SetFlagAndNotify(XFA_NodeFlag_Initialized);
   }
   CXFA_ContentArea* pContentArea =
@@ -430,7 +430,7 @@
     if (!pContentArea)
       return false;
 
-    pPageArea->InsertChild(pContentArea, nullptr);
+    pPageArea->InsertChildAndNotify(pContentArea, nullptr);
     pContentArea->SetFlagAndNotify(XFA_NodeFlag_Initialized);
     pContentArea->JSObject()->SetMeasure(
         XFA_Attribute::X, CXFA_Measurement(0.25f, XFA_Unit::In), false);
@@ -449,7 +449,7 @@
     if (!pContentArea)
       return false;
 
-    pPageArea->InsertChild(pMedium, nullptr);
+    pPageArea->InsertChildAndNotify(pMedium, nullptr);
     pMedium->SetFlagAndNotify(XFA_NodeFlag_Initialized);
     pMedium->JSObject()->SetMeasure(
         XFA_Attribute::Short, CXFA_Measurement(8.5f, XFA_Unit::In), false);
@@ -1766,7 +1766,7 @@
                 }
               }
               if (pExistingNode) {
-                pParentNode->RemoveChild(pExistingNode, true);
+                pParentNode->RemoveChildAndNotify(pExistingNode, true);
               }
             }
             pViewItem->m_pOldSubform = pNewSubform;
@@ -1800,7 +1800,7 @@
         CXFA_Node* pFormToplevelSubform =
             pNode->GetFirstChildByClass<CXFA_Subform>(XFA_Element::Subform);
         if (pFormToplevelSubform)
-          pFormToplevelSubform->InsertChild(pPendingPageSet, nullptr);
+          pFormToplevelSubform->InsertChildAndNotify(pPendingPageSet, nullptr);
       }
     }
     pDocument->DataMerge_UpdateBindingRelations(pPendingPageSet);
@@ -1839,7 +1839,7 @@
             }
           }
           CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext();
-          pNode->GetParent()->RemoveChild(pNode, true);
+          pNode->GetParent()->RemoveChildAndNotify(pNode, true);
           pNode = pNext;
         } else {
           pNode->ClearFlag(XFA_NodeFlag_UnusedNode);
@@ -1951,7 +1951,8 @@
       CXFA_Node* pNextPageSet =
           pPageSetFormNode->GetNextSameClassSibling<CXFA_PageSet>(
               XFA_Element::PageSet);
-      pPageSetFormNode->GetParent()->RemoveChild(pPageSetFormNode, false);
+      pPageSetFormNode->GetParent()->RemoveChildAndNotify(pPageSetFormNode,
+                                                          false);
       pRootLayoutItem->GetFormNode()
           ->GetDocument()
           ->m_pPendingPageSet.push_back(pPageSetFormNode);
diff --git a/xfa/fxfa/parser/cxfa_attachnodelist.cpp b/xfa/fxfa/parser/cxfa_attachnodelist.cpp
index 8fc67cb1..6d8e5c3 100644
--- a/xfa/fxfa/parser/cxfa_attachnodelist.cpp
+++ b/xfa/fxfa/parser/cxfa_attachnodelist.cpp
@@ -24,9 +24,9 @@
 void CXFA_AttachNodeList::Append(CXFA_Node* pNode) {
   CXFA_Node* pParent = pNode->GetParent();
   if (pParent)
-    pParent->RemoveChild(pNode, true);
+    pParent->RemoveChildAndNotify(pNode, true);
 
-  m_pAttachNode->InsertChild(pNode, nullptr);
+  m_pAttachNode->InsertChildAndNotify(pNode, nullptr);
 }
 
 bool CXFA_AttachNodeList::Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode) {
@@ -35,14 +35,14 @@
 
   CXFA_Node* pParent = pNewNode->GetParent();
   if (pParent)
-    pParent->RemoveChild(pNewNode, true);
+    pParent->RemoveChildAndNotify(pNewNode, true);
 
-  m_pAttachNode->InsertChild(pNewNode, pBeforeNode);
+  m_pAttachNode->InsertChildAndNotify(pNewNode, pBeforeNode);
   return true;
 }
 
 void CXFA_AttachNodeList::Remove(CXFA_Node* pNode) {
-  m_pAttachNode->RemoveChild(pNode, true);
+  m_pAttachNode->RemoveChildAndNotify(pNode, true);
 }
 
 CXFA_Node* CXFA_AttachNodeList::Item(size_t index) {
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index a30cb54..0264365 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -116,7 +116,7 @@
           }
         }
         pContentRawDataNode = pChildNode->CreateSamePacketNode(element);
-        pChildNode->InsertChild(pContentRawDataNode, nullptr);
+        pChildNode->InsertChildAndNotify(pContentRawDataNode, nullptr);
       }
       pContentRawDataNode->JSObject()->SetCData(XFA_Attribute::Value, wsContent,
                                                 false, false);
@@ -157,7 +157,7 @@
   }
   CXFA_Node* pNewNode = pProtoNode->Clone(true);
   pNewNode->SetTemplateNode(pProtoNode);
-  pDestNodeParent->InsertChild(pNewNode, nullptr);
+  pDestNodeParent->InsertChildAndNotify(pNewNode, nullptr);
 }
 
 void MergeNode(CXFA_Node* pDestNode, CXFA_Node* pProtoNode) {
@@ -209,12 +209,12 @@
         break;
 
       CXFA_Node* pNextNode = pNode->GetNextSibling();
-      pFormParent->RemoveChild(pNode, true);
+      pFormParent->RemoveChildAndNotify(pNode, true);
       subforms->push_back(pNode);
       pNode = pNextNode;
     }
-    pFormParent->RemoveChild(pExistingNode, true);
-    pFormParent->InsertChild(pExistingNode, nullptr);
+    pFormParent->RemoveChildAndNotify(pExistingNode, true);
+    pFormParent->InsertChildAndNotify(pExistingNode, nullptr);
     pExistingNode->ClearFlag(XFA_NodeFlag_UnusedNode);
     pExistingNode->SetTemplateNode(pTemplateNode);
     return pExistingNode;
@@ -226,7 +226,7 @@
       L"_" + pTemplateNode->JSObject()->GetCData(XFA_Attribute::Name);
   pNewNode->JSObject()->SetCData(XFA_Attribute::Name, wsInstMgrNodeName, false,
                                  false);
-  pFormParent->InsertChild(pNewNode, nullptr);
+  pFormParent->InsertChildAndNotify(pNewNode, nullptr);
   pNewNode->SetTemplateNode(pTemplateNode);
   return pNewNode;
 }
@@ -534,7 +534,7 @@
               pValue->JSObject()->SetCData(XFA_Attribute::Name, L"value", false,
                                            false);
               pValue->CreateXMLMappingNode();
-              pDataNode->InsertChild(pValue, nullptr);
+              pDataNode->InsertChildAndNotify(pValue, nullptr);
               pValue->JSObject()->SetCData(XFA_Attribute::Value, text, false,
                                            false);
             }
@@ -739,7 +739,7 @@
         pDocument->CreateNode(XFA_PacketType::Datasets, eNodeType);
     pDataNode->JSObject()->SetCData(XFA_Attribute::Name, wsName, false, false);
     pDataNode->CreateXMLMappingNode();
-    pDataParent->InsertChild(pDataNode, nullptr);
+    pDataParent->InsertChildAndNotify(pDataNode, nullptr);
     pDataNode->SetFlag(XFA_NodeFlag_Initialized);
     return pDataNode;
   }
@@ -776,7 +776,7 @@
       pDataNode->JSObject()->SetEnum(XFA_Attribute::Contains,
                                      XFA_AttributeValue::MetaData, false);
     }
-    pDataParent->InsertChild(pDataNode, nullptr);
+    pDataParent->InsertChildAndNotify(pDataNode, nullptr);
     pDataNode->SetDataDescriptionNode(pDDNode);
     pDataNode->SetFlag(XFA_NodeFlag_Initialized);
     return pDataNode;
@@ -1156,8 +1156,8 @@
             CXFA_Node* pDataParent = pDataNode->GetParent();
             if (pDataParent != pDataScope) {
               ASSERT(pDataParent);
-              pDataParent->RemoveChild(pDataNode, true);
-              pDataScope->InsertChild(pDataNode, nullptr);
+              pDataParent->RemoveChildAndNotify(pDataNode, true);
+              pDataScope->InsertChildAndNotify(pDataNode, nullptr);
             }
           }
         }
@@ -1642,7 +1642,7 @@
                                         false);
 
     m_pRootNode->GetXMLMappingNode()->AppendChild(pDatasetsXMLNode);
-    m_pRootNode->InsertChild(pDatasetsRoot, nullptr);
+    m_pRootNode->InsertChildAndNotify(pDatasetsRoot, nullptr);
 
     pDatasetsRoot->SetXMLMappingNode(pDatasetsXMLNode);
   }
@@ -1685,7 +1685,7 @@
         notify_->GetHDOC()->GetXMLDocument()->CreateNode<CFX_XMLElement>(
             L"xfa:data");
     pDataRoot->SetXMLMappingNode(elem);
-    pDatasetsRoot->InsertChild(pDataRoot, nullptr);
+    pDatasetsRoot->InsertChildAndNotify(pDataRoot, nullptr);
   }
 
   CXFA_DataGroup* pDataTopLevel =
@@ -1716,7 +1716,7 @@
         CreateNode(XFA_PacketType::Form, XFA_Element::Form));
     ASSERT(pFormRoot);
     pFormRoot->JSObject()->SetCData(XFA_Attribute::Name, L"form", false, false);
-    m_pRootNode->InsertChild(pFormRoot, nullptr);
+    m_pRootNode->InsertChildAndNotify(pFormRoot, nullptr);
   } else {
     CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
         sIterator(pFormRoot);
@@ -1745,7 +1745,7 @@
     pDataTopLevel->SetXMLMappingNode(elem);
 
     CXFA_Node* pBeforeNode = pDataRoot->GetFirstChild();
-    pDataRoot->InsertChild(pDataTopLevel, pBeforeNode);
+    pDataRoot->InsertChildAndNotify(pDataTopLevel, pBeforeNode);
   }
 
   ASSERT(pDataTopLevel);
@@ -1771,7 +1771,7 @@
     CXFA_PageSet* pNextPageSetNode =
         pPageSetNode->GetNextSameClassSibling<CXFA_PageSet>(
             XFA_Element::PageSet);
-    pSubformSetNode->RemoveChild(pPageSetNode, true);
+    pSubformSetNode->RemoveChildAndNotify(pPageSetNode, true);
     pPageSetNode = pNextPageSetNode;
   }
 
@@ -1786,7 +1786,7 @@
       if (pNode->IsContainerNode() ||
           pNode->GetElementType() == XFA_Element::InstanceManager) {
         CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext();
-        pNode->GetParent()->RemoveChild(pNode, true);
+        pNode->GetParent()->RemoveChildAndNotify(pNode, true);
         pNode = pNext;
       } else {
         pNode->ClearFlag(XFA_NodeFlag_UnusedNode);
@@ -1804,7 +1804,7 @@
   CXFA_Node* pFormRoot = ToNode(GetXFAObject(XFA_HASHCODE_Form));
   if (pFormRoot) {
     while (CXFA_Node* pNode = pFormRoot->GetFirstChild())
-      pFormRoot->RemoveChild(pNode, true);
+      pFormRoot->RemoveChildAndNotify(pNode, true);
 
     pFormRoot->SetBindingNode(nullptr);
   }
diff --git a/xfa/fxfa/parser/cxfa_document_parser.cpp b/xfa/fxfa/parser/cxfa_document_parser.cpp
index beb99e3..61e14fa 100644
--- a/xfa/fxfa/parser/cxfa_document_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_document_parser.cpp
@@ -294,7 +294,7 @@
             pXFAChild->JSObject()->SetCData(XFA_Attribute::Value, wsChildValue,
                                             false, false);
 
-          pXFANode->InsertChild(pXFAChild, nullptr);
+          pXFANode->InsertChildAndNotify(pXFAChild, nullptr);
           pXFAChild->SetXMLMappingNode(pXMLChild);
           pXFAChild->SetFlag(XFA_NodeFlag_Initialized);
           break;
@@ -387,7 +387,7 @@
     pXMLConfigDOMRoot = pChildItem;
     pXFAConfigDOMRoot = ParseAsXDPPacket_Config(pXMLConfigDOMRoot);
     if (pXFAConfigDOMRoot)
-      pXFARootNode->InsertChild(pXFAConfigDOMRoot, nullptr);
+      pXFARootNode->InsertChildAndNotify(pXFAConfigDOMRoot, nullptr);
   }
 
   CFX_XMLNode* pXMLDatasetsDOMRoot = nullptr;
@@ -430,7 +430,7 @@
       CXFA_Node* pPacketNode = ParseAsXDPPacket_Template(pElement);
       if (pPacketNode) {
         pXMLTemplateDOMRoot = pElement;
-        pXFARootNode->InsertChild(pPacketNode, nullptr);
+        pXFARootNode->InsertChildAndNotify(pPacketNode, nullptr);
       }
     } else {
       CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket);
@@ -441,7 +441,7 @@
                 FX_HashCode_GetW(packet_info.value().name, false))) {
           return nullptr;
         }
-        pXFARootNode->InsertChild(pPacketNode, nullptr);
+        pXFARootNode->InsertChildAndNotify(pPacketNode, nullptr);
       }
     }
   }
@@ -454,13 +454,13 @@
     CXFA_Node* pPacketNode =
         ParseAsXDPPacket(pXMLDatasetsDOMRoot, XFA_PacketType::Datasets);
     if (pPacketNode)
-      pXFARootNode->InsertChild(pPacketNode, nullptr);
+      pXFARootNode->InsertChildAndNotify(pPacketNode, nullptr);
   }
   if (pXMLFormDOMRoot) {
     CXFA_Node* pPacketNode =
         ParseAsXDPPacket(pXMLFormDOMRoot, XFA_PacketType::Form);
     if (pPacketNode)
-      pXFARootNode->InsertChild(pPacketNode, nullptr);
+      pXFARootNode->InsertChildAndNotify(pPacketNode, nullptr);
   }
 
   pXFARootNode->SetXMLMappingNode(pXMLDocumentNode);
@@ -710,7 +710,7 @@
           pXFAChild->JSObject()->SetAttribute(attr.value().attribute,
                                               it.second.AsStringView(), false);
         }
-        pXFANode->InsertChild(pXFAChild, nullptr);
+        pXFANode->InsertChildAndNotify(pXFAChild, nullptr);
         if (eType == XFA_Element::Validate || eType == XFA_Element::Locale) {
           if (ePacketID == XFA_PacketType::Config)
             ParseContentNode(pXFAChild, pXMLElement, ePacketID);
@@ -790,7 +790,7 @@
       ASSERT(pContentRawDataNode);
       pContentRawDataNode->JSObject()->SetCData(XFA_Attribute::Value, wsValue,
                                                 false, false);
-      pXFANode->InsertChild(pContentRawDataNode, nullptr);
+      pXFANode->InsertChildAndNotify(pContentRawDataNode, nullptr);
     } else {
       pXFANode->JSObject()->SetCData(XFA_Attribute::Value, wsValue, false,
                                      false);
@@ -886,7 +886,7 @@
                                              false, false);
           pXFAMetaData->JSObject()->SetEnum(
               XFA_Attribute::Contains, XFA_AttributeValue::MetaData, false);
-          pXFAChild->InsertChild(pXFAMetaData, nullptr);
+          pXFAChild->InsertChildAndNotify(pXFAMetaData, nullptr);
           pXFAMetaData->SetXMLMappingNode(pXMLElement);
           pXFAMetaData->SetFlag(XFA_NodeFlag_Initialized);
         }
@@ -894,7 +894,7 @@
         if (!bNeedValue)
           pXMLElement->RemoveAttribute(L"xsi:nil");
 
-        pXFANode->InsertChild(pXFAChild, nullptr);
+        pXFANode->InsertChildAndNotify(pXFAChild, nullptr);
         if (eNodeType == XFA_Element::DataGroup)
           ParseDataGroup(pXFAChild, pXMLElement, ePacketID);
         else if (bNeedValue)
@@ -918,7 +918,7 @@
 
         pXFAChild->JSObject()->SetCData(XFA_Attribute::Value, wsText, false,
                                         false);
-        pXFANode->InsertChild(pXFAChild, nullptr);
+        pXFANode->InsertChildAndNotify(pXFAChild, nullptr);
         pXFAChild->SetXMLMappingNode(pXMLText);
         pXFAChild->SetFlag(XFA_NodeFlag_Initialized);
         continue;
@@ -970,7 +970,7 @@
                                         false, false);
         pXFAChild->JSObject()->SetCData(XFA_Attribute::Value, wsCurValue, false,
                                         false);
-        pXFANode->InsertChild(pXFAChild, nullptr);
+        pXFANode->InsertChildAndNotify(pXFAChild, nullptr);
         pXFAChild->SetXMLMappingNode(pXMLCurValueNode);
         pXFAChild->SetFlag(XFA_NodeFlag_Initialized);
         wsValueTextBuf << wsCurValue;
@@ -987,7 +987,7 @@
     pXFAChild->JSObject()->SetCData(XFA_Attribute::Name, wsNodeStr, false,
                                     false);
     ParseDataValue(pXFAChild, pXMLChild, ePacketID);
-    pXFANode->InsertChild(pXFAChild, nullptr);
+    pXFANode->InsertChildAndNotify(pXFAChild, nullptr);
     pXFAChild->SetXMLMappingNode(pXMLChild);
     pXFAChild->SetFlag(XFA_NodeFlag_Initialized);
     WideString wsCurValue =
@@ -1008,7 +1008,7 @@
                                         false, false);
         pXFAChild->JSObject()->SetCData(XFA_Attribute::Value, wsCurValue, false,
                                         false);
-        pXFANode->InsertChild(pXFAChild, nullptr);
+        pXFANode->InsertChildAndNotify(pXFAChild, nullptr);
         pXFAChild->SetXMLMappingNode(pXMLCurValueNode);
         pXFAChild->SetFlag(XFA_NodeFlag_Initialized);
       }
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 368da29..496c5db 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -623,8 +623,8 @@
           pBeforeNode = pLastNode->GetNextSibling();
         }
         for (auto* pCurNode : rgNodeArray1) {
-          pParentNode->RemoveChild(pCurNode, true);
-          pParentNode->InsertChild(pCurNode, pBeforeNode);
+          pParentNode->RemoveChildAndNotify(pCurNode, true);
+          pParentNode->InsertChildAndNotify(pCurNode, pBeforeNode);
         }
       }
     }
@@ -1005,7 +1005,7 @@
   if (bRecursive) {
     for (CXFA_Node* pChild = GetFirstChild(); pChild;
          pChild = pChild->GetNextSibling()) {
-      pClone->InsertChild(pChild->Clone(bRecursive), nullptr);
+      pClone->InsertChildAndNotify(pChild->Clone(bRecursive), nullptr);
     }
   }
   pClone->SetFlagAndNotify(XFA_NodeFlag_Initialized);
@@ -1162,7 +1162,7 @@
   CXFA_Node* pNewNode =
       m_pDocument->CreateNode(GetPacketType(), property.value());
   if (pNewNode) {
-    InsertChild(pNewNode, nullptr);
+    InsertChildAndNotify(pNewNode, nullptr);
     pNewNode->SetFlagAndNotify(XFA_NodeFlag_Initialized);
     nodes.push_back(pNewNode);
   }
@@ -1191,7 +1191,8 @@
   if (bRecursive) {
     for (CXFA_Node* pChild = GetFirstChild(); pChild;
          pChild = pChild->GetNextSibling()) {
-      pClone->InsertChild(pChild->CloneTemplateToForm(bRecursive), nullptr);
+      pClone->InsertChildAndNotify(pChild->CloneTemplateToForm(bRecursive),
+                                   nullptr);
     }
   }
   pClone->SetFlagAndNotify(XFA_NodeFlag_Initialized);
@@ -1504,7 +1505,7 @@
   return nullptr;
 }
 
-void CXFA_Node::InsertChild(int32_t index, CXFA_Node* pNode) {
+void CXFA_Node::InsertChildAndNotify(int32_t index, CXFA_Node* pNode) {
   CHECK(!pNode->GetParent());
   pNode->ClearFlag(XFA_NodeFlag_HasRemovedChildren);
 
@@ -1535,7 +1536,7 @@
   xml_node_->InsertChildNode(pNode->xml_node_.Get(), index);
 }
 
-void CXFA_Node::InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode) {
+void CXFA_Node::InsertChildAndNotify(CXFA_Node* pNode, CXFA_Node* pBeforeNode) {
   CHECK(!pBeforeNode || pBeforeNode->GetParent() == this);
 
   int32_t index = -1;
@@ -1551,10 +1552,10 @@
       ++index;
     }
   }
-  InsertChild(index, pNode);
+  InsertChildAndNotify(index, pNode);
 }
 
-void CXFA_Node::RemoveChild(CXFA_Node* pNode, bool bNotify) {
+void CXFA_Node::RemoveChildAndNotify(CXFA_Node* pNode, bool bNotify) {
   CHECK(pNode);
   CHECK_EQ(pNode->GetParent(), this);
 
@@ -1874,7 +1875,7 @@
 
     CXFA_Node* pNextSibling =
         iCount > 0 ? item->GetNextSibling() : GetNextSibling();
-    GetParent()->InsertChild(pNewInstance, pNextSibling);
+    GetParent()->InsertChildAndNotify(pNewInstance, pNextSibling);
     if (bMoveDataBindingNodes) {
       std::set<CXFA_Node*> sNew;
       std::set<CXFA_Node*> sAfter;
@@ -1909,7 +1910,7 @@
       return;
     }
 
-    GetParent()->InsertChild(pNewInstance, pBeforeInstance);
+    GetParent()->InsertChildAndNotify(pNewInstance, pBeforeInstance);
     if (bMoveDataBindingNodes) {
       std::set<CXFA_Node*> sNew;
       std::set<CXFA_Node*> sBefore;
@@ -1942,7 +1943,7 @@
 
 void CXFA_Node::RemoveItem(CXFA_Node* pRemoveInstance,
                            bool bRemoveDataBinding) {
-  GetParent()->RemoveChild(pRemoveInstance, true);
+  GetParent()->RemoveChildAndNotify(pRemoveInstance, true);
   if (!bRemoveDataBinding)
     return;
 
@@ -1956,7 +1957,7 @@
 
     if (pDataNode->RemoveBindItem(pFormNode) == 0) {
       if (CXFA_Node* pDataParent = pDataNode->GetParent()) {
-        pDataParent->RemoveChild(pDataNode, true);
+        pDataParent->RemoveChildAndNotify(pDataNode, true);
       }
     }
     pFormNode->SetBindingNode(nullptr);
@@ -1987,7 +1988,7 @@
       pTemplateNode, pFormParent, pDataScope, true, bDataMerge, true);
   if (pInstance) {
     pDocument->DataMerge_UpdateBindingRelations(pInstance);
-    pFormParent->RemoveChild(pInstance, true);
+    pFormParent->RemoveChildAndNotify(pInstance, true);
   }
   return pInstance;
 }
@@ -4415,7 +4416,7 @@
   }
 
   while (CXFA_Node* pChildNode = pBind->GetFirstChild())
-    pBind->RemoveChild(pChildNode, true);
+    pBind->RemoveChildAndNotify(pChildNode, true);
 }
 
 void CXFA_Node::InsertItem(const WideString& wsLabel,
@@ -4434,10 +4435,10 @@
   }
   if (listitems.empty()) {
     CXFA_Node* pItems = CreateSamePacketNode(XFA_Element::Items);
-    InsertChild(-1, pItems);
+    InsertChildAndNotify(-1, pItems);
     InsertListTextItem(pItems, wsLabel, nIndex);
     CXFA_Node* pSaveItems = CreateSamePacketNode(XFA_Element::Items);
-    InsertChild(-1, pSaveItems);
+    InsertChildAndNotify(-1, pSaveItems);
     pSaveItems->JSObject()->SetBoolean(XFA_Attribute::Save, true, false);
     InsertListTextItem(pSaveItems, wsNewValue, nIndex);
   } else if (listitems.size() > 1) {
@@ -4455,7 +4456,7 @@
     pNode->JSObject()->SetEnum(XFA_Attribute::Presence,
                                XFA_AttributeValue::Visible, false);
     CXFA_Node* pSaveItems = CreateSamePacketNode(XFA_Element::Items);
-    InsertChild(-1, pSaveItems);
+    InsertChildAndNotify(-1, pSaveItems);
     pSaveItems->JSObject()->SetBoolean(XFA_Attribute::Save, true, false);
     pSaveItems->JSObject()->SetEnum(XFA_Attribute::Presence,
                                     XFA_AttributeValue::Hidden, false);
@@ -4569,7 +4570,7 @@
 
     if (nIndex < 0) {
       while (CXFA_Node* pNode = pItems->GetFirstChild()) {
-        pItems->RemoveChild(pNode, true);
+        pItems->RemoveChildAndNotify(pNode, true);
       }
     } else {
       if (!bSetValue && pItems->JSObject()->GetBoolean(XFA_Attribute::Save)) {
@@ -4580,7 +4581,7 @@
       CXFA_Node* pNode = pItems->GetFirstChild();
       while (pNode) {
         if (i == nIndex) {
-          pItems->RemoveChild(pNode, true);
+          pItems->RemoveChildAndNotify(pNode, true);
           break;
         }
         i++;
@@ -4990,7 +4991,7 @@
                                    const WideString& wsText,
                                    int32_t nIndex) {
   CXFA_Node* pText = pItems->CreateSamePacketNode(XFA_Element::Text);
-  pItems->InsertChild(nIndex, pText);
+  pItems->InsertChildAndNotify(nIndex, pText);
   pText->JSObject()->SetContent(wsText, wsText, false, false, false);
 }
 
diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h
index 182bbae..4639e16 100644
--- a/xfa/fxfa/parser/cxfa_node.h
+++ b/xfa/fxfa/parser/cxfa_node.h
@@ -164,9 +164,9 @@
     return static_cast<T*>(GetChildInternal(index, eType, bOnlyChild));
   }
 
-  void InsertChild(int32_t index, CXFA_Node* pNode);
-  void InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode);
-  void RemoveChild(CXFA_Node* pNode, bool bNotify);
+  void InsertChildAndNotify(int32_t index, CXFA_Node* pNode);
+  void InsertChildAndNotify(CXFA_Node* pNode, CXFA_Node* pBeforeNode);
+  void RemoveChildAndNotify(CXFA_Node* pNode, bool bNotify);
 
   CXFA_Node* Clone(bool bRecursive);
 
diff --git a/xfa/fxfa/parser/cxfa_node_unittest.cpp b/xfa/fxfa/parser/cxfa_node_unittest.cpp
index d302398..3653d51 100644
--- a/xfa/fxfa/parser/cxfa_node_unittest.cpp
+++ b/xfa/fxfa/parser/cxfa_node_unittest.cpp
@@ -54,7 +54,7 @@
 
   CXFA_Node* child =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child);
+  GetNode()->InsertChildAndNotify(-1, child);
 
   EXPECT_EQ(GetNode(), child->GetParent());
   EXPECT_EQ(child, GetNode()->GetFirstChild());
@@ -66,11 +66,11 @@
 TEST_F(CXFANodeTest, InsertChildByNegativeIndex) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child);
+  GetNode()->InsertChildAndNotify(-1, child);
 
   EXPECT_EQ(GetNode(), child->GetParent());
   EXPECT_EQ(nullptr, child->GetNextSibling());
@@ -85,23 +85,23 @@
 TEST_F(CXFANodeTest, InsertChildByIndex) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child1);
+  GetNode()->InsertChildAndNotify(-1, child1);
 
   CXFA_Node* child2 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child2);
+  GetNode()->InsertChildAndNotify(-1, child2);
 
   CXFA_Node* child3 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child3);
+  GetNode()->InsertChildAndNotify(-1, child3);
 
   CXFA_Node* child =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(2, child);
+  GetNode()->InsertChildAndNotify(2, child);
 
   EXPECT_EQ(GetNode(), child->GetParent());
 
@@ -123,15 +123,15 @@
 TEST_F(CXFANodeTest, InsertChildIndexPastEnd) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child1);
+  GetNode()->InsertChildAndNotify(-1, child1);
 
   CXFA_Node* child =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(20, child);
+  GetNode()->InsertChildAndNotify(20, child);
 
   EXPECT_EQ(GetNode(), child->GetParent());
   EXPECT_EQ(nullptr, child->GetNextSibling());
@@ -148,8 +148,7 @@
 
   CXFA_Node* child =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(child, nullptr);
-
+  GetNode()->InsertChildAndNotify(child, nullptr);
   EXPECT_EQ(child, GetNode()->GetFirstChild());
   EXPECT_EQ(child, GetNode()->GetLastChild());
 }
@@ -157,15 +156,15 @@
 TEST_F(CXFANodeTest, InsertBeforeWithNullBefore) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child1);
+  GetNode()->InsertChildAndNotify(-1, child1);
 
   CXFA_Node* child =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(child, nullptr);
+  GetNode()->InsertChildAndNotify(child, nullptr);
 
   EXPECT_EQ(GetNode(), child->GetParent());
   EXPECT_EQ(nullptr, child->GetNextSibling());
@@ -179,15 +178,15 @@
 TEST_F(CXFANodeTest, InsertBeforeFirstChild) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child1);
+  GetNode()->InsertChildAndNotify(-1, child1);
 
   CXFA_Node* child =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(child, child0);
+  GetNode()->InsertChildAndNotify(child, child0);
 
   EXPECT_EQ(GetNode(), child->GetParent());
   EXPECT_EQ(child0, child->GetNextSibling());
@@ -201,23 +200,23 @@
 TEST_F(CXFANodeTest, InsertBefore) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child1);
+  GetNode()->InsertChildAndNotify(-1, child1);
 
   CXFA_Node* child2 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child2);
+  GetNode()->InsertChildAndNotify(-1, child2);
 
   CXFA_Node* child3 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child3);
+  GetNode()->InsertChildAndNotify(-1, child3);
 
   CXFA_Node* child =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(child, child2);
+  GetNode()->InsertChildAndNotify(child, child2);
 
   EXPECT_EQ(GetNode(), child->GetParent());
   EXPECT_EQ(child2, child->GetNextSibling());
@@ -232,16 +231,13 @@
 TEST_F(CXFANodeTest, RemoveOnlyChild) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
-
+  GetNode()->InsertChildAndNotify(-1, child0);
   EXPECT_EQ(child0, GetNode()->GetFirstChild());
   EXPECT_EQ(child0, GetNode()->GetLastChild());
 
-  GetNode()->RemoveChild(child0, false);
-
+  GetNode()->RemoveChildAndNotify(child0, false);
   EXPECT_EQ(nullptr, GetNode()->GetFirstChild());
   EXPECT_EQ(nullptr, GetNode()->GetLastChild());
-
   EXPECT_EQ(nullptr, child0->GetParent());
   EXPECT_EQ(nullptr, child0->GetNextSibling());
   EXPECT_EQ(nullptr, child0->GetPrevSibling());
@@ -250,24 +246,21 @@
 TEST_F(CXFANodeTest, RemoveFirstChild) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child1);
+  GetNode()->InsertChildAndNotify(-1, child1);
 
   CXFA_Node* child2 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child2);
-
+  GetNode()->InsertChildAndNotify(-1, child2);
   EXPECT_EQ(child0, GetNode()->GetFirstChild());
   EXPECT_EQ(child2, GetNode()->GetLastChild());
 
-  GetNode()->RemoveChild(child0, false);
-
+  GetNode()->RemoveChildAndNotify(child0, false);
   EXPECT_EQ(child1, GetNode()->GetFirstChild());
   EXPECT_EQ(child2, GetNode()->GetLastChild());
-
   EXPECT_EQ(nullptr, child1->GetPrevSibling());
   EXPECT_EQ(nullptr, child0->GetParent());
   EXPECT_EQ(nullptr, child0->GetNextSibling());
@@ -277,24 +270,21 @@
 TEST_F(CXFANodeTest, RemoveLastChild) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child1);
+  GetNode()->InsertChildAndNotify(-1, child1);
 
   CXFA_Node* child2 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child2);
-
+  GetNode()->InsertChildAndNotify(-1, child2);
   EXPECT_EQ(child0, GetNode()->GetFirstChild());
   EXPECT_EQ(child2, GetNode()->GetLastChild());
 
-  GetNode()->RemoveChild(child2, false);
-
+  GetNode()->RemoveChildAndNotify(child2, false);
   EXPECT_EQ(child0, GetNode()->GetFirstChild());
   EXPECT_EQ(child1, GetNode()->GetLastChild());
-
   EXPECT_EQ(nullptr, child1->GetNextSibling());
   EXPECT_EQ(nullptr, child2->GetParent());
   EXPECT_EQ(nullptr, child2->GetNextSibling());
@@ -304,24 +294,21 @@
 TEST_F(CXFANodeTest, RemoveChild) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child1);
+  GetNode()->InsertChildAndNotify(-1, child1);
 
   CXFA_Node* child2 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child2);
-
+  GetNode()->InsertChildAndNotify(-1, child2);
   EXPECT_EQ(child0, GetNode()->GetFirstChild());
   EXPECT_EQ(child2, GetNode()->GetLastChild());
 
-  GetNode()->RemoveChild(child1, false);
-
+  GetNode()->RemoveChildAndNotify(child1, false);
   EXPECT_EQ(child0, GetNode()->GetFirstChild());
   EXPECT_EQ(child2, GetNode()->GetLastChild());
-
   EXPECT_EQ(child2, child0->GetNextSibling());
   EXPECT_EQ(child0, child2->GetPrevSibling());
   EXPECT_EQ(nullptr, child1->GetParent());
@@ -334,57 +321,60 @@
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  child0->InsertChild(-1, child1);
+  child0->InsertChildAndNotify(-1, child1);
 
-  EXPECT_DEATH_IF_SUPPORTED(GetNode()->InsertChild(0, child1), "");
+  EXPECT_DEATH_IF_SUPPORTED(GetNode()->InsertChildAndNotify(0, child1), "");
 }
 
 TEST_F(CXFANodeTest, InsertNullChild) {
-  EXPECT_DEATH_IF_SUPPORTED(GetNode()->InsertChild(0, nullptr), "");
+  EXPECT_DEATH_IF_SUPPORTED(GetNode()->InsertChildAndNotify(0, nullptr), "");
 }
 
 TEST_F(CXFANodeTest, InsertBeforeWithNullChild) {
-  EXPECT_DEATH_IF_SUPPORTED(GetNode()->InsertChild(nullptr, nullptr), "");
+  EXPECT_DEATH_IF_SUPPORTED(GetNode()->InsertChildAndNotify(nullptr, nullptr),
+                            "");
 }
 
 TEST_F(CXFANodeTest, InsertBeforeWithBeforeInAnotherParent) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  child0->InsertChild(-1, child1);
+  child0->InsertChildAndNotify(-1, child1);
 
   CXFA_Node* child =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  EXPECT_DEATH_IF_SUPPORTED(GetNode()->InsertChild(child, child1), "");
+  EXPECT_DEATH_IF_SUPPORTED(GetNode()->InsertChildAndNotify(child, child1), "");
 }
 
 TEST_F(CXFANodeTest, InsertBeforeWithNodeInAnotherParent) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  child0->InsertChild(-1, child1);
+  child0->InsertChildAndNotify(-1, child1);
 
-  EXPECT_DEATH_IF_SUPPORTED(GetNode()->InsertChild(child1, nullptr), "");
+  EXPECT_DEATH_IF_SUPPORTED(GetNode()->InsertChildAndNotify(child1, nullptr),
+                            "");
 }
 
 TEST_F(CXFANodeTest, RemoveChildNullptr) {
-  EXPECT_DEATH_IF_SUPPORTED(GetNode()->RemoveChild(nullptr, false), "");
+  EXPECT_DEATH_IF_SUPPORTED(GetNode()->RemoveChildAndNotify(nullptr, false),
+                            "");
 }
 
 TEST_F(CXFANodeTest, RemoveChildAnotherParent) {
   CXFA_Node* child0 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  GetNode()->InsertChild(-1, child0);
+  GetNode()->InsertChildAndNotify(-1, child0);
 
   CXFA_Node* child1 =
       GetDoc()->CreateNode(XFA_PacketType::Form, XFA_Element::Ui);
-  child0->InsertChild(-1, child1);
+  child0->InsertChildAndNotify(-1, child1);
 
-  EXPECT_DEATH_IF_SUPPORTED(GetNode()->RemoveChild(child1, false), "");
+  EXPECT_DEATH_IF_SUPPORTED(GetNode()->RemoveChildAndNotify(child1, false), "");
 }
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.cpp b/xfa/fxfa/parser/cxfa_nodehelper.cpp
index 7d65e0d..7f961f7 100644
--- a/xfa/fxfa/parser/cxfa_nodehelper.cpp
+++ b/xfa/fxfa/parser/cxfa_nodehelper.cpp
@@ -91,7 +91,7 @@
     for (size_t i = 0; i < m_iCreateCount; ++i) {
       CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(eType);
       if (pNewNode) {
-        m_pCreateParent->InsertChild(pNewNode, nullptr);
+        m_pCreateParent->InsertChildAndNotify(pNewNode, nullptr);
         if (i == m_iCreateCount - 1) {
           m_pCreateParent = pNewNode;
         }
@@ -109,7 +109,7 @@
         pNewNode->JSObject()->SetAttribute(XFA_Attribute::Name, wsNameView,
                                            false);
         pNewNode->CreateXMLMappingNode();
-        m_pCreateParent->InsertChild(pNewNode, nullptr);
+        m_pCreateParent->InsertChildAndNotify(pNewNode, nullptr);
         if (i == m_iCreateCount - 1) {
           m_pCreateParent = pNewNode;
         }
diff --git a/xfa/fxfa/parser/cxfa_validate.cpp b/xfa/fxfa/parser/cxfa_validate.cpp
index 8506e5f..d65b170 100644
--- a/xfa/fxfa/parser/cxfa_validate.cpp
+++ b/xfa/fxfa/parser/cxfa_validate.cpp
@@ -137,7 +137,7 @@
   }
 
   CXFA_Node* pTextNode = pNode->CreateSamePacketNode(XFA_Element::Text);
-  pNode->InsertChild(pTextNode, nullptr);
+  pNode->InsertChildAndNotify(pTextNode, nullptr);
   pTextNode->JSObject()->SetCData(XFA_Attribute::Name, wsMessageType, false,
                                   false);
   pTextNode->JSObject()->SetContent(wsMessage, wsMessage, false, false, true);
diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
index 7962916..dfd8cf0 100644
--- a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
+++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
@@ -55,10 +55,10 @@
   }
   if (pExistingNode) {
     if (pSubformArray) {
-      pFormParent->InsertChild(pExistingNode, nullptr);
+      pFormParent->InsertChildAndNotify(pExistingNode, nullptr);
     } else if (pExistingNode->IsContainerNode()) {
-      pFormParent->RemoveChild(pExistingNode, true);
-      pFormParent->InsertChild(pExistingNode, nullptr);
+      pFormParent->RemoveChildAndNotify(pExistingNode, true);
+      pFormParent->InsertChildAndNotify(pExistingNode, nullptr);
     }
     pExistingNode->ClearFlag(XFA_NodeFlag_UnusedNode);
     pExistingNode->SetTemplateNode(pTemplateNode);
@@ -76,13 +76,13 @@
   }
 
   CXFA_Node* pNewNode = pTemplateNode->CloneTemplateToForm(false);
-  pFormParent->InsertChild(pNewNode, nullptr);
+  pFormParent->InsertChildAndNotify(pNewNode, nullptr);
   if (bRecursive) {
     for (CXFA_Node* pTemplateChild = pTemplateNode->GetFirstChild();
          pTemplateChild; pTemplateChild = pTemplateChild->GetNextSibling()) {
       if (XFA_DataMerge_NeedGenerateForm(pTemplateChild, true)) {
         CXFA_Node* pNewChild = pTemplateChild->CloneTemplateToForm(true);
-        pNewNode->InsertChild(pNewChild, nullptr);
+        pNewNode->InsertChildAndNotify(pNewChild, nullptr);
       }
     }
   }
