diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
index 7327010..d61db05 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
@@ -871,22 +871,9 @@
       FALLTHROUGH;
 
     case Stage::kBreakBefore:
-      if (*pCurActionNode) {
-        CXFA_Node* pBreakBeforeNode = (*pCurActionNode)->GetNextSibling();
-        if (!m_bKeepBreakFinish) {
-          ret = FindBreakNode(pBreakBeforeNode, true, pCurActionNode);
-          if (ret.has_value())
-            return ret.value();
-        }
-        if (m_bIsProcessKeep) {
-          ret = ProcessKeepNodesForBreakBefore(pCurActionNode, pChildContainer);
-          if (ret.has_value())
-            return ret.value();
-          goto CheckNextChildContainer;
-        }
-        *pCurActionNode = pChildContainer;
-        return Stage::kContainer;
-      }
+      ret = HandleBreakBefore(pChildContainer, pCurActionNode);
+      if (ret.has_value())
+        return ret.value();
       goto CheckNextChildContainer;
 
     case Stage::kContainer:
@@ -899,35 +886,11 @@
         return ret.value();
 
     CheckNextChildContainer : {
-      CXFA_Node* pNextChildContainer =
-          pChildContainer ? pChildContainer->GetNextContainerSibling()
-                          : pParentContainer->GetFirstContainerChild();
-      while (pNextChildContainer &&
-             pNextChildContainer->IsLayoutGeneratedNode()) {
-        CXFA_Node* pSaveNode = pNextChildContainer;
-        pNextChildContainer = pNextChildContainer->GetNextContainerSibling();
-        if (pSaveNode->IsUnusedNode())
-          DeleteLayoutGeneratedNode(pSaveNode);
-      }
-      if (!pNextChildContainer)
-        goto NoMoreChildContainer;
-
-      bool bLastKeep = false;
-      ret = ProcessKeepNodesForCheckNext(pCurActionNode, &pNextChildContainer,
-                                         &bLastKeep);
+      ret = HandleCheckNextChildContainer(pParentContainer, pChildContainer,
+                                          pCurActionNode);
       if (ret.has_value())
         return ret.value();
-      if (!m_bKeepBreakFinish && !bLastKeep) {
-        ret = FindBreakNode(pNextChildContainer->GetFirstChild(), true,
-                            pCurActionNode);
-        if (ret.has_value())
-          return ret.value();
-      }
-      *pCurActionNode = pNextChildContainer;
-      return m_bIsProcessKeep ? Stage::kKeep : Stage::kContainer;
-    }
 
-    NoMoreChildContainer : {
       *pCurActionNode = nullptr;
       FALLTHROUGH;
       case Stage::kBookendTrailer:
@@ -936,6 +899,7 @@
           return ret.value();
     }
       FALLTHROUGH;
+
     default:
       *pCurActionNode = nullptr;
       return Stage::kDone;
@@ -2759,6 +2723,25 @@
 }
 
 Optional<CXFA_ItemLayoutProcessor::Stage>
+CXFA_ItemLayoutProcessor::HandleBreakBefore(CXFA_Node* pChildContainer,
+                                            CXFA_Node** pCurActionNode) {
+  if (!*pCurActionNode)
+    return {};
+
+  CXFA_Node* pBreakBeforeNode = (*pCurActionNode)->GetNextSibling();
+  if (!m_bKeepBreakFinish) {
+    Optional<Stage> ret = FindBreakNode(pBreakBeforeNode, true, pCurActionNode);
+    if (ret.has_value())
+      return ret.value();
+  }
+  if (m_bIsProcessKeep)
+    return ProcessKeepNodesForBreakBefore(pCurActionNode, pChildContainer);
+
+  *pCurActionNode = pChildContainer;
+  return Stage::kContainer;
+}
+
+Optional<CXFA_ItemLayoutProcessor::Stage>
 CXFA_ItemLayoutProcessor::HandleBreakAfter(CXFA_Node* pChildContainer,
                                            CXFA_Node** pCurActionNode) {
   if (*pCurActionNode) {
@@ -2771,6 +2754,39 @@
 }
 
 Optional<CXFA_ItemLayoutProcessor::Stage>
+CXFA_ItemLayoutProcessor::HandleCheckNextChildContainer(
+    CXFA_Node* pParentContainer,
+    CXFA_Node* pChildContainer,
+    CXFA_Node** pCurActionNode) {
+  CXFA_Node* pNextChildContainer =
+      pChildContainer ? pChildContainer->GetNextContainerSibling()
+                      : pParentContainer->GetFirstContainerChild();
+  while (pNextChildContainer && pNextChildContainer->IsLayoutGeneratedNode()) {
+    CXFA_Node* pSaveNode = pNextChildContainer;
+    pNextChildContainer = pNextChildContainer->GetNextContainerSibling();
+    if (pSaveNode->IsUnusedNode())
+      DeleteLayoutGeneratedNode(pSaveNode);
+  }
+  if (!pNextChildContainer)
+    return {};
+
+  bool bLastKeep = false;
+  Optional<Stage> ret = ProcessKeepNodesForCheckNext(
+      pCurActionNode, &pNextChildContainer, &bLastKeep);
+  if (ret.has_value())
+    return ret.value();
+
+  if (!m_bKeepBreakFinish && !bLastKeep) {
+    ret = FindBreakNode(pNextChildContainer->GetFirstChild(), true,
+                        pCurActionNode);
+    if (ret.has_value())
+      return ret.value();
+  }
+  *pCurActionNode = pNextChildContainer;
+  return m_bIsProcessKeep ? Stage::kKeep : Stage::kContainer;
+}
+
+Optional<CXFA_ItemLayoutProcessor::Stage>
 CXFA_ItemLayoutProcessor::HandleBookendTrailer(CXFA_Node* pParentContainer,
                                                CXFA_Node** pCurActionNode) {
   for (CXFA_Node* pBookendNode = *pCurActionNode
diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
index 53cd71d..539b205 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
@@ -166,8 +166,13 @@
                              CXFA_Node** pCurActionNode);
   Optional<Stage> HandleBookendLeader(CXFA_Node* pParentContainer,
                                       CXFA_Node** pCurActionNode);
+  Optional<Stage> HandleBreakBefore(CXFA_Node* pChildContainer,
+                                    CXFA_Node** pCurActionNode);
   Optional<Stage> HandleBreakAfter(CXFA_Node* pChildContainer,
                                    CXFA_Node** pCurActionNode);
+  Optional<Stage> HandleCheckNextChildContainer(CXFA_Node* pParentContainer,
+                                                CXFA_Node* pChildContainer,
+                                                CXFA_Node** pCurActionNode);
   Optional<Stage> HandleBookendTrailer(CXFA_Node* pParentContainer,
                                        CXFA_Node** pCurActionNode);
   void ProcessKeepNodesEnd();
