diff --git a/core/fpdfapi/page/cpdf_stitchfunc.cpp b/core/fpdfapi/page/cpdf_stitchfunc.cpp
index 3e903b7..4f55048 100644
--- a/core/fpdfapi/page/cpdf_stitchfunc.cpp
+++ b/core/fpdfapi/page/cpdf_stitchfunc.cpp
@@ -85,15 +85,14 @@
         return false;
 
       if (nOutputs.has_value()) {
-        if (nFuncOutputs != *nOutputs)
+        if (nOutputs != nFuncOutputs)
           return false;
       } else {
         nOutputs = nFuncOutputs;
       }
-
       m_pSubFunctions.push_back(std::move(pFunc));
     }
-    m_nOutputs = *nOutputs;
+    m_nOutputs = nOutputs.value();
   }
 
   m_bounds.reserve(nSubs + 1);
diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp
index a3ea904..a935de2 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.cpp
+++ b/core/fpdfapi/parser/cpdf_data_avail.cpp
@@ -497,8 +497,8 @@
   if (!header_offset.has_value())
     return kDataError;
 
-  m_parser.m_pSyntax =
-      std::make_unique<CPDF_SyntaxParser>(GetValidator(), *header_offset);
+  m_parser.m_pSyntax = std::make_unique<CPDF_SyntaxParser>(
+      GetValidator(), header_offset.value());
   m_pLinearized = m_parser.ParseLinearizedHeader();
   if (GetValidator()->has_read_problems())
     return kDataNotAvailable;
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index 03c9bcd..03b70a8 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -121,10 +121,11 @@
   const Optional<FX_FILESIZE> header_offset = GetHeaderOffset(validator);
   if (!header_offset.has_value())
     return false;
-  if (validator->GetSize() < *header_offset + kPDFHeaderSize)
+  if (validator->GetSize() < header_offset.value() + kPDFHeaderSize)
     return false;
 
-  m_pSyntax = std::make_unique<CPDF_SyntaxParser>(validator, *header_offset);
+  m_pSyntax =
+      std::make_unique<CPDF_SyntaxParser>(validator, header_offset.value());
   return ParseFileVersion();
 }
 
diff --git a/core/fpdfdoc/cpdf_formcontrol.cpp b/core/fpdfdoc/cpdf_formcontrol.cpp
index f3e8403..699d439 100644
--- a/core/fpdfdoc/cpdf_formcontrol.cpp
+++ b/core/fpdfdoc/cpdf_formcontrol.cpp
@@ -206,7 +206,7 @@
   if (CPDF_Dictionary* pDict = ToDictionary(pObj)) {
     CPDF_Dictionary* pFonts = pDict->GetDictFor("Font");
     if (ValidateFontResourceDict(pFonts)) {
-      CPDF_Dictionary* pElement = pFonts->GetDictFor(*csFontNameTag);
+      CPDF_Dictionary* pElement = pFonts->GetDictFor(csFontNameTag.value());
       if (pElement) {
         auto* pData = CPDF_DocPageData::FromDocument(m_pForm->GetDocument());
         RetainPtr<CPDF_Font> pFont = pData->GetFont(pElement);
@@ -215,7 +215,7 @@
       }
     }
   }
-  RetainPtr<CPDF_Font> pFormFont = m_pForm->GetFormFont(*csFontNameTag);
+  RetainPtr<CPDF_Font> pFormFont = m_pForm->GetFormFont(csFontNameTag.value());
   if (pFormFont)
     return pFormFont;
 
@@ -229,7 +229,7 @@
   if (!ValidateFontResourceDict(pFonts))
     return nullptr;
 
-  CPDF_Dictionary* pElement = pFonts->GetDictFor(*csFontNameTag);
+  CPDF_Dictionary* pElement = pFonts->GetDictFor(csFontNameTag.value());
   if (!pElement)
     return nullptr;
 
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index 9401070..5e22bdd 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -860,7 +860,7 @@
   if (!font_name.has_value())
     return;
 
-  CPDF_Dictionary* pFontDict = pFont->GetDictFor(*font_name);
+  CPDF_Dictionary* pFontDict = pFont->GetDictFor(font_name.value());
   if (!pFontDict)
     return;
 
diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp
index 2c3dd64..0b06dcc 100644
--- a/core/fpdfdoc/cpdf_generateap.cpp
+++ b/core/fpdfdoc/cpdf_generateap.cpp
@@ -941,7 +941,7 @@
   if (!font.has_value())
     return;
 
-  ByteString font_name = *font;
+  ByteString font_name = font.value();
   CFX_Color crText = fpdfdoc::CFXColorFromString(DA);
   CPDF_Dictionary* pDRDict = pFormDict->GetDictFor("DR");
   if (!pDRDict)
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index e92efa8..afaafee 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -624,7 +624,7 @@
   m_TextBuf.AppendChar(unicode);
   if (!formMatrix.IsIdentity())
     pGenerateChar->m_Matrix = formMatrix;
