You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2026/01/29 11:46:47 UTC

(tika) 01/02: TIKA-4638 -- unify sax style configuration

This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch TIKA-4638
in repository https://gitbox.apache.org/repos/asf/tika.git

commit 492183218d3acddd427bb271489fb7a09f25ba31
Author: tallison <ta...@apache.org>
AuthorDate: Thu Jan 29 06:44:44 2026 -0500

    TIKA-4638 -- unify sax style configuration
---
 .../ParsingEmbeddedDocumentExtractor.java          |  18 +--
 .../ParsingEmbeddedDocumentExtractorFactory.java   |  11 +-
 .../tika/extractor/RUnpackExtractorFactory.java    |   9 --
 .../java/org/apache/tika/parser/EmptyParser.java   |   2 +-
 .../tika/parser/external/ExternalParser.java       |   2 +-
 .../tika/parser/external2/ExternalParser.java      |   2 +-
 .../java/org/apache/tika/sax/SAXOutputConfig.java  |  76 +++++++++++++
 .../org/apache/tika/sax/XHTMLContentHandler.java   |  87 +++++++++++----
 .../apache/tika/sax/XHTMLContentHandlerTest.java   | 123 +++++++++++++++++++++
 .../org/apache/tika/example/RollbackSoftware.java  |   2 +-
 .../org/apache/custom/parser/MyCustomParser.java   |   2 +-
 .../apache/tika/parser/envi/EnviHeaderParser.java  |   2 +-
 .../org/apache/tika/parser/gdal/GDALParser.java    |   8 +-
 .../geoinfo/GeographicInformationParser.java       |   2 +-
 .../org/apache/tika/parser/grib/GribParser.java    |   2 +-
 .../java/org/apache/tika/parser/hdf/HDFParser.java |   2 +-
 .../apache/tika/parser/isatab/ISArchiveParser.java |   2 +-
 .../apache/tika/parser/netcdf/NetCDFParser.java    |   2 +-
 .../apache/tika/parser/ner/NamedEntityParser.java  |   2 +-
 .../parser/transcribe/aws/AmazonTranscribe.java    |   2 +-
 .../tika/parser/apple/AppleSingleFileParser.java   |   2 +-
 .../org/apache/tika/parser/apple/PListParser.java  |   2 +-
 .../tika/parser/iwork/IWorkPackageParser.java      |   2 +-
 .../parser/iwork/iwana/IWork13PackageParser.java   |   2 +-
 .../org/apache/tika/parser/audio/AudioParser.java  |   2 +-
 .../org/apache/tika/parser/audio/MidiParser.java   |   2 +-
 .../java/org/apache/tika/parser/mp3/Mp3Parser.java |   2 +-
 .../java/org/apache/tika/parser/mp4/MP4Parser.java |   2 +-
 .../org/apache/tika/parser/ogg/FlacParser.java     |   2 +-
 .../java/org/apache/tika/parser/ogg/OggParser.java |   2 +-
 .../org/apache/tika/parser/ogg/OpusParser.java     |   2 +-
 .../org/apache/tika/parser/ogg/SpeexParser.java    |   2 +-
 .../org/apache/tika/parser/ogg/TheoraParser.java   |   2 +-
 .../org/apache/tika/parser/ogg/VorbisParser.java   |   2 +-
 .../org/apache/tika/parser/video/FLVParser.java    |   2 +-
 .../org/apache/tika/parser/dgn/DGN8Parser.java     |   2 +-
 .../java/org/apache/tika/parser/dwg/DWGParser.java |   2 +-
 .../org/apache/tika/parser/dwg/DWGReadParser.java  |   2 +-
 .../java/org/apache/tika/parser/prt/PRTParser.java |   2 +-
 .../org/apache/tika/parser/asm/ClassParser.java    |   2 +-
 .../apache/tika/parser/asm/XHTMLClassVisitor.java  |   5 +-
 .../apache/tika/parser/code/SourceCodeParser.java  |   2 +-
 .../tika/parser/executable/ExecutableParser.java   |   2 +-
 .../executable/UniversalExecutableParser.java      |   2 +-
 .../java/org/apache/tika/parser/mat/MatParser.java |   2 +-
 .../org/apache/tika/parser/sas/SAS7BDATParser.java |   2 +-
 .../org/apache/tika/parser/crypto/TSDParser.java   |   2 +-
 .../tika/parser/font/AdobeFontMetricParser.java    |   2 +-
 .../apache/tika/parser/font/TrueTypeParser.java    |   2 +-
 .../org/apache/tika/parser/html/HtmlHandler.java   |   2 +-
 .../tika/parser/image/AbstractImageParser.java     |   4 +-
 .../org/apache/tika/parser/image/ICNSParser.java   |   2 +-
 .../org/apache/tika/parser/image/PSDParser.java    |   2 +-
 .../org/apache/tika/parser/image/WebPParser.java   |   2 +-
 .../apache/tika/parser/jdbc/AbstractDBParser.java  |   2 +-
 .../org/apache/tika/parser/mail/RFC822Parser.java  |   2 +-
 .../org/apache/tika/parser/mbox/MboxParser.java    |   2 +-
 .../apache/tika/parser/microsoft/EMFParser.java    |   2 +-
 .../tika/parser/microsoft/JackcessParser.java      |   2 +-
 .../tika/parser/microsoft/MSOwnerFileParser.java   |   2 +-
 .../apache/tika/parser/microsoft/OfficeParser.java |   2 +-
 .../tika/parser/microsoft/OldExcelParser.java      |   2 +-
 .../apache/tika/parser/microsoft/TNEFParser.java   |   2 +-
 .../apache/tika/parser/microsoft/WMFParser.java    |   2 +-
 .../microsoft/activemime/ActiveMimeParser.java     |   2 +-
 .../tika/parser/microsoft/chm/ChmParser.java       |   2 +-
 .../tika/parser/microsoft/libpst/LibPstParser.java |   2 +-
 .../parser/microsoft/onenote/OneNoteParser.java    |   2 +-
 .../microsoft/ooxml/AbstractOOXMLExtractor.java    |   2 +-
 .../ooxml/xwpf/ml2006/Word2006MLParser.java        |   2 +-
 .../parser/microsoft/pst/OutlookPSTParser.java     |   2 +-
 .../parser/microsoft/pst/PSTMailItemParser.java    |   2 +-
 .../tika/parser/microsoft/rtf/RTFParser.java       |   2 +-
 .../microsoft/xml/AbstractXML2003Parser.java       |   2 +-
 .../java/org/apache/tika/parser/dbf/DBFParser.java |   2 +-
 .../java/org/apache/tika/parser/dif/DIFParser.java |   2 +-
 .../org/apache/tika/parser/epub/EpubParser.java    |   2 +-
 .../org/apache/tika/parser/hwp/HwpV5Parser.java    |   2 +-
 .../apache/tika/parser/indesign/IDMLParser.java    |   2 +-
 .../java/org/apache/tika/parser/mif/MIFParser.java |   2 +-
 .../tika/parser/odf/FlatOpenDocumentParser.java    |   2 +-
 .../tika/parser/odf/OpenDocumentContentParser.java |   2 +-
 .../apache/tika/parser/odf/OpenDocumentParser.java |   2 +-
 .../tika/parser/wordperfect/QuattroProParser.java  |   2 +-
 .../tika/parser/wordperfect/WordPerfectParser.java |   2 +-
 .../org/apache/tika/parser/feed/FeedParser.java    |   2 +-
 .../apache/tika/parser/iptc/IptcAnpaParser.java    |   2 +-
 .../apache/tika/parser/ocr/TesseractOCRParser.java |   2 +-
 .../apache/tika/parser/pdf/AbstractPDF2XHTML.java  |   2 +-
 .../java/org/apache/tika/parser/pdf/PDFParser.java |   2 +-
 .../apache/tika/parser/pkg/CompressorParser.java   |   2 +-
 .../org/apache/tika/parser/pkg/PackageParser.java  |   2 +-
 .../java/org/apache/tika/parser/pkg/RarParser.java |   2 +-
 .../org/apache/tika/parser/pkg/UnrarParser.java    |   2 +-
 .../apache/tika/parser/csv/TextAndCSVParser.java   |   8 +-
 .../tika/parser/strings/Latin1StringsParser.java   |   2 +-
 .../apache/tika/parser/strings/StringsParser.java  |   2 +-
 .../java/org/apache/tika/parser/txt/TXTParser.java |   2 +-
 .../org/apache/tika/parser/http/HttpParser.java    |   2 +-
 .../org/apache/tika/parser/wacz/WACZParser.java    |   2 +-
 .../org/apache/tika/parser/warc/WARCParser.java    |   2 +-
 .../java/org/apache/tika/parser/tmx/TMXParser.java |   2 +-
 .../apache/tika/parser/xliff/XLIFF12Parser.java    |   2 +-
 .../org/apache/tika/parser/xliff/XLZParser.java    |   2 +-
 .../java/org/apache/tika/parser/xml/XMLParser.java |   2 +-
 .../tika/parser/AutoDetectReaderParserTest.java    |   2 +-
 .../resources/configs/tika-config-no-names.json    |   1 -
 ...a-config-upcasing-custom-handler-decorator.json |   1 -
 .../resources/configs/tika-config-with-names.json  |   1 -
 .../resources/configs/tika-config-truncate.json    |   1 -
 .../org/apache/tika/config/loader/TikaLoader.java  |   7 ++
 .../configs/TIKA-4207-embedded-bytes-config.json   |   1 -
 112 files changed, 389 insertions(+), 164 deletions(-)

diff --git a/tika-core/src/main/java/org/apache/tika/extractor/ParsingEmbeddedDocumentExtractor.java b/tika-core/src/main/java/org/apache/tika/extractor/ParsingEmbeddedDocumentExtractor.java
index 4b1e406183..8639d04594 100644
--- a/tika-core/src/main/java/org/apache/tika/extractor/ParsingEmbeddedDocumentExtractor.java
+++ b/tika-core/src/main/java/org/apache/tika/extractor/ParsingEmbeddedDocumentExtractor.java
@@ -38,6 +38,7 @@ import org.apache.tika.parser.ParseRecord;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.sax.BodyContentHandler;
 import org.apache.tika.sax.EmbeddedContentHandler;
