diff --git a/tika-core/src/main/java/org/apache/tika/sax/StandardOrganizations.java b/tika-core/src/main/java/org/apache/tika/sax/StandardOrganizations.java
new file mode 100644
index 000000000..a0d02a905
--- /dev/null
+++ b/tika-core/src/main/java/org/apache/tika/sax/StandardOrganizations.java
@@ -0,0 +1,166 @@
+/*
+ * 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.util.HashMap;
+import java.util.Map;
+
+/**
+ * This class provides a collection of the most important technical standard organizations.
+ * The collection of standard organizations has been obtained from <a href="https://en.wikipedia.org/wiki/List_of_technical_standard_organisations">Wikipedia</a>.
+ * Currently, the list is composed of the most important international standard organizations, the regional standard organizations (i.e., Africa, Americas, Asia Pacific, Europe, and Middle East), and British and American standard organizations among the national-based ones.
+ *
+ */
+public class StandardOrganizations {
+
+	private static Map<String, String> organizations;
+	static {
+		organizations = new HashMap<String, String>();
+		//International standard organizations
+	    organizations.put("3GPP", "3rd Generation Partnership Project");
+	    organizations.put("3GPP2", "3rd Generation Partnership Project 2");
+	    organizations.put("Accellera", "Accellera Organization");
+	    organizations.put("A4L", "Access for Learning Community (formerly known as the Schools Interoperability Framework)");
+	    organizations.put("AES", "Audio Engineering Society");
+	    organizations.put("AIIM", "Association for Information and Image Management");
+	    organizations.put("ASAM", "Association for Automation and Measuring Systems - Automotive technology");
+	    organizations.put("ASHRAE", "American Society of Heating, Refrigerating and Air-Conditioning Engineers (ASHRAE is an international organization, despite its name)");
+	    organizations.put("ASME", "formerly The American Society of Mechanical Engineers");
+	    organizations.put("ASTM", "ASTM (American Society for Testing and Materials) International");
+	    organizations.put("ATIS", "Alliance for Telecommunications Industry Solutions");
+	    organizations.put("AUTOSAR", "Automotive technology");
+	    organizations.put("BIPM, CGPM, and CIPM", "Bureau International des Poids et Mesures and the related organizations established under the Metre Convention of 1875.");
+	    organizations.put("CableLabs", "Cable Television Laboratories");
+	    organizations.put("CCSDS", "Consultative Committee for Space Data Sciences");
+	    organizations.put("CISPR", "International Special Committee on Radio Interference");
+	    organizations.put("CFA", "Compact flash association");
+	    organizations.put("DCMI", "Dublin Core Metadata Initiative");
+	    organizations.put("DMTF", "Distributed Management Task Force");
+	    organizations.put("Ecma International", "Ecma International (previously called ECMA)");
+	    organizations.put("EKOenergy", "EKOenergy Network managed by environmental NGOs");
+	    organizations.put("FAI", "Fédération Aéronautique Internationale");
+	    organizations.put("GlobalPlatform", "Secure element and TEE standards");
+	    organizations.put("GS1", "Global supply chain standards (identification numbers, barcodes, electronic commerce transactions, RFID)");
+	    organizations.put("HGI", "Home Gateway Initiative");
+	    organizations.put("HFSB", "Hedge Fund Standards Board");
+	    organizations.put("IATA", "International Air Transport Association");
+	    organizations.put("IAU*", "International Arabic Union");
+	    organizations.put("ICAO", "International Civil Aviation Organization");
+	    organizations.put("IEC", "International Electrotechnical Commission");
+	    organizations.put("IEEE", "Institute of Electrical and Electronics Engineers");
+	    organizations.put("IEEE-SA", "IEEE Standards Association");
+	    organizations.put("IETF", "Internet Engineering Task Force");
+	    organizations.put("IFOAM", "International Federation of Organic Agriculture Movements");
+	    organizations.put("IFSWF", "International Forum of Sovereign Wealth Funds");
+	    organizations.put("IMO", "International Maritime Organization");
+	    organizations.put("IMS", "IMS Global Learning Consortium");
+	    organizations.put("ISO", "International Organization for Standardization");
+	    organizations.put("IPTC", "International Press Telecommunications Council");
+	    organizations.put("ITU", "The International Telecommunication Union");
+	    organizations.put("ITU-R", "ITU Radiocommunications Sector (formerly known as CCIR)");
+	    organizations.put("CCIR", "Comité Consultatif International pour la Radio, a forerunner of the ITU-R");
+	    organizations.put("ITU-T", "ITU Telecommunications Sector (formerly known as CCITT)");
+	    organizations.put("CCITT", "Comité Consultatif International Téléphonique et Télégraphique, renamed ITU-T in 1993");
+	    organizations.put("ITU-D", "ITU Telecom Development (formerly known as BDT)");
+	    organizations.put("BDT", "Bureau de développement des télécommunications, renamed ITU-D");
+	    organizations.put("IUPAC", "International Union of Pure and Applied Chemistry");
+	    organizations.put("Liberty Alliance", "Liberty Alliance");
+	    organizations.put("Media Grid", "Media Grid Standards Organization");
+	    organizations.put("NACE International", "Formerly known as National Association of Corrosion Engineers");
+	    organizations.put("OASIS", "Organization for the Advancement of Structured Information Standards");
+	    organizations.put("OGC", "Open Geospatial Consortium");
+	    organizations.put("OHICC", "Organization of Hotel Industry Classification & Certification");
+	    organizations.put("OMA", "Open Mobile Alliance");
+	    organizations.put("OMG", "Object Management Group");
+	    organizations.put("OGF", "Open Grid Forum (merger of Global Grid Forum (GGF) and Enterprise Grid Alliance (EGA))");
+	    organizations.put("GGF", "Global Grid Forum");
+	    organizations.put("EGA", "Enterprise Grid Alliance");
+	    organizations.put("OpenTravel Alliance", "OpenTravel Alliance (previously known as OTA)");
+	    organizations.put("OTA", "OpenTravel Alliance");
+	    organizations.put("OSGi", "OSGi Alliance");
+	    organizations.put("PESC", "P20 Education Standards Council[1]");
+	    organizations.put("SAI", "Social Accountability International");
+	    organizations.put("SDA", "Secure Digital Association");
+	    organizations.put("SNIA", "Storage Networking Industry Association");
+	    organizations.put("SMPTE", "Society of Motion Picture and Television Engineers");
+	    organizations.put("SSDA", "Solid State Drive Alliance");
+	    organizations.put("The Open Group", "The Open Group");
+	    organizations.put("TIA", "Telecommunications Industry Association");
+	    organizations.put("TM Forum", "Telemanagement Forum");
+	    organizations.put("UIC", "International Union of Railways");
+	    organizations.put("UL", "Underwriters Laboratories");
+	    organizations.put("UPU", "Universal Postal Union");
+	    organizations.put("WMO", "World Meteorological Organization");
+	    organizations.put("W3C", "World Wide Web Consortium");
+	    organizations.put("WSA", "Website Standards Association");
+	    organizations.put("WHO", "World Health Organization");
+	    organizations.put("XSF", "The XMPP Standards Foundation");
+	    organizations.put("FAO", "Food and Agriculture Organization");
+	    //Regional standards organizations
+	    //Africa
+	    organizations.put("ARSO", "African Regional Organization for Standarization");
+	    organizations.put("SADCSTAN", "Southern African Development Community (SADC) Cooperation in Standarization");
+	    //Americas
+	    organizations.put("COPANT", "Pan American Standards Commission");
+	    organizations.put("AMN", "MERCOSUR Standardization Association");
+	    organizations.put("CROSQ", "CARICOM Regional Organization for Standards and Quality");
+	    organizations.put("AAQG", "America's Aerospace Quality Group");
+	    //Asia Pacific
+	    organizations.put("PASC", "Pacific Area Standards Congress");
+	    organizations.put("ACCSQ", "ASEAN Consultative Committee for Standards and Quality");
+	    //Europe
+	    organizations.put("RoyalCert", "RoyalCert International Registrars");
+	    organizations.put("CEN", "European Committee for Standardization");
+	    organizations.put("CENELEC", "European Committee for Electrotechnical Standardization");
+	    organizations.put("URS", "United Registrar of Systems, UK");
+	    organizations.put("ETSI", "European Telecommunications Standards Institute");
+	    organizations.put("EASC", "Euro-Asian Council for Standardization, Metrology and Certification");
+	    organizations.put("IRMM", "Institute for Reference Materials and Measurements (European Union)");
+	    //Middle East
+	    organizations.put("AIDMO", "Arab Industrial Development and Mining Organization");
+	    organizations.put("IAU", "International Arabic Union");
+	    //Nationally-based standards organizations
+	    //United Kingdom
+	    organizations.put("BSI", "British Standards Institution aka BSI Group");
+	    organizations.put("DStan", "UK Defence Standardization");
+	    //United States of America
+	    organizations.put("ANSI", "American National Standards Institute");
+	    organizations.put("ACI", "American Concrete Institute");
+	    organizations.put("NIST", "National Institute of Standards and Technology");
+	}
+	
+	/**
+	 * Returns the map containing the collection of the most important technical standard organizations.
+	 * 
+	 * @return the map containing the collection of the most important technical standard organizations.
+	 */
+	public static Map<String, String> getOrganizations() {
+		return organizations;
+	}
+	
+	/**
+	 * Returns the regular expression containing the most important technical standard organizations.
+	 * 
+	 * @return the regular expression containing the most important technical standard organizations.
+	 */
+	public static String getOrganzationsRegex() {
+		String regex = "(" + String.join("|", organizations.keySet()) + ")";
+		
+		return regex;
+	}
+}
\ No newline at end of file
diff --git a/tika-core/src/main/java/org/apache/tika/sax/StandardReference.java b/tika-core/src/main/java/org/apache/tika/sax/StandardReference.java
new file mode 100644
index 000000000..cb3f5a135
--- /dev/null
+++ b/tika-core/src/main/java/org/apache/tika/sax/StandardReference.java
@@ -0,0 +1,124 @@
+/*
+ * 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;
+
+/**
+ * Class that represents a standard reference.
+ *
+ */
+public class StandardReference {
+	private String mainOrganization;
+	private String separator;
+	private String secondOrganization;
+	private String identifier;
+	private double score;
+	
+	private StandardReference(String mainOrganizationAcronym, String separator, String secondOrganizationAcronym,
+			String identifier, double score) {
+		super();
+		this.mainOrganization = mainOrganizationAcronym;
+		this.separator = separator;
+		this.secondOrganization = secondOrganizationAcronym;
+		this.identifier = identifier;
+		this.score = score;
+	}
+
+	public String getMainOrganizationAcronym() {
+		return mainOrganization;
+	}
+
+	public void setMainOrganizationAcronym(String mainOrganizationAcronym) {
+		this.mainOrganization = mainOrganizationAcronym;
+	}
+
+	public String getSeparator() {
+		return separator;
+	}
+
+	public void setSeparator(String separator) {
+		this.separator = separator;
+	}
+
+	public String getSecondOrganizationAcronym() {
+		return secondOrganization;
+	}
+
+	public void setSecondOrganizationAcronym(String secondOrganizationAcronym) {
+		this.secondOrganization = secondOrganizationAcronym;
+	}
+
+	public String getIdentifier() {
+		return identifier;
+	}
+
+	public void setIdentifier(String identifier) {
+		this.identifier = identifier;
+	}
+
+	public double getScore() {
+		return score;
+	}
+
+	public void setScore(double score) {
+		this.score = score;
+	}
+
+	@Override
+	public String toString() {
+		String standardReference = mainOrganization;
+		
+		if (separator != null && !separator.isEmpty()) {
+			standardReference += separator + secondOrganization; 
+		}
+		
+		standardReference += " " + identifier;
+		
+		return standardReference;
+	}
+	
+	public static class StandardReferenceBuilder {
+		private String mainOrganization;
+		private String separator;
+		private String secondOrganization;
+		private String identifier;
+		private double score;
+		
+		public StandardReferenceBuilder(String mainOrganization, String identifier) {
+			this.mainOrganization = mainOrganization;
+			this.separator = null;
+			this.secondOrganization = null;
+			this.identifier = identifier;
+			this.score = 0;
+		}
+		
+		public StandardReferenceBuilder setSecondOrganization(String separator, String secondOrganization) {
+			this.separator = separator;
+			this.secondOrganization = secondOrganization;
+			return this;
+		}
+		
+		public StandardReferenceBuilder setScore(double score) {
+			this.score = score;
+			return this;
+		}
+		
+		public StandardReference build() {
+			return new StandardReference(mainOrganization, separator, secondOrganization, identifier, score);
+		}
+	}
+}
diff --git a/tika-core/src/main/java/org/apache/tika/sax/StandardsExtractingContentHandler.java b/tika-core/src/main/java/org/apache/tika/sax/StandardsExtractingContentHandler.java
new file mode 100644
index 000000000..5d633004f
--- /dev/null
+++ b/tika-core/src/main/java/org/apache/tika/sax/StandardsExtractingContentHandler.java
@@ -0,0 +1,116 @@
+/*
+ * 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.util.Arrays;
+import java.util.List;
+
+import org.apache.tika.metadata.Metadata;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * StandardsExtractingContentHandler is a Content Handler used to extract
+ * standard references while parsing.
+ *
+ */
+public class StandardsExtractingContentHandler extends ContentHandlerDecorator {
+	public static final String STANDARD_REFERENCES = "standard_references";
+	private Metadata metadata;
+	private StringBuilder stringBuilder;
+	private double threshold = 0;
+
+	/**
+	 * Creates a decorator for the given SAX event handler and Metadata object.
+	 * 
+	 * @param handler
+	 *            SAX event handler to be decorated.
+	 * @param metadata
+	 *            {@link Metadata} object.
+	 */
+	public StandardsExtractingContentHandler(ContentHandler handler, Metadata metadata) {
+		super(handler);
+		this.metadata = metadata;
+		this.stringBuilder = new StringBuilder();
+	}
+
+	/**
+	 * Creates a decorator that by default forwards incoming SAX events to a
+	 * dummy content handler that simply ignores all the events. Subclasses
+	 * should use the {@link #setContentHandler(ContentHandler)} method to
+	 * switch to a more usable underlying content handler. Also creates a dummy
+	 * Metadata object to store phone numbers in.
+	 */
+	protected StandardsExtractingContentHandler() {
+		this(new DefaultHandler(), new Metadata());
+	}
+
+	/**
+	 * Gets the threshold to be used for selecting the standard references found
+	 * within the text based on their score.
+	 * 
+	 * @return the threshold to be used for selecting the standard references
+	 *         found within the text based on their score.
+	 */
+	public double getThreshold() {
+		return threshold;
+	}
+
+	/**
+	 * Sets the score to be used as threshold.
+	 * 
+	 * @param score
+	 *            the score to be used as threshold.
+	 */
+	public void setThreshold(double score) {
+		this.threshold = score;
+	}
+
+	/**
+	 * The characters method is called whenever a Parser wants to pass raw
+	 * characters to the ContentHandler. However, standard references are often
+	 * split across different calls to characters, depending on the specific
+	 * Parser used. Therefore, we simply add all characters to a StringBuilder
+	 * and analyze it once the document is finished.
+	 */
+	@Override
+	public void characters(char[] ch, int start, int length) throws SAXException {
+		try {
+			String text = new String(Arrays.copyOfRange(ch, start, start + length));
+			stringBuilder.append(text);
+			super.characters(ch, start, length);
+		} catch (SAXException e) {
+			handleException(e);
+		}
+	}
+
+	/**
+	 * This method is called whenever the Parser is done parsing the file. So,
+	 * we check the output for any standard references.
+	 */
+	@Override
+	public void endDocument() throws SAXException {
+		super.endDocument();
+		List<StandardReference> standards = StandardsText.extractStandardReferences(stringBuilder.toString(),
+				threshold);
+		for (StandardReference standardReference : standards) {
+			metadata.add(STANDARD_REFERENCES, standardReference.toString());
+		}
+	}
+}
\ No newline at end of file
diff --git a/tika-core/src/main/java/org/apache/tika/sax/StandardsText.java b/tika-core/src/main/java/org/apache/tika/sax/StandardsText.java
new file mode 100644
index 000000000..7aa38c70f
--- /dev/null
+++ b/tika-core/src/main/java/org/apache/tika/sax/StandardsText.java
@@ -0,0 +1,178 @@
+/*
+ * 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.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.tika.sax.StandardReference.StandardReferenceBuilder;
+
+/**
+ * StandardText relies on regular expressions to extract standard references
+ * from text.
+ * 
+ * <p>
+ * This class helps to find the standard references from text by performing the
+ * following steps:
+ * <ol>
+ * <li>searches for headers;</li>
+ * <li>searches for patterns that are supposed to be standard references
+ * (basically, every string mostly composed of uppercase letters followed by an
+ * alphanumeric characters);</li>
+ * <li>each potential standard reference starts with score equal to 0.25;</li>
+ * <li>increases by 0.50 the score of references which include the name of a
+ * known standard organization ({@link StandardOrganizations});</li>
+ * <li>increases by 0.50 the score of references which have been found within
+ * "Applicable Documents" and equivalent sections;</li>
+ * <li>returns the standard references along with scores.</li>
+ * </ol>
+ * </p>
+ *
+ */
+public class StandardsText {
+	// Regular expression to match uppercase headers
+	private static final String REGEX_HEADER = "(\\d+\\.(\\d+\\.?)*)\\p{Blank}+([A-Z]+(\\s[A-Z]+)*){5,}";
+
+	// Regular expression to match the "APPLICABLE DOCUMENTS" and equivalent
+	// sections
+	private static final String REGEX_APPLICABLE_DOCUMENTS = "(?i:.*APPLICABLE\\sDOCUMENTS|REFERENCE|STANDARD|REQUIREMENT|GUIDELINE|COMPLIANCE.*)";
+
+	// Regular expression to match the alphanumeric identifier of the standard
+	private static final String REGEX_IDENTIFIER = "(?<identifier>([0-9]{3,}|([A-Z]+(-|_|\\.)?[0-9]{2,}))((-|_|\\.)?[A-Z0-9]+)*)";
+
+	// Regular expression to match the standard organization
+	private static final String REGEX_ORGANIZATION = StandardOrganizations.getOrganzationsRegex();
+
+	// Regular expression to match the type of publication, often reported
+	// between the name of the standard organization and the standard identifier
+	private static final String REGEX_STANDARD_TYPE = "(\\s(Publication|Standard))?";
+
+	// Regular expression to match a string that is supposed to be a standard
+	// reference
+	private static final String REGEX_FALLBACK = "\\(?" + "(?<mainOrganization>[A-Z]\\w+)"
+			+ "\\)?((\\s?(?<separator>\\/)\\s?)(\\w+\\s)*\\(?" + "(?<secondOrganization>[A-Z]\\w+)" + "\\)?)?"
+			+ REGEX_STANDARD_TYPE + "(-|\\s)?" + REGEX_IDENTIFIER;
+
+	// Regular expression to match the standard organization within a string
+	// that is supposed to be a standard reference
+	private static final String REGEX_STANDARD = ".*" + REGEX_ORGANIZATION + ".+" + REGEX_ORGANIZATION + "?.*";
+
+	/**
+	 * Extracts the standard references found within the given text.
+	 * 
+	 * @param text
+	 *            the text from which the standard references are extracted.
+	 * @param threshold
+	 *            the lower bound limit to be used in order to select only the
+	 *            standard references with score greater than or equal to the
+	 *            threshold. For instance, using a threshold of 0.75 means that
+	 *            only the patterns with score greater than or equal to 0.75
+	 *            will be returned.
+	 * @return the list of standard references extracted from the given text.
+	 */
+	public static ArrayList<StandardReference> extractStandardReferences(String text, double threshold) {
+		Map<Integer, String> headers = findHeaders(text);
+
+		ArrayList<StandardReference> standardReferences = findStandards(text, headers, threshold);
+
+		return standardReferences;
+	}
+
+	/**
+	 * This method helps to find the headers within the given text.
+	 * 
+	 * @param text
+	 *            the text from which the headers are extracted.
+	 * @return the list of headers found within the given text.
+	 */
+	private static Map<Integer, String> findHeaders(String text) {
+		Map<Integer, String> headers = new TreeMap<Integer, String>();
+
+		Pattern pattern = Pattern.compile(REGEX_HEADER);
+		Matcher matcher = pattern.matcher(text);
+
+		while (matcher.find()) {
+			headers.put(matcher.start(), matcher.group());
+		}
+
+		return headers;
+	}
+
+	/**
+	 * This method helps to find the standard references within the given text.
+	 * 
+	 * @param text
+	 *            the text from which the standards references are extracted.
+	 * @param headers
+	 *            the list of headers found within the given text.
+	 * @param threshold
+	 *            the lower bound limit to be used in order to select only the
+	 *            standard references with score greater than or equal to the
+	 *            threshold.
+	 * @return the list of standard references extracted from the given text.
+	 */
+	private static ArrayList<StandardReference> findStandards(String text, Map<Integer, String> headers,
+			double threshold) {
+		ArrayList<StandardReference> standards = new ArrayList<StandardReference>();
+		double score = 0;
+
+		Pattern pattern = Pattern.compile(REGEX_FALLBACK);
+		Matcher matcher = pattern.matcher(text);
+
+		while (matcher.find()) {
+			StandardReferenceBuilder builder = new StandardReference.StandardReferenceBuilder(
+					matcher.group("mainOrganization"), matcher.group("identifier"))
+							.setSecondOrganization(matcher.group("separator"), matcher.group("secondOrganization"));
+			score = 0.25;
+
+			if (matcher.group().matches(REGEX_STANDARD)) {
+				score += 0.50;
+			}
+
+			int startHeader = 0;
+			int endHeader = 0;
+			boolean headerFound = false;
+			Iterator<Entry<Integer, String>> iterator = headers.entrySet().iterator();
+			while (iterator.hasNext() && !headerFound) {
+				startHeader = endHeader;
+				endHeader = iterator.next().getKey();
+				if (endHeader > matcher.start()) {
+					headerFound = true;
+				}
+			}
+
+			String header = headers.get(startHeader);
+			if (header != null && headers.get(startHeader).matches(REGEX_APPLICABLE_DOCUMENTS)) {
+				score += 0.25;
+			}
+
+			builder.setScore(score);
+
+			if (score >= threshold) {
+				standards.add(builder.build());
+			}
+		}
+
+		return standards;
+	}
+}
\ No newline at end of file
diff --git a/tika-example/src/main/java/org/apache/tika/example/StandardsExtractionExample.java b/tika-example/src/main/java/org/apache/tika/example/StandardsExtractionExample.java
new file mode 100644
index 000000000..aad5fd7bb
--- /dev/null
+++ b/tika-example/src/main/java/org/apache/tika/example/StandardsExtractionExample.java
@@ -0,0 +1,109 @@
+/*
+ * 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.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Collections;
+import java.util.HashSet;
+
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.AutoDetectParser;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.Parser;
+
+/**
+ * Class to demonstrate how to use the {@link StandardsExtractingContentHandler}
+ * to get a list of the standard references from every file in a directory.
+ * 
+ * <p>
+ * You can run this main method by running 
+ * <code>
+ *   mvn exec:java -Dexec.mainClass="org.apache.tika.example.StandardsExtractionExample" -Dexec.args="/path/to/input"
+ * </code>
+ * from the tika-example directory.
+ * </p>
+ */
+public class StandardsExtractionExample {
+	private static HashSet<String> standardReferences = new HashSet<>();
+	private static int failedFiles = 0;
+	private static int successfulFiles = 0;
+
+	public static void main(String[] args) {
+		if (args.length < 1) {
+			System.err.println("Usage: " + StandardsExtractionExample.class.getName() + " /path/to/input");
+			System.exit(1);
+		}
+		String pathname = args[0];
+
+		Path folder = Paths.get(pathname);
+		System.out.println("Searching " + folder.toAbsolutePath() + "...");
+		processFolder(folder);
+		System.out.println(standardReferences.toString());
+		System.out.println("Parsed " + successfulFiles + "/" + (successfulFiles + failedFiles));
+	}
+
+	public static void processFolder(Path folder) {
+		try {
+			Files.walkFileTree(folder, new SimpleFileVisitor<Path>() {
+				@Override
+				public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+					try {
+						process(file);
+						successfulFiles++;
+					} catch (Exception e) {
+						failedFiles++;
+						// ignore this file
+					}
+					return FileVisitResult.CONTINUE;
+				}
+
+				@Override
+				public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+					failedFiles++;
+					return FileVisitResult.CONTINUE;
+				}
+			});
+		} catch (IOException e) {
+			// ignore failure
+		}
+	}
+
+	public static void process(Path path) throws Exception {
+		Parser parser = new AutoDetectParser();
+		Metadata metadata = new Metadata();
+		// The StandardsExtractingContentHandler will examine any characters for
+		// standard references before passing them
+		// to the underlying Handler.
+		StandardsExtractingContentHandler handler = new StandardsExtractingContentHandler(new BodyContentHandler(-1),
+				metadata);
+		handler.setThreshold(1.0);
+		try (InputStream stream = new BufferedInputStream(Files.newInputStream(path))) {
+			parser.parse(stream, handler, metadata, new ParseContext());
+		}
+		String[] references = metadata.getValues(StandardsExtractingContentHandler.STANDARD_REFERENCES);
+		Collections.addAll(standardReferences, references);
+	}
+}
\ No newline at end of file
diff --git a/tika-parsers/src/test/java/org/apache/tika/sax/StandardsExtractingContentHandlerTest.java b/tika-parsers/src/test/java/org/apache/tika/sax/StandardsExtractingContentHandlerTest.java
new file mode 100644
index 000000000..ff31a97f4
--- /dev/null
+++ b/tika-parsers/src/test/java/org/apache/tika/sax/StandardsExtractingContentHandlerTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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 static org.junit.Assert.*;
+
+import java.io.InputStream;
+
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.AutoDetectParser;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.Parser;
+import org.junit.Test;
+
+/**
+ * Test class for the {@link StandardsExtractingContentHandler} class.
+ */
+public class StandardsExtractingContentHandlerTest {
+
+	@Test
+	public void testExtractStandards() throws Exception {
+		Parser parser = new AutoDetectParser();
+		Metadata metadata = new Metadata();
+		
+		StandardsExtractingContentHandler handler = new StandardsExtractingContentHandler(new BodyContentHandler(-1), metadata);
+		handler.setThreshold(0.75);
+		InputStream inputStream = StandardsExtractingContentHandlerTest.class.getResourceAsStream("/test-documents/testStandardsExtractor.pdf");
+		
+		parser.parse(inputStream, handler, metadata, new ParseContext());
+		
+		String[] standardReferences = metadata.getValues(StandardsExtractingContentHandler.STANDARD_REFERENCES);
+		assertTrue(standardReferences[0].equals("ANSI/TIA 222-G"));
+		assertTrue(standardReferences[1].equals("TIA/ANSI 222-G-1"));
+	}
+}
\ No newline at end of file
diff --git a/tika-parsers/src/test/resources/test-documents/testStandardsExtractor.pdf b/tika-parsers/src/test/resources/test-documents/testStandardsExtractor.pdf
new file mode 100644
index 000000000..aad6d79d4
Binary files /dev/null and b/tika-parsers/src/test/resources/test-documents/testStandardsExtractor.pdf differ