-  m_CharList.push_back(*pGenerateChar);
+  m_CharList.push_back(pGenerateChar.value());
 }
 
 void CPDF_TextPage::ProcessObject() {
@@ -986,7 +986,7 @@
           if (!form_matrix.IsIdentity())
             pGenerateChar->m_Matrix = form_matrix;
           m_TempTextBuf.AppendChar(L' ');
-          m_TempCharList.push_back(*pGenerateChar);
+          m_TempCharList.push_back(pGenerateChar.value());
         }
         break;
       }
diff --git a/core/fpdftext/cpdf_textpagefind.cpp b/core/fpdftext/cpdf_textpagefind.cpp
index f31f991..c39f2bb 100644
--- a/core/fpdftext/cpdf_textpagefind.cpp
+++ b/core/fpdftext/cpdf_textpagefind.cpp
@@ -141,7 +141,7 @@
     size_t pos = 0;
     while (pos < word->GetLength()) {
       WideString curStr = word->Substr(pos, 1);
-      wchar_t curChar = (*word)[pos];
+      wchar_t curChar = word.value()[pos];
       if (IsIgnoreSpaceCharacter(curChar)) {
         if (pos > 0 && curChar == 0x2019) {
           pos++;
diff --git a/core/fxcrt/widestring.cpp b/core/fxcrt/widestring.cpp
index 8327dc3..ee148fd 100644
--- a/core/fxcrt/widestring.cpp
+++ b/core/fxcrt/widestring.cpp
@@ -307,9 +307,9 @@
     Optional<WideString> ret =
         TryVSWPrintf(static_cast<size_t>(maxLen), format, argListCopy);
     va_end(argListCopy);
-
     if (ret.has_value())
-      return *ret;
+      return ret.value();
+
     maxLen *= 2;
   }
   return WideString();
diff --git a/fpdfsdk/cpdfsdk_appstream.cpp b/fpdfsdk/cpdfsdk_appstream.cpp
index e8c8b48..2c3c198 100644
--- a/fpdfsdk/cpdfsdk_appstream.cpp
+++ b/fpdfsdk/cpdfsdk_appstream.cpp
@@ -1208,7 +1208,7 @@
   ByteString csNameTag;
   Optional<ByteString> font = da.GetFont(&fFontSize);
   if (font.has_value())
-    csNameTag = *font;
+    csNameTag = font.value();
   else
     fFontSize = 12.0f;
 
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index fb35ad8..571d2a4 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -1012,7 +1012,7 @@
   if (!bsVal.has_value())
     return 0;
 
-  return NulTerminateMaybeCopyAndReturnLength(*bsVal, buffer, length);
+  return NulTerminateMaybeCopyAndReturnLength(bsVal.value(), buffer, length);
 }
 
 FPDF_EXPORT FPDF_DWORD FPDF_CALLCONV
diff --git a/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp b/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
index d24acee..1bc8cd1 100644
--- a/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
+++ b/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
@@ -72,7 +72,7 @@
     if (!code.has_value())
       return false;
 
-    context->writeCodeword(*code);
+    context->writeCodeword(code.value());
     context->m_pos += 2;
     return true;
   }
diff --git a/fxbarcode/qrcode/BC_QRCoderEncoder.cpp b/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
index 27c9b65..0b68642 100644
--- a/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
+++ b/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
@@ -458,7 +458,7 @@
   if (!maskPattern.has_value())
     return false;
 
-  qrCode->SetMaskPattern(*maskPattern);
+  qrCode->SetMaskPattern(maskPattern.value());
   if (!CBC_QRCoderMatrixUtil::BuildMatrix(
           &finalBits, qrCode->GetECLevel(), qrCode->GetVersion(),
           qrCode->GetMaskPattern(), matrix.get())) {
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index 930b1aa..0281d4d 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -1598,7 +1598,7 @@
           Optional<WideString> ret =
               pXFANode->JSObject()->TryAttribute(XFA_Attribute::Name, false);
           if (ret.has_value())
-            wsName = *ret;
+            wsName = ret.value();
         }
         if (wsName.IsEmpty())
           wsName = L"#" + WideString::FromASCII(pNode->GetClassName());
diff --git a/fxjs/xfa/cjx_object.cpp b/fxjs/xfa/cjx_object.cpp
index 0ee7daa..ba55a68 100644
--- a/fxjs/xfa/cjx_object.cpp
+++ b/fxjs/xfa/cjx_object.cpp
@@ -210,7 +210,8 @@
       Optional<XFA_AttributeValue> item =
           XFA_GetAttributeValueByName(wsValue.AsStringView());
       SetEnum(eAttr,
-              item.has_value() ? *item : *(GetXFANode()->GetDefaultEnum(eAttr)),
+              item.has_value() ? item.value()
+                               : GetXFANode()->GetDefaultEnum(eAttr).value(),
               bNotify);
       break;
     }
