diff --git a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
index 2587b98..e2f4a74 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
@@ -589,9 +589,10 @@
 
 CXFA_ViewRecord* CXFA_LayoutPageMgr::CreateViewRecord(CXFA_Node* pPageNode,
                                                       bool bCreateNew) {
+  ASSERT(pPageNode);
   CXFA_ViewRecord* pNewRecord = new CXFA_ViewRecord();
   if (HasCurrentViewRecord()) {
-    if (!IsPageSetRootOrderedOccurrence() || !pPageNode) {
+    if (!IsPageSetRootOrderedOccurrence()) {
       *pNewRecord = *GetCurrentViewRecord();
       m_ProposedViewRecords.push_back(pNewRecord);
       return pNewRecord;
@@ -632,25 +633,31 @@
       pNewRecord->pCurPageSet = pPageSetLayoutItem;
     }
   } else {
-    if (pPageNode) {
-      CXFA_Node* pPageSet = pPageNode->GetParent();
-      if (pPageSet == m_pTemplatePageSetRoot) {
-        pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
-      } else {
-        CXFA_ViewLayoutItem* pPageSetLayoutItem =
-            new CXFA_ViewLayoutItem(pPageSet);
-        pPageSet->JSObject()->SetLayoutItem(pPageSetLayoutItem);
-        m_pPageSetLayoutItemRoot->AddChild(pPageSetLayoutItem);
-        pNewRecord->pCurPageSet = pPageSetLayoutItem;
-      }
-    } else {
+    CXFA_Node* pPageSet = pPageNode->GetParent();
+    if (pPageSet == m_pTemplatePageSetRoot) {
       pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
+    } else {
+      CXFA_ViewLayoutItem* pPageSetLayoutItem =
+          new CXFA_ViewLayoutItem(pPageSet);
+      pPageSet->JSObject()->SetLayoutItem(pPageSetLayoutItem);
+      m_pPageSetLayoutItemRoot->AddChild(pPageSetLayoutItem);
+      pNewRecord->pCurPageSet = pPageSetLayoutItem;
     }
   }
   m_ProposedViewRecords.push_back(pNewRecord);
   return pNewRecord;
 }
 
+CXFA_ViewRecord* CXFA_LayoutPageMgr::CreateViewRecordSimple() {
+  CXFA_ViewRecord* pNewRecord = new CXFA_ViewRecord();
+  if (HasCurrentViewRecord())
+    *pNewRecord = *GetCurrentViewRecord();
+  else
+    pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
+  m_ProposedViewRecords.push_back(pNewRecord);
+  return pNewRecord;
+}
+
 void CXFA_LayoutPageMgr::AddPageAreaLayoutItem(CXFA_ViewRecord* pNewRecord,
                                                CXFA_Node* pNewPageArea) {
   CXFA_ViewLayoutItem* pNewPageAreaLayoutItem = nullptr;
@@ -1210,7 +1217,7 @@
           pPreferredPageArea = pCurrentNode;
           break;
         }
-        CXFA_ViewRecord* pNewRecord = CreateViewRecord(nullptr, false);
+        CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
         AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
         AddContentAreaLayoutItem(
             pNewRecord, pCurrentNode->GetFirstChildByClass<CXFA_ContentArea>(
@@ -1232,7 +1239,7 @@
         if (!pCurrentNode->GetFirstChildByClass<CXFA_ContentArea>(
                 XFA_Element::ContentArea)) {
           if (pTargetPageArea == pCurrentNode) {
-            CXFA_ViewRecord* pNewRecord = CreateViewRecord(nullptr, false);
+            CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
             AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
             pTargetPageArea = nullptr;
           }
@@ -1248,7 +1255,7 @@
           pFallbackPageArea = pCurrentNode;
         }
       } else if (pTargetPageArea && !MatchPageAreaOddOrEven(pTargetPageArea)) {
-        CXFA_ViewRecord* pNewRecord = CreateViewRecord(nullptr, false);
+        CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
         AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
         AddContentAreaLayoutItem(
             pNewRecord, pCurrentNode->GetFirstChildByClass<CXFA_ContentArea>(
@@ -1273,7 +1280,7 @@
     return false;
 
   if (!bQuery) {
-    CXFA_ViewRecord* pNewRecord = CreateViewRecord(nullptr, false);
+    CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
     AddPageAreaLayoutItem(pNewRecord, pCurPageArea);
     if (!pTargetContentArea) {
       pTargetContentArea = pCurPageArea->GetFirstChildByClass<CXFA_ContentArea>(
@@ -1389,13 +1396,13 @@
       if (pContentAreaLayout.value()->GetFormNode() == pCurContentNode)
         return false;
 
-      CXFA_ViewRecord* pNewRecord = CreateViewRecord(nullptr, false);
+      CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
       pNewRecord->pCurContentArea = pContentAreaLayout.value();
       return true;
     }
   }
 
-  CXFA_ViewRecord* pNewRecord = CreateViewRecord(nullptr, false);
+  CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
   AddContentAreaLayoutItem(pNewRecord, pContentArea);
   return true;
 }
@@ -1445,7 +1452,7 @@
     i = m_nCurPageCount;
 
   for (; i < iMin; i++) {
-    CXFA_ViewRecord* pNewRecord = CreateViewRecord(nullptr, false);
+    CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
     AddPageAreaLayoutItem(pNewRecord, pPageArea);
     AddContentAreaLayoutItem(pNewRecord, pContentArea);
   }
@@ -2010,7 +2017,7 @@
             XFA_Attribute::PagePosition);
     if (eLastChoice == XFA_AttributeValue::First &&
         (bIsSimplex || eOddOrEven != XFA_AttributeValue::Odd)) {
-      CXFA_ViewRecord* pRecord = CreateViewRecord(nullptr, false);
+      CXFA_ViewRecord* pRecord = CreateViewRecordSimple();
       AddPageAreaLayoutItem(pRecord, pNode);
       return;
     }
@@ -2042,7 +2049,7 @@
 
   if (pNode->JSObject()->GetEnum(XFA_Attribute::PagePosition) ==
       XFA_AttributeValue::Last) {
-    CXFA_ViewRecord* pRecord = CreateViewRecord(nullptr, false);
+    CXFA_ViewRecord* pRecord = CreateViewRecordSimple();
     AddPageAreaLayoutItem(pRecord, pNode);
   }
 }
diff --git a/xfa/fxfa/layout/cxfa_layoutpagemgr.h b/xfa/fxfa/layout/cxfa_layoutpagemgr.h
index 3ec9b9d..55aeb91 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.h
+++ b/xfa/fxfa/layout/cxfa_layoutpagemgr.h
@@ -78,6 +78,7 @@
     return !m_ProposedViewRecords.empty() ? std::prev(iter) : iter;
   }
   CXFA_ViewRecord* CreateViewRecord(CXFA_Node* pPageNode, bool bCreateNew);
+  CXFA_ViewRecord* CreateViewRecordSimple();
   void AddPageAreaLayoutItem(CXFA_ViewRecord* pNewRecord,
                              CXFA_Node* pNewPageArea);
   void AddContentAreaLayoutItem(CXFA_ViewRecord* pNewRecord,
