diff --git a/xfa/fxfa/layout/BUILD.gn b/xfa/fxfa/layout/BUILD.gn
index e50869c..9fe47c2 100644
--- a/xfa/fxfa/layout/BUILD.gn
+++ b/xfa/fxfa/layout/BUILD.gn
@@ -12,19 +12,19 @@
   sources = [
     "cxfa_contentlayoutitem.cpp",
     "cxfa_contentlayoutitem.h",
-    "cxfa_itemlayoutprocessor.cpp",
-    "cxfa_itemlayoutprocessor.h",
+    "cxfa_contentlayoutprocessor.cpp",
+    "cxfa_contentlayoutprocessor.h",
     "cxfa_layoutcontext.cpp",
     "cxfa_layoutcontext.h",
     "cxfa_layoutitem.cpp",
     "cxfa_layoutitem.h",
-    "cxfa_layoutpagemgr.cpp",
-    "cxfa_layoutpagemgr.h",
     "cxfa_layoutprocessor.cpp",
     "cxfa_layoutprocessor.h",
     "cxfa_traversestrategy_layoutitem.h",
     "cxfa_viewlayoutitem.cpp",
     "cxfa_viewlayoutitem.h",
+    "cxfa_viewlayoutprocessor.cpp",
+    "cxfa_viewlayoutprocessor.h",
   ]
   deps = [
     "../../../core/fxcrt",
diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
similarity index 92%
rename from xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
rename to xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
index df6792b..43c1be8 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/fxfa/layout/cxfa_itemlayoutprocessor.h"
+#include "xfa/fxfa/layout/cxfa_contentlayoutprocessor.h"
 
 #include <algorithm>
 #include <memory>
@@ -21,9 +21,9 @@
 #include "xfa/fxfa/cxfa_ffwidget.h"
 #include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
 #include "xfa/fxfa/layout/cxfa_layoutcontext.h"
-#include "xfa/fxfa/layout/cxfa_layoutpagemgr.h"
 #include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
 #include "xfa/fxfa/layout/cxfa_viewlayoutitem.h"
+#include "xfa/fxfa/layout/cxfa_viewlayoutprocessor.h"
 #include "xfa/fxfa/parser/cxfa_document.h"
 #include "xfa/fxfa/parser/cxfa_keep.h"
 #include "xfa/fxfa/parser/cxfa_localemgr.h"
@@ -390,7 +390,7 @@
   return false;
 }
 
-Optional<CXFA_ItemLayoutProcessor::Stage> FindBreakNode(
+Optional<CXFA_ContentLayoutProcessor::Stage> FindBreakNode(
     CXFA_Node* pContainerNode,
     bool bBreakBefore,
     CXFA_Node** pCurActionNode) {
@@ -405,14 +405,14 @@
           break;
 
         *pCurActionNode = pBreakNode;
-        return CXFA_ItemLayoutProcessor::Stage::kBreakBefore;
+        return CXFA_ContentLayoutProcessor::Stage::kBreakBefore;
       }
       case XFA_Element::BreakAfter: {
         if (bBreakBefore)
           break;
 
         *pCurActionNode = pBreakNode;
-        return CXFA_ItemLayoutProcessor::Stage::kBreakAfter;
+        return CXFA_ContentLayoutProcessor::Stage::kBreakAfter;
       }
       case XFA_Element::Break:
         if (pBreakNode->JSObject()->GetEnum(eAttributeType) ==
@@ -421,8 +421,8 @@
         }
 
         *pCurActionNode = pBreakNode;
-        return bBreakBefore ? CXFA_ItemLayoutProcessor::Stage::kBreakBefore
-                            : CXFA_ItemLayoutProcessor::Stage::kBreakAfter;
+        return bBreakBefore ? CXFA_ContentLayoutProcessor::Stage::kBreakBefore
+                            : CXFA_ContentLayoutProcessor::Stage::kBreakAfter;
       default:
         break;
     }
@@ -618,9 +618,10 @@
 
 }  // namespace
 