+import org.apache.tika.sax.SAXOutputConfig;
 
 /**
  * Helper class for parsers of package archives or other compound document
@@ -51,8 +52,6 @@ public class ParsingEmbeddedDocumentExtractor implements EmbeddedDocumentExtract
 
     private static final Parser DELEGATING_PARSER = new DelegatingParser();
 
-    private boolean writeFileNameToContent = true;
-
     protected final ParseContext context;
 
     public ParsingEmbeddedDocumentExtractor(ParseContext context) {
@@ -102,7 +101,7 @@ public class ParsingEmbeddedDocumentExtractor implements EmbeddedDocumentExtract
         }
 
         String name = metadata.get(TikaCoreProperties.RESOURCE_NAME_KEY);
-        if (writeFileNameToContent && name != null && name.length() > 0 && outputHtml) {
+        if (isWriteFileNameToContent() && name != null && name.length() > 0 && outputHtml) {
             handler.startElement(XHTML, "h1", "h1", new AttributesImpl());
             char[] chars = name.toCharArray();
             handler.characters(chars, 0, chars.length);
@@ -143,11 +142,14 @@ public class ParsingEmbeddedDocumentExtractor implements EmbeddedDocumentExtract
         return DELEGATING_PARSER;
     }
 
-    public void setWriteFileNameToContent(boolean writeFileNameToContent) {
-        this.writeFileNameToContent = writeFileNameToContent;
-    }
-
+    /**
+     * Returns whether to write file names to content based on {@link SAXOutputConfig}
+     * in the ParseContext. Defaults to {@code true} if no config is present.
+     *
+     * @return true if file names should be written to content
+     */
     public boolean isWriteFileNameToContent() {
-        return writeFileNameToContent;
+        SAXOutputConfig config = context.get(SAXOutputConfig.class);
+        return config == null || config.isWriteFileNameToContent();
     }
 }
diff --git a/tika-core/src/main/java/org/apache/tika/extractor/ParsingEmbeddedDocumentExtractorFactory.java b/tika-core/src/main/java/org/apache/tika/extractor/ParsingEmbeddedDocumentExtractorFactory.java
index 4dabadcd18..1cc53da2df 100644
--- a/tika-core/src/main/java/org/apache/tika/extractor/ParsingEmbeddedDocumentExtractorFactory.java
+++ b/tika-core/src/main/java/org/apache/tika/extractor/ParsingEmbeddedDocumentExtractorFactory.java
@@ -24,17 +24,8 @@ import org.apache.tika.parser.ParseContext;
 public class ParsingEmbeddedDocumentExtractorFactory
         implements EmbeddedDocumentExtractorFactory {
 
-    private boolean writeFileNameToContent = true;
-
-    public void setWriteFileNameToContent(boolean writeFileNameToContent) {
-        this.writeFileNameToContent = writeFileNameToContent;
-    }
-
     @Override
     public EmbeddedDocumentExtractor newInstance(Metadata metadata, ParseContext parseContext) {
-        ParsingEmbeddedDocumentExtractor ex =
-                new ParsingEmbeddedDocumentExtractor(parseContext);
-        ex.setWriteFileNameToContent(writeFileNameToContent);
-        return ex;
+        return new ParsingEmbeddedDocumentExtractor(parseContext);
     }
 }
diff --git a/tika-core/src/main/java/org/apache/tika/extractor/RUnpackExtractorFactory.java b/tika-core/src/main/java/org/apache/tika/extractor/RUnpackExtractorFactory.java
index fb68f183ab..858e8e61f7 100644
--- a/tika-core/src/main/java/org/apache/tika/extractor/RUnpackExtractorFactory.java
+++ b/tika-core/src/main/java/org/apache/tika/extractor/RUnpackExtractorFactory.java
@@ -29,16 +29,12 @@ public class RUnpackExtractorFactory implements EmbeddedDocumentByteStoreExtract
 
     public static long DEFAULT_MAX_EMBEDDED_BYTES_FOR_EXTRACTION = 10l * 1024l * 1024l * 1024l;
 
-    private boolean writeFileNameToContent = true;
     private Set<String> embeddedBytesIncludeMimeTypes = new HashSet<>();
     private Set<String> embeddedBytesExcludeMimeTypes = new HashSet<>();
     private Set<String> embeddedBytesIncludeEmbeddedResourceTypes = new HashSet<>();
     private Set<String> embeddedBytesExcludeEmbeddedResourceTypes = new HashSet<>();
 
     private long maxEmbeddedBytesForExtraction = DEFAULT_MAX_EMBEDDED_BYTES_FOR_EXTRACTION;
-    public void setWriteFileNameToContent(boolean writeFileNameToContent) {
-        this.writeFileNameToContent = writeFileNameToContent;
-    }
 
     public void setEmbeddedBytesIncludeMimeTypes(Set<String> includeMimeTypes) {
         embeddedBytesIncludeMimeTypes = new HashSet<>(includeMimeTypes);
@@ -72,10 +68,6 @@ public class RUnpackExtractorFactory implements EmbeddedDocumentByteStoreExtract
         this.maxEmbeddedBytesForExtraction = maxEmbeddedBytesForExtraction;
     }
 
-    public boolean isWriteFileNameToContent() {
-        return writeFileNameToContent;
-    }
-
     public Set<String> getEmbeddedBytesIncludeMimeTypes() {
         return embeddedBytesIncludeMimeTypes;
     }
@@ -101,7 +93,6 @@ public class RUnpackExtractorFactory implements EmbeddedDocumentByteStoreExtract
         RUnpackExtractor ex =
                 new RUnpackExtractor(parseContext,
                         maxEmbeddedBytesForExtraction);
-        ex.setWriteFileNameToContent(writeFileNameToContent);
         ex.setEmbeddedBytesSelector(createEmbeddedBytesSelector());
         return ex;
     }