@@ -266,7 +267,7 @@
       Optional<XFA_AttributeValue> value = TryEnum(eAttr, bUseDefault);
       if (!value.has_value())
         return pdfium::nullopt;
-      return WideString::FromASCII(XFA_AttributeValueToName(*value));
+      return WideString::FromASCII(XFA_AttributeValueToName(value.value()));
     }
     case XFA_AttributeType::CData:
       return TryCData(eAttr, bUseDefault);
@@ -275,13 +276,13 @@
       Optional<bool> value = TryBoolean(eAttr, bUseDefault);
       if (!value.has_value())
         return pdfium::nullopt;
-      return WideString(*value ? L"1" : L"0");
+      return WideString(value.value() ? L"1" : L"0");
     }
     case XFA_AttributeType::Integer: {
       Optional<int32_t> iValue = TryInteger(eAttr, bUseDefault);
       if (!iValue.has_value())
         return pdfium::nullopt;
-      return WideString::Format(L"%d", *iValue);
+      return WideString::Format(L"%d", iValue.value());
     }
     case XFA_AttributeType::Measure: {
       Optional<CXFA_Measurement> value = TryMeasure(eAttr, bUseDefault);
@@ -614,7 +615,7 @@
         Optional<WideString> ret =
             TryAttribute(XFA_Attribute::ContentType, false);
         if (ret.has_value())
-          wsContentType = *ret;
+          wsContentType = ret.value();
         if (wsContentType.EqualsASCII("text/html")) {
           wsContentType.clear();
           SetAttributeByEnum(XFA_Attribute::ContentType, wsContentType, false);
diff --git a/xfa/fxfa/cxfa_ffbarcode.cpp b/xfa/fxfa/cxfa_ffbarcode.cpp
index a4b4343..67329c5 100644
--- a/xfa/fxfa/cxfa_ffbarcode.cpp
+++ b/xfa/fxfa/cxfa_ffbarcode.cpp
@@ -197,55 +197,55 @@
   Optional<WideString> encoding_string = barcode_->GetCharEncoding();
   if (encoding_string.has_value()) {
     Optional<BC_CHAR_ENCODING> encoding =
-        CharEncodingFromString(*encoding_string);
+        CharEncodingFromString(encoding_string.value());
     if (encoding.has_value())
-      pBarCodeWidget->SetCharEncoding(*encoding);
+      pBarCodeWidget->SetCharEncoding(encoding.value());
   }
 
   Optional<bool> calcChecksum = barcode_->GetChecksum();
   if (calcChecksum.has_value())
-    pBarCodeWidget->SetCalChecksum(*calcChecksum);
+    pBarCodeWidget->SetCalChecksum(calcChecksum.value());
 
   Optional<int32_t> dataLen = barcode_->GetDataLength();
   if (dataLen.has_value())
-    pBarCodeWidget->SetDataLength(*dataLen);
+    pBarCodeWidget->SetDataLength(dataLen.value());
 
   Optional<char> startChar = barcode_->GetStartChar();
   if (startChar.has_value())
-    pBarCodeWidget->SetStartChar(*startChar);
+    pBarCodeWidget->SetStartChar(startChar.value());
 
   Optional<char> endChar = barcode_->GetEndChar();
   if (endChar.has_value())
-    pBarCodeWidget->SetEndChar(*endChar);
+    pBarCodeWidget->SetEndChar(endChar.value());
 
   Optional<int32_t> ecLevel = barcode_->GetECLevel();
   if (ecLevel.has_value())
-    pBarCodeWidget->SetErrorCorrectionLevel(*ecLevel);
+    pBarCodeWidget->SetErrorCorrectionLevel(ecLevel.value());
 
   Optional<int32_t> width = barcode_->GetModuleWidth();
   if (width.has_value())
-    pBarCodeWidget->SetModuleWidth(*width);
+    pBarCodeWidget->SetModuleWidth(width.value());
 
   Optional<int32_t> height = barcode_->GetModuleHeight();
   if (height.has_value())
-    pBarCodeWidget->SetModuleHeight(*height);
+    pBarCodeWidget->SetModuleHeight(height.value());
 
   Optional<bool> printCheck = barcode_->GetPrintChecksum();
   if (printCheck.has_value())
-    pBarCodeWidget->SetPrintChecksum(*printCheck);
+    pBarCodeWidget->SetPrintChecksum(printCheck.value());
 
   Optional<XFA_AttributeValue> text_attr = barcode_->GetTextLocation();
   if (text_attr.has_value()) {
-    Optional<BC_TEXT_LOC> textLoc = TextLocFromAttribute(*text_attr);
+    Optional<BC_TEXT_LOC> textLoc = TextLocFromAttribute(text_attr.value());
     if (textLoc.has_value())
-      pBarCodeWidget->SetTextLocation(*textLoc);
+      pBarCodeWidget->SetTextLocation(textLoc.value());
   }
 
   // Truncated is currently not a supported flag.
 
   Optional<int8_t> ratio = barcode_->GetWideNarrowRatio();
   if (ratio.has_value())
-    pBarCodeWidget->SetWideNarrowRatio(*ratio);
+    pBarCodeWidget->SetWideNarrowRatio(ratio.value());
 
   if (info->eName == BarcodeType::code3Of9 ||
       info->eName == BarcodeType::ean8 || info->eName == BarcodeType::ean13 ||
diff --git a/xfa/fxfa/cxfa_ffdatetimeedit.cpp b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
index 0cd34ee..f3f05be 100644
--- a/xfa/fxfa/cxfa_ffdatetimeedit.cpp
+++ b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
@@ -93,9 +93,9 @@
 
   uint32_t dwEditStyles = 0;
   Optional<int32_t> numCells = m_pNode->GetNumberOfCells();
-  if (numCells.has_value() && *numCells > 0) {
+  if (numCells.has_value() && numCells.value() > 0) {
     dwEditStyles |= FWL_STYLEEXT_EDT_CombText;
-    pPicker->SetEditLimit(*numCells);
+    pPicker->SetEditLimit(numCells.value());
   }
   if (!m_pNode->IsOpenAccess() || !GetDoc()->GetXFADoc()->IsInteractive())
     dwEditStyles |= FWL_STYLEEXT_EDT_ReadOnly;
diff --git a/xfa/fxfa/cxfa_ffnumericedit.cpp b/xfa/fxfa/cxfa_ffnumericedit.cpp
index 2067ffa..1af3cdc 100644
--- a/xfa/fxfa/cxfa_ffnumericedit.cpp
+++ b/xfa/fxfa/cxfa_ffnumericedit.cpp
@@ -56,9 +56,9 @@
     dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
 
   Optional<int32_t> numCells = m_pNode->GetNumberOfCells();
-  if (numCells.has_value() && *numCells > 0) {
+  if (numCells.has_value() && numCells.value() > 0) {
     dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
-    pWidget->SetLimit(*numCells);
+    pWidget->SetLimit(numCells.value());
   }
   dwExtendedStyle |= GetAlignment();
   if (!m_pNode->IsOpenAccess() || !GetDoc()->GetXFADoc()->IsInteractive())
diff --git a/xfa/fxfa/cxfa_ffpageview.cpp b/xfa/fxfa/cxfa_ffpageview.cpp
index 6d357c6..131bf6c 100644
--- a/xfa/fxfa/cxfa_ffpageview.cpp
+++ b/xfa/fxfa/cxfa_ffpageview.cpp
@@ -432,7 +432,7 @@
       Optional<WideString> traverseWidgetName =
           pTraverse->JSObject()->TryAttribute(XFA_Attribute::Ref, true);
       if (traverseWidgetName.has_value())
-        return FindWidgetByName(*traverseWidgetName, pWidget);
+        return FindWidgetByName(traverseWidgetName.value(), pWidget);
     }
   }
   return nullptr;
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index 5c0b665..4f86541 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -105,12 +105,12 @@
   Optional<int32_t> numCells = m_pNode->GetNumberOfCells();
   if (!numCells.has_value()) {
     pWidget->SetLimit(iMaxChars);
-  } else if (*numCells == 0) {
+  } else if (numCells == 0) {
     dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
     pWidget->SetLimit(iMaxChars > 0 ? iMaxChars : 1);
   } else {
     dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
-    pWidget->SetLimit(*numCells);
+    pWidget->SetLimit(numCells.value());
   }
 
   dwExtendedStyle |= GetAlignment();
diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp
index c760d47..71e638a 100644
--- a/xfa/fxfa/cxfa_textlayout.cpp
+++ b/xfa/fxfa/cxfa_textlayout.cpp
@@ -813,7 +813,7 @@
           Optional<WideString> obj =
               m_pTextParser->GetEmbeddedObj(m_pTextProvider, pXMLNode);
           if (obj.has_value())
-            wsText = *obj;
+            wsText = obj.value();
         }
       }
 
diff --git a/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
index db1618c..8f0d030 100644
--- a/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
@@ -341,7 +341,7 @@
   Optional<XFA_AttributeValue> layoutMode =
       pFormNode->JSObject()->TryEnum(XFA_Attribute::Layout, false);
   if (layoutMode.has_value())
-    return *layoutMode;
+    return layoutMode.value();
 
   CXFA_Node* pParentNode = pFormNode->GetParent();
   if (pParentNode && pParentNode->GetElementType() == XFA_Element::Form) {
@@ -369,11 +369,9 @@
 
     Optional<XFA_AttributeValue> previous =
         pKeep->JSObject()->TryEnum(eKeepType, false);
-    if (previous.has_value()) {
-      if (*previous == XFA_AttributeValue::ContentArea ||
-          *previous == XFA_AttributeValue::PageArea) {
-        return true;
-      }
+    if (previous == XFA_AttributeValue::ContentArea ||
+        previous == XFA_AttributeValue::PageArea) {
+      return true;
     }
   }
 
@@ -387,10 +385,8 @@
 
   Optional<XFA_AttributeValue> next =
       pKeep->JSObject()->TryEnum(eKeepType, false);
-  if (!next.has_value())
-    return false;
-  if (*next == XFA_AttributeValue::ContentArea ||
-      *next == XFA_AttributeValue::PageArea) {
+  if (next == XFA_AttributeValue::ContentArea ||
+      next == XFA_AttributeValue::PageArea) {
     return true;
   }
   return false;
diff --git a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
index f207e8c..1525abb 100644
--- a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
@@ -1157,7 +1157,7 @@
       Optional<int32_t> ret =
           pOccurNode->JSObject()->TryInteger(XFA_Attribute::Max, false);
       if (ret.has_value())
-        iMax = *ret;
+        iMax = ret.value();
     }
     if (iMax >= 0 && iMax <= iPageSetCount)
       return false;
@@ -1325,11 +1325,11 @@
 
   Optional<XFA_AttributeValue> ret =
       pPageArea->JSObject()->TryEnum(XFA_Attribute::OddOrEven, true);
-  if (!ret.has_value() || *ret == XFA_AttributeValue::Any)
+  if (!ret.has_value() || ret == XFA_AttributeValue::Any)
     return true;
 
   int32_t iPageLast = GetPageCount() % 2;
-  return *ret == XFA_AttributeValue::Odd ? iPageLast == 0 : iPageLast == 1;
+  return ret == XFA_AttributeValue::Odd ? iPageLast == 0 : iPageLast == 1;
 }
 
 CXFA_Node* CXFA_ViewLayoutProcessor::GetNextAvailPageArea(
@@ -1355,7 +1355,7 @@
         Optional<int32_t> ret =
             pOccurNode->JSObject()->TryInteger(XFA_Attribute::Max, false);
         if (ret.has_value())
-          iMax = *ret;
+          iMax = ret.value();
       }
       if ((iMax < 0 || m_nCurPageCount < iMax)) {
         if (!bQuery) {
@@ -1462,7 +1462,7 @@
   if (pOccurNode) {
     ret = pOccurNode->JSObject()->TryInteger(XFA_Attribute::Min, false);
     if (ret.has_value())
-      iMin = *ret;
+      iMin = ret.value();
   }
 
   if (!ret.has_value() && !bTargetPageArea)
@@ -1502,10 +1502,10 @@
 
   Optional<int32_t> iMin =
       pOccurNode->JSObject()->TryInteger(XFA_Attribute::Min, false);
-  if (!iMin.has_value() || iCurSetCount >= *iMin)
+  if (!iMin.has_value() || iCurSetCount >= iMin.value())
     return;
 
-  for (int32_t i = 0; i < *iMin - iCurSetCount; i++) {
+  for (int32_t i = 0; i < iMin.value() - iCurSetCount; i++) {
     for (CXFA_Node* node = pPageSet->GetFirstChild(); node;
          node = node->GetNextSibling()) {
       if (node->GetElementType() == XFA_Element::PageArea)
@@ -1514,7 +1514,7 @@
         CreateMinPageSetRecord(node, true);
     }
   }
-  m_pPageSetMap[pPageSet] = *iMin;
+  m_pPageSetMap[pPageSet] = iMin.value();
 }
 
 void CXFA_ViewLayoutProcessor::CreateNextMinRecord(CXFA_Node* pRecordNode) {
@@ -1569,7 +1569,7 @@
   if (pOccurNode) {
     ret = pOccurNode->JSObject()->TryInteger(XFA_Attribute::Max, false);
     if (ret.has_value())
-      iMax = *ret;
+      iMax = ret.value();
   }
   if (ret.has_value()) {
     if (m_nCurPageCount == iMax) {
diff --git a/xfa/fxfa/parser/cxfa_barcode.cpp b/xfa/fxfa/parser/cxfa_barcode.cpp
index 4fc004c..bfa295d 100644
--- a/xfa/fxfa/parser/cxfa_barcode.cpp
+++ b/xfa/fxfa/parser/cxfa_barcode.cpp
@@ -74,7 +74,7 @@
   if (!checksum.has_value())
     return pdfium::nullopt;
 
-  switch (*checksum) {
+  switch (checksum.value()) {
     case XFA_AttributeValue::None:
       return {false};
     case XFA_AttributeValue::Auto:
@@ -103,7 +103,7 @@
   if (!wsStartEndChar.has_value() || wsStartEndChar->IsEmpty())
     return pdfium::nullopt;
 
-  return static_cast<char>((*wsStartEndChar)[0]);
+  return static_cast<char>(wsStartEndChar.value()[0]);
 }
 
 Optional<char> CXFA_Barcode::GetEndChar() {
@@ -112,7 +112,7 @@
   if (!wsStartEndChar.has_value() || wsStartEndChar->IsEmpty())
     return pdfium::nullopt;
 
-  return static_cast<char>((*wsStartEndChar)[0]);
+  return static_cast<char>(wsStartEndChar.value()[0]);
 }
 
 Optional<int32_t> CXFA_Barcode::GetECLevel() {
@@ -164,12 +164,13 @@
     return static_cast<int8_t>(FXSYS_wtoi(wsWideNarrowRatio->c_str()));
 
   int32_t fB = FXSYS_wtoi(
-      wsWideNarrowRatio->Last(wsWideNarrowRatio->GetLength() - (*ptPos + 1))
+      wsWideNarrowRatio
+          ->Last(wsWideNarrowRatio->GetLength() - (ptPos.value() + 1))
           .c_str());
   if (!fB)
     return 0;
 
-  int32_t fA = FXSYS_wtoi(wsWideNarrowRatio->First(*ptPos).c_str());
+  int32_t fA = FXSYS_wtoi(wsWideNarrowRatio->First(ptPos.value()).c_str());
   float result = static_cast<float>(fA) / static_cast<float>(fB);
   return static_cast<int8_t>(result);
 }
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index 99008b2..aab083c 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -1348,7 +1348,7 @@
             pDatasetsNode->JSObject()->TryNamespace();
         if (!datasetsURI.has_value())
           continue;
-        if (*namespaceURI == *datasetsURI)
+        if (namespaceURI.value() == datasetsURI.value())
           return pDatasetsChild;
       }
       return nullptr;
@@ -1692,7 +1692,7 @@
           pChildNode->JSObject()->TryNamespace();
       if (!namespaceURI.has_value())
         continue;
-      if (*namespaceURI == wsDatasetsURI)
+      if (namespaceURI == wsDatasetsURI)
         pDataRoot = pChildNode;
     }
     if (pDataRoot && pDDRoot)
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 9fb983c..712c7ef 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -1453,7 +1453,7 @@
   if (pKeep) {
     Optional<XFA_AttributeValue> intact = GetIntactFromKeep(pKeep, eLayoutType);
     if (intact.has_value())
-      return *intact;
+      return intact.value();
   }
 
   switch (GetElementType()) {
@@ -2022,14 +2022,14 @@
   Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Boolean);
   if (!value.has_value())
     return pdfium::nullopt;
-  return !!*value;
+  return !!value.value();
 }
 
 Optional<int32_t> CXFA_Node::GetDefaultInteger(XFA_Attribute attr) const {
   Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Integer);
   if (!value.has_value())
     return pdfium::nullopt;
-  return static_cast<int32_t>(reinterpret_cast<uintptr_t>(*value));
+  return static_cast<int32_t>(reinterpret_cast<uintptr_t>(value.value()));
 }
 
 Optional<CXFA_Measurement> CXFA_Node::GetDefaultMeasurement(
@@ -2038,7 +2038,7 @@
   if (!value.has_value())
     return pdfium::nullopt;
 
-  WideString str = WideString(static_cast<const wchar_t*>(*value));
+  WideString str = WideString(static_cast<const wchar_t*>(value.value()));
   return CXFA_Measurement(str.AsStringView());
 }
 
@@ -2047,7 +2047,7 @@
   if (!value.has_value())
     return pdfium::nullopt;
 
-  return WideString(static_cast<const wchar_t*>(*value));
+  return WideString(static_cast<const wchar_t*>(value.value()));
 }
 
 Optional<XFA_AttributeValue> CXFA_Node::GetDefaultEnum(
@@ -2055,7 +2055,8 @@
   Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Enum);
   if (!value.has_value())
     return pdfium::nullopt;
-  return static_cast<XFA_AttributeValue>(reinterpret_cast<uintptr_t>(*value));
+  return static_cast<XFA_AttributeValue>(
+      reinterpret_cast<uintptr_t>(value.value()));
 }
 
 Optional<void*> CXFA_Node::GetDefaultValue(XFA_Attribute attr,
@@ -2229,7 +2230,7 @@
 int32_t CXFA_Node::GetRotate() const {
   Optional<int32_t> degrees =
       JSObject()->TryInteger(XFA_Attribute::Rotate, false);
-  return degrees.has_value() ? XFA_MapRotation(*degrees) / 90 * 90 : 0;
+  return degrees.has_value() ? XFA_MapRotation(degrees.value()) / 90 * 90 : 0;
 }
 
 CXFA_Border* CXFA_Node::GetBorderIfExists() const {
@@ -2341,8 +2342,8 @@
 
   Optional<XFA_AttributeValue> value =
       pKeep->JSObject()->TryEnum(XFA_Attribute::Previous, false);
-  if (value.has_value() && (*value == XFA_AttributeValue::ContentArea ||
-                            *value == XFA_AttributeValue::PageArea)) {
+  if (value == XFA_AttributeValue::ContentArea ||
+      value == XFA_AttributeValue::PageArea) {
     return XFA_AttributeValue::ContentArea;
   }
 
@@ -2353,13 +2354,11 @@
 
   Optional<XFA_AttributeValue> ret =
       pNode->JSObject()->TryEnum(XFA_Attribute::Next, false);
-  if (!ret.has_value())
-    return intact;
-
-  return (*ret == XFA_AttributeValue::ContentArea ||
-          *ret == XFA_AttributeValue::PageArea)
-             ? XFA_AttributeValue::ContentArea
-             : intact;
+  if (ret == XFA_AttributeValue::ContentArea ||
+      ret == XFA_AttributeValue::PageArea) {
+    return XFA_AttributeValue::ContentArea;
+  }
+  return intact;
 }
 
 Optional<float> CXFA_Node::TryWidth() {
@@ -3242,28 +3241,28 @@
 
   Optional<float> width = TryWidth();
   if (width.has_value()) {
-    pSize->width = *width;
+    pSize->width = width.value();
   } else {
     Optional<float> min = TryMinWidth();
     if (min.has_value())
-      pSize->width = std::max(pSize->width, *min);
+      pSize->width = std::max(pSize->width, min.value());
 
     Optional<float> max = TryMaxWidth();
-    if (max.has_value() && *max > 0)
-      pSize->width = std::min(pSize->width, *max);
+    if (max.has_value() && max.value() > 0)
+      pSize->width = std::min(pSize->width, max.value());
   }
 
   Optional<float> height = TryHeight();
   if (height.has_value()) {
-    pSize->height = *height;
+    pSize->height = height.value();
   } else {
     Optional<float> min = TryMinHeight();
     if (min.has_value())
-      pSize->height = std::max(pSize->height, *min);
+      pSize->height = std::max(pSize->height, min.value());
 
     Optional<float> max = TryMaxHeight();
-    if (max.has_value() && *max > 0)
-      pSize->height = std::min(pSize->height, *max);
+    if (max.has_value() && max.value() > 0)
+      pSize->height = std::min(pSize->height, max.value());
   }
   return true;
 }
@@ -3372,7 +3371,7 @@
   CFX_RectF rtFit;
   Optional<float> width = TryWidth();
   if (width.has_value()) {
-    rtFit.width = *width;
+    rtFit.width = width.value();
     GetWidthWithoutMargin(rtFit.width);
   } else {
     rtFit.width = rtImage.width;
@@ -3380,7 +3379,7 @@
 
   Optional<float> height = TryHeight();
   if (height.has_value()) {
-    rtFit.height = *height;
+    rtFit.height = height.value();
     GetHeightWithoutMargin(rtFit.height);
   } else {
     rtFit.height = rtImage.height;
@@ -3446,11 +3445,11 @@
 
   Optional<float> min = TryMinWidth();
   if (min.has_value())
-    fWidthCalc = std::max(fWidthCalc, *min);
+    fWidthCalc = std::max(fWidthCalc, min.value());
 
   Optional<float> max = TryMaxWidth();
-  if (max.has_value() && *max > 0)
-    fWidthCalc = std::min(fWidthCalc, *max);
+  if (max.has_value() && max.value() > 0)
+    fWidthCalc = std::min(fWidthCalc, max.value());
 
   return fWidthCalc;
 }
@@ -3469,11 +3468,11 @@
 
   Optional<float> min = TryMinHeight();
   if (min.has_value())
-    fHeightCalc = std::max(fHeightCalc, *min);
+    fHeightCalc = std::max(fHeightCalc, min.value());
 
   Optional<float> max = TryMaxHeight();
-  if (max.has_value() && *max > 0)
-    fHeightCalc = std::min(fHeightCalc, *max);
+  if (max.has_value() && max.value() > 0)
+    fHeightCalc = std::min(fHeightCalc, max.value());
 
   return fHeightCalc;
 }
@@ -3503,7 +3502,7 @@
   if (*pCalcWidth > 0 && *pCalcHeight < 0) {
     Optional<float> height = TryHeight();
     if (height.has_value()) {
-      *pCalcHeight = *height;
+      *pCalcHeight = height.value();
     } else {
       CFX_SizeF size = CalculateAccWidthAndHeight(doc, *pCalcWidth);
       *pCalcWidth = size.width;
@@ -3517,10 +3516,10 @@
     Optional<float> height;
     Optional<float> width = TryWidth();
     if (width.has_value()) {
-      fWidth = *width;
+      fWidth = width.value();
       height = TryHeight();
       if (height.has_value())
-        *pCalcHeight = *height;
+        *pCalcHeight = height.value();
     }
     if (!width.has_value() || !height.has_value()) {
       CFX_SizeF size = CalculateAccWidthAndHeight(doc, fWidth);
@@ -3855,8 +3854,8 @@
   if (*pCalcWidth < 0 && *pCalcHeight < 0) {
     Optional<float> width = TryWidth();
     if (width.has_value()) {
-      pTextLayout->StartLayout(GetWidthWithoutMargin(*width));
-      *pCalcWidth = *width;
+      pTextLayout->StartLayout(GetWidthWithoutMargin(width.value()));
+      *pCalcWidth = width.value();
     } else {
       float fMaxWidth = CalculateWidgetAutoWidth(pTextLayout->StartLayout(-1));
       pTextLayout->StartLayout(GetWidthWithoutMargin(fMaxWidth));
@@ -3987,7 +3986,7 @@
   int32_t i = 0;
   while (pText) {
     Optional<WideString> wsContent = pText->JSObject()->TryContent(false, true);
-    if (wsContent.has_value() && *wsContent == wsValue)
+    if (wsContent == wsValue)
       return static_cast<XFA_CheckState>(i);
 
     i++;
@@ -4722,7 +4721,7 @@
           Optional<WideString> picture =
               pPicture->JSObject()->TryContent(false, true);
           if (picture.has_value())
-            return *picture;
+            return picture.value();
         }
       }
 
@@ -4757,7 +4756,7 @@
           Optional<WideString> picture =
               pPicture->JSObject()->TryContent(false, true);
           if (picture.has_value())
-            return *picture;
+            return picture.value();
         }
       }
 
diff --git a/xfa/fxfa/parser/cxfa_occur.cpp b/xfa/fxfa/parser/cxfa_occur.cpp
index a9281bc..d07f8c3 100644
--- a/xfa/fxfa/parser/cxfa_occur.cpp
+++ b/xfa/fxfa/parser/cxfa_occur.cpp
@@ -42,12 +42,12 @@
 
 int32_t CXFA_Occur::GetMax() {
   Optional<int32_t> max = JSObject()->TryInteger(XFA_Attribute::Max, true);
-  return max.has_value() ? *max : GetMin();
+  return max.has_value() ? max.value() : GetMin();
 }
 
 int32_t CXFA_Occur::GetMin() {
   Optional<int32_t> min = JSObject()->TryInteger(XFA_Attribute::Min, true);
-  return min.has_value() && *min >= 0 ? *min : 1;
+  return min.has_value() && min.value() >= 0 ? min.value() : 1;
 }
 
 std::tuple<int32_t, int32_t, int32_t> CXFA_Occur::GetOccurInfo() {
@@ -56,7 +56,8 @@
 
   Optional<int32_t> init =
       JSObject()->TryInteger(XFA_Attribute::Initial, false);
-  return {iMin, iMax, init.has_value() && *init >= iMin ? *init : iMin};
+  return {iMin, iMax,
+          init.has_value() && init.value() >= iMin ? init.value() : iMin};
 }
 
 void CXFA_Occur::SetMax(int32_t iMax) {
diff --git a/xfa/fxfa/parser/cxfa_validate.cpp b/xfa/fxfa/parser/cxfa_validate.cpp
index 44e8cd8..4b65bbc 100644
--- a/xfa/fxfa/parser/cxfa_validate.cpp
+++ b/xfa/fxfa/parser/cxfa_validate.cpp
@@ -64,9 +64,9 @@
 void CXFA_Validate::SetNullTest(const WideString& wsValue) {
   Optional<XFA_AttributeValue> item =
       XFA_GetAttributeValueByName(wsValue.AsStringView());
-  JSObject()->SetEnum(XFA_Attribute::NullTest,
-                      item.has_value() ? *item : XFA_AttributeValue::Disabled,
-                      false);
+  JSObject()->SetEnum(
+      XFA_Attribute::NullTest,
+      item.has_value() ? item.value() : XFA_AttributeValue::Disabled, false);
 }
 
 XFA_AttributeValue CXFA_Validate::GetNullTest() {
diff --git a/xfa/fxfa/parser/xfa_utils.cpp b/xfa/fxfa/parser/xfa_utils.cpp
index 580b333..b0ea770 100644
--- a/xfa/fxfa/parser/xfa_utils.cpp
+++ b/xfa/fxfa/parser/xfa_utils.cpp
@@ -148,7 +148,7 @@
   wsOutput += L" ";
   wsOutput += wsName;
   wsOutput += L"=\"";
-  wsOutput += ExportEncodeAttribute(*value);
+  wsOutput += ExportEncodeAttribute(value.value());
   wsOutput += L"\"";
 }
 
@@ -366,7 +366,8 @@
     return WideString();
 
   XFA_VERSION eVersion =
-      pTemplateRoot->GetDocument()->RecognizeXFAVersionNumber(*templateNS);
+      pTemplateRoot->GetDocument()->RecognizeXFAVersionNumber(
+          templateNS.value());
   if (eVersion == XFA_VERSION_UNKNOWN)
     eVersion = XFA_VERSION_DEFAULT;
 