-CXFA_ItemLayoutProcessor::CXFA_ItemLayoutProcessor(CXFA_Node* pNode,
-                                                   CXFA_LayoutPageMgr* pPageMgr)
-    : m_pFormNode(pNode), m_pPageMgr(pPageMgr) {
+CXFA_ContentLayoutProcessor::CXFA_ContentLayoutProcessor(
+    CXFA_Node* pNode,
+    CXFA_ViewLayoutProcessor* pViewLayoutProcessor)
+    : m_pFormNode(pNode), m_pViewLayoutProcessor(pViewLayoutProcessor) {
   ASSERT(GetFormNode());
   ASSERT(GetFormNode()->IsContainerNode() ||
          GetFormNode()->GetElementType() == XFA_Element::Form);
@@ -628,9 +629,9 @@
       ToContentLayoutItem(GetFormNode()->JSObject()->GetLayoutItem());
 }
 
-CXFA_ItemLayoutProcessor::~CXFA_ItemLayoutProcessor() {}
+CXFA_ContentLayoutProcessor::~CXFA_ContentLayoutProcessor() {}
 
-CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::CreateContentLayoutItem(
+CXFA_ContentLayoutItem* CXFA_ContentLayoutProcessor::CreateContentLayoutItem(
     CXFA_Node* pFormNode) {
   if (!pFormNode)
     return nullptr;
@@ -655,7 +656,7 @@
   return pLayoutItem;
 }
 
-float CXFA_ItemLayoutProcessor::FindSplitPos(float fProposedSplitPos) {
+float CXFA_ContentLayoutProcessor::FindSplitPos(float fProposedSplitPos) {
   ASSERT(m_pLayoutItem);
   auto value = GetFormNode()->JSObject()->TryEnum(XFA_Attribute::Layout, true);
   XFA_AttributeValue eLayout = value.value_or(XFA_AttributeValue::Position);
@@ -670,7 +671,7 @@
   return fProposedSplitPos;
 }
 
-void CXFA_ItemLayoutProcessor::SplitLayoutItem(
+void CXFA_ContentLayoutProcessor::SplitLayoutItem(
     CXFA_ContentLayoutItem* pLayoutItem,
     CXFA_ContentLayoutItem* pSecondParent,
     float fSplitPos) {
@@ -796,12 +797,12 @@
     pLayoutItem->AppendLastChild(pSecondLayoutItem);
 }
 
-void CXFA_ItemLayoutProcessor::SplitLayoutItem(float fSplitPos) {
+void CXFA_ContentLayoutProcessor::SplitLayoutItem(float fSplitPos) {
   ASSERT(m_pLayoutItem);
   SplitLayoutItem(m_pLayoutItem, nullptr, fSplitPos);
 }
 
-CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::ExtractLayoutItem() {
+CXFA_ContentLayoutItem* CXFA_ContentLayoutProcessor::ExtractLayoutItem() {
   CXFA_ContentLayoutItem* pLayoutItem = m_pLayoutItem;
   if (pLayoutItem) {
     m_pLayoutItem = ToContentLayoutItem(pLayoutItem->GetNextSibling());
@@ -827,16 +828,17 @@
   return pLayoutItem;
 }
 
-void CXFA_ItemLayoutProcessor::GotoNextContainerNodeSimple(bool bUsePageBreak) {
+void CXFA_ContentLayoutProcessor::GotoNextContainerNodeSimple(
+    bool bUsePageBreak) {
   m_nCurChildNodeStage = GotoNextContainerNode(
       m_nCurChildNodeStage, bUsePageBreak, GetFormNode(), &m_pCurChildNode);
 }
 
-CXFA_ItemLayoutProcessor::Stage CXFA_ItemLayoutProcessor::GotoNextContainerNode(
-    Stage nCurStage,
-    bool bUsePageBreak,
-    CXFA_Node* pParentContainer,
-    CXFA_Node** pCurActionNode) {
+CXFA_ContentLayoutProcessor::Stage
+CXFA_ContentLayoutProcessor::GotoNextContainerNode(Stage nCurStage,
+                                                   bool bUsePageBreak,
+                                                   CXFA_Node* pParentContainer,
+                                                   CXFA_Node** pCurActionNode) {
   CXFA_Node* pChildContainer = nullptr;
   switch (nCurStage) {
     case Stage::kBreakBefore:
@@ -914,8 +916,8 @@
   return Stage::kDone;
 }
 
-Optional<CXFA_ItemLayoutProcessor::Stage>
-CXFA_ItemLayoutProcessor::ProcessKeepNodesForCheckNext(
+Optional<CXFA_ContentLayoutProcessor::Stage>
+CXFA_ContentLayoutProcessor::ProcessKeepNodesForCheckNext(
     CXFA_Node** pCurActionNode,
     CXFA_Node** pNextContainer,
     bool* pLastKeepNode) {
@@ -956,8 +958,8 @@
   return ret;
 }
 
-Optional<CXFA_ItemLayoutProcessor::Stage>
-CXFA_ItemLayoutProcessor::ProcessKeepNodesForBreakBefore(
+Optional<CXFA_ContentLayoutProcessor::Stage>
+CXFA_ContentLayoutProcessor::ProcessKeepNodesForBreakBefore(
     CXFA_Node** pCurActionNode,
     CXFA_Node* pContainerNode) {
   if (m_pKeepTailNode == pContainerNode) {
@@ -970,7 +972,7 @@
   return FindBreakNode(pBreakAfterNode, false, pCurActionNode);
 }
 
-void CXFA_ItemLayoutProcessor::DoLayoutPageArea(
+void CXFA_ContentLayoutProcessor::DoLayoutPageArea(
     CXFA_ViewLayoutItem* pPageAreaLayoutItem) {
   CXFA_Node* pFormNode = pPageAreaLayoutItem->GetFormNode();
   CXFA_Node* pCurChildNode = nullptr;
@@ -986,7 +988,7 @@
       continue;
 
     auto pProcessor =
-        pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(pCurChildNode, nullptr);
+        pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(pCurChildNode, nullptr);
     pProcessor->DoLayout(false, FLT_MAX, FLT_MAX, nullptr);
     if (!pProcessor->HasLayoutItem())
       continue;
@@ -1025,7 +1027,7 @@
   }
 }
 
-void CXFA_ItemLayoutProcessor::DoLayoutPositionedContainer(
+void CXFA_ContentLayoutProcessor::DoLayoutPositionedContainer(
     CXFA_LayoutContext* pContext) {
   if (m_pLayoutItem)
     return;
@@ -1053,8 +1055,8 @@
     if (m_pCurChildNode->GetElementType() == XFA_Element::Variables)
       continue;
 
-    auto pProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
-        m_pCurChildNode, m_pPageMgr.Get());
+    auto pProcessor = pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(
+        m_pCurChildNode, m_pViewLayoutProcessor.Get());
     if (pContext && pContext->m_prgSpecifiedColumnWidths) {
       int32_t iColSpan =
           m_pCurChildNode->JSObject()->GetInteger(XFA_Attribute::ColSpan);
@@ -1131,7 +1133,8 @@
   SetCurrentComponentSize(containerSize);
 }
 
-void CXFA_ItemLayoutProcessor::DoLayoutTableContainer(CXFA_Node* pLayoutNode) {
+void CXFA_ContentLayoutProcessor::DoLayoutTableContainer(
+    CXFA_Node* pLayoutNode) {
   if (m_pLayoutItem)
     return;
   if (!pLayoutNode)
@@ -1187,8 +1190,8 @@
     if (m_nCurChildNodeStage != Stage::kContainer)
       continue;
 
-    auto pProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
-        m_pCurChildNode, m_pPageMgr.Get());
+    auto pProcessor = pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(
+        m_pCurChildNode, m_pViewLayoutProcessor.Get());
     pProcessor->DoLayout(false, FLT_MAX, FLT_MAX, pLayoutContext);
     if (!pProcessor->HasLayoutItem())
       continue;
@@ -1357,7 +1360,7 @@
   SetCurrentComponentSize(containerSize);
 }
 
-bool CXFA_ItemLayoutProcessor::IsAddNewRowForTrailer(
+bool CXFA_ContentLayoutProcessor::IsAddNewRowForTrailer(
     CXFA_ContentLayoutItem* pTrailerItem) {
   if (!pTrailerItem)
     return false;
@@ -1368,7 +1371,7 @@
   return eLayout == XFA_AttributeValue::Tb || m_fWidthLimit <= fWidth;
 }
 
-float CXFA_ItemLayoutProcessor::InsertKeepLayoutItems() {
+float CXFA_ContentLayoutProcessor::InsertKeepLayoutItems() {
   if (m_arrayKeepItems.empty())
     return 0;
 
@@ -1388,8 +1391,8 @@
   return fTotalHeight;
 }
 
-bool CXFA_ItemLayoutProcessor::ProcessKeepForSplit(
-    CXFA_ItemLayoutProcessor* pChildProcessor,
+bool CXFA_ContentLayoutProcessor::ProcessKeepForSplit(
+    CXFA_ContentLayoutProcessor* pChildProcessor,
     Result eRetValue,
     std::vector<CXFA_ContentLayoutItem*>* rgCurLineLayoutItem,
     float* fContentCurRowAvailWidth,
@@ -1432,7 +1435,7 @@
   return true;
 }
 
-bool CXFA_ItemLayoutProcessor::JudgePutNextPage(
+bool CXFA_ContentLayoutProcessor::JudgePutNextPage(
     CXFA_ContentLayoutItem* pParentLayoutItem,
     float fChildHeight,
     std::vector<CXFA_ContentLayoutItem*>* pKeepItems) {
@@ -1455,10 +1458,10 @@
     }
   }
   fItemsHeight += fChildHeight;
-  return m_pPageMgr->GetNextAvailContentHeight(fItemsHeight);
+  return m_pViewLayoutProcessor->GetNextAvailContentHeight(fItemsHeight);
 }
 
-void CXFA_ItemLayoutProcessor::ProcessUnUseBinds(CXFA_Node* pFormNode) {
+void CXFA_ContentLayoutProcessor::ProcessUnUseBinds(CXFA_Node* pFormNode) {
   if (!pFormNode)
     return;
 
@@ -1476,7 +1479,7 @@
   }
 }
 
-void CXFA_ItemLayoutProcessor::ProcessUnUseOverFlow(
+void CXFA_ContentLayoutProcessor::ProcessUnUseOverFlow(
     CXFA_Node* pLeaderNode,
     CXFA_Node* pTrailerNode,
     CXFA_ContentLayoutItem* pTrailerItem,
@@ -1498,8 +1501,8 @@
     XFA_ReleaseLayoutItem(pTrailerItem);
 }
 
-CXFA_ItemLayoutProcessor::Result
-CXFA_ItemLayoutProcessor::DoLayoutFlowedContainer(
+CXFA_ContentLayoutProcessor::Result
+CXFA_ContentLayoutProcessor::DoLayoutFlowedContainer(
     bool bUseBreakControl,
     XFA_AttributeValue eFlowStrategy,
     float fHeightLimit,
@@ -1604,7 +1607,7 @@
     }
 
     while (m_pCurChildNode) {
-      std::unique_ptr<CXFA_ItemLayoutProcessor> pProcessor;
+      std::unique_ptr<CXFA_ContentLayoutProcessor> pProcessor;
       bool bAddedItemInRow = false;
       fContentCurRowY += InsertPendingItems(GetFormNode());
       switch (m_nCurChildNodeStage) {
@@ -1617,11 +1620,11 @@
             calculated_size.height -= item->m_sSize.height;
           }
 
-          if (!bUseBreakControl || !m_pPageMgr)
+          if (!bUseBreakControl || !m_pViewLayoutProcessor)
             break;
 
-          Optional<CXFA_LayoutPageMgr::BreakData> break_data =
-              m_pPageMgr->ProcessBreakBefore(m_pCurChildNode);
+          Optional<CXFA_ViewLayoutProcessor::BreakData> break_data =
+              m_pViewLayoutProcessor->ProcessBreakBefore(m_pCurChildNode);
           if (!break_data.has_value() || !break_data.value().bCreatePage ||
               GetFormNode()->GetElementType() == XFA_Element::Form) {
             break;
@@ -1639,8 +1642,8 @@
               AddPendingNode(pTrailerNode, true);
             } else {
               auto pTempProcessor =
-                  pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(pTrailerNode,
-                                                               nullptr);
+                  pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(pTrailerNode,
+                                                                  nullptr);
               InsertFlowedItem(
                   pTempProcessor.get(), bContainerWidthAutoSize,
                   bContainerHeightAutoSize, container_size.height,
@@ -1656,11 +1659,11 @@
           goto SuspendAndCreateNewRow;
         }
         case Stage::kBreakAfter: {
-          if (!bUseBreakControl || !m_pPageMgr)
+          if (!bUseBreakControl || !m_pViewLayoutProcessor)
             break;
 
-          Optional<CXFA_LayoutPageMgr::BreakData> break_data =
-              m_pPageMgr->ProcessBreakAfter(m_pCurChildNode);
+          Optional<CXFA_ViewLayoutProcessor::BreakData> break_data =
+              m_pViewLayoutProcessor->ProcessBreakAfter(m_pCurChildNode);
           if (!break_data.has_value() ||
               GetFormNode()->GetElementType() == XFA_Element::Form) {
             break;
@@ -1670,8 +1673,9 @@
           CXFA_Node* pTrailerNode = break_data.value().pTrailer;
           bool bCreatePage = break_data.value().bCreatePage;
           if (JudgeLeaderOrTrailerForOccur(pTrailerNode)) {
-            auto pTempProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
-                pTrailerNode, nullptr);
+            auto pTempProcessor =
+                pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(pTrailerNode,
+                                                                nullptr);
             InsertFlowedItem(pTempProcessor.get(), bContainerWidthAutoSize,
                              bContainerHeightAutoSize, container_size.height,
                              eFlowStrategy, &uCurHAlignState,
@@ -1689,8 +1693,8 @@
                   fContentCurRowHeight, fContentWidthLimit, false);
               rgCurLineLayoutItems->clear();
               auto pTempProcessor =
-                  pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(pLeaderNode,
-                                                               nullptr);
+                  pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(pLeaderNode,
+                                                                  nullptr);
               InsertFlowedItem(
                   pTempProcessor.get(), bContainerWidthAutoSize,
                   bContainerHeightAutoSize, container_size.height,
@@ -1716,12 +1720,12 @@
         case Stage::kBookendLeader: {
           if (m_pCurChildPreprocessor) {
             pProcessor = std::move(m_pCurChildPreprocessor);
-          } else if (m_pPageMgr) {
+          } else if (m_pViewLayoutProcessor) {
             CXFA_Node* pLeaderNode =
-                m_pPageMgr->ProcessBookendLeader(m_pCurChildNode);
+                m_pViewLayoutProcessor->ProcessBookendLeader(m_pCurChildNode);
             if (pLeaderNode) {
-              pProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
-                  pLeaderNode, m_pPageMgr.Get());
+              pProcessor = pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(
+                  pLeaderNode, m_pViewLayoutProcessor.Get());
             }
           }
 
@@ -1744,12 +1748,12 @@
         case Stage::kBookendTrailer: {
           if (m_pCurChildPreprocessor) {
             pProcessor = std::move(m_pCurChildPreprocessor);
-          } else if (m_pPageMgr) {
+          } else if (m_pViewLayoutProcessor) {
             CXFA_Node* pTrailerNode =
-                m_pPageMgr->ProcessBookendTrailer(m_pCurChildNode);
+                m_pViewLayoutProcessor->ProcessBookendTrailer(m_pCurChildNode);
             if (pTrailerNode) {
-              pProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
-                  pTrailerNode, m_pPageMgr.Get());
+              pProcessor = pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(
+                  pTrailerNode, m_pViewLayoutProcessor.Get());
             }
           }
           if (pProcessor) {
@@ -1785,8 +1789,8 @@
             pProcessor = std::move(m_pCurChildPreprocessor);
             bNewRow = true;
           } else {
-            pProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
-                m_pCurChildNode, m_pPageMgr.Get());
+            pProcessor = pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(
+                m_pCurChildNode, m_pViewLayoutProcessor.Get());
           }
 
           pProcessor->InsertPendingItems(m_pCurChildNode);
@@ -1867,7 +1871,7 @@
   return bIsManualBreak ? Result::kManualBreak : Result::kPageFullBreak;
 }
 
-bool CXFA_ItemLayoutProcessor::CalculateRowChildPosition(
+bool CXFA_ContentLayoutProcessor::CalculateRowChildPosition(
     std::vector<CXFA_ContentLayoutItem*> (&rgCurLineLayoutItems)[3],
     XFA_AttributeValue eFlowStrategy,
     bool bContainerHeightAutoSize,
@@ -2001,7 +2005,7 @@
   return true;
 }
 
-CXFA_Node* CXFA_ItemLayoutProcessor::GetSubformSetParent(
+CXFA_Node* CXFA_ContentLayoutProcessor::GetSubformSetParent(
     CXFA_Node* pSubformSet) {
   if (pSubformSet && pSubformSet->GetElementType() == XFA_Element::SubformSet) {
     CXFA_Node* pParent = pSubformSet->GetParent();
@@ -2014,7 +2018,7 @@
   return pSubformSet;
 }
 
-void CXFA_ItemLayoutProcessor::DoLayoutField() {
+void CXFA_ContentLayoutProcessor::DoLayoutField() {
   if (m_pLayoutItem)
     return;
 
@@ -2036,7 +2040,7 @@
   SetCurrentComponentSize(size);
 }
 
-CXFA_ItemLayoutProcessor::Result CXFA_ItemLayoutProcessor::DoLayout(
+CXFA_ContentLayoutProcessor::Result CXFA_ContentLayoutProcessor::DoLayout(
     bool bUseBreakControl,
     float fHeightLimit,
     float fRealHeight,
@@ -2081,19 +2085,21 @@
   }
 }
 
-CFX_SizeF CXFA_ItemLayoutProcessor::GetCurrentComponentSize() {
+CFX_SizeF CXFA_ContentLayoutProcessor::GetCurrentComponentSize() {
   return CFX_SizeF(m_pLayoutItem->m_sSize.width, m_pLayoutItem->m_sSize.height);
 }
 
-void CXFA_ItemLayoutProcessor::SetCurrentComponentPos(const CFX_PointF& pos) {
+void CXFA_ContentLayoutProcessor::SetCurrentComponentPos(
+    const CFX_PointF& pos) {
   m_pLayoutItem->m_sPos = pos;
 }
 
-void CXFA_ItemLayoutProcessor::SetCurrentComponentSize(const CFX_SizeF& size) {
+void CXFA_ContentLayoutProcessor::SetCurrentComponentSize(
+    const CFX_SizeF& size) {
   m_pLayoutItem->m_sSize = size;
 }
 
-bool CXFA_ItemLayoutProcessor::JudgeLeaderOrTrailerForOccur(
+bool CXFA_ContentLayoutProcessor::JudgeLeaderOrTrailerForOccur(
     CXFA_Node* pFormNode) {
   if (!pFormNode)
     return false;
@@ -2119,7 +2125,7 @@
   return true;
 }
 
-void CXFA_ItemLayoutProcessor::UpdatePendingItemLayout(
+void CXFA_ContentLayoutProcessor::UpdatePendingItemLayout(
     CXFA_ContentLayoutItem* pLayoutItem) {
   XFA_AttributeValue eLayout =
       pLayoutItem->GetFormNode()->JSObject()->GetEnum(XFA_Attribute::Layout);
@@ -2133,7 +2139,7 @@
   }
 }
 
-void CXFA_ItemLayoutProcessor::AddTrailerBeforeSplit(
+void CXFA_ContentLayoutProcessor::AddTrailerBeforeSplit(
     float fSplitPos,
     CXFA_ContentLayoutItem* pTrailerLayoutItem,
     bool bUseInherited) {
@@ -2195,7 +2201,7 @@
   m_pLayoutItem->AppendLastChild(pTrailerLayoutItem);
 }
 
-void CXFA_ItemLayoutProcessor::AddLeaderAfterSplit(
+void CXFA_ContentLayoutProcessor::AddLeaderAfterSplit(
     CXFA_ContentLayoutItem* pLeaderLayoutItem) {
   UpdatePendingItemLayout(pLeaderLayoutItem);
 
@@ -2242,13 +2248,14 @@
   m_pLayoutItem->AppendLastChild(pLeaderLayoutItem);
 }
 
-void CXFA_ItemLayoutProcessor::AddPendingNode(CXFA_Node* pPendingNode,
-                                              bool bBreakPending) {
+void CXFA_ContentLayoutProcessor::AddPendingNode(CXFA_Node* pPendingNode,
+                                                 bool bBreakPending) {
   m_PendingNodes.push_back(pPendingNode);
   m_bBreakPending = bBreakPending;
 }
 
-float CXFA_ItemLayoutProcessor::InsertPendingItems(CXFA_Node* pCurChildNode) {
+float CXFA_ContentLayoutProcessor::InsertPendingItems(
+    CXFA_Node* pCurChildNode) {
   float fTotalHeight = 0;
   if (m_PendingNodes.empty())
     return fTotalHeight;
@@ -2259,7 +2266,7 @@
   }
 
   while (!m_PendingNodes.empty()) {
-    auto pPendingProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
+    auto pPendingProcessor = pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(
         m_PendingNodes.front(), nullptr);
     m_PendingNodes.pop_front();
     pPendingProcessor->DoLayout(false, FLT_MAX, FLT_MAX, nullptr);
@@ -2276,8 +2283,9 @@
   return fTotalHeight;
 }
 
-CXFA_ItemLayoutProcessor::Result CXFA_ItemLayoutProcessor::InsertFlowedItem(
-    CXFA_ItemLayoutProcessor* pProcessor,
+CXFA_ContentLayoutProcessor::Result
+CXFA_ContentLayoutProcessor::InsertFlowedItem(
+    CXFA_ContentLayoutProcessor* pProcessor,
     bool bContainerWidthAutoSize,
     bool bContainerHeightAutoSize,
     float fContainerHeight,
@@ -2327,8 +2335,9 @@
 
   bool bUseInherited = false;
   CXFA_LayoutContext layoutContext;
-  if (m_pPageMgr) {
-    CXFA_Node* pOverflowNode = m_pPageMgr->QueryOverflow(GetFormNode());
+  if (m_pViewLayoutProcessor) {
+    CXFA_Node* pOverflowNode =
+        m_pViewLayoutProcessor->QueryOverflow(GetFormNode());
     if (pOverflowNode) {
       layoutContext.m_pOverflowNode = pOverflowNode;
       layoutContext.m_pOverflowProcessor = this;
@@ -2367,23 +2376,24 @@
   CXFA_Node* pFormNode = nullptr;
   CXFA_ContentLayoutItem* pTrailerLayoutItem = nullptr;
   bool bIsAddTrailerHeight = false;
-  if (m_pPageMgr &&
+  if (m_pViewLayoutProcessor &&
       pProcessor->GetFormNode()->GetIntact() == XFA_AttributeValue::None) {
-    pFormNode = m_pPageMgr->QueryOverflow(pProcessor->GetFormNode());
+    pFormNode =
+        m_pViewLayoutProcessor->QueryOverflow(pProcessor->GetFormNode());
     if (!pFormNode && pLayoutContext && pLayoutContext->m_pOverflowProcessor) {
       pFormNode = pLayoutContext->m_pOverflowNode.Get();
       bUseInherited = true;
     }
-    Optional<CXFA_LayoutPageMgr::OverflowData> overflow_data =
-        m_pPageMgr->ProcessOverflow(pFormNode, false);
+    Optional<CXFA_ViewLayoutProcessor::OverflowData> overflow_data =
+        m_pViewLayoutProcessor->ProcessOverflow(pFormNode, false);
     if (overflow_data.has_value()) {
       pOverflowLeaderNode = overflow_data.value().pLeader;
       pOverflowTrailerNode = overflow_data.value().pTrailer;
       if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowTrailerNode)) {
         if (pOverflowTrailerNode) {
           auto pOverflowLeaderProcessor =
-              pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(pOverflowTrailerNode,
-                                                           nullptr);
+              pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(
+                  pOverflowTrailerNode, nullptr);
           pOverflowLeaderProcessor->DoLayout(false, FLT_MAX, FLT_MAX, nullptr);
           pTrailerLayoutItem =
               pOverflowLeaderProcessor->HasLayoutItem()
@@ -2497,9 +2507,9 @@
       return Result::kPageFullBreak;
     }
 
-    if (m_pPageMgr && !pProcessor->m_bUseInherited &&
+    if (m_pViewLayoutProcessor && !pProcessor->m_bUseInherited &&
         eRetValue != Result::kPageFullBreak) {
-      m_pPageMgr->ProcessOverflow(pFormNode, true);
+      m_pViewLayoutProcessor->ProcessOverflow(pFormNode, true);
     }
     if (pTrailerLayoutItem && bIsAddTrailerHeight) {
       pProcessor->AddTrailerBeforeSplit(fSplitPos, pTrailerLayoutItem,
@@ -2541,12 +2551,13 @@
 
   if (*fContentCurRowY <= kXFALayoutPrecision) {
     childSize = pProcessor->GetCurrentComponentSize();
-    if (pProcessor->m_pPageMgr->GetNextAvailContentHeight(childSize.height)) {
-      if (m_pPageMgr) {
+    if (pProcessor->m_pViewLayoutProcessor->GetNextAvailContentHeight(
+            childSize.height)) {
+      if (m_pViewLayoutProcessor) {
         if (!pFormNode && pLayoutContext)
           pFormNode = pLayoutContext->m_pOverflowProcessor->GetFormNode();
 
-        m_pPageMgr->ProcessOverflow(pFormNode, true);
+        m_pViewLayoutProcessor->ProcessOverflow(pFormNode, true);
       }
       if (bUseInherited) {
         pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode,
@@ -2573,9 +2584,9 @@
       pProcessor->GetFormNode()->JSObject()->GetEnum(XFA_Attribute::Layout);
   if (pProcessor->GetFormNode()->GetIntact() == XFA_AttributeValue::None &&
       eLayout == XFA_AttributeValue::Tb) {
-    if (m_pPageMgr) {
-      Optional<CXFA_LayoutPageMgr::OverflowData> overflow_data =
-          m_pPageMgr->ProcessOverflow(pFormNode, true);
+    if (m_pViewLayoutProcessor) {
+      Optional<CXFA_ViewLayoutProcessor::OverflowData> overflow_data =
+          m_pViewLayoutProcessor->ProcessOverflow(pFormNode, true);
       if (overflow_data.has_value()) {
         pOverflowLeaderNode = overflow_data.value().pLeader;
         pOverflowTrailerNode = overflow_data.value().pTrailer;
@@ -2594,9 +2605,9 @@
 
   if (!pFormNode && pLayoutContext)
     pFormNode = pLayoutContext->m_pOverflowProcessor->GetFormNode();
-  if (m_pPageMgr) {
-    Optional<CXFA_LayoutPageMgr::OverflowData> overflow_data =
-        m_pPageMgr->ProcessOverflow(pFormNode, true);
+  if (m_pViewLayoutProcessor) {
+    Optional<CXFA_ViewLayoutProcessor::OverflowData> overflow_data =
+        m_pViewLayoutProcessor->ProcessOverflow(pFormNode, true);
     if (overflow_data.has_value()) {
       pOverflowLeaderNode = overflow_data.value().pLeader;
       pOverflowTrailerNode = overflow_data.value().pTrailer;
@@ -2610,17 +2621,17 @@
   return Result::kPageFullBreak;
 }
 
-Optional<CXFA_ItemLayoutProcessor::Stage> CXFA_ItemLayoutProcessor::HandleKeep(
-    CXFA_Node* pBreakAfterNode,
-    CXFA_Node** pCurActionNode) {
+Optional<CXFA_ContentLayoutProcessor::Stage>
+CXFA_ContentLayoutProcessor::HandleKeep(CXFA_Node* pBreakAfterNode,
+                                        CXFA_Node** pCurActionNode) {
   if (m_bKeepBreakFinish)
     return {};
   return FindBreakNode(pBreakAfterNode, false, pCurActionNode);
 }
 
-Optional<CXFA_ItemLayoutProcessor::Stage>
-CXFA_ItemLayoutProcessor::HandleBookendLeader(CXFA_Node* pParentContainer,
-                                              CXFA_Node** pCurActionNode) {
+Optional<CXFA_ContentLayoutProcessor::Stage>
+CXFA_ContentLayoutProcessor::HandleBookendLeader(CXFA_Node* pParentContainer,
+                                                 CXFA_Node** pCurActionNode) {
   for (CXFA_Node* pBookendNode = *pCurActionNode
                                      ? (*pCurActionNode)->GetNextSibling()
                                      : pParentContainer->GetFirstChild();
@@ -2637,9 +2648,9 @@
   return {};
 }
 
-Optional<CXFA_ItemLayoutProcessor::Stage>
-CXFA_ItemLayoutProcessor::HandleBreakBefore(CXFA_Node* pChildContainer,
-                                            CXFA_Node** pCurActionNode) {
+Optional<CXFA_ContentLayoutProcessor::Stage>
+CXFA_ContentLayoutProcessor::HandleBreakBefore(CXFA_Node* pChildContainer,
+                                               CXFA_Node** pCurActionNode) {
   if (!*pCurActionNode)
     return {};
 
@@ -2656,9 +2667,9 @@
   return Stage::kContainer;
 }
 
-Optional<CXFA_ItemLayoutProcessor::Stage>
-CXFA_ItemLayoutProcessor::HandleBreakAfter(CXFA_Node* pChildContainer,
-                                           CXFA_Node** pCurActionNode) {
+Optional<CXFA_ContentLayoutProcessor::Stage>
+CXFA_ContentLayoutProcessor::HandleBreakAfter(CXFA_Node* pChildContainer,
+                                              CXFA_Node** pCurActionNode) {
   if (*pCurActionNode) {
     CXFA_Node* pBreakAfterNode = (*pCurActionNode)->GetNextSibling();
     return FindBreakNode(pBreakAfterNode, false, pCurActionNode);
@@ -2668,8 +2679,8 @@
   return HandleKeep(pBreakAfterNode, pCurActionNode);
 }
 
-Optional<CXFA_ItemLayoutProcessor::Stage>
-CXFA_ItemLayoutProcessor::HandleCheckNextChildContainer(
+Optional<CXFA_ContentLayoutProcessor::Stage>
+CXFA_ContentLayoutProcessor::HandleCheckNextChildContainer(
     CXFA_Node* pParentContainer,
     CXFA_Node* pChildContainer,
     CXFA_Node** pCurActionNode) {
@@ -2701,9 +2712,9 @@
   return m_bIsProcessKeep ? Stage::kKeep : Stage::kContainer;
 }
 
-Optional<CXFA_ItemLayoutProcessor::Stage>
-CXFA_ItemLayoutProcessor::HandleBookendTrailer(CXFA_Node* pParentContainer,
-                                               CXFA_Node** pCurActionNode) {
+Optional<CXFA_ContentLayoutProcessor::Stage>
+CXFA_ContentLayoutProcessor::HandleBookendTrailer(CXFA_Node* pParentContainer,
+                                                  CXFA_Node** pCurActionNode) {
   for (CXFA_Node* pBookendNode = *pCurActionNode
                                      ? (*pCurActionNode)->GetNextSibling()
                                      : pParentContainer->GetFirstChild();
@@ -2720,14 +2731,14 @@
   return {};
 }
 
-void CXFA_ItemLayoutProcessor::ProcessKeepNodesEnd() {
+void CXFA_ContentLayoutProcessor::ProcessKeepNodesEnd() {
   m_bKeepBreakFinish = true;
   m_pKeepHeadNode = nullptr;
   m_pKeepTailNode = nullptr;
   m_bIsProcessKeep = false;
 }
 
-void CXFA_ItemLayoutProcessor::AdjustContainerSpecifiedSize(
+void CXFA_ContentLayoutProcessor::AdjustContainerSpecifiedSize(
     CXFA_LayoutContext* pContext,
     CFX_SizeF* pSize,
     bool* pContainerWidthAutoSize,
@@ -2755,7 +2766,7 @@
   *pContainerHeightAutoSize = true;
 }
 
-CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::FindLastContentLayoutItem(
+CXFA_ContentLayoutItem* CXFA_ContentLayoutProcessor::FindLastContentLayoutItem(
     XFA_AttributeValue eFlowStrategy) {
   if (m_nCurChildNodeStage == Stage::kDone ||
       eFlowStrategy == XFA_AttributeValue::Tb) {
@@ -2773,7 +2784,7 @@
   return pLastChild;
 }
 
-CFX_SizeF CXFA_ItemLayoutProcessor::CalculateLayoutItemSize(
+CFX_SizeF CXFA_ContentLayoutProcessor::CalculateLayoutItemSize(
     const CXFA_ContentLayoutItem* pLastChild) {
   CFX_SizeF size;
   for (CXFA_LayoutItem* pChild = m_pLayoutItem->GetFirstChild();
diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.h
similarity index 91%
rename from xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
rename to xfa/fxfa/layout/cxfa_contentlayoutprocessor.h
index 3faffb2..32dd9cd 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
+++ b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef XFA_FXFA_LAYOUT_CXFA_ITEMLAYOUTPROCESSOR_H_
-#define XFA_FXFA_LAYOUT_CXFA_ITEMLAYOUTPROCESSOR_H_
+#ifndef XFA_FXFA_LAYOUT_CXFA_CONTENTLAYOUTPROCESSOR_H_
+#define XFA_FXFA_LAYOUT_CXFA_CONTENTLAYOUTPROCESSOR_H_
 
 #include <float.h>
 
@@ -22,14 +22,14 @@
 constexpr float kXFALayoutPrecision = 0.0005f;
 
 class CXFA_ContentLayoutItem;
-class CXFA_ItemLayoutProcessor;
+class CXFA_ContentLayoutProcessor;
 class CXFA_LayoutContext;
-class CXFA_LayoutPageMgr;
 class CXFA_LayoutProcessor;
 class CXFA_Node;
 class CXFA_ViewLayoutItem;
+class CXFA_ViewLayoutProcessor;
 
-class CXFA_ItemLayoutProcessor {
+class CXFA_ContentLayoutProcessor {
  public:
   enum class Result : uint8_t {
     kDone,
@@ -49,8 +49,9 @@
     kDone,
   };
 
-  CXFA_ItemLayoutProcessor(CXFA_Node* pNode, CXFA_LayoutPageMgr* pPageMgr);
-  ~CXFA_ItemLayoutProcessor();
+  CXFA_ContentLayoutProcessor(CXFA_Node* pNode,
+                              CXFA_ViewLayoutProcessor* pViewLayoutProcessor);
+  ~CXFA_ContentLayoutProcessor();
 
   Result DoLayout(bool bUseBreakControl,
                   float fHeightLimit,
@@ -69,7 +70,7 @@
   float FindSplitPos(float fProposedSplitPos);
 
   bool ProcessKeepForSplit(
-      CXFA_ItemLayoutProcessor* pChildProcessor,
+      CXFA_ContentLayoutProcessor* pChildProcessor,
       Result eRetValue,
       std::vector<CXFA_ContentLayoutItem*>* rgCurLineLayoutItem,
       float* fContentCurRowAvailWidth,
@@ -143,7 +144,7 @@
   void AddPendingNode(CXFA_Node* pPendingNode, bool bBreakPending);
   float InsertPendingItems(CXFA_Node* pCurChildNode);
   Result InsertFlowedItem(
-      CXFA_ItemLayoutProcessor* pProcessor,
+      CXFA_ContentLayoutProcessor* pProcessor,
       bool bContainerWidthAutoSize,
       bool bContainerHeightAutoSize,
       float fContainerHeight,
@@ -201,12 +202,12 @@
   CXFA_Node* m_pKeepTailNode = nullptr;
   CXFA_ContentLayoutItem* m_pLayoutItem = nullptr;
   CXFA_ContentLayoutItem* m_pOldLayoutItem = nullptr;
-  UnownedPtr<CXFA_LayoutPageMgr> m_pPageMgr;
+  UnownedPtr<CXFA_ViewLayoutProcessor> m_pViewLayoutProcessor;
   std::vector<float> m_rgSpecifiedColumnWidths;
   std::vector<CXFA_ContentLayoutItem*> m_arrayKeepItems;
   std::list<CXFA_Node*> m_PendingNodes;
   std::map<CXFA_Node*, int32_t> m_PendingNodesCount;
-  std::unique_ptr<CXFA_ItemLayoutProcessor> m_pCurChildPreprocessor;
+  std::unique_ptr<CXFA_ContentLayoutProcessor> m_pCurChildPreprocessor;
 };
 
-#endif  // XFA_FXFA_LAYOUT_CXFA_ITEMLAYOUTPROCESSOR_H_
+#endif  // XFA_FXFA_LAYOUT_CXFA_CONTENTLAYOUTPROCESSOR_H_
diff --git a/xfa/fxfa/layout/cxfa_layoutcontext.h b/xfa/fxfa/layout/cxfa_layoutcontext.h
index 4fa7b1c..76ed06f 100644
--- a/xfa/fxfa/layout/cxfa_layoutcontext.h
+++ b/xfa/fxfa/layout/cxfa_layoutcontext.h
@@ -12,7 +12,7 @@
 #include "core/fxcrt/unowned_ptr.h"
 #include "third_party/base/optional.h"
 
-class CXFA_ItemLayoutProcessor;
+class CXFA_ContentLayoutProcessor;
 class CXFA_Node;
 
 class CXFA_LayoutContext {
@@ -22,7 +22,7 @@
 
   Optional<float> m_fCurColumnWidth;
   UnownedPtr<std::vector<float>> m_prgSpecifiedColumnWidths;
-  UnownedPtr<CXFA_ItemLayoutProcessor> m_pOverflowProcessor;
+  UnownedPtr<CXFA_ContentLayoutProcessor> m_pOverflowProcessor;
   UnownedPtr<CXFA_Node> m_pOverflowNode;
 };
 
diff --git a/xfa/fxfa/layout/cxfa_layoutprocessor.cpp b/xfa/fxfa/layout/cxfa_layoutprocessor.cpp
index 08476f9..fc86a4b 100644
--- a/xfa/fxfa/layout/cxfa_layoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_layoutprocessor.cpp
@@ -10,8 +10,8 @@
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 #include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
-#include "xfa/fxfa/layout/cxfa_itemlayoutprocessor.h"
-#include "xfa/fxfa/layout/cxfa_layoutpagemgr.h"
+#include "xfa/fxfa/layout/cxfa_contentlayoutprocessor.h"
+#include "xfa/fxfa/layout/cxfa_viewlayoutprocessor.h"
 #include "xfa/fxfa/parser/cxfa_document.h"
 #include "xfa/fxfa/parser/cxfa_localemgr.h"
 #include "xfa/fxfa/parser/cxfa_measurement.h"
@@ -38,7 +38,7 @@
   if (!bForceRestart && !IsNeedLayout())
     return 100;
 
-  m_pRootItemLayoutProcessor.reset();
+  m_pContentLayoutProcessor.reset();
   m_nProgressCounter = 0;
   CXFA_Node* pFormPacketNode =
       ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Form));
@@ -50,16 +50,16 @@
   if (!pFormRoot)
     return -1;
 
-  if (!m_pLayoutPageMgr)
-    m_pLayoutPageMgr = pdfium::MakeUnique<CXFA_LayoutPageMgr>(this);
-  if (!m_pLayoutPageMgr->InitLayoutPage(pFormRoot))
+  if (!m_pViewLayoutProcessor)
+    m_pViewLayoutProcessor = pdfium::MakeUnique<CXFA_ViewLayoutProcessor>(this);
+  if (!m_pViewLayoutProcessor->InitLayoutPage(pFormRoot))
     return -1;
 
-  if (!m_pLayoutPageMgr->PrepareFirstPage(pFormRoot))
+  if (!m_pViewLayoutProcessor->PrepareFirstPage(pFormRoot))
     return -1;
 
-  m_pRootItemLayoutProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
-      pFormRoot, m_pLayoutPageMgr.get());
+  m_pContentLayoutProcessor = pdfium::MakeUnique<CXFA_ContentLayoutProcessor>(
+      pFormRoot, m_pViewLayoutProcessor.get());
   m_nProgressCounter = 1;
   return 0;
 }
@@ -68,35 +68,35 @@
   if (m_nProgressCounter < 1)
     return -1;
 
-  CXFA_ItemLayoutProcessor::Result eStatus;
-  CXFA_Node* pFormNode = m_pRootItemLayoutProcessor->GetFormNode();
+  CXFA_ContentLayoutProcessor::Result eStatus;
+  CXFA_Node* pFormNode = m_pContentLayoutProcessor->GetFormNode();
   float fPosX =
       pFormNode->JSObject()->GetMeasureInUnit(XFA_Attribute::X, XFA_Unit::Pt);
   float fPosY =
       pFormNode->JSObject()->GetMeasureInUnit(XFA_Attribute::Y, XFA_Unit::Pt);
   do {
-    float fAvailHeight = m_pLayoutPageMgr->GetAvailHeight();
-    eStatus = m_pRootItemLayoutProcessor->DoLayout(true, fAvailHeight,
-                                                   fAvailHeight, nullptr);
-    if (eStatus != CXFA_ItemLayoutProcessor::Result::kDone)
+    float fAvailHeight = m_pViewLayoutProcessor->GetAvailHeight();
+    eStatus = m_pContentLayoutProcessor->DoLayout(true, fAvailHeight,
+                                                  fAvailHeight, nullptr);
+    if (eStatus != CXFA_ContentLayoutProcessor::Result::kDone)
       m_nProgressCounter++;
 
     CXFA_ContentLayoutItem* pLayoutItem =
-        m_pRootItemLayoutProcessor->ExtractLayoutItem();
+        m_pContentLayoutProcessor->ExtractLayoutItem();
     if (pLayoutItem)
       pLayoutItem->m_sPos = CFX_PointF(fPosX, fPosY);
 
-    m_pLayoutPageMgr->SubmitContentItem(pLayoutItem, eStatus);
-  } while (eStatus != CXFA_ItemLayoutProcessor::Result::kDone);
+    m_pViewLayoutProcessor->SubmitContentItem(pLayoutItem, eStatus);
+  } while (eStatus != CXFA_ContentLayoutProcessor::Result::kDone);
 
-  if (eStatus == CXFA_ItemLayoutProcessor::Result::kDone) {
-    m_pLayoutPageMgr->FinishPaginatedPageSets();
-    m_pLayoutPageMgr->SyncLayoutData();
+  if (eStatus == CXFA_ContentLayoutProcessor::Result::kDone) {
+    m_pViewLayoutProcessor->FinishPaginatedPageSets();
+    m_pViewLayoutProcessor->SyncLayoutData();
     m_bNeedLayout = false;
     m_rgChangedContainers.clear();
   }
   return 100 *
-         (eStatus == CXFA_ItemLayoutProcessor::Result::kDone
+         (eStatus == CXFA_ContentLayoutProcessor::Result::kDone
               ? m_nProgressCounter
               : m_nProgressCounter - 1) /
          m_nProgressCounter;
@@ -111,11 +111,12 @@
 }
 
 int32_t CXFA_LayoutProcessor::CountPages() const {
-  return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetPageCount() : 0;
+  return m_pViewLayoutProcessor ? m_pViewLayoutProcessor->GetPageCount() : 0;
 }
 
 CXFA_ViewLayoutItem* CXFA_LayoutProcessor::GetPage(int32_t index) const {
-  return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetPage(index) : nullptr;
+  return m_pViewLayoutProcessor ? m_pViewLayoutProcessor->GetPage(index)
+                                : nullptr;
 }
 
 CXFA_LayoutItem* CXFA_LayoutProcessor::GetLayoutItem(CXFA_Node* pFormItem) {
@@ -128,7 +129,8 @@
 }
 
 CXFA_ViewLayoutItem* CXFA_LayoutProcessor::GetRootLayoutItem() const {
-  return m_pLayoutPageMgr ? m_pLayoutPageMgr->GetRootLayoutItem() : nullptr;
+  return m_pViewLayoutProcessor ? m_pViewLayoutProcessor->GetRootLayoutItem()
+                                : nullptr;
 }
 
 bool CXFA_LayoutProcessor::IsNeedLayout() {
diff --git a/xfa/fxfa/layout/cxfa_layoutprocessor.h b/xfa/fxfa/layout/cxfa_layoutprocessor.h
index dfaca7b..29cd3d6 100644
--- a/xfa/fxfa/layout/cxfa_layoutprocessor.h
+++ b/xfa/fxfa/layout/cxfa_layoutprocessor.h
@@ -14,11 +14,11 @@
 #include "core/fxcrt/unowned_ptr.h"
 #include "xfa/fxfa/parser/cxfa_document.h"
 
-class CXFA_ItemLayoutProcessor;
+class CXFA_ContentLayoutProcessor;
 class CXFA_LayoutItem;
-class CXFA_LayoutPageMgr;
 class CXFA_Node;
 class CXFA_ViewLayoutItem;
+class CXFA_ViewLayoutProcessor;
 
 class CXFA_LayoutProcessor : public CXFA_Document::LayoutProcessorIface {
  public:
@@ -38,18 +38,18 @@
   CXFA_LayoutItem* GetLayoutItem(CXFA_Node* pFormItem);
   void AddChangedContainer(CXFA_Node* pContainer);
   CXFA_ViewLayoutItem* GetRootLayoutItem() const;
-  CXFA_ItemLayoutProcessor* GetRootRootItemLayoutProcessor() const {
-    return m_pRootItemLayoutProcessor.get();
+  CXFA_ContentLayoutProcessor* GetRootContentLayoutProcessor() const {
+    return m_pContentLayoutProcessor.get();
   }
-  CXFA_LayoutPageMgr* GetLayoutPageMgr() const {
-    return m_pLayoutPageMgr.get();
+  CXFA_ViewLayoutProcessor* GetLayoutPageMgr() const {
+    return m_pViewLayoutProcessor.get();
   }
 
  private:
   bool IsNeedLayout();
 
-  std::unique_ptr<CXFA_LayoutPageMgr> m_pLayoutPageMgr;
-  std::unique_ptr<CXFA_ItemLayoutProcessor> m_pRootItemLayoutProcessor;
+  std::unique_ptr<CXFA_ViewLayoutProcessor> m_pViewLayoutProcessor;
+  std::unique_ptr<CXFA_ContentLayoutProcessor> m_pContentLayoutProcessor;
   std::vector<CXFA_Node*> m_rgChangedContainers;
   uint32_t m_nProgressCounter = 0;
   bool m_bNeedLayout = true;
diff --git a/xfa/fxfa/layout/cxfa_viewlayoutitem.cpp b/xfa/fxfa/layout/cxfa_viewlayoutitem.cpp
index 77e442a..2920cb4 100644
--- a/xfa/fxfa/layout/cxfa_viewlayoutitem.cpp
+++ b/xfa/fxfa/layout/cxfa_viewlayoutitem.cpp
@@ -10,8 +10,8 @@
 
 #include "fxjs/xfa/cjx_object.h"
 #include "xfa/fxfa/cxfa_ffpageview.h"
-#include "xfa/fxfa/layout/cxfa_layoutpagemgr.h"
 #include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
+#include "xfa/fxfa/layout/cxfa_viewlayoutprocessor.h"
 #include "xfa/fxfa/parser/cxfa_measurement.h"
 #include "xfa/fxfa/parser/cxfa_medium.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
diff --git a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
similarity index 92%
rename from xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
rename to xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
index a09b0cd..0605aa6 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/fxfa/layout/cxfa_layoutpagemgr.h"
+#include "xfa/fxfa/layout/cxfa_viewlayoutprocessor.h"
 
 #include <utility>
 
@@ -15,7 +15,7 @@
 #include "xfa/fxfa/cxfa_ffnotify.h"
 #include "xfa/fxfa/cxfa_ffpageview.h"
 #include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
-#include "xfa/fxfa/layout/cxfa_itemlayoutprocessor.h"
+#include "xfa/fxfa/layout/cxfa_contentlayoutprocessor.h"
 #include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
 #include "xfa/fxfa/layout/cxfa_traversestrategy_layoutitem.h"
 #include "xfa/fxfa/layout/cxfa_viewlayoutitem.h"
@@ -343,7 +343,8 @@
   CXFA_ViewLayoutItem* pCurContentArea;
 };
 
-CXFA_LayoutPageMgr::CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor)
+CXFA_ViewLayoutProcessor::CXFA_ViewLayoutProcessor(
+    CXFA_LayoutProcessor* pLayoutProcessor)
     : m_pLayoutProcessor(pLayoutProcessor),
       m_pTemplatePageSetRoot(nullptr),
       m_pPageSetLayoutItemRoot(nullptr),
@@ -355,7 +356,7 @@
       m_ePageSetMode(XFA_AttributeValue::OrderedOccurrence),
       m_bCreateOverFlowPage(false) {}
 
-CXFA_LayoutPageMgr::~CXFA_LayoutPageMgr() {
+CXFA_ViewLayoutProcessor::~CXFA_ViewLayoutProcessor() {
   ClearData();
   CXFA_LayoutItem* pLayoutItem = GetRootLayoutItem();
   CXFA_LayoutItem* pNextLayout = nullptr;
@@ -365,7 +366,7 @@
   }
 }
 
-bool CXFA_LayoutPageMgr::InitLayoutPage(CXFA_Node* pFormNode) {
+bool CXFA_ViewLayoutProcessor::InitLayoutPage(CXFA_Node* pFormNode) {
   PrepareLayout();
   CXFA_Node* pTemplateNode = pFormNode->GetTemplateNodeIfExists();
   if (!pTemplateNode)
@@ -456,7 +457,7 @@
   return true;
 }
 
-bool CXFA_LayoutPageMgr::PrepareFirstPage(CXFA_Node* pRootSubform) {
+bool CXFA_ViewLayoutProcessor::PrepareFirstPage(CXFA_Node* pRootSubform) {
   bool bProBreakBefore = false;
   const CXFA_Node* pBreakBeforeNode = nullptr;
   while (pRootSubform) {
@@ -493,7 +494,7 @@
   return AppendNewPage(true);
 }
 
-bool CXFA_LayoutPageMgr::AppendNewPage(bool bFirstTemPage) {
+bool CXFA_ViewLayoutProcessor::AppendNewPage(bool bFirstTemPage) {
   if (m_CurrentViewRecordIter != GetTailPosition())
     return true;
 
@@ -506,8 +507,9 @@
   return !bFirstTemPage || HasCurrentViewRecord();
 }
 
-void CXFA_LayoutPageMgr::RemoveLayoutRecord(CXFA_ViewRecord* pNewRecord,
-                                            CXFA_ViewRecord* pPrevRecord) {
+void CXFA_ViewLayoutProcessor::RemoveLayoutRecord(
+    CXFA_ViewRecord* pNewRecord,
+    CXFA_ViewRecord* pPrevRecord) {
   if (!pNewRecord || !pPrevRecord)
     return;
   if (pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) {
@@ -524,7 +526,7 @@
   }
 }
 
-void CXFA_LayoutPageMgr::ReorderPendingLayoutRecordToTail(
+void CXFA_ViewLayoutProcessor::ReorderPendingLayoutRecordToTail(
     CXFA_ViewRecord* pNewRecord,
     CXFA_ViewRecord* pPrevRecord) {
   if (!pNewRecord || !pPrevRecord)
@@ -543,17 +545,17 @@
   }
 }
 
-void CXFA_LayoutPageMgr::SubmitContentItem(
+void CXFA_ViewLayoutProcessor::SubmitContentItem(
     CXFA_ContentLayoutItem* pContentLayoutItem,
-    CXFA_ItemLayoutProcessor::Result eStatus) {
+    CXFA_ContentLayoutProcessor::Result eStatus) {
   if (pContentLayoutItem) {
     GetCurrentViewRecord()->pCurContentArea->AppendLastChild(
         pContentLayoutItem);
     m_bCreateOverFlowPage = false;
   }
 
-  if (eStatus != CXFA_ItemLayoutProcessor::Result::kDone) {
-    if (eStatus == CXFA_ItemLayoutProcessor::Result::kPageFullBreak &&
+  if (eStatus != CXFA_ContentLayoutProcessor::Result::kDone) {
+    if (eStatus == CXFA_ContentLayoutProcessor::Result::kPageFullBreak &&
         m_CurrentViewRecordIter == GetTailPosition()) {
       AppendNewPage(false);
     }
@@ -562,7 +564,7 @@
   }
 }
 
-float CXFA_LayoutPageMgr::GetAvailHeight() {
+float CXFA_ViewLayoutProcessor::GetAvailHeight() {
   CXFA_ViewLayoutItem* pLayoutItem = GetCurrentViewRecord()->pCurContentArea;
   if (!pLayoutItem || !pLayoutItem->GetFormNode())
     return 0.0f;
@@ -576,14 +578,15 @@
   return FLT_MAX;
 }
 
-CXFA_ViewRecord* CXFA_LayoutPageMgr::AppendNewRecord(
+CXFA_ViewRecord* CXFA_ViewLayoutProcessor::AppendNewRecord(
     std::unique_ptr<CXFA_ViewRecord> pNewRecord) {
   m_ProposedViewRecords.push_back(std::move(pNewRecord));
   return m_ProposedViewRecords.back().get();
 }
 
-CXFA_ViewRecord* CXFA_LayoutPageMgr::CreateViewRecord(CXFA_Node* pPageNode,
-                                                      bool bCreateNew) {
+CXFA_ViewRecord* CXFA_ViewLayoutProcessor::CreateViewRecord(
+    CXFA_Node* pPageNode,
+    bool bCreateNew) {
   ASSERT(pPageNode);
   auto pNewRecord = pdfium::MakeUnique<CXFA_ViewRecord>();
   if (!HasCurrentViewRecord()) {
@@ -645,7 +648,7 @@
   return AppendNewRecord(std::move(pNewRecord));
 }
 
-CXFA_ViewRecord* CXFA_LayoutPageMgr::CreateViewRecordSimple() {
+CXFA_ViewRecord* CXFA_ViewLayoutProcessor::CreateViewRecordSimple() {
   auto pNewRecord = pdfium::MakeUnique<CXFA_ViewRecord>();
   if (HasCurrentViewRecord())
     *pNewRecord = *GetCurrentViewRecord();
@@ -654,8 +657,9 @@
   return AppendNewRecord(std::move(pNewRecord));
 }
 
-void CXFA_LayoutPageMgr::AddPageAreaLayoutItem(CXFA_ViewRecord* pNewRecord,
-                                               CXFA_Node* pNewPageArea) {
+void CXFA_ViewLayoutProcessor::AddPageAreaLayoutItem(
+    CXFA_ViewRecord* pNewRecord,
+    CXFA_Node* pNewPageArea) {
   CXFA_ViewLayoutItem* pNewPageAreaLayoutItem = nullptr;
   if (pdfium::IndexInBounds(m_PageArray, m_nAvailPages)) {
     CXFA_ViewLayoutItem* pViewItem = m_PageArray[m_nAvailPages];
@@ -678,8 +682,9 @@
   pNewRecord->pCurContentArea = nullptr;
 }
 
-void CXFA_LayoutPageMgr::AddContentAreaLayoutItem(CXFA_ViewRecord* pNewRecord,
-                                                  CXFA_Node* pContentArea) {
+void CXFA_ViewLayoutProcessor::AddContentAreaLayoutItem(
+    CXFA_ViewRecord* pNewRecord,
+    CXFA_Node* pContentArea) {
   if (!pContentArea) {
     pNewRecord->pCurContentArea = nullptr;
     return;
@@ -691,7 +696,7 @@
   pNewRecord->pCurContentArea = pNewViewLayoutItem;
 }
 
-void CXFA_LayoutPageMgr::FinishPaginatedPageSets() {
+void CXFA_ViewLayoutProcessor::FinishPaginatedPageSets() {
   for (CXFA_ViewLayoutItem* pRootPageSetLayoutItem = m_pPageSetLayoutItemRoot;
        pRootPageSetLayoutItem; pRootPageSetLayoutItem = ToViewLayoutItem(
                                    pRootPageSetLayoutItem->GetNextSibling())) {
@@ -716,26 +721,26 @@
   }
 }
 
-int32_t CXFA_LayoutPageMgr::GetPageCount() const {
+int32_t CXFA_ViewLayoutProcessor::GetPageCount() const {
   return pdfium::CollectionSize<int32_t>(m_PageArray);
 }
 
-CXFA_ViewLayoutItem* CXFA_LayoutPageMgr::GetPage(int32_t index) const {
+CXFA_ViewLayoutItem* CXFA_ViewLayoutProcessor::GetPage(int32_t index) const {
   if (!pdfium::IndexInBounds(m_PageArray, index))
     return nullptr;
   return m_PageArray[index];
 }
 
-int32_t CXFA_LayoutPageMgr::GetPageIndex(
+int32_t CXFA_ViewLayoutProcessor::GetPageIndex(
     const CXFA_ViewLayoutItem* pPage) const {
   auto it = std::find(m_PageArray.begin(), m_PageArray.end(), pPage);
   return it != m_PageArray.end() ? it - m_PageArray.begin() : -1;
 }
 
-bool CXFA_LayoutPageMgr::RunBreak(XFA_Element eBreakType,
-                                  XFA_AttributeValue eTargetType,
-                                  CXFA_Node* pTarget,
-                                  bool bStartNew) {
+bool CXFA_ViewLayoutProcessor::RunBreak(XFA_Element eBreakType,
+                                        XFA_AttributeValue eTargetType,
+                                        CXFA_Node* pTarget,
+                                        bool bStartNew) {
   bool bRet = false;
   switch (eTargetType) {
     case XFA_AttributeValue::ContentArea:
@@ -774,15 +779,15 @@
   return bRet;
 }
 
-bool CXFA_LayoutPageMgr::ShouldGetNextPageArea(CXFA_Node* pTarget,
-                                               bool bStartNew) const {
+bool CXFA_ViewLayoutProcessor::ShouldGetNextPageArea(CXFA_Node* pTarget,
+                                                     bool bStartNew) const {
   return bStartNew || !pTarget || !HasCurrentViewRecord() ||
          pTarget != GetCurrentViewRecord()->pCurPageArea->GetFormNode();
 }
 
-CXFA_LayoutPageMgr::BreakData CXFA_LayoutPageMgr::ExecuteBreakBeforeOrAfter(
-    const CXFA_Node* pCurNode,
-    bool bBefore) {
+CXFA_ViewLayoutProcessor::BreakData
+CXFA_ViewLayoutProcessor::ExecuteBreakBeforeOrAfter(const CXFA_Node* pCurNode,
+                                                    bool bBefore) {
   BreakData ret = {nullptr, nullptr, false};
   XFA_Element eType = pCurNode->GetElementType();
   switch (eType) {
@@ -851,19 +856,19 @@
   return ret;
 }
 
-Optional<CXFA_LayoutPageMgr::BreakData> CXFA_LayoutPageMgr::ProcessBreakBefore(
-    const CXFA_Node* pBreakNode) {
+Optional<CXFA_ViewLayoutProcessor::BreakData>
+CXFA_ViewLayoutProcessor::ProcessBreakBefore(const CXFA_Node* pBreakNode) {
   return ProcessBreakBeforeOrAfter(pBreakNode, /*before=*/true);
 }
 
-Optional<CXFA_LayoutPageMgr::BreakData> CXFA_LayoutPageMgr::ProcessBreakAfter(
-    const CXFA_Node* pBreakNode) {
+Optional<CXFA_ViewLayoutProcessor::BreakData>
+CXFA_ViewLayoutProcessor::ProcessBreakAfter(const CXFA_Node* pBreakNode) {
   return ProcessBreakBeforeOrAfter(pBreakNode, /*before=*/false);
 }
 
-Optional<CXFA_LayoutPageMgr::BreakData>
-CXFA_LayoutPageMgr::ProcessBreakBeforeOrAfter(const CXFA_Node* pBreakNode,
-                                              bool bBefore) {
+Optional<CXFA_ViewLayoutProcessor::BreakData>
+CXFA_ViewLayoutProcessor::ProcessBreakBeforeOrAfter(const CXFA_Node* pBreakNode,
+                                                    bool bBefore) {
   CXFA_Node* pFormNode = pBreakNode->GetContainerParent();
   if (!pFormNode->PresenceRequiresSpace())
     return pdfium::nullopt;
@@ -903,17 +908,17 @@
   return break_data;
 }
 
-CXFA_Node* CXFA_LayoutPageMgr::ProcessBookendLeader(
+CXFA_Node* CXFA_ViewLayoutProcessor::ProcessBookendLeader(
     const CXFA_Node* pBookendNode) {
   return ProcessBookendLeaderOrTrailer(pBookendNode, /*leader=*/true);
 }
 
-CXFA_Node* CXFA_LayoutPageMgr::ProcessBookendTrailer(
+CXFA_Node* CXFA_ViewLayoutProcessor::ProcessBookendTrailer(
     const CXFA_Node* pBookendNode) {
   return ProcessBookendLeaderOrTrailer(pBookendNode, /*leader=*/false);
 }
 
-CXFA_Node* CXFA_LayoutPageMgr::ProcessBookendLeaderOrTrailer(
+CXFA_Node* CXFA_ViewLayoutProcessor::ProcessBookendLeaderOrTrailer(
     const CXFA_Node* pBookendNode,
     bool bLeader) {
   CXFA_Node* pFormNode = pBookendNode->GetContainerParent();
@@ -934,10 +939,10 @@
   return pBookendAppendNode;
 }
 
-bool CXFA_LayoutPageMgr::BreakOverflow(const CXFA_Node* pOverflowNode,
-                                       bool bCreatePage,
-                                       CXFA_Node** pLeaderTemplate,
-                                       CXFA_Node** pTrailerTemplate) {
+bool CXFA_ViewLayoutProcessor::BreakOverflow(const CXFA_Node* pOverflowNode,
+                                             bool bCreatePage,
+                                             CXFA_Node** pLeaderTemplate,
+                                             CXFA_Node** pTrailerTemplate) {
   CXFA_Node* pContainer =
       pOverflowNode->GetContainerParent()->GetTemplateNodeIfExists();
   if (pOverflowNode->GetElementType() == XFA_Element::Break) {
@@ -1015,9 +1020,9 @@
   return true;
 }
 
-Optional<CXFA_LayoutPageMgr::OverflowData> CXFA_LayoutPageMgr::ProcessOverflow(
-    CXFA_Node* pFormNode,
-    bool bCreatePage) {
+Optional<CXFA_ViewLayoutProcessor::OverflowData>
+CXFA_ViewLayoutProcessor::ProcessOverflow(CXFA_Node* pFormNode,
+                                          bool bCreatePage) {
   if (!pFormNode)
     return pdfium::nullopt;
 
@@ -1067,7 +1072,7 @@
   return pdfium::nullopt;
 }
 
-CXFA_Node* CXFA_LayoutPageMgr::ResolveBookendLeaderOrTrailer(
+CXFA_Node* CXFA_ViewLayoutProcessor::ResolveBookendLeaderOrTrailer(
     const CXFA_Node* pBookendNode,
     bool bLeader) {
   CXFA_Node* pContainer =
@@ -1088,12 +1093,13 @@
   return ResolveBreakTarget(pContainer, true, &leader);
 }
 
-bool CXFA_LayoutPageMgr::FindPageAreaFromPageSet(CXFA_Node* pPageSet,
-                                                 CXFA_Node* pStartChild,
-                                                 CXFA_Node* pTargetPageArea,
-                                                 CXFA_Node* pTargetContentArea,
-                                                 bool bNewPage,
-                                                 bool bQuery) {
+bool CXFA_ViewLayoutProcessor::FindPageAreaFromPageSet(
+    CXFA_Node* pPageSet,
+    CXFA_Node* pStartChild,
+    CXFA_Node* pTargetPageArea,
+    CXFA_Node* pTargetContentArea,
+    bool bNewPage,
+    bool bQuery) {
   if (!pPageSet && !pStartChild)
     return false;
 
@@ -1110,7 +1116,7 @@
       bQuery, ePreferredPosition);
 }
 
-bool CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered(
+bool CXFA_ViewLayoutProcessor::FindPageAreaFromPageSet_Ordered(
     CXFA_Node* pPageSet,
     CXFA_Node* pStartChild,
     CXFA_Node* pTargetPageArea,
@@ -1183,7 +1189,7 @@
   return bRes;
 }
 
-bool CXFA_LayoutPageMgr::FindPageAreaFromPageSet_SimplexDuplex(
+bool CXFA_ViewLayoutProcessor::FindPageAreaFromPageSet_SimplexDuplex(
     CXFA_Node* pPageSet,
     CXFA_Node* pStartChild,
     CXFA_Node* pTargetPageArea,
@@ -1291,7 +1297,7 @@
   return true;
 }
 
-bool CXFA_LayoutPageMgr::MatchPageAreaOddOrEven(CXFA_Node* pPageArea) {
+bool CXFA_ViewLayoutProcessor::MatchPageAreaOddOrEven(CXFA_Node* pPageArea) {
   if (m_ePageSetMode != XFA_AttributeValue::DuplexPaginated)
     return true;
 
@@ -1304,7 +1310,7 @@
   return *ret == XFA_AttributeValue::Odd ? iPageLast == 0 : iPageLast == 1;
 }
 
-CXFA_Node* CXFA_LayoutPageMgr::GetNextAvailPageArea(
+CXFA_Node* CXFA_ViewLayoutProcessor::GetNextAvailPageArea(
     CXFA_Node* pTargetPageArea,
     CXFA_Node* pTargetContentArea,
     bool bNewPage,
@@ -1375,7 +1381,7 @@
   return nullptr;
 }
 
-bool CXFA_LayoutPageMgr::GetNextContentArea(CXFA_Node* pContentArea) {
+bool CXFA_ViewLayoutProcessor::GetNextContentArea(CXFA_Node* pContentArea) {
   CXFA_Node* pCurContentNode =
       GetCurrentViewRecord()->pCurContentArea->GetFormNode();
   if (!pContentArea) {
@@ -1406,7 +1412,7 @@
   return true;
 }
 
-void CXFA_LayoutPageMgr::InitPageSetMap() {
+void CXFA_ViewLayoutProcessor::InitPageSetMap() {
   if (!IsPageSetRootOrderedOccurrence())
     return;
 
@@ -1422,9 +1428,9 @@
   }
 }
 
-int32_t CXFA_LayoutPageMgr::CreateMinPageRecord(CXFA_Node* pPageArea,
-                                                bool bTargetPageArea,
-                                                bool bCreateLast) {
+int32_t CXFA_ViewLayoutProcessor::CreateMinPageRecord(CXFA_Node* pPageArea,
+                                                      bool bTargetPageArea,
+                                                      bool bCreateLast) {
   if (!pPageArea)
     return 0;
 
@@ -1458,8 +1464,8 @@
   return iMin;
 }
 
-void CXFA_LayoutPageMgr::CreateMinPageSetRecord(CXFA_Node* pPageSet,
-                                                bool bCreateAll) {
+void CXFA_ViewLayoutProcessor::CreateMinPageSetRecord(CXFA_Node* pPageSet,
+                                                      bool bCreateAll) {
   if (!pPageSet)
     return;
 
@@ -1493,7 +1499,7 @@
   m_pPageSetMap[pPageSet] = *iMin;
 }
 
-void CXFA_LayoutPageMgr::CreateNextMinRecord(CXFA_Node* pRecordNode) {
+void CXFA_ViewLayoutProcessor::CreateNextMinRecord(CXFA_Node* pRecordNode) {
   if (!pRecordNode)
     return;
 
@@ -1506,7 +1512,7 @@
   }
 }
 
-void CXFA_LayoutPageMgr::ProcessLastPageSet() {
+void CXFA_ViewLayoutProcessor::ProcessLastPageSet() {
   CreateMinPageRecord(m_pCurPageArea, false, true);
   CreateNextMinRecord(m_pCurPageArea);
   CXFA_Node* pPageSet = m_pCurPageArea->GetParent();
@@ -1520,7 +1526,7 @@
   }
 }
 
-bool CXFA_LayoutPageMgr::GetNextAvailContentHeight(float fChildHeight) {
+bool CXFA_ViewLayoutProcessor::GetNextAvailContentHeight(float fChildHeight) {
   CXFA_Node* pCurContentNode =
       GetCurrentViewRecord()->pCurContentArea->GetFormNode();
   if (!pCurContentNode)
@@ -1586,7 +1592,7 @@
          fNextContentHeight > fChildHeight;
 }
 
-void CXFA_LayoutPageMgr::ClearData() {
+void CXFA_ViewLayoutProcessor::ClearData() {
   if (!m_pTemplatePageSetRoot)
     return;
 
@@ -1598,7 +1604,7 @@
   m_pPageSetMap.clear();
 }
 
-void CXFA_LayoutPageMgr::SaveLayoutItemChildren(
+void CXFA_ViewLayoutProcessor::SaveLayoutItemChildren(
     CXFA_LayoutItem* pParentLayoutItem) {
   CXFA_Document* pDocument = m_pTemplatePageSetRoot->GetDocument();
   CXFA_FFNotify* pNotify = pDocument->GetNotify();
@@ -1626,7 +1632,7 @@
   }
 }
 
-CXFA_Node* CXFA_LayoutPageMgr::QueryOverflow(CXFA_Node* pFormNode) {
+CXFA_Node* CXFA_ViewLayoutProcessor::QueryOverflow(CXFA_Node* pFormNode) {
   for (CXFA_Node* pCurNode = pFormNode->GetFirstChild(); pCurNode;
        pCurNode = pCurNode->GetNextSibling()) {
     if (pCurNode->GetElementType() == XFA_Element::Break) {
@@ -1649,7 +1655,7 @@
   return nullptr;
 }
 
-void CXFA_LayoutPageMgr::MergePageSetContents() {
+void CXFA_ViewLayoutProcessor::MergePageSetContents() {
   CXFA_Document* pDocument = m_pTemplatePageSetRoot->GetDocument();
   pDocument->SetPendingNodesUnusedAndUnbound();
 
@@ -1825,7 +1831,7 @@
   }
 }
 
-void CXFA_LayoutPageMgr::LayoutPageSetContents() {
+void CXFA_ViewLayoutProcessor::LayoutPageSetContents() {
   for (CXFA_ViewLayoutItem* pRootLayoutItem = GetRootLayoutItem();
        pRootLayoutItem;
        pRootLayoutItem = ToViewLayoutItem(pRootLayoutItem->GetNextSibling())) {
@@ -1836,13 +1842,13 @@
       if (type != XFA_Element::PageArea)
         continue;
 
-      m_pLayoutProcessor->GetRootRootItemLayoutProcessor()->DoLayoutPageArea(
+      m_pLayoutProcessor->GetRootContentLayoutProcessor()->DoLayoutPageArea(
           pViewItem);
     }
   }
 }
 
-void CXFA_LayoutPageMgr::SyncLayoutData() {
+void CXFA_ViewLayoutProcessor::SyncLayoutData() {
   MergePageSetContents();
   LayoutPageSetContents();
   CXFA_FFNotify* pNotify = m_pTemplatePageSetRoot->GetDocument()->GetNotify();
@@ -1897,7 +1903,7 @@
   ClearData();
 }
 
-void CXFA_LayoutPageMgr::PrepareLayout() {
+void CXFA_ViewLayoutProcessor::PrepareLayout() {
   m_pPageSetCurRoot = nullptr;
   m_ePageSetMode = XFA_AttributeValue::OrderedOccurrence;
   m_nAvailPages = 0;
@@ -1940,7 +1946,7 @@
   m_pPageSetLayoutItemRoot = nullptr;
 }
 
-void CXFA_LayoutPageMgr::ProcessSimplexOrDuplexPageSets(
+void CXFA_ViewLayoutProcessor::ProcessSimplexOrDuplexPageSets(
     CXFA_ViewLayoutItem* pPageSetLayoutItem,
     bool bIsSimplex) {
   size_t nPageAreaCount;
diff --git a/xfa/fxfa/layout/cxfa_layoutpagemgr.h b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.h
similarity index 93%
rename from xfa/fxfa/layout/cxfa_layoutpagemgr.h
rename to xfa/fxfa/layout/cxfa_viewlayoutprocessor.h
index 335e22d..332cbc0 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.h
+++ b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef XFA_FXFA_LAYOUT_CXFA_LAYOUTPAGEMGR_H_
-#define XFA_FXFA_LAYOUT_CXFA_LAYOUTPAGEMGR_H_
+#ifndef XFA_FXFA_LAYOUT_CXFA_VIEWLAYOUTPROCESSOR_H_
+#define XFA_FXFA_LAYOUT_CXFA_VIEWLAYOUTPROCESSOR_H_
 
 #include <iterator>
 #include <list>
@@ -14,13 +14,13 @@
 #include <vector>
 
 #include "third_party/base/optional.h"
-#include "xfa/fxfa/layout/cxfa_itemlayoutprocessor.h"
+#include "xfa/fxfa/layout/cxfa_contentlayoutprocessor.h"
 
 class CXFA_LayoutItem;
 class CXFA_Node;
 class CXFA_ViewRecord;
 
-class CXFA_LayoutPageMgr {
+class CXFA_ViewLayoutProcessor {
  public:
   struct BreakData {
     CXFA_Node* pLeader;
@@ -33,15 +33,15 @@
     CXFA_Node* pTrailer;
   };
 
-  explicit CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor);
-  ~CXFA_LayoutPageMgr();
+  explicit CXFA_ViewLayoutProcessor(CXFA_LayoutProcessor* pLayoutProcessor);
+  ~CXFA_ViewLayoutProcessor();
 
   bool InitLayoutPage(CXFA_Node* pFormNode);
   bool PrepareFirstPage(CXFA_Node* pRootSubform);
   float GetAvailHeight();
   bool GetNextAvailContentHeight(float fChildHeight);
   void SubmitContentItem(CXFA_ContentLayoutItem* pContentLayoutItem,
-                         CXFA_ItemLayoutProcessor::Result eStatus);
+                         CXFA_ContentLayoutProcessor::Result eStatus);
   void FinishPaginatedPageSets();
   void SyncLayoutData();
   int32_t GetPageCount() const;
@@ -165,4 +165,4 @@
   std::vector<CXFA_ViewLayoutItem*> m_PageArray;
 };
 
-#endif  // XFA_FXFA_LAYOUT_CXFA_LAYOUTPAGEMGR_H_
+#endif  // XFA_FXFA_LAYOUT_CXFA_VIEWLAYOUTPROCESSOR_H_