diff --git a/tika-core/src/main/java/org/apache/tika/parser/EmptyParser.java b/tika-core/src/main/java/org/apache/tika/parser/EmptyParser.java
index 1da391f2bd..412dde5d54 100644
--- a/tika-core/src/main/java/org/apache/tika/parser/EmptyParser.java
+++ b/tika-core/src/main/java/org/apache/tika/parser/EmptyParser.java
@@ -50,7 +50,7 @@ public class EmptyParser implements Parser {
 
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws SAXException {
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.endDocument();
     }
diff --git a/tika-core/src/main/java/org/apache/tika/parser/external/ExternalParser.java b/tika-core/src/main/java/org/apache/tika/parser/external/ExternalParser.java
index 00e04c1542..38d4f61563 100644
--- a/tika-core/src/main/java/org/apache/tika/parser/external/ExternalParser.java
+++ b/tika-core/src/main/java/org/apache/tika/parser/external/ExternalParser.java
@@ -267,7 +267,7 @@ public class ExternalParser implements Parser {
      */
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
 
         TemporaryResources tmp = new TemporaryResources();
         try {
diff --git a/tika-core/src/main/java/org/apache/tika/parser/external2/ExternalParser.java b/tika-core/src/main/java/org/apache/tika/parser/external2/ExternalParser.java
index 536da8dd41..25abd588d3 100644
--- a/tika-core/src/main/java/org/apache/tika/parser/external2/ExternalParser.java
+++ b/tika-core/src/main/java/org/apache/tika/parser/external2/ExternalParser.java
@@ -164,7 +164,7 @@ public class ExternalParser implements Parser {
             if (config.isReturnStderr()) {
                 metadata.set(ExternalProcess.STD_ERR, result.getStderr());
             }
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
             handleOutput(result, outFile, xhtml, metadata, context);
             xhtml.endDocument();
diff --git a/tika-core/src/main/java/org/apache/tika/sax/SAXOutputConfig.java b/tika-core/src/main/java/org/apache/tika/sax/SAXOutputConfig.java
new file mode 100644
index 0000000000..b85e1b1fd8
--- /dev/null
+++ b/tika-core/src/main/java/org/apache/tika/sax/SAXOutputConfig.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tika.sax;
+
+import java.io.Serializable;
+
+/**
+ * Configuration for SAX output behavior.
+ * <p>
+ * This can be stored in a {@link org.apache.tika.parser.ParseContext} to control
+ * how content handlers and embedded document extractors generate output.
+ * </p>
+ */
+public class SAXOutputConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Whether to write metadata as &lt;meta&gt; elements in the XHTML head.
+     * Default is {@code true} for backward compatibility.
+     */
+    private boolean writeMetadataToHead = true;
+
+    /**
+     * Whether to include the &lt;title&gt; element in the XHTML head.
+     * Default is {@code true} for backward compatibility.
+     */
+    private boolean includeTitle = true;
+
+    /**
+     * Whether to write embedded file names to content (e.g., as &lt;h1&gt; elements).
+     * Default is {@code true} for backward compatibility.
+     */
+    private boolean writeFileNameToContent = true;
+
+    public SAXOutputConfig() {
+    }
+
+    public boolean isWriteMetadataToHead() {
+        return writeMetadataToHead;
+    }
+
+    public void setWriteMetadataToHead(boolean writeMetadataToHead) {
+        this.writeMetadataToHead = writeMetadataToHead;
+    }
+
+    public boolean isIncludeTitle() {
+        return includeTitle;
+    }
+
+    public void setIncludeTitle(boolean includeTitle) {
+        this.includeTitle = includeTitle;
+    }
+
+    public boolean isWriteFileNameToContent() {
+        return writeFileNameToContent;
+    }
+
+    public void setWriteFileNameToContent(boolean writeFileNameToContent) {
+        this.writeFileNameToContent = writeFileNameToContent;
+    }
+}
diff --git a/tika-core/src/main/java/org/apache/tika/sax/XHTMLContentHandler.java b/tika-core/src/main/java/org/apache/tika/sax/XHTMLContentHandler.java
index 6ba4232205..bae8c4b885 100644
--- a/tika-core/src/main/java/org/apache/tika/sax/XHTMLContentHandler.java
+++ b/tika-core/src/main/java/org/apache/tika/sax/XHTMLContentHandler.java
@@ -28,6 +28,7 @@ import org.xml.sax.helpers.AttributesImpl;
 
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
+import org.apache.tika.parser.ParseContext;
 
 /**
  * Content handler decorator that simplifies the task of producing XHTML
@@ -75,6 +76,14 @@ public class XHTMLContentHandler extends SafeContentHandler {
      * &lt;head/&gt; section.
      */
     private final Metadata metadata;
+    /**
+     * Whether to write metadata as meta elements in the head.
+     */
+    private final boolean writeMetadataToHead;
+    /**
+     * Whether to include the title element in the head.
+     */
+    private final boolean includeTitle;
     /**
      * Flag to indicate whether the document has been started.
      */
@@ -85,9 +94,35 @@ public class XHTMLContentHandler extends SafeContentHandler {
     private boolean headStarted = false;
     private boolean headEnded = false;
     private boolean useFrameset = false;
+
     public XHTMLContentHandler(ContentHandler handler, Metadata metadata) {
+        this(handler, metadata, null);
+    }
+
+    /**
+     * Creates a new XHTMLContentHandler with configuration from ParseContext.
+     * <p>
+     * If a {@link SAXOutputConfig} is present in the ParseContext,
+     * its settings will be used to control output behavior.
+     *
+     * @param handler      the content handler to wrap
+     * @param metadata     metadata associated with the document
+     * @param parseContext parse context containing optional configuration
+     */
+    public XHTMLContentHandler(ContentHandler handler, Metadata metadata,
+                               ParseContext parseContext) {
         super(handler);
         this.metadata = metadata;
+        SAXOutputConfig config = parseContext != null
+                ? parseContext.get(SAXOutputConfig.class)
+                : null;
+        if (config != null) {
+            this.writeMetadataToHead = config.isWriteMetadataToHead();
+            this.includeTitle = config.isIncludeTitle();
+        } else {
+            this.writeMetadataToHead = true;
+            this.includeTitle = true;
+        }
     }
 
     private static Set<String> unmodifiableSet(String... elements) {
@@ -156,36 +191,40 @@ public class XHTMLContentHandler extends SafeContentHandler {
 
             // TIKA-478: Emit all metadata values (other than title). We have to call
             // startElement() and characters() directly to avoid recursive problems.
-            for (String name : metadata.names()) {
-                if (name.equals("title")) {
-                    continue;
-                }
+            if (writeMetadataToHead) {
+                for (String name : metadata.names()) {
+                    if (name.equals("title")) {
+                        continue;
+                    }
 
-                for (String value : metadata.getValues(name)) {
-                    // Putting null values into attributes causes problems, but is
-                    // allowed by Metadata, so guard against that.
-                    if (value != null) {
-                        AttributesImpl attributes = new AttributesImpl();
-                        attributes.addAttribute("", "name", "name", "CDATA", name);
-                        attributes.addAttribute("", "content", "content", "CDATA", value);
-                        super.startElement(XHTML, "meta", "meta", attributes);
-                        super.endElement(XHTML, "meta", "meta");
-                        newline();
+                    for (String value : metadata.getValues(name)) {
+                        // Putting null values into attributes causes problems, but is
+                        // allowed by Metadata, so guard against that.
+                        if (value != null) {
+                            AttributesImpl attributes = new AttributesImpl();
+                            attributes.addAttribute("", "name", "name", "CDATA", name);
+                            attributes.addAttribute("", "content", "content", "CDATA", value);
+                            super.startElement(XHTML, "meta", "meta", attributes);
+                            super.endElement(XHTML, "meta", "meta");
+                            newline();
+                        }
                     }
                 }
             }
 
-            super.startElement(XHTML, "title", "title", EMPTY_ATTRIBUTES);
-            String title = metadata.get(TikaCoreProperties.TITLE);
-            if (title != null && title.length() > 0) {
-                char[] titleChars = title.toCharArray();
-                super.characters(titleChars, 0, titleChars.length);
-            } else {
-                // TIKA-725: Prefer <title></title> over <title/>
-                super.characters(new char[0], 0, 0);
+            if (includeTitle) {
+                super.startElement(XHTML, "title", "title", EMPTY_ATTRIBUTES);
+                String title = metadata.get(TikaCoreProperties.TITLE);
+                if (title != null && title.length() > 0) {
+                    char[] titleChars = title.toCharArray();
+                    super.characters(titleChars, 0, titleChars.length);
+                } else {
+                    // TIKA-725: Prefer <title></title> over <title/>
+                    super.characters(new char[0], 0, 0);
+                }
+                super.endElement(XHTML, "title", "title");
+                newline();
             }
-            super.endElement(XHTML, "title", "title");
-            newline();
 
             super.endElement(XHTML, "head", "head");
             newline();
diff --git a/tika-core/src/test/java/org/apache/tika/sax/XHTMLContentHandlerTest.java b/tika-core/src/test/java/org/apache/tika/sax/XHTMLContentHandlerTest.java
index 136c62b0c0..4812bfd719 100644
--- a/tika-core/src/test/java/org/apache/tika/sax/XHTMLContentHandlerTest.java
+++ b/tika-core/src/test/java/org/apache/tika/sax/XHTMLContentHandlerTest.java
@@ -29,6 +29,8 @@ import org.xml.sax.SAXException;
 import org.xml.sax.helpers.AttributesImpl;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
+import org.apache.tika.parser.ParseContext;
 
 /**
  * Unit tests for the {@link XHTMLContentHandler} class.
@@ -218,4 +220,125 @@ public class XHTMLContentHandlerTest {
         assertEquals("a\ufffdz", words[0]);
     }
 
+    @Test
+    public void testDefaultConfigIncludesMetadataAndTitle() throws Exception {
+        Metadata metadata = new Metadata();
+        metadata.set(TikaCoreProperties.TITLE, "Test Title");
+        metadata.set("author", "Test Author");
+
+        ToHTMLContentHandler toHTMLContentHandler = new ToHTMLContentHandler();
+        XHTMLContentHandler xhtmlHandler = new XHTMLContentHandler(toHTMLContentHandler, metadata);
+
+        xhtmlHandler.startDocument();
+        xhtmlHandler.element("p", "content");
+        xhtmlHandler.endDocument();
+
+        String result = toHTMLContentHandler.toString();
+        assertTrue(result.contains("<title>Test Title</title>"), "Should contain title");
+        assertTrue(result.contains("<meta name=\"author\" content=\"Test Author\""),
+                "Should contain metadata");
+    }
+
+    @Test
+    public void testConfigSkipMetadataInHead() throws Exception {
+        Metadata metadata = new Metadata();
+        metadata.set(TikaCoreProperties.TITLE, "Test Title");
+        metadata.set("author", "Test Author");
+
+        SAXOutputConfig config = new SAXOutputConfig();
+        config.setWriteMetadataToHead(false);
+
+        ParseContext context = new ParseContext();
+        context.set(SAXOutputConfig.class, config);
+
+        ToHTMLContentHandler toHTMLContentHandler = new ToHTMLContentHandler();
+        XHTMLContentHandler xhtmlHandler =
+                new XHTMLContentHandler(toHTMLContentHandler, metadata, context);
+
+        xhtmlHandler.startDocument();
+        xhtmlHandler.element("p", "content");
+        xhtmlHandler.endDocument();
+
+        String result = toHTMLContentHandler.toString();
+        assertTrue(result.contains("<title>Test Title</title>"), "Should still contain title");
+        assertTrue(!result.contains("<meta name=\"author\""),
+                "Should NOT contain metadata");
+    }
+
+    @Test
+    public void testConfigSkipTitle() throws Exception {
+        Metadata metadata = new Metadata();
+        metadata.set(TikaCoreProperties.TITLE, "Test Title");
+        metadata.set("author", "Test Author");
+
+        SAXOutputConfig config = new SAXOutputConfig();
+        config.setIncludeTitle(false);
+
+        ParseContext context = new ParseContext();
+        context.set(SAXOutputConfig.class, config);
+
+        ToHTMLContentHandler toHTMLContentHandler = new ToHTMLContentHandler();
+        XHTMLContentHandler xhtmlHandler =
+                new XHTMLContentHandler(toHTMLContentHandler, metadata, context);
+
+        xhtmlHandler.startDocument();
+        xhtmlHandler.element("p", "content");
+        xhtmlHandler.endDocument();
+
+        String result = toHTMLContentHandler.toString();
+        assertTrue(!result.contains("<title>"), "Should NOT contain title");
+        assertTrue(result.contains("<meta name=\"author\" content=\"Test Author\""),
+                "Should still contain metadata");
+    }
+
+    @Test
+    public void testConfigSkipBothMetadataAndTitle() throws Exception {
+        Metadata metadata = new Metadata();
+        metadata.set(TikaCoreProperties.TITLE, "Test Title");
+        metadata.set("author", "Test Author");
+
+        SAXOutputConfig config = new SAXOutputConfig();
+        config.setWriteMetadataToHead(false);
+        config.setIncludeTitle(false);
+
+        ParseContext context = new ParseContext();
+        context.set(SAXOutputConfig.class, config);
+
+        ToHTMLContentHandler toHTMLContentHandler = new ToHTMLContentHandler();
+        XHTMLContentHandler xhtmlHandler =
+                new XHTMLContentHandler(toHTMLContentHandler, metadata, context);
+
+        xhtmlHandler.startDocument();
+        xhtmlHandler.element("p", "content");
+        xhtmlHandler.endDocument();
+
+        String result = toHTMLContentHandler.toString();
+        assertTrue(!result.contains("<title>"), "Should NOT contain title");
+        assertTrue(!result.contains("<meta name=\"author\""),
+                "Should NOT contain metadata");
+        assertTrue(result.contains("<head>") && result.contains("</head>"),
+                "Should still have head element");
+        assertTrue(result.contains("content"), "Should have body content");
+    }
+
+    @Test
+    public void testNullParseContextUsesDefaults() throws Exception {
+        Metadata metadata = new Metadata();
+        metadata.set(TikaCoreProperties.TITLE, "Test Title");
+        metadata.set("author", "Test Author");
+
+        ToHTMLContentHandler toHTMLContentHandler = new ToHTMLContentHandler();
+        XHTMLContentHandler xhtmlHandler =
+                new XHTMLContentHandler(toHTMLContentHandler, metadata, null);
+
+        xhtmlHandler.startDocument();
+        xhtmlHandler.element("p", "content");
+        xhtmlHandler.endDocument();
+
+        String result = toHTMLContentHandler.toString();
+        assertTrue(result.contains("<title>Test Title</title>"), "Should contain title");
+        assertTrue(result.contains("<meta name=\"author\" content=\"Test Author\""),
+                "Should contain metadata");
+    }
+
 }
diff --git a/tika-example/src/main/java/org/apache/tika/example/RollbackSoftware.java b/tika-example/src/main/java/org/apache/tika/example/RollbackSoftware.java
index 2ff8eddcee..cc9aef8f47 100755
--- a/tika-example/src/main/java/org/apache/tika/example/RollbackSoftware.java
+++ b/tika-example/src/main/java/org/apache/tika/example/RollbackSoftware.java
@@ -114,7 +114,7 @@ public class RollbackSoftware {
                     .getName()
                     .startsWith("current"));
 
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
             for (File v : versions) {
                 if (isSymlink(v)) {
diff --git a/tika-integration-tests/tika-resource-loading-tests/src/test/java/org/apache/custom/parser/MyCustomParser.java b/tika-integration-tests/tika-resource-loading-tests/src/test/java/org/apache/custom/parser/MyCustomParser.java
index 1bb9bb0ba8..72c7bb5c89 100644
--- a/tika-integration-tests/tika-resource-loading-tests/src/test/java/org/apache/custom/parser/MyCustomParser.java
+++ b/tika-integration-tests/tika-resource-loading-tests/src/test/java/org/apache/custom/parser/MyCustomParser.java
@@ -41,7 +41,7 @@ public class MyCustomParser implements Parser {
     @Override
     public void parse(TikaInputStream stream, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.startElement("p");
         xhtml.characters("my custom parser");
diff --git a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/envi/EnviHeaderParser.java b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/envi/EnviHeaderParser.java
index 6561f946c6..e718a74b8b 100644
--- a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/envi/EnviHeaderParser.java
+++ b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/envi/EnviHeaderParser.java
@@ -80,7 +80,7 @@ public class EnviHeaderParser extends AbstractEncodingDetectorParser {
             Charset charset = reader.getCharset();
             // deprecated, see TIKA-431
             metadata.set(Metadata.CONTENT_ENCODING, charset.name());
-            xhtml = new XHTMLContentHandler(handler, metadata);
+            xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
             readLines(reader, metadata);
             xhtml.endDocument();
diff --git a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/gdal/GDALParser.java b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/gdal/GDALParser.java
index 8d964e0cce..12a9d9799a 100644
--- a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/gdal/GDALParser.java
+++ b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/gdal/GDALParser.java
@@ -225,7 +225,7 @@ public class GDALParser implements Parser {
 
         // make the content handler and provide output there
         // now that we have metadata
-        processOutput(handler, metadata, output);
+        processOutput(handler, metadata, output, context);
     }
 
     private Map<Pattern, String> getPatterns() {
@@ -313,9 +313,9 @@ public class GDALParser implements Parser {
         }
     }
 
-    private void processOutput(ContentHandler handler, Metadata metadata, String output)
-            throws SAXException, IOException {
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+    private void processOutput(ContentHandler handler, Metadata metadata, String output,
+                               ParseContext context) throws SAXException, IOException {
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         try (Reader reader = new StringReader(output)) {
             xhtml.startDocument();
             xhtml.startElement("p");
diff --git a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/geoinfo/GeographicInformationParser.java b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/geoinfo/GeographicInformationParser.java
index 66064e7eb7..b9892775ff 100644
--- a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/geoinfo/GeographicInformationParser.java
+++ b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/geoinfo/GeographicInformationParser.java
@@ -88,7 +88,7 @@ public class GeographicInformationParser implements Parser {
     public void parse(TikaInputStream tis, ContentHandler contentHandler, Metadata metadata,
                       ParseContext parseContext) throws IOException, SAXException, TikaException {
         metadata.set(Metadata.CONTENT_TYPE, geoInfoType);
-        XHTMLContentHandler xhtmlContentHandler = new XHTMLContentHandler(contentHandler, metadata);
+        XHTMLContentHandler xhtmlContentHandler = new XHTMLContentHandler(contentHandler, metadata, parseContext);
 
         TemporaryResources tmp = null;
         try (tis) {
diff --git a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/grib/GribParser.java b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/grib/GribParser.java
index ea5dd14442..efad705f66 100644
--- a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/grib/GribParser.java
+++ b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/grib/GribParser.java
@@ -83,7 +83,7 @@ public class GribParser implements Parser {
                     }
                 }
 
-                xhtml = new XHTMLContentHandler(handler, metadata);
+                xhtml = new XHTMLContentHandler(handler, metadata, context);
 
                 xhtml.startDocument();
 
diff --git a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/hdf/HDFParser.java b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/hdf/HDFParser.java
index a98f743a67..7adc349e59 100644
--- a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/hdf/HDFParser.java
+++ b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/hdf/HDFParser.java
@@ -94,7 +94,7 @@ public class HDFParser implements Parser {
             throw new TikaException("HDF parse error", e);
         }
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.endDocument();
     }
diff --git a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/isatab/ISArchiveParser.java b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/isatab/ISArchiveParser.java
index e0d5f25e45..85baa72d03 100644
--- a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/isatab/ISArchiveParser.java
+++ b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/isatab/ISArchiveParser.java
@@ -91,7 +91,7 @@ public class ISArchiveParser implements Parser {
             File locationFile = new File(location);
             String[] investigationList = locationFile.list((dir, name) -> name.matches("i_.+\\.txt"));
 
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
 
             parseInvestigation(investigationList, xhtml, metadata, context);
diff --git a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/netcdf/NetCDFParser.java b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/netcdf/NetCDFParser.java
index 306d196848..f19caee923 100644
--- a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/netcdf/NetCDFParser.java
+++ b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/netcdf/NetCDFParser.java
@@ -94,7 +94,7 @@ public class NetCDFParser implements Parser {
             }
 
 
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
             xhtml.newline();
             xhtml.element("h1", "dimensions");
diff --git a/tika-parsers/tika-parsers-ml/tika-parser-nlp-module/src/main/java/org/apache/tika/parser/ner/NamedEntityParser.java b/tika-parsers/tika-parsers-ml/tika-parser-nlp-module/src/main/java/org/apache/tika/parser/ner/NamedEntityParser.java
index 5f951eba7f..9aa75462e6 100644
--- a/tika-parsers/tika-parsers-ml/tika-parser-nlp-module/src/main/java/org/apache/tika/parser/ner/NamedEntityParser.java
+++ b/tika-parsers/tika-parsers-ml/tika-parser-nlp-module/src/main/java/org/apache/tika/parser/ner/NamedEntityParser.java
@@ -143,7 +143,7 @@ public class NamedEntityParser implements Parser {
                 }
             }
         }
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(contentHandler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(contentHandler, metadata, parseContext);
         extractOutput(text.trim(), xhtml);
     }
 
diff --git a/tika-parsers/tika-parsers-ml/tika-transcribe-aws/src/main/java/org/apache/tika/parser/transcribe/aws/AmazonTranscribe.java b/tika-parsers/tika-parsers-ml/tika-transcribe-aws/src/main/java/org/apache/tika/parser/transcribe/aws/AmazonTranscribe.java
index b741fb6b86..b69ebc7035 100644
--- a/tika-parsers/tika-parsers-ml/tika-transcribe-aws/src/main/java/org/apache/tika/parser/transcribe/aws/AmazonTranscribe.java
+++ b/tika-parsers/tika-parsers-ml/tika-transcribe-aws/src/main/java/org/apache/tika/parser/transcribe/aws/AmazonTranscribe.java
@@ -153,7 +153,7 @@ public class AmazonTranscribe implements Parser, Initializable {
             startTranscriptionJobRequest = startTranscriptionJobRequest.toBuilder().identifyLanguage(true).build();
         }
         amazonTranscribeAsync.startTranscriptionJob(startTranscriptionJobRequest);
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         String text = getTranscriptText(jobName);
         xhtml.startElement("p");
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/apple/AppleSingleFileParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/apple/AppleSingleFileParser.java
index d01e452e83..28a83569ab 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/apple/AppleSingleFileParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/apple/AppleSingleFileParser.java
@@ -93,7 +93,7 @@ public class AppleSingleFileParser implements Parser {
         Metadata embeddedMetadata = context.newMetadata();
         bytesRead = processFieldEntries(tis, fieldInfoList, embeddedMetadata, bytesRead);
         FieldInfo contentFieldInfo = getContentFieldInfo(fieldInfoList);
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         if (contentFieldInfo != null) {
             long diff = contentFieldInfo.offset - bytesRead;
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/apple/PListParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/apple/PListParser.java
index 05af800ac2..d6a0b1e9c7 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/apple/PListParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/apple/PListParser.java
@@ -119,7 +119,7 @@ public class PListParser implements Parser {
                 metadata.set(Metadata.CONTENT_TYPE, subtype.toString());
             }
         }
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         State state = new State(xhtml, metadata, embeddedDocumentExtractor, df, context);
         xhtml.startDocument();
         xhtml.startElement(PLIST);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/IWorkPackageParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/IWorkPackageParser.java
index 1591ad2fb2..7c1e2be25b 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/IWorkPackageParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/IWorkPackageParser.java
@@ -103,7 +103,7 @@ public class IWorkPackageParser implements Parser {
             entryStream.reset(); // 4096 fails on github
 
             if (type != null) {
-                XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+                XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
                 ContentHandler contentHandler;
 
                 switch (type) {
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/iwana/IWork13PackageParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/iwana/IWork13PackageParser.java
index ed1de8f3bc..bf0f151b6c 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/iwana/IWork13PackageParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/iwana/IWork13PackageParser.java
@@ -94,7 +94,7 @@ public class IWork13PackageParser implements Parser {
         } else {
             zipStream = new ZipInputStream(tis);
         }
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         MediaType type = null;
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/audio/AudioParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/audio/AudioParser.java
index 1fc9a7c53b..de9b3f212e 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/audio/AudioParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/audio/AudioParser.java
@@ -130,7 +130,7 @@ public class AudioParser implements Parser {
                     UNSUPPORTED_AUDIO_FILE_EXCEPTION);
         }
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.endDocument();
     }
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/audio/MidiParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/audio/MidiParser.java
index 4480146481..e4c7cbb50b 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/audio/MidiParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/audio/MidiParser.java
@@ -63,7 +63,7 @@ public class MidiParser implements Parser {
                       ParseContext context) throws IOException, SAXException, TikaException {
         metadata.set(Metadata.CONTENT_TYPE, "audio/midi");
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         // TikaInputStream always supports mark
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java
index 948dba2ebc..127f473e87 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java
@@ -146,7 +146,7 @@ public class Mp3Parser implements Parser {
         metadata.set(Metadata.CONTENT_TYPE, "audio/mpeg");
         metadata.set(XMPDM.AUDIO_COMPRESSOR, "MP3");
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
 
         // Create handlers for the various kinds of ID3 tags
         ID3TagsAndAudio audioAndTags = getAllTagHandlers(tis, handler);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/mp4/MP4Parser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/mp4/MP4Parser.java
index 687276f6c5..a8cfd9af24 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/mp4/MP4Parser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/mp4/MP4Parser.java
@@ -97,7 +97,7 @@ public class MP4Parser implements Parser {
                       ParseContext context) throws IOException, SAXException, TikaException {
 
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         com.drew.metadata.Metadata mp4Metadata = new com.drew.metadata.Metadata();
         Mp4BoxHandler boxHandler = new TikaMp4BoxHandler(mp4Metadata, metadata, xhtml);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/FlacParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/FlacParser.java
index 23ff660fe6..1c70315499 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/FlacParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/FlacParser.java
@@ -68,7 +68,7 @@ public class FlacParser extends AbstractParser {
         FlacFile flac = FlacFile.open(tis);
 
         // Start
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         // Extract the common FLAC info
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/OggParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/OggParser.java
index 9d03be1fe7..48013dc93f 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/OggParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/OggParser.java
@@ -106,7 +106,7 @@ public class OggParser extends AbstractParser {
         int totalStreams = 0;
 
         // Start
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         // Check the streams in turn
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/OpusParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/OpusParser.java
index 184184629d..46e808d549 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/OpusParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/OpusParser.java
@@ -69,7 +69,7 @@ public class OpusParser extends OggAudioParser {
         OpusFile opus = new OpusFile(ogg);
 
         // Start
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         // Extract the common Opus info
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/SpeexParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/SpeexParser.java
index cc15b235e0..877898f308 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/SpeexParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/SpeexParser.java
@@ -69,7 +69,7 @@ public class SpeexParser extends OggAudioParser {
         SpeexFile speex = new SpeexFile(ogg);
 
         // Start
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         // Extract the common Speex info
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/TheoraParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/TheoraParser.java
index 0838ba34cb..61f20f6c18 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/TheoraParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/TheoraParser.java
@@ -70,7 +70,7 @@ public class TheoraParser extends AbstractParser {
         TheoraFile theora = new TheoraFile(ogg);
 
         // Start
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         // Extract the common Theora info
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/VorbisParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/VorbisParser.java
index 2daee53341..3fb0789796 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/VorbisParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/ogg/VorbisParser.java
@@ -67,7 +67,7 @@ public class VorbisParser extends OggAudioParser {
         VorbisFile vorbis = new VorbisFile(ogg);
 
         // Start
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         // Extract the common Vorbis info
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/video/FLVParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/video/FLVParser.java
index 9cae569a8c..d438872b72 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/video/FLVParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/video/FLVParser.java
@@ -198,7 +198,7 @@ public class FLVParser implements Parser {
         metadata.set("hasVideo", Boolean.toString((typeFlags & MASK_VIDEO) != 0));
         metadata.set("hasAudio", Boolean.toString((typeFlags & MASK_AUDIO) != 0));
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         // flv tag stream follows...
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dgn/DGN8Parser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dgn/DGN8Parser.java
index b235335687..fa7597137d 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dgn/DGN8Parser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dgn/DGN8Parser.java
@@ -51,7 +51,7 @@ public class DGN8Parser implements Parser {
     @Override
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         SummaryExtractor summaryExtractor = new SummaryExtractor(metadata);
         final DirectoryNode root;
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGParser.java
index d8e085bf55..925c7fcb49 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGParser.java
@@ -105,7 +105,7 @@ public class DWGParser extends AbstractDWGParser {
             IOUtils.readFully(tis, header);
             String version = new String(header, 0, 6, "US-ASCII");
 
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
 
             switch (version) {
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGReadParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGReadParser.java
index 2ad4196090..098969c7c9 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGReadParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/dwg/DWGReadParser.java
@@ -101,7 +101,7 @@ public class DWGReadParser extends AbstractDWGParser {
 
         configure(context);
         DWGParserConfig dwgc = context.get(DWGParserConfig.class);
-        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         // create unique files so we avoid overwriting out files if multithreaded
         UUID uuid = UUID.randomUUID();
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/prt/PRTParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/prt/PRTParser.java
index 8fd33eea63..676575ce40 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/prt/PRTParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java/org/apache/tika/parser/prt/PRTParser.java
@@ -76,7 +76,7 @@ public class PRTParser implements Parser {
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         Last5 l5 = new Last5();
         int read;
 
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/asm/ClassParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/asm/ClassParser.java
index d06f3dcd5d..bb42da272b 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/asm/ClassParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/asm/ClassParser.java
@@ -51,7 +51,7 @@ public class ClassParser implements Parser {
 
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
-        new XHTMLClassVisitor(handler, metadata).parse(tis);
+        new XHTMLClassVisitor(handler, metadata, context).parse(tis);
     }
 
 }
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/asm/XHTMLClassVisitor.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/asm/XHTMLClassVisitor.java
index b78d753863..375331b036 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/asm/XHTMLClassVisitor.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/asm/XHTMLClassVisitor.java
@@ -35,6 +35,7 @@ import org.apache.tika.exception.TikaException;
 import org.apache.tika.exception.WriteLimitReachedException;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
+import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.XHTMLContentHandler;
 
 /**
@@ -51,9 +52,9 @@ class XHTMLClassVisitor extends ClassVisitor {
 
     private String packageName;
 
-    public XHTMLClassVisitor(ContentHandler handler, Metadata metadata) {
+    public XHTMLClassVisitor(ContentHandler handler, Metadata metadata, ParseContext context) {
         super(Opcodes.ASM9);
-        this.xhtml = new XHTMLContentHandler(handler, metadata);
+        this.xhtml = new XHTMLContentHandler(handler, metadata, context);
         this.metadata = metadata;
     }
 
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/code/SourceCodeParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/code/SourceCodeParser.java
index 6fc2ad7aa3..e5ef13da29 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/code/SourceCodeParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/code/SourceCodeParser.java
@@ -129,7 +129,7 @@ public class SourceCodeParser extends AbstractEncodingDetectorParser {
             String codeAsHtml = renderer.highlight(name, out.toString(), charset.name(), false);
             Document document = Jsoup.parse(codeAsHtml);
             document.quirksMode(Document.QuirksMode.quirks);
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
             try {
                 NodeTraversor.filter(new TikaNodeFilter(xhtml), document);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/executable/ExecutableParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/executable/ExecutableParser.java
index 6ef0baa876..b68cadfd9a 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/executable/ExecutableParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/executable/ExecutableParser.java
@@ -85,7 +85,7 @@ public class ExecutableParser implements Parser, MachineMetadata {
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
         // We only do metadata, for now
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         // What kind is it?
         byte[] first4 = new byte[4];
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/executable/UniversalExecutableParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/executable/UniversalExecutableParser.java
index 896a45130a..560f1ab8f0 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/executable/UniversalExecutableParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/executable/UniversalExecutableParser.java
@@ -63,7 +63,7 @@ public class UniversalExecutableParser implements Parser {
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         EmbeddedDocumentExtractor extractor =
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/mat/MatParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/mat/MatParser.java
index 9438e59f0d..730d0138de 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/mat/MatParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/mat/MatParser.java
@@ -100,7 +100,7 @@ public class MatParser implements Parser {
         metadata.set("endian", endianCode);
 
         //Text output
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.newline();
         //Loop through each variable
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/sas/SAS7BDATParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/sas/SAS7BDATParser.java
index 246702d9e3..1dcc26c74a 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/sas/SAS7BDATParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java/org/apache/tika/parser/sas/SAS7BDATParser.java
@@ -67,7 +67,7 @@ public class SAS7BDATParser implements Parser {
                       ParseContext context) throws IOException, SAXException, TikaException {
         metadata.set(Metadata.CONTENT_TYPE, TYPE_SAS7BDAT.toString());
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         SasFileReader sas = new SasFileReaderImpl(tis);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/TSDParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/TSDParser.java
index e5690b295c..2cbf91c66f 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/TSDParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java/org/apache/tika/parser/crypto/TSDParser.java
@@ -107,7 +107,7 @@ public class TSDParser implements Parser {
         this.buildMetas(tsdMetasList,
                 metadata != null && metadata.size() > 0 ? TSDAndEmbeddedMetadata : metadata);
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         tis.rewind();
 
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-font-module/src/main/java/org/apache/tika/parser/font/AdobeFontMetricParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-font-module/src/main/java/org/apache/tika/parser/font/AdobeFontMetricParser.java
index d35d49cbaa..96a8a22e56 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-font-module/src/main/java/org/apache/tika/parser/font/AdobeFontMetricParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-font-module/src/main/java/org/apache/tika/parser/font/AdobeFontMetricParser.java
@@ -98,7 +98,7 @@ public class AdobeFontMetricParser implements Parser {
                 Float.toString(fontMetrics.getUnderlineThickness()));
 
         // Output the remaining comments as text
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         // Display the comments
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-font-module/src/main/java/org/apache/tika/parser/font/TrueTypeParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-font-module/src/main/java/org/apache/tika/parser/font/TrueTypeParser.java
index 625a215632..7d04d3d35e 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-font-module/src/main/java/org/apache/tika/parser/font/TrueTypeParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-font-module/src/main/java/org/apache/tika/parser/font/TrueTypeParser.java
@@ -116,7 +116,7 @@ public class TrueTypeParser implements Parser {
         }
 
         // For now, we only output metadata, no textual contents
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.endDocument();
     }
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/HtmlHandler.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/HtmlHandler.java
index b52d934bba..3ce7f7d179 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/HtmlHandler.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/HtmlHandler.java
@@ -107,7 +107,7 @@ class HtmlHandler extends TextContentHandler {
 
     public HtmlHandler(HtmlMapper mapper, ContentHandler handler, Metadata metadata,
                        ParseContext context, boolean extractScripts) {
-        this(mapper, new XHTMLContentHandler(handler, metadata), metadata, context, extractScripts);
+        this(mapper, new XHTMLContentHandler(handler, metadata, context), metadata, context, extractScripts);
     }
 
     @Override
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/AbstractImageParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/AbstractImageParser.java
index 6c74614400..b97371bfe2 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/AbstractImageParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/AbstractImageParser.java
@@ -76,7 +76,7 @@ public abstract class AbstractImageParser implements Parser {
         if (ocrMediaType == null ||
                 ocrParser == null || !ocrParser.getSupportedTypes(context).contains(ocrMediaType)) {
             extractMetadata(tis, handler, metadata, context);
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
             xhtml.endDocument();
             return;
@@ -85,7 +85,7 @@ public abstract class AbstractImageParser implements Parser {
         TemporaryResources tmpResources = new TemporaryResources();
         Exception metadataException = null;
         try {
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
             Path path = tis.getPath();
             try (InputStream pathStream = Files.newInputStream(path)) {
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/ICNSParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/ICNSParser.java
index c98a61fa98..e42422144b 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/ICNSParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/ICNSParser.java
@@ -139,7 +139,7 @@ public class ICNSParser implements Parser {
             iconmask_details = new StringBuilder(iconmask_details.substring(2));
             metadata.set("Masked icon details", iconmask_details.toString());
         }
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.endDocument();
     }
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/PSDParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/PSDParser.java
index dc4e6072e9..b807d1d5b3 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/PSDParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/PSDParser.java
@@ -169,7 +169,7 @@ public class PSDParser implements Parser {
         // We can't do anything with these parts
 
         // We don't have any helpful text, sorry...
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.endDocument();
     }
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/WebPParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/WebPParser.java
index a155c16e12..b16fe51015 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/WebPParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/WebPParser.java
@@ -51,7 +51,7 @@ public class WebPParser implements Parser {
                       ParseContext context) throws IOException, SAXException, TikaException {
         new ImageMetadataExtractor(metadata).parseWebP(tis.getFile());
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.endDocument();
     }
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-jdbc-commons/src/main/java/org/apache/tika/parser/jdbc/AbstractDBParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-jdbc-commons/src/main/java/org/apache/tika/parser/jdbc/AbstractDBParser.java
index e4b2be3d0a..50e5ca61cf 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-jdbc-commons/src/main/java/org/apache/tika/parser/jdbc/AbstractDBParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-jdbc-commons/src/main/java/org/apache/tika/parser/jdbc/AbstractDBParser.java
@@ -81,7 +81,7 @@ public abstract class AbstractDBParser implements Parser {
 
         extractMetadata(connection, metadata);
 
-        xHandler = new XHTMLContentHandler(handler, metadata);
+        xHandler = new XHTMLContentHandler(handler, metadata, context);
         xHandler.startDocument();
 
         try {
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mail/RFC822Parser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mail/RFC822Parser.java
index 6ca78095fb..6c9d48e24f 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mail/RFC822Parser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mail/RFC822Parser.java
@@ -117,7 +117,7 @@ public class RFC822Parser implements Parser {
         }
         MimeStreamParser parser =
                 new MimeStreamParser(config, null, new DefaultBodyDescriptorBuilder());
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
 
         MailContentHandler mch = new MailContentHandler(xhtml, localDetector, metadata, context,
                 config.isStrictParsing(), extractAllAlternatives);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mbox/MboxParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mbox/MboxParser.java
index 13c388fdb2..42d92f8b65 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mbox/MboxParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java/org/apache/tika/parser/mbox/MboxParser.java
@@ -93,7 +93,7 @@ public class MboxParser implements Parser {
         metadata.set(Metadata.CONTENT_TYPE, MBOX_MIME_TYPE);
         metadata.set(Metadata.CONTENT_ENCODING, charsetName);
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         InputStreamReader isr = new InputStreamReader(tis, charsetName);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java
index 6a6d02bfe4..64e7f0de1b 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/EMFParser.java
@@ -98,7 +98,7 @@ public class EMFParser implements Parser {
                       ParseContext context) throws IOException, SAXException, TikaException {
 
         EmbeddedDocumentExtractor embeddedDocumentExtractor = null;
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         try {
             HemfPicture ex = new HemfPicture(tis);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessParser.java
index 081f8df372..fd609fe1f0 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/JackcessParser.java
@@ -78,7 +78,7 @@ public class JackcessParser implements Parser {
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
         Database db = null;
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         String password = null;
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/MSOwnerFileParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/MSOwnerFileParser.java
index c5ad542cf3..941b7e8bbc 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/MSOwnerFileParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/MSOwnerFileParser.java
@@ -61,7 +61,7 @@ public class MSOwnerFileParser implements Parser {
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         byte[] asciiNameBytes = new byte[ASCII_CHUNK_LENGTH];
         IOUtils.readFully(tis, asciiNameBytes);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
index 10e7dfec30..d87de80d29 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
@@ -162,7 +162,7 @@ public class OfficeParser extends AbstractOfficeParser {
                       ParseContext context) throws IOException, SAXException, TikaException {
 
         configure(context);
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         final DirectoryNode root;
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OldExcelParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OldExcelParser.java
index 0d43c1ec3e..fa76bf529b 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OldExcelParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OldExcelParser.java
@@ -85,7 +85,7 @@ public class OldExcelParser implements Parser {
         // TODO Get the version and type, to set as the Content Type
 
         // Have the text extracted and given to our Content Handler
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         parse(extractor, xhtml);
         xhtml.endDocument();
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/TNEFParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/TNEFParser.java
index cda7a6e1b5..9a528e8f61 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/TNEFParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/TNEFParser.java
@@ -78,7 +78,7 @@ public class TNEFParser implements Parser {
             metadata.set(TikaCoreProperties.TITLE, subject);
             metadata.set(TikaCoreProperties.SUBJECT, subject);
         }
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         // Recurse into the message body RTF
         MAPIAttribute attr = msg.getMessageMAPIAttribute(MAPIProperty.RTF_COMPRESSED);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/WMFParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/WMFParser.java
index 05665857a2..fe6c622dd9 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/WMFParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/WMFParser.java
@@ -59,7 +59,7 @@ public class WMFParser implements Parser {
     @Override
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         tis.setCloseShield();
         try {
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/activemime/ActiveMimeParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/activemime/ActiveMimeParser.java
index 9edc648ec5..d9ea0ef21e 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/activemime/ActiveMimeParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/activemime/ActiveMimeParser.java
@@ -73,7 +73,7 @@ public class ActiveMimeParser implements Parser {
         IOUtils.skipFully(tis, 4);//don't know
 
         IOUtils.skipFully(tis, zlibOffset);
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         EmbeddedDocumentExtractor ex = EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(context);
         try (InputStream payload = new DeflateCompressorInputStream(tis)) {
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/chm/ChmParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/chm/ChmParser.java
index 9e05f8dbd4..11dcbfc322 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/chm/ChmParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/chm/ChmParser.java
@@ -64,7 +64,7 @@ public class ChmParser implements Parser {
         metadata.set(Metadata.CONTENT_TYPE, "application/vnd.ms-htmlhelp");
 
         // content
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         Parser htmlParser =
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/libpst/LibPstParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/libpst/LibPstParser.java
index 95904cc77d..ed56c0bf31 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/libpst/LibPstParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/libpst/LibPstParser.java
@@ -82,7 +82,7 @@ public class LibPstParser implements Parser, Initializable {
         Path debugFile = activeConfig.isDebug() ? Files.createTempFile("tika-libpst-debug", ".txt") : null;
         try {
             ProcessBuilder pb = getProcessBuilder(pst, activeConfig, outDir, debugFile);
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(contentHandler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(contentHandler, metadata, parseContext);
             FileProcessResult fileProcessResult = ProcessUtils.execute(pb, activeConfig.getTimeoutSeconds() * 1000l, MAX_STDOUT, MAX_STDERR);
             xhtml.startDocument();
             processContents(outDir, activeConfig, xhtml, metadata, parseContext);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/OneNoteParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/OneNoteParser.java
index e4018be077..208ecdede1 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/OneNoteParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/OneNoteParser.java
@@ -80,7 +80,7 @@ public class OneNoteParser implements Parser {
 
         try (OneNoteDirectFileResource oneNoteDirectFileResource = new OneNoteDirectFileResource(
                         tis.getFile())) {
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
             OneNoteDocument oneNoteDocument =
                     createOneNoteDocumentFromDirectFileResource(oneNoteDirectFileResource);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/AbstractOOXMLExtractor.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/AbstractOOXMLExtractor.java
index 58683a0f40..2503a0c8f9 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/AbstractOOXMLExtractor.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/AbstractOOXMLExtractor.java
@@ -141,7 +141,7 @@ public abstract class AbstractOOXMLExtractor implements OOXMLExtractor {
      */
     public void getXHTML(ContentHandler handler, Metadata metadata, ParseContext context)
             throws SAXException, XmlException, IOException, TikaException {
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         buildXHTML(xhtml);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParser.java
index 597624a589..1da2750f46 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParser.java
@@ -51,7 +51,7 @@ public class Word2006MLParser extends AbstractOfficeParser {
         //set OfficeParserConfig if the user hasn't specified one
         configure(context);
 
-        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
 
         xhtml.startDocument();
         tis.setCloseShield();
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/OutlookPSTParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/OutlookPSTParser.java
index 5e8c2880ad..be7c7f9855 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/OutlookPSTParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/OutlookPSTParser.java
@@ -74,7 +74,7 @@ public class OutlookPSTParser implements Parser {
 
         metadata.set(Metadata.CONTENT_TYPE, MS_OUTLOOK_PST_MIMETYPE.toString());
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         PSTFile pstFile = null;
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java
index 9b638386f9..4cfb641612 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java
@@ -77,7 +77,7 @@ public class PSTMailItemParser implements Parser {
         }
         PSTMessage pstMsg = (PSTMessage) openContainerObj;
         EmbeddedDocumentExtractor ex = EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(context);
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         parseMailAndAttachments(pstMsg, xhtml, metadata, context, ex);
         xhtml.endDocument();
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java
index b45cdea8d1..5e8dca35bc 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java
@@ -88,7 +88,7 @@ public class RTFParser implements Parser {
                       ParseContext context) throws IOException, SAXException, TikaException {
         metadata.set(Metadata.CONTENT_TYPE, "application/rtf");
         TaggedInputStream tagged = new TaggedInputStream(tis);
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         try {
             parseInline(tis, xhtml, metadata, context);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/xml/AbstractXML2003Parser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/xml/AbstractXML2003Parser.java
index 37b743165d..6d7e4ef8b9 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/xml/AbstractXML2003Parser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/xml/AbstractXML2003Parser.java
@@ -85,7 +85,7 @@ public abstract class AbstractXML2003Parser implements Parser {
                       ParseContext context) throws IOException, SAXException, TikaException {
         setContentType(metadata);
 
-        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         TaggedContentHandler tagged = new TaggedContentHandler(xhtml);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/dbf/DBFParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/dbf/DBFParser.java
index eceec3d224..153574f432 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/dbf/DBFParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/dbf/DBFParser.java
@@ -89,7 +89,7 @@ public class DBFParser implements Parser {
         Charset charset = getCharset(firstRows, header, context);
         metadata.set(Metadata.CONTENT_ENCODING, charset.toString());
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.startElement("table");
         xhtml.startElement("thead");
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/dif/DIFParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/dif/DIFParser.java
index c8059f7c73..edb304fca3 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/dif/DIFParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/dif/DIFParser.java
@@ -57,7 +57,7 @@ public class DIFParser implements Parser {
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
         // TODO Auto-generated method stub
-        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.startElement("p");
         TaggedContentHandler tagged = new TaggedContentHandler(handler);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/epub/EpubParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/epub/EpubParser.java
index a7b0211ca6..a07d764052 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/epub/EpubParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/epub/EpubParser.java
@@ -114,7 +114,7 @@ public class EpubParser implements Parser {
                       ParseContext context) throws IOException, SAXException, TikaException {
         // Because an EPub file is often made up of multiple XHTML files,
         //  we need explicit control over the start and end of the document
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         IOException caughtException = null;
         ContentHandler childHandler = new EmbeddedContentHandler(
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/hwp/HwpV5Parser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/hwp/HwpV5Parser.java
index 37ab5ac646..95b238645d 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/hwp/HwpV5Parser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/hwp/HwpV5Parser.java
@@ -56,7 +56,7 @@ public class HwpV5Parser implements Parser {
 
         metadata.set(Metadata.CONTENT_TYPE, HWP_MIME_TYPE);
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         try {
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java
index d7deb5faa8..3caa086135 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java
@@ -95,7 +95,7 @@ public class IDMLParser implements Parser {
             zipStream = new ZipInputStream(tis);
         }
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(baseHandler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(baseHandler, metadata, context);
         xhtml.startDocument();
         EndDocumentShieldingContentHandler handler = new EndDocumentShieldingContentHandler(xhtml);
 
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/mif/MIFParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/mif/MIFParser.java
index beacc72506..084495d471 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/mif/MIFParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/mif/MIFParser.java
@@ -72,7 +72,7 @@ public class MIFParser extends AbstractEncodingDetectorParser {
             Optional<MediaType> firstElement = SUPPORTED_TYPES.stream().findFirst();
             metadata.set(Metadata.CONTENT_TYPE, firstElement.get().toString());
 
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
             EndDocumentShieldingContentHandler parseHandler =
                     new EndDocumentShieldingContentHandler(xhtml);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java
index bd841f8461..30eae3d8f5 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java
@@ -97,7 +97,7 @@ public class FlatOpenDocumentParser implements Parser {
     @Override
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
-        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
 
         xhtml.startDocument();
         tis.setCloseShield();
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java
index 7128167e63..a9646265e0 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentContentParser.java
@@ -44,7 +44,7 @@ public class OpenDocumentContentParser implements Parser {
 
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
-        parseInternal(tis, new XHTMLContentHandler(handler, metadata), metadata, context);
+        parseInternal(tis, new XHTMLContentHandler(handler, metadata, context), metadata, context);
     }
 
     void parseInternal(TikaInputStream tis, final ContentHandler handler, Metadata metadata,
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentParser.java
index bfbe84e05c..02dfd9e374 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentParser.java
@@ -169,7 +169,7 @@ public class OpenDocumentParser implements Parser {
             tis.setOpenContainer(zipFile);
         }
         // Prepare to handle the content
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(baseHandler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(baseHandler, metadata, context);
         xhtml.startDocument();
         // As we don't know which of the metadata or the content
         //  we'll hit first, catch the endDocument call initially
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/wordperfect/QuattroProParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/wordperfect/QuattroProParser.java
index d0593da913..d1e14d826d 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/wordperfect/QuattroProParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/wordperfect/QuattroProParser.java
@@ -65,7 +65,7 @@ public class QuattroProParser implements Parser {
             metadata.set(Metadata.CONTENT_TYPE, QP_9.toString());
         }
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         QPWTextExtractor extractor = new QPWTextExtractor();
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/wordperfect/WordPerfectParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/wordperfect/WordPerfectParser.java
index 695df67fce..8ef47ebfba 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/wordperfect/WordPerfectParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/wordperfect/WordPerfectParser.java
@@ -73,7 +73,7 @@ public class WordPerfectParser implements Parser {
 
         applyMetadata(prefixArea, metadata);
 
-        extractDocumentArea(prefixArea, wpStream, new XHTMLContentHandler(handler, metadata));
+        extractDocumentArea(prefixArea, wpStream, new XHTMLContentHandler(handler, metadata, context));
     }
 
     private void extractDocumentArea(WPPrefixArea prefixArea, WPInputStream in,
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/feed/FeedParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/feed/FeedParser.java
index c29b13d850..4cd25e794e 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/feed/FeedParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/feed/FeedParser.java
@@ -99,7 +99,7 @@ public class FeedParser implements Parser {
             metadata.set(TikaCoreProperties.DESCRIPTION, description);
             // store the other fields in the metadata
 
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
 
             xhtml.element("h1", title);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java
index 124f2626c8..53917df38d 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java
@@ -104,7 +104,7 @@ public class IptcAnpaParser implements Parser {
         HashMap<String, String> properties = this.loadProperties(tis);
         this.setMetadata(metadata, properties);
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         // TODO: put body content here
         xhtml.startElement("p");
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/main/java/org/apache/tika/parser/ocr/TesseractOCRParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/main/java/org/apache/tika/parser/ocr/TesseractOCRParser.java
index ecc5c8962b..c7aedcc495 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/main/java/org/apache/tika/parser/ocr/TesseractOCRParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/main/java/org/apache/tika/parser/ocr/TesseractOCRParser.java
@@ -290,7 +290,7 @@ public class TesseractOCRParser extends AbstractExternalProcessParser implements
             //commandline.  The actual output file name will have a suffix added.
             File tmpOCROutputFile = tmp.createTemporaryFile();
             ContentHandler baseHandler = getContentHandler(config.isInlineContent(), handler, metadata, parseContext);
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(baseHandler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(baseHandler, metadata, parseContext);
             xhtml.startDocument();
             parse(tikaStream, tmpOCROutputFile, xhtml, metadata, parseContext, config);
             xhtml.endDocument();
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java
index 248a25c85e..a0cac9381c 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/AbstractPDF2XHTML.java
@@ -202,7 +202,7 @@ class AbstractPDF2XHTML extends PDFTextStripper {
     AbstractPDF2XHTML(PDDocument pdDocument, ContentHandler handler, ParseContext context,
                       Metadata metadata, PDFParserConfig config, Renderer renderer) throws IOException {
         this.pdDocument = pdDocument;
-        this.xhtml = new XHTMLContentHandler(handler, metadata);
+        this.xhtml = new XHTMLContentHandler(handler, metadata, context);
         this.context = context;
         this.metadata = metadata;
         this.config = config;
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
index 8cb51df207..26a38f46f4 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/PDFParser.java
@@ -727,7 +727,7 @@ public class PDFParser implements Parser, RenderingParser {
                                ParseContext context)
             throws SAXException, IOException, TikaException {
         XFAExtractor ex = new XFAExtractor();
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         try (InputStream is = 
                 UnsynchronizedByteArrayInputStream.builder().setByteArray(pdDocument.getDocumentCatalog().getAcroForm(null).getXFA().getBytes()).get()) {
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/CompressorParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/CompressorParser.java
index f140922e90..7f9c051412 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/CompressorParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/CompressorParser.java
@@ -236,7 +236,7 @@ public class CompressorParser implements Parser {
         }
 
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         try {
             Metadata entrydata = context.newMetadata();
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/PackageParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/PackageParser.java
index ad0737212c..e0b645bf0c 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/PackageParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/PackageParser.java
@@ -317,7 +317,7 @@ public class PackageParser extends AbstractEncodingDetectorParser {
         EmbeddedDocumentExtractor extractor =
                 EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(context);
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         // mark before we start parsing entries for potential reset
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/RarParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/RarParser.java
index 62e568ae03..96785a7b5d 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/RarParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/RarParser.java
@@ -59,7 +59,7 @@ public class RarParser implements Parser {
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         EmbeddedDocumentExtractor extractor =
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/UnrarParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/UnrarParser.java
index d1b98aecc3..6525b2cc15 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/UnrarParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/UnrarParser.java
@@ -69,7 +69,7 @@ public class UnrarParser implements Parser {
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         EmbeddedDocumentExtractor extractor =
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/TextAndCSVParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/TextAndCSVParser.java
index 66396adf2c..e7a203a28f 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/TextAndCSVParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/csv/TextAndCSVParser.java
@@ -186,14 +186,14 @@ public class TextAndCSVParser extends AbstractEncodingDetectorParser {
         //TODO -- if it was detected as a non-csv subtype of text
         if (!params.getMediaType().getBaseType().equals(CSV) &&
                 !params.getMediaType().getBaseType().equals(TSV)) {
-            handleText(reader, charset, handler, metadata);
+            handleText(reader, charset, handler, metadata, context);
             return;
         }
 
         CSVFormat csvFormat = CSVFormat.EXCEL.builder().setDelimiter(params.getDelimiter()).get();
         metadata.set(DELIMITER_PROPERTY, textAndCSVConfig.getDelimiterToNameMap().get(csvFormat.getDelimiterString().charAt(0)));
 
-        XHTMLContentHandler xhtmlContentHandler = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtmlContentHandler = new XHTMLContentHandler(handler, metadata, context);
         int totalRows = 0;
         try (CSVParser commonsParser = CSVParser.builder().setReader(reader).setFormat(csvFormat).get()) {
             xhtmlContentHandler.startDocument();
@@ -246,7 +246,7 @@ public class TextAndCSVParser extends AbstractEncodingDetectorParser {
     }
 
     private void handleText(Reader reader, Charset charset, ContentHandler handler,
-                            Metadata metadata) throws SAXException, IOException, TikaException {
+                            Metadata metadata, ParseContext context) throws SAXException, IOException, TikaException {
         // Automatically detect the character encoding
         //try to get detected content type; could be a subclass of text/plain
         //such as vcal, etc.
@@ -263,7 +263,7 @@ public class TextAndCSVParser extends AbstractEncodingDetectorParser {
         // deprecated, see TIKA-431
         metadata.set(Metadata.CONTENT_ENCODING, charset.name());
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         handleText(reader, xhtml);
         xhtml.endDocument();
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/strings/Latin1StringsParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/strings/Latin1StringsParser.java
index d646ce6611..5c5d0a651b 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/strings/Latin1StringsParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/strings/Latin1StringsParser.java
@@ -226,7 +226,7 @@ public class Latin1StringsParser implements Parser {
         tmpPos = 0;
         outPos = 0;
 
-        xhtml = new XHTMLContentHandler(handler, metadata);
+        xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         int i = 0;
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/strings/StringsParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/strings/StringsParser.java
index aac74f624e..fae77f02d6 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/strings/StringsParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/strings/StringsParser.java
@@ -116,7 +116,7 @@ public class StringsParser implements Parser, Initializable {
             int totalBytes = 0;
 
             // Content
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
 
             xhtml.startDocument();
 
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/txt/TXTParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/txt/TXTParser.java
index 849fa3a495..4244d62280 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/txt/TXTParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/txt/TXTParser.java
@@ -95,7 +95,7 @@ public class TXTParser extends AbstractEncodingDetectorParser {
             // deprecated, see TIKA-431
             metadata.set(Metadata.CONTENT_ENCODING, charset.name());
 
-            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+            XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
             xhtml.startDocument();
 
             xhtml.startElement("p");
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/http/HttpParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/http/HttpParser.java
index a27783637d..89dc7836d0 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/http/HttpParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/http/HttpParser.java
@@ -58,7 +58,7 @@ public class HttpParser implements Parser {
         parser.lenientRequest();
         parser.lenientResponse();
         ByteBuffer buffer = ByteBuffer.allocate(1024);
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
 
         tis.setCloseShield();
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/wacz/WACZParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/wacz/WACZParser.java
index e914299a36..1809e5371e 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/wacz/WACZParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/wacz/WACZParser.java
@@ -60,7 +60,7 @@ public class WACZParser implements Parser {
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         EmbeddedDocumentExtractor embeddedDocumentExtractor =
                 EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(context);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/warc/WARCParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/warc/WARCParser.java
index ad0d33b479..4892854b49 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/warc/WARCParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java/org/apache/tika/parser/warc/WARCParser.java
@@ -80,7 +80,7 @@ public class WARCParser implements Parser {
     public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata,
                       ParseContext context) throws IOException, SAXException, TikaException {
 
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         EmbeddedDocumentExtractor embeddedDocumentExtractor =
                 EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(context);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/tmx/TMXParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/tmx/TMXParser.java
index a524e5496a..2a1224171b 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/tmx/TMXParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/tmx/TMXParser.java
@@ -65,7 +65,7 @@ public class TMXParser implements Parser {
 
         metadata.set(Metadata.CONTENT_TYPE, TMX_CONTENT_TYPE.toString());
 
-        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         tis.setCloseShield();
         try {
             XMLReaderUtils.parseSAX(tis, new TMXContentHandler(xhtml, metadata), context);
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xliff/XLIFF12Parser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xliff/XLIFF12Parser.java
index 0f4c77288f..476388370d 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xliff/XLIFF12Parser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xliff/XLIFF12Parser.java
@@ -65,7 +65,7 @@ public class XLIFF12Parser implements Parser {
 
         metadata.set(Metadata.CONTENT_TYPE, XLF_CONTENT_TYPE.toString());
 
-        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
 
         tis.setCloseShield();
         try {
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xliff/XLZParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xliff/XLZParser.java
index 05384abfb4..f72198c36f 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xliff/XLZParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xliff/XLZParser.java
@@ -88,7 +88,7 @@ public class XLZParser implements Parser {
         }
 
         // Prepare to handle the content
-        XHTMLContentHandler xhtml = new XHTMLContentHandler(baseHandler, metadata);
+        XHTMLContentHandler xhtml = new XHTMLContentHandler(baseHandler, metadata, context);
         EndDocumentShieldingContentHandler handler = new EndDocumentShieldingContentHandler(xhtml);
         if (zipFile != null) {
             try {
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xml/XMLParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xml/XMLParser.java
index f7b972dd2b..3fca827da8 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xml/XMLParser.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java/org/apache/tika/parser/xml/XMLParser.java
@@ -63,7 +63,7 @@ public class XMLParser implements Parser {
             metadata.set(Metadata.CONTENT_TYPE, "application/xml");
         }
 
-        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+        final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
         xhtml.startDocument();
         xhtml.startElement("p");
 
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/parser/AutoDetectReaderParserTest.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/parser/AutoDetectReaderParserTest.java
index 767e10c1d2..f90f83022d 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/parser/AutoDetectReaderParserTest.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/parser/AutoDetectReaderParserTest.java
@@ -70,7 +70,7 @@ public class AutoDetectReaderParserTest extends MultiThreadedTikaTest {
                 Charset charset = reader.getCharset();
                 MediaType type = new MediaType(MediaType.parse("text/plhtml"), charset);
                 metadata.set(Metadata.CONTENT_TYPE, type.toString());
-                XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
+                XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);
                 xhtml.startDocument();
 
                 xhtml.startElement("p");
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-no-names.json b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-no-names.json
index b56a7d5d2d..25f0d5dce1 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-no-names.json
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-no-names.json
@@ -3,7 +3,6 @@
     "outputThreshold": 678900,
     "embeddedDocumentExtractorFactory": {
       "runpack-extractor-factory": {
-        "writeFileNameToContent": false
       }
     }
   }
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-upcasing-custom-handler-decorator.json b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-upcasing-custom-handler-decorator.json
index 28c5763f0b..0c812d63b2 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-upcasing-custom-handler-decorator.json
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-upcasing-custom-handler-decorator.json
@@ -6,7 +6,6 @@
     "maximumPackageEntryDepth": 1000,
     "embeddedDocumentExtractorFactory": {
       "runpack-extractor-factory": {
-        "writeFileNameToContent": true,
         "embeddedBytesIncludeMimeTypes": [
           "text/pdf"
         ],
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-with-names.json b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-with-names.json
index 17811c8dec..3edd26dedb 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-with-names.json
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-with-names.json
@@ -3,7 +3,6 @@
     "outputThreshold": 678900,
     "embeddedDocumentExtractorFactory": {
       "runpack-extractor-factory": {
-        "writeFileNameToContent": true
       }
     }
   }
diff --git a/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-truncate.json b/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-truncate.json
index f8d5d3464b..90141d91af 100644
--- a/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-truncate.json
+++ b/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-truncate.json
@@ -48,7 +48,6 @@
     "outputThreshold": 1000000,
     "embeddedDocumentExtractorFactory": {
       "runpack-extractor-factory": {
-        "writeFileNameToContent": false,
         "maxEmbeddedBytesForExtraction": 10
       }
     },
diff --git a/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaLoader.java b/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaLoader.java
index 55f6ff0993..7183d69962 100644
--- a/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaLoader.java
+++ b/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaLoader.java
@@ -55,6 +55,7 @@ import org.apache.tika.renderer.CompositeRenderer;
 import org.apache.tika.renderer.Renderer;
 import org.apache.tika.sax.BasicContentHandlerFactory;
 import org.apache.tika.sax.ContentHandlerFactory;
+import org.apache.tika.sax.SAXOutputConfig;
 import org.apache.tika.serialization.ComponentConfig;
 import org.apache.tika.serialization.ComponentNameResolver;
 import org.apache.tika.serialization.JsonMetadata;
@@ -416,6 +417,12 @@ public class TikaLoader {
             context.set(MetadataWriteLimiterFactory.class, metadataWriteLimiterFactory);
         }
 
+        // Load SAXOutputConfig from other-configs if present
+        SAXOutputConfig saxOutputConfig = configs().load(SAXOutputConfig.class);
+        if (saxOutputConfig != null) {
+            context.set(SAXOutputConfig.class, saxOutputConfig);
+        }
+
         return context;
     }
 
diff --git a/tika-serialization/src/test/resources/configs/TIKA-4207-embedded-bytes-config.json b/tika-serialization/src/test/resources/configs/TIKA-4207-embedded-bytes-config.json
index b014152172..0a0ef6e845 100644
--- a/tika-serialization/src/test/resources/configs/TIKA-4207-embedded-bytes-config.json
+++ b/tika-serialization/src/test/resources/configs/TIKA-4207-embedded-bytes-config.json
@@ -6,7 +6,6 @@
     "outputThreshold": 678900,
     "embeddedDocumentExtractorFactory": {
       "runpack-extractor-factory": {
-        "writeFileNameToContent": false,
         "embeddedBytesIncludeMimeTypes": ["application/pdf", "application/rtf", "text/plain"],
         "embeddedBytesIncludeEmbeddedResourceTypes": ["ATTACHMENT", "INLINE"]
       }