diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
index 092f802..007481a 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
@@ -833,15 +833,15 @@
 }
 
 void CXFA_ItemLayoutProcessor::GotoNextContainerNodeSimple(bool bUsePageBreak) {
-  GotoNextContainerNode(&m_pCurChildNode, &m_nCurChildNodeStage, GetFormNode(),
-                        bUsePageBreak);
+  GotoNextContainerNode(bUsePageBreak, GetFormNode(), &m_pCurChildNode,
+                        &m_nCurChildNodeStage);
 }
 
 void CXFA_ItemLayoutProcessor::GotoNextContainerNode(
-    CXFA_Node** pCurActionNode,
-    XFA_ItemLayoutProcessorStages* nCurStage,
+    bool bUsePageBreak,
     CXFA_Node* pParentContainer,
-    bool bUsePageBreak) {
+    CXFA_Node** pCurActionNode,
+    XFA_ItemLayoutProcessorStages* nCurStage) {
   CXFA_Node* pChildContainer = nullptr;
   switch (*nCurStage) {
     case XFA_ItemLayoutProcessorStages::BreakBefore:
@@ -859,77 +859,51 @@
   }
 
   switch (*nCurStage) {
-    case XFA_ItemLayoutProcessorStages::Keep: {
-      CXFA_Node* pBreakAfterNode = pChildContainer->GetFirstChild();
-      if (!m_bKeepBreakFinish &&
-          FindBreakNode(pBreakAfterNode, false, pCurActionNode, nCurStage)) {
+    case XFA_ItemLayoutProcessorStages::Keep:
+      if (HandleKeep(pChildContainer->GetFirstChild(), pCurActionNode,
+                     nCurStage)) {
         return;
       }
       goto CheckNextChildContainer;
-    }
-    case XFA_ItemLayoutProcessorStages::None: {
+
+    case XFA_ItemLayoutProcessorStages::None:
       *pCurActionNode = nullptr;
       FALLTHROUGH;
-      case XFA_ItemLayoutProcessorStages::BookendLeader:
-        for (CXFA_Node* pBookendNode = *pCurActionNode
-                                           ? (*pCurActionNode)->GetNextSibling()
-                                           : pParentContainer->GetFirstChild();
-             pBookendNode; pBookendNode = pBookendNode->GetNextSibling()) {
-          switch (pBookendNode->GetElementType()) {
-            case XFA_Element::Bookend:
-            case XFA_Element::Break:
-              *pCurActionNode = pBookendNode;
-              *nCurStage = XFA_ItemLayoutProcessorStages::BookendLeader;
-              return;
-            default:
-              break;
-          }
+
+    case XFA_ItemLayoutProcessorStages::BookendLeader:
+      if (HandleBookendLeader(pParentContainer, pCurActionNode, nCurStage))
+        return;
+
+      *pCurActionNode = nullptr;
+      FALLTHROUGH;
+
+    case XFA_ItemLayoutProcessorStages::BreakBefore:
+      if (*pCurActionNode) {
+        CXFA_Node* pBreakBeforeNode = (*pCurActionNode)->GetNextSibling();
+        if (!m_bKeepBreakFinish &&
+            FindBreakNode(pBreakBeforeNode, true, pCurActionNode, nCurStage)) {
+          return;
         }
-    }
-      {
-        *pCurActionNode = nullptr;
-        FALLTHROUGH;
-        case XFA_ItemLayoutProcessorStages::BreakBefore:
-          if (*pCurActionNode) {
-            CXFA_Node* pBreakBeforeNode = (*pCurActionNode)->GetNextSibling();
-            if (!m_bKeepBreakFinish &&
-                FindBreakNode(pBreakBeforeNode, true, pCurActionNode,
-                              nCurStage)) {
-              return;
-            }
-            if (m_bIsProcessKeep) {
-              if (ProcessKeepNodesForBreakBefore(pCurActionNode, nCurStage,
-                                                 pChildContainer)) {
-                return;
-              }
-              goto CheckNextChildContainer;
-            }
-            *pCurActionNode = pChildContainer;
-            *nCurStage = XFA_ItemLayoutProcessorStages::Container;
+        if (m_bIsProcessKeep) {
+          if (ProcessKeepNodesForBreakBefore(pCurActionNode, nCurStage,
+                                             pChildContainer)) {
             return;
           }
           goto CheckNextChildContainer;
+        }
+        *pCurActionNode = pChildContainer;
+        *nCurStage = XFA_ItemLayoutProcessorStages::Container;
+        return;
       }
-    case XFA_ItemLayoutProcessorStages::Container: {
+      goto CheckNextChildContainer;
+
+    case XFA_ItemLayoutProcessorStages::Container:
       *pCurActionNode = nullptr;
       FALLTHROUGH;
-      case XFA_ItemLayoutProcessorStages::BreakAfter: {
-        if (*pCurActionNode) {
-          CXFA_Node* pBreakAfterNode = (*pCurActionNode)->GetNextSibling();
-          if (FindBreakNode(pBreakAfterNode, false, pCurActionNode,
-                            nCurStage)) {
-            return;
-          }
-        } else {
-          CXFA_Node* pBreakAfterNode = pChildContainer->GetFirstChild();
-          if (!m_bKeepBreakFinish && FindBreakNode(pBreakAfterNode, false,
-                                                   pCurActionNode, nCurStage)) {
-            return;
-          }
-        }
-        goto CheckNextChildContainer;
-      }
-    }
+
+    case XFA_ItemLayoutProcessorStages::BreakAfter:
+      if (HandleBreakAfter(pChildContainer, pCurActionNode, nCurStage))
+        return;
 
     CheckNextChildContainer : {
       CXFA_Node* pNextChildContainer =
@@ -965,25 +939,14 @@
       *pCurActionNode = nullptr;
       FALLTHROUGH;
       case XFA_ItemLayoutProcessorStages::BookendTrailer:
-        for (CXFA_Node* pBookendNode = *pCurActionNode
-                                           ? (*pCurActionNode)->GetNextSibling()
-                                           : pParentContainer->GetFirstChild();
-             pBookendNode; pBookendNode = pBookendNode->GetNextSibling()) {
-          switch (pBookendNode->GetElementType()) {
-            case XFA_Element::Bookend:
-            case XFA_Element::Break:
-              *pCurActionNode = pBookendNode;
-              *nCurStage = XFA_ItemLayoutProcessorStages::BookendTrailer;
-              return;
-            default:
-              break;
-          }
-        }
+        if (HandleBookendTrailer(pParentContainer, pCurActionNode, nCurStage))
+          return;
     }
       FALLTHROUGH;
     default:
       *pCurActionNode = nullptr;
       *nCurStage = XFA_ItemLayoutProcessorStages::Done;
+      break;
   }
 }
 
@@ -1050,10 +1013,10 @@
   XFA_ItemLayoutProcessorStages nCurChildNodeStage =
       XFA_ItemLayoutProcessorStages::None;
   CXFA_LayoutItem* pBeforeItem = nullptr;
-  for (GotoNextContainerNode(&pCurChildNode, &nCurChildNodeStage, pFormNode,
-                             false);
-       pCurChildNode; GotoNextContainerNode(&pCurChildNode, &nCurChildNodeStage,
-                                            pFormNode, false)) {
+  for (GotoNextContainerNode(false, pFormNode, &pCurChildNode,
+                             &nCurChildNodeStage);
+       pCurChildNode; GotoNextContainerNode(false, pFormNode, &pCurChildNode,
+                                            &nCurChildNodeStage)) {
     if (nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Container)
       continue;
     if (pCurChildNode->GetElementType() == XFA_Element::Variables)
@@ -2790,3 +2753,66 @@
   }
   return XFA_ItemLayoutProcessorResult::PageFullBreak;
 }
+
+bool CXFA_ItemLayoutProcessor::HandleKeep(
+    CXFA_Node* pBreakAfterNode,
+    CXFA_Node** pCurActionNode,
+    XFA_ItemLayoutProcessorStages* nCurStage) {
+  return !m_bKeepBreakFinish &&
+         FindBreakNode(pBreakAfterNode, false, pCurActionNode, nCurStage);
+}
+
+bool CXFA_ItemLayoutProcessor::HandleBookendLeader(
+    CXFA_Node* pParentContainer,
+    CXFA_Node** pCurActionNode,
+    XFA_ItemLayoutProcessorStages* nCurStage) {
+  for (CXFA_Node* pBookendNode = *pCurActionNode
+                                     ? (*pCurActionNode)->GetNextSibling()
+                                     : pParentContainer->GetFirstChild();
+       pBookendNode; pBookendNode = pBookendNode->GetNextSibling()) {
+    switch (pBookendNode->GetElementType()) {
+      case XFA_Element::Bookend:
+      case XFA_Element::Break:
+        *pCurActionNode = pBookendNode;
+        *nCurStage = XFA_ItemLayoutProcessorStages::BookendLeader;
+        return true;
+      default:
+        break;
+    }
+  }
+  return false;
+}
+
+bool CXFA_ItemLayoutProcessor::HandleBreakAfter(
+    CXFA_Node* pChildContainer,
+    CXFA_Node** pCurActionNode,
+    XFA_ItemLayoutProcessorStages* nCurStage) {
+  if (*pCurActionNode) {
+    CXFA_Node* pBreakAfterNode = (*pCurActionNode)->GetNextSibling();
+    return FindBreakNode(pBreakAfterNode, false, pCurActionNode, nCurStage);
+  }
+
+  CXFA_Node* pBreakAfterNode = pChildContainer->GetFirstChild();
+  return HandleKeep(pBreakAfterNode, pCurActionNode, nCurStage);
+}
+
+bool CXFA_ItemLayoutProcessor::HandleBookendTrailer(
+    CXFA_Node* pParentContainer,
+    CXFA_Node** pCurActionNode,
+    XFA_ItemLayoutProcessorStages* nCurStage) {
+  for (CXFA_Node* pBookendNode = *pCurActionNode
+                                     ? (*pCurActionNode)->GetNextSibling()
+                                     : pParentContainer->GetFirstChild();
+       pBookendNode; pBookendNode = pBookendNode->GetNextSibling()) {
+    switch (pBookendNode->GetElementType()) {
+      case XFA_Element::Bookend:
+      case XFA_Element::Break:
+        *pCurActionNode = pBookendNode;
+        *nCurStage = XFA_ItemLayoutProcessorStages::BookendTrailer;
+        return true;
+      default:
+        break;
+    }
+  }
+  return false;
+}
diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
index 272e93a..571a55e 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
@@ -120,10 +120,10 @@
   void DoLayoutField();
 
   void GotoNextContainerNodeSimple(bool bUsePageBreak);
-  void GotoNextContainerNode(CXFA_Node** pCurActionNode,
-                             XFA_ItemLayoutProcessorStages* nCurStage,
+  void GotoNextContainerNode(bool bUsePageBreak,
                              CXFA_Node* pParentContainer,
-                             bool bUsePageBreak);
+                             CXFA_Node** pCurActionNode,
+                             XFA_ItemLayoutProcessorStages* nCurStage);
 
   bool ProcessKeepNodesForCheckNext(CXFA_Node** pCurActionNode,
                                     XFA_ItemLayoutProcessorStages* nCurStage,
@@ -163,6 +163,19 @@
       CXFA_LayoutContext* pLayoutContext,
       bool bNewRow);
 
+  bool HandleKeep(CXFA_Node* pBreakAfterNode,
+                  CXFA_Node** pCurActionNode,
+                  XFA_ItemLayoutProcessorStages* nCurStage);
+  bool HandleBookendLeader(CXFA_Node* pParentContainer,
+                           CXFA_Node** pCurActionNode,
+                           XFA_ItemLayoutProcessorStages* nCurStage);
+  bool HandleBreakAfter(CXFA_Node* pChildContainer,
+                        CXFA_Node** pCurActionNode,
+                        XFA_ItemLayoutProcessorStages* nCurStage);
+  bool HandleBookendTrailer(CXFA_Node* pParentContainer,
+                            CXFA_Node** pCurActionNode,
+                            XFA_ItemLayoutProcessorStages* nCurStage);
+
   CXFA_Node* m_pFormNode;
   CXFA_ContentLayoutItem* m_pLayoutItem = nullptr;
   CXFA_Node* m_pCurChildNode = nullptr;
