Index: src/main/java/org/apache/tika/config/Content.java
===================================================================
--- src/main/java/org/apache/tika/config/Content.java	(revision 582664)
+++ src/main/java/org/apache/tika/config/Content.java	(working copy)
@@ -19,11 +19,13 @@
 import org.jdom.Element;
 
 /**
- * Content object, used to configure and store data populated from XPATH, Regex,
- * Document fulltext, document metadata etc.
+ * Content object, used to configure the metadata to be extracted using
+ * XPath, Regex, and other means.
  */
 public class Content {
 
+    private final String name;
+
     private final String textSelect;
 
     private final String xPathSelect;
@@ -30,11 +32,10 @@
 
     private final String regexSelect;
 
-    private String value;
-
-    private String[] values;
-
-    public Content(String xPathSelect, String textSelect, String regexSelect) {
+    public Content(
+            String name,
+            String xPathSelect, String textSelect, String regexSelect) {
+        this.name = name;
         this.xPathSelect = xPathSelect;
         this.textSelect = textSelect;
         this.regexSelect = regexSelect;
@@ -41,6 +42,7 @@
     }
 
     public Content(Element element) {
+        name = element.getAttributeValue("name");
         xPathSelect = element.getAttributeValue("xpathSelect");
         textSelect = element.getAttributeValue("textSelect");
         regexSelect = element.getChildTextTrim("regexSelect");
@@ -46,6 +48,10 @@
         regexSelect = element.getChildTextTrim("regexSelect");
     }
 
+    public String getName() {
+        return name;
+    }
+
     public String getRegexSelect() {
         return regexSelect;
     }
@@ -58,20 +64,4 @@
         return xPathSelect;
     }
 
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    public String[] getValues() {
-        return values;
-    }
-
-    public void setValues(String[] values) {
-        this.values = values;
-    }
-
 }
Index: src/main/java/org/apache/tika/config/ParserConfig.java
===================================================================
--- src/main/java/org/apache/tika/config/ParserConfig.java	(revision 582664)
+++ src/main/java/org/apache/tika/config/ParserConfig.java	(working copy)
@@ -16,9 +16,9 @@
  */
 package org.apache.tika.config;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 
 import org.jdom.Element;
 
@@ -33,8 +33,7 @@
 
     private final String nameSpace;
 
-    private final Map<String, Content> contents =
-        new HashMap<String, Content>();
+    private final Collection<Content> contents = new ArrayList<Content>();
 
     public ParserConfig(Element element) {
         name = element.getAttributeValue("name");
@@ -43,8 +42,7 @@
         Element extract = element.getChild("extract");
         if (extract != null) {
             for (Object child : extract.getChildren()) {
-                String name = ((Element) child).getAttributeValue("name");
-                contents.put(name, new Content((Element) child));
+                contents.add(new Content((Element) child));
             }
         }
     }
@@ -61,8 +59,8 @@
         return parserClass;
     }
 
-    public Map<String, Content> getContents() {
-        return Collections.unmodifiableMap(contents);
+    public Collection<Content> getContents() {
+        return Collections.unmodifiableCollection(contents);
     }
 
 }
Index: src/main/java/org/apache/tika/parser/Parser.java
===================================================================
--- src/main/java/org/apache/tika/parser/Parser.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/Parser.java	(working copy)
@@ -21,6 +21,7 @@
 
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 
 /**
  * Tika parser interface
@@ -36,7 +37,8 @@
      * The responsibility to close the stream remains on the caller.
      *
      * @param stream the document to be parsed
-     * @param contents set of metadata information to extract
+     * @param contents configuration of metadata information to extract
+     * @param metadata document metadata
      * @return full text content of the document
      * @throws IOException if the document could not be read
      * @throws TikaException if the document could not be parsed
@@ -41,7 +43,8 @@
      * @throws IOException if the document could not be read
      * @throws TikaException if the document could not be parsed
      */
-    String parse(InputStream stream, Iterable<Content> contents)
+    String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException;
 
 }
Index: src/main/java/org/apache/tika/parser/ParserDecorator.java
===================================================================
--- src/main/java/org/apache/tika/parser/ParserDecorator.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/ParserDecorator.java	(working copy)
@@ -21,6 +21,7 @@
 
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 
 /**
  * Decorator base class for the {@link Parser} interface. This class
@@ -49,9 +50,10 @@
      * override this method (and use <code>super.parse()</code> to invoke
      * the decorated parser) to implement extra decoration.
      */
-    public String parse(InputStream stream, Iterable<Content> contents)
+    public String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException {
-        return parser.parse(stream, contents);
+        return parser.parse(stream, contents, metadata);
     }
 
 }
Index: src/main/java/org/apache/tika/parser/ParserPostProcessor.java
===================================================================
--- src/main/java/org/apache/tika/parser/ParserPostProcessor.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/ParserPostProcessor.java	(working copy)
@@ -24,6 +24,7 @@
 import org.apache.oro.text.regex.MalformedPatternException;
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.utils.RegexUtils;
 
 /**
@@ -54,18 +55,19 @@
      * Forwards the call to the delegated parser and post-processes the
      * results as described above.
      */
-    public String parse(InputStream stream, Iterable<Content> contents)
+    public String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException {
         try {
-            String contentStr = super.parse(stream, contents);
+            String contentStr = super.parse(stream, contents, metadata);
 
             for (Content content : contents) {
                 if ("fulltext".equalsIgnoreCase(content.getTextSelect())) {
-                    content.setValue(contentStr);
+                    metadata.set(content.getName(), contentStr);
                 } else if ("summary".equalsIgnoreCase(content.getTextSelect())) {
                     int length = Math.min(contentStr.length(), 500);
                     String summary = contentStr.substring(0, length);
-                    content.setValue(summary);
+                    metadata.set(content.getName(), summary);
                 } else if (content.getRegexSelect() != null) {
                     String regex = content.getRegexSelect();
                     try {
@@ -71,10 +73,8 @@
                     try {
                         List<String> values =
                             RegexUtils.extract(contentStr, regex);
-                        if (values.size() > 0) {
-                            content.setValue(values.get(0));
-                            content.setValues(
-                                    values.toArray(new String[values.size()]));
+                        for (String value : values) {
+                            metadata.add(content.getName(), value);
                         }
                     } catch (MalformedPatternException e) {
                         logger.error(
Index: src/main/java/org/apache/tika/parser/html/HtmlParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/html/HtmlParser.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/html/HtmlParser.java	(working copy)
@@ -22,6 +22,7 @@
 import org.apache.log4j.Logger;
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.Parser;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -37,7 +38,8 @@
 
     static Logger logger = Logger.getRootLogger();
 
-    public String parse(InputStream stream, Iterable<Content> contents)
+    public String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException {
         Tidy tidy = new Tidy();
         tidy.setQuiet(true);
@@ -47,7 +49,7 @@
             String text = content.getTextSelect();
             if (text != null && !text.equalsIgnoreCase("fulltext")
                     && !text.equalsIgnoreCase("summary")) {
-                extractElementTxt((Element) root, content);
+                extractElementTxt((Element) root, content, metadata);
             }
         }
         return getTextContent(root);
@@ -53,7 +55,8 @@
         return getTextContent(root);
     }
 
-    private void extractElementTxt(Element root, Content content) {
+    private void extractElementTxt(
+            Element root, Content content, Metadata metadata) {
         NodeList children = root.getElementsByTagName(content.getTextSelect());
         if (children != null) {
             if (children.getLength() > 0) {
@@ -61,11 +64,9 @@
                     Element node = (Element) children.item(0);
                     Text txt = (Text) node.getFirstChild();
                     if (txt != null) {
-                        content.setValue(txt.getData());
-
+                        metadata.set(content.getName(), txt.getData());
                     }
                 } else {
-                    String[] values = new String[100];
                     for (int i = 0; i < children.getLength(); i++) {
                         Element node = (Element) children.item(i);
                         Text txt = (Text) node.getFirstChild();
@@ -70,13 +71,9 @@
                         Element node = (Element) children.item(i);
                         Text txt = (Text) node.getFirstChild();
                         if (txt != null) {
-                            values[i] = txt.getData();
+                            metadata.add(content.getName(), txt.getData());
                         }
                     }
-                    if (values.length > 0) {
-                        content.setValue(values[0]);
-                        content.setValues(values);
-                    }
                 }
             }
         }
Index: src/main/java/org/apache/tika/parser/msexcel/MsExcelParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/msexcel/MsExcelParser.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/msexcel/MsExcelParser.java	(working copy)
@@ -21,6 +21,7 @@
 
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.utils.MSExtractor;
 
@@ -29,7 +30,8 @@
  */
 public class MsExcelParser implements Parser {
 
-    public String parse(InputStream stream, Iterable<Content> contents)
+    public String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException {
         try {
             MSExtractor extractor = new ExcelExtractor();
@@ -34,7 +36,7 @@
         try {
             MSExtractor extractor = new ExcelExtractor();
             extractor.setContents(contents);
-            extractor.extract(stream);
+            extractor.extract(stream, metadata);
             return extractor.getText();
         } catch (IOException e) {
             throw e;
Index: src/main/java/org/apache/tika/parser/mspowerpoint/MsPowerPointParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/mspowerpoint/MsPowerPointParser.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/mspowerpoint/MsPowerPointParser.java	(working copy)
@@ -21,6 +21,7 @@
 
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.utils.MSExtractor;
 
@@ -29,7 +30,8 @@
  */
 public class MsPowerPointParser implements Parser {
 
-    public String parse(InputStream stream, Iterable<Content> contents)
+    public String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException {
         try {
             MSExtractor extractor = new PPTExtractor();
@@ -34,7 +36,7 @@
         try {
             MSExtractor extractor = new PPTExtractor();
             extractor.setContents(contents);
-            extractor.extract(stream);
+            extractor.extract(stream, metadata);
             return extractor.getText();
         } catch (IOException e) {
             throw e;
Index: src/main/java/org/apache/tika/parser/msword/MsWordParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/msword/MsWordParser.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/msword/MsWordParser.java	(working copy)
@@ -21,6 +21,7 @@
 
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.utils.MSExtractor;
 
@@ -29,7 +30,8 @@
  */
 public class MsWordParser implements Parser {
 
-    public String parse(InputStream stream, Iterable<Content> contents)
+    public String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException {
         try {
             MSExtractor extractor = new WordExtractor();
@@ -34,7 +36,7 @@
         try {
             MSExtractor extractor = new WordExtractor();
             extractor.setContents(contents);
-            extractor.extract(stream);
+            extractor.extract(stream, metadata);
             return extractor.getText();
         } catch (IOException e) {
             throw e;
Index: src/main/java/org/apache/tika/parser/opendocument/OpenOfficeParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/opendocument/OpenOfficeParser.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/opendocument/OpenOfficeParser.java	(working copy)
@@ -29,6 +29,7 @@
 
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.xml.XMLParser;
 
@@ -75,7 +76,8 @@
         return xmlDoc;
     }
 
-    public String parse(InputStream stream, Iterable<Content> contents)
+    public String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException {
         Document xmlDoc = parse(stream);
         XMLParser xp = new XMLParser();
@@ -82,7 +84,7 @@
         xp.getAllDocumentNs(xmlDoc);
         for (Content content : contents) {
             if (content.getXPathSelect() != null) {
-                xp.extractContent(xmlDoc, content);
+                xp.extractContent(xmlDoc, content, metadata);
             }
         }
         return xp.concatOccurrence(xmlDoc, "//*", " ");
Index: src/main/java/org/apache/tika/parser/pdf/PDFParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/pdf/PDFParser.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/pdf/PDFParser.java	(working copy)
@@ -23,6 +23,7 @@
 
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.Parser;
 
 import org.pdfbox.pdmodel.PDDocument;
@@ -34,7 +35,8 @@
  */
 public class PDFParser implements Parser {
 
-    public String parse(InputStream stream, Iterable<Content> contents)
+    public String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException {
         try {
             PDDocument pdfDocument = PDDocument.load(stream);
@@ -48,23 +50,24 @@
                 for (Content content : contents) {
                     String text = content.getTextSelect();
                     if ("title".equalsIgnoreCase(text)) {
-                        content.setValue(metaData.getTitle());
+                        metadata.set(content.getName(), metaData.getTitle());
                     } else if ("author".equalsIgnoreCase(text)) {
-                        content.setValue(metaData.getAuthor());
+                        metadata.set(content.getName(), metaData.getAuthor());
                     } else if ("creator".equalsIgnoreCase(text)) {
-                        content.setValue(metaData.getCreator());
+                        metadata.set(content.getName(), metaData.getCreator());
                     } else if ("keywords".equalsIgnoreCase(text)) {
-                        content.setValue(metaData.getKeywords());
+                        metadata.set(content.getName(), metaData.getKeywords());
                     } else if ("producer".equalsIgnoreCase(text)) {
-                        content.setValue(metaData.getProducer());
+                        metadata.set(content.getName(), metaData.getProducer());
                     } else if ("subject".equalsIgnoreCase(text)) {
-                        content.setValue(metaData.getSubject());
+                        metadata.set(content.getName(), metaData.getSubject());
                     } else if ("trapped".equalsIgnoreCase(text)) {
-                        content.setValue(metaData.getTrapped());
+                        metadata.set(content.getName(), metaData.getTrapped());
                     } else if ("creationDate".equalsIgnoreCase(text)) {
                         Calendar calendar = metaData.getCreationDate();
                         if (calendar != null) {
-                            content.setValue(calendar.getTime().toString());
+                            metadata.set(content.getName(),
+                                    calendar.getTime().toString());
                         }
                     } else if ("modificationDate".equalsIgnoreCase(text)) {
                         Calendar calendar = metaData.getModificationDate();
@@ -69,7 +72,8 @@
                     } else if ("modificationDate".equalsIgnoreCase(text)) {
                         Calendar calendar = metaData.getModificationDate();
                         if (calendar != null) {
-                            content.setValue(calendar.getTime().toString());
+                            metadata.set(content.getName(),
+                                    calendar.getTime().toString());
                         }
                     }
                 }
Index: src/main/java/org/apache/tika/parser/rtf/RTFParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/rtf/RTFParser.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/rtf/RTFParser.java	(working copy)
@@ -24,6 +24,7 @@
 
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.Parser;
 
 /**
@@ -31,7 +32,8 @@
  */
 public class RTFParser implements Parser {
 
-    public String parse(InputStream stream, Iterable<Content> contents)
+    public String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException {
         try {
             DefaultStyledDocument sd = new DefaultStyledDocument();
Index: src/main/java/org/apache/tika/parser/txt/TXTParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/txt/TXTParser.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/txt/TXTParser.java	(working copy)
@@ -23,6 +23,7 @@
 
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.Parser;
 
 /**
@@ -30,7 +31,8 @@
  */
 public class TXTParser implements Parser {
 
-    public String parse(InputStream stream, Iterable<Content> contents)
+    public String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException {
         StringBuilder sb = new StringBuilder();
         BufferedReader br = new BufferedReader(new InputStreamReader(stream));
Index: src/main/java/org/apache/tika/parser/xml/XMLParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/xml/XMLParser.java	(revision 582664)
+++ src/main/java/org/apache/tika/parser/xml/XMLParser.java	(working copy)
@@ -24,6 +24,7 @@
 
 import org.apache.tika.config.Content;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.utils.Utils;
 
@@ -60,7 +61,8 @@
         this.namespace = namespace;
     }
 
-    public String parse(InputStream stream, Iterable<Content> contents)
+    public String parse(
+            InputStream stream, Iterable<Content> contents, Metadata metadata)
             throws IOException, TikaException {
         Document xmlDoc = Utils.parse(stream);
         if (exist(getAllDocumentNs(xmlDoc), getNamespace())) {
@@ -66,7 +68,7 @@
         if (exist(getAllDocumentNs(xmlDoc), getNamespace())) {
             for (Content content : contents) {
                 if (content.getXPathSelect() != null) {
-                    extractContent(xmlDoc, content);
+                    extractContent(xmlDoc, content, metadata);
                 }
             }
         }
@@ -167,7 +169,8 @@
         }
     }
 
-    public void extractContent(Document xmlDoc, Content content) {
+    public void extractContent(
+            Document xmlDoc, Content content, Metadata metadata) {
         try {
             JDOMXPath xp = new JDOMXPath(content.getXPathSelect());
             xp.setNamespaceContext(nsc);
@@ -173,8 +176,6 @@
             xp.setNamespaceContext(nsc);
             List selectNodes = xp.selectNodes(xmlDoc);
             Iterator nodes = selectNodes.iterator();
-            String[] values = new String[selectNodes.size()];
-            int i = 0;
             while (nodes.hasNext()) {
                 Object node = nodes.next();
                 if (node instanceof Element) {
@@ -180,30 +181,24 @@
                 if (node instanceof Element) {
                     Element elem = (Element) node;
                     if (StringUtils.isNotBlank(elem.getText())) {
-                        values[i] = elem.getText().trim();
+                        metadata.add(content.getName(), elem.getText().trim());
                     }
                 } else if (node instanceof Attribute) {
                     Attribute att = (Attribute) node;
-                    values[i] = att.getValue();
+                    metadata.add(content.getName(), att.getValue());
                 } else if (node instanceof Text) {
                     Text text = (Text) node;
-                    values[i] = text.getText();
+                    metadata.add(content.getName(), text.getText());
                 } else if (node instanceof Comment) {
                     Comment com = (Comment) node;
-                    values[i] = com.getText();
+                    metadata.add(content.getName(), com.getText());
                 } else if (node instanceof ProcessingInstruction) {
                     ProcessingInstruction pi = (ProcessingInstruction) node;
-                    values[i] = pi.getData();
+                    metadata.add(content.getName(), pi.getData());
                 } else if (node instanceof EntityRef) {
                     EntityRef er = (EntityRef) node;
-                    values[i] = er.toString();
-
+                    metadata.add(content.getName(), er.toString());
                 }
-                i++;
-            }
-            if (values.length > 0) {
-                content.setValue(values[0]);
-                content.setValues(values);
             }
         } catch (JaxenException e) {
             logger.error(e.getMessage());
Index: src/main/java/org/apache/tika/utils/MSExtractor.java
===================================================================
--- src/main/java/org/apache/tika/utils/MSExtractor.java	(revision 582664)
+++ src/main/java/org/apache/tika/utils/MSExtractor.java	(working copy)
@@ -26,6 +26,7 @@
 import org.apache.poi.poifs.eventfilesystem.POIFSReaderEvent;
 import org.apache.poi.poifs.eventfilesystem.POIFSReaderListener;
 import org.apache.tika.config.Content;
+import org.apache.tika.metadata.Metadata;
 
 /**
  * Defines a Microsoft document content extractor.
@@ -55,7 +56,7 @@
     /**
      * Extracts properties and text from an MS Document input stream
      */
-    public void extract(InputStream input) throws Exception {
+    public void extract(InputStream input, Metadata metadata) throws Exception {
         RereadableInputStream ris = new RereadableInputStream(input,
                 MEMORY_THRESHOLD);
         try {
@@ -62,7 +63,8 @@
             // First, extract properties
             this.reader = new POIFSReader();
 
-            this.reader.registerListener(new PropertiesReaderListener(),
+            this.reader.registerListener(
+                    new PropertiesReaderListener(metadata),
                     SummaryInformation.DEFAULT_STREAM_NAME);
 
             if (input.available() > 0) {
@@ -94,6 +96,12 @@
 
     private class PropertiesReaderListener implements POIFSReaderListener {
 
+        private final Metadata metadata;
+
+        public PropertiesReaderListener(Metadata metadata) {
+            this.metadata = metadata;
+        }
+
         public void processPOIFSReaderEvent(POIFSReaderEvent event) {
             if (!event.getName().startsWith(
                     SummaryInformation.DEFAULT_STREAM_NAME)) {
@@ -106,67 +114,67 @@
                 for (Content content : contents) {
                     if (content.getTextSelect().equalsIgnoreCase("title")) {
                         if (si.getTitle() != null)
-                            content.setValue(si.getTitle());
+                            metadata.set(content.getName(), si.getTitle());
                     } else if (content.getTextSelect().equalsIgnoreCase(
                     "author")) {
                         if (si.getAuthor() != null)
-                            content.setValue(si.getAuthor());
+                            metadata.set(content.getName(), si.getAuthor());
                     } else if (content.getTextSelect().equalsIgnoreCase(
                     "keywords")) {
                         if (si.getKeywords() != null)
-                            content.setValue(si.getKeywords());
+                            metadata.set(content.getName(), si.getKeywords());
                     } else if (content.getTextSelect().equalsIgnoreCase(
                     "subject")) {
                         if (si.getSubject() != null)
-                            content.setValue(si.getSubject());
+                            metadata.set(content.getName(), si.getSubject());
                     } else if (content.getTextSelect().equalsIgnoreCase(
                     "lastauthor")) {
                         if (si.getLastAuthor() != null)
-                            content.setValue(si.getLastAuthor());
+                            metadata.set(content.getName(), si.getLastAuthor());
                     } else if (content.getTextSelect().equalsIgnoreCase(
                     "comments")) {
                         if (si.getComments() != null)
-                            content.setValue(si.getComments());
+                            metadata.set(content.getName(), si.getComments());
                     } else if (content.getTextSelect().equalsIgnoreCase(
                     "template")) {
                         if (si.getTemplate() != null)
-                            content.setValue(si.getTemplate());
+                            metadata.set(content.getName(), si.getTemplate());
                     } else if (content.getTextSelect().equalsIgnoreCase(
                     "applicationname")) {
                         if (si.getApplicationName() != null)
-                            content.setValue(si.getApplicationName());
+                            metadata.set(content.getName(), si.getApplicationName());
                     } else if (content.getTextSelect().equalsIgnoreCase(
                     "revnumber")) {
                         if (si.getRevNumber() != null)
-                            content.setValue(si.getRevNumber());
+                            metadata.set(content.getName(), si.getRevNumber());
                     } else if (content.getTextSelect().equalsIgnoreCase(
                     "creationdate")) {
                         if (si.getCreateDateTime() != null)
-                            content.setValue(si.getCreateDateTime().toString());
+                            metadata.set(content.getName(), si.getCreateDateTime().toString());
                     } else if (content.getTextSelect().equalsIgnoreCase(
                     "charcount")) {
                         if (si.getCharCount() > 0)
-                            content.setValue("" + si.getCharCount());
+                            metadata.set(content.getName(), "" + si.getCharCount());
                     } else if (content.getTextSelect().equals("edittime")) {
                         if (si.getEditTime() > 0)
-                            content.setValue("" + si.getEditTime());
+                            metadata.set(content.getName(), "" + si.getEditTime());
                     } else if (content.getTextSelect().equals(
                     "lastsavedatetime")) {
                         if (si.getLastSaveDateTime() != null)
-                            content.setValue(si.getLastSaveDateTime()
-                                    .toString());
+                            metadata.set(content.getName(),
+                                    si.getLastSaveDateTime().toString());
                     } else if (content.getTextSelect().equals("pagecount")) {
                         if (si.getPageCount() > 0)
-                            content.setValue("" + si.getPageCount());
+                            metadata.set(content.getName(), "" + si.getPageCount());
                     } else if (content.getTextSelect().equals("security")) {
                         if (si.getSecurity() > 0)
-                            content.setValue("" + si.getSecurity());
+                            metadata.set(content.getName(), "" + si.getSecurity());
                     } else if (content.getTextSelect().equals("wordcount")) {
                         if (si.getWordCount() > 0)
-                            content.setValue("" + si.getWordCount());
+                            metadata.set(content.getName(), "" + si.getWordCount());
                     } else if (content.getTextSelect().equals("lastprinted")) {
                         if (si.getLastPrinted() != null)
-                            content.setValue(si.getLastPrinted().toString());
+                            metadata.set(content.getName(), si.getLastPrinted().toString());
                     }
 
                 }
Index: src/main/java/org/apache/tika/utils/ParseUtils.java
===================================================================
--- src/main/java/org/apache/tika/utils/ParseUtils.java	(revision 582664)
+++ src/main/java/org/apache/tika/utils/ParseUtils.java	(working copy)
@@ -30,6 +30,7 @@
 import org.apache.tika.config.ParserConfig;
 import org.apache.tika.config.TikaConfig;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaMimeKeys;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.ParserFactory;
@@ -172,7 +173,7 @@
             IOException {
         ParserConfig pc = config.getParserConfig(mimeType);
         Parser parser = ParserFactory.getParser(pc);
-        return parser.parse(inputStream, pc.getContents().values());
+        return parser.parse(inputStream, pc.getContents(), new Metadata());
     }
 
     /**
Index: src/main/java/org/apache/tika/utils/Utils.java
===================================================================
--- src/main/java/org/apache/tika/utils/Utils.java	(revision 582664)
+++ src/main/java/org/apache/tika/utils/Utils.java	(working copy)
@@ -24,13 +24,8 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.io.Writer;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
@@ -35,7 +30,6 @@
 import java.util.zip.ZipInputStream;
 
 import org.apache.log4j.Logger;
-import org.apache.tika.config.Content;
 import org.jdom.Document;
 import org.jdom.JDOMException;
 import org.jdom.input.SAXBuilder;
@@ -52,40 +46,6 @@
 
     static Logger logger = Logger.getRootLogger();
 
-    public static String toString(Map<String, Content> structuredContent) {
-        final StringWriter sw = new StringWriter();
-        print(structuredContent, sw);
-        return sw.toString();
-    }
-
-    public static void print(Map<String, Content> structuredContent) {
-        print(structuredContent, new OutputStreamWriter(System.out));
-    }
-
-    public static void print(Map<String, Content> structuredContent,
-            Writer outputWriter) {
-        final PrintWriter output = new PrintWriter(outputWriter, true);
-        for (Map.Entry<String, Content> entry : structuredContent.entrySet()) {
-            Content ct = entry.getValue();
-            if (ct.getValue() != null) {
-                output.print(entry.getKey() + ": ");
-                output.println(ct.getValue());
-            } else if (ct.getValues() != null) {
-                output.print(entry.getKey() + ": ");
-                for (int j = 0; j < ct.getValues().length; j++) {
-                    if (j == 0)
-                        output.println(ct.getValues()[j]);
-                    else {
-                        output.println("\t" + ct.getValues()[j]);
-                    }
-                }
-            } else { // there are no values, but there is a Content object
-                System.out.println("Content '" + entry.getKey()
-                        + "' has no values.");
-            }
-        }
-    }
-
     public static Document parse(InputStream is) {
         org.jdom.Document xmlDoc = new org.jdom.Document();
         try {
Index: src/test/java/org/apache/tika/TestParsers.java
===================================================================
--- src/test/java/org/apache/tika/TestParsers.java	(revision 582664)
+++ src/test/java/org/apache/tika/TestParsers.java	(working copy)
@@ -20,12 +20,11 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 
 import junit.framework.TestCase;
 
-import org.apache.log4j.Logger;
 import org.apache.tika.config.Content;
 import org.apache.tika.config.ParserConfig;
 import org.apache.tika.config.TikaConfig;
@@ -30,6 +29,7 @@
 import org.apache.tika.config.ParserConfig;
 import org.apache.tika.config.TikaConfig;
 import org.apache.tika.log.TikaLogger;
+import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.ParserFactory;
 import org.apache.tika.utils.ParseUtils;
@@ -117,16 +117,16 @@
         ParserConfig config = tc
         .getParserConfig("application/vnd.ms-powerpoint");
         Parser parser = ParserFactory.getParser(config);
-        Map<String, Content> contents = config.getContents();
+        Collection<Content> contents = config.getContents();
         assertNotNull(contents);
+        Metadata metadata = new Metadata();
         InputStream stream = new FileInputStream(file);
         try {
-            parser.parse(stream, contents.values());
+            parser.parse(stream, contents, metadata);
         } finally {
             stream.close();
         }
-        assertEquals("Sample Powerpoint Slide", contents.get("title")
-                .getValue());
+        assertEquals("Sample Powerpoint Slide", metadata.get(Metadata.TITLE));
     }
 
     public void testWORDxtraction() throws Exception {
@@ -136,15 +136,16 @@
         assertEquals(s1, s2);
         ParserConfig config = tc.getParserConfig("application/msword");
         Parser parser = ParserFactory.getParser(config);
-        Map<String, Content> contents = config.getContents();
+        Collection<Content> contents = config.getContents();
         assertNotNull(contents);
+        Metadata metadata = new Metadata();;
         InputStream stream = new FileInputStream(file);
         try {
-            parser.parse(stream, contents.values());
+            parser.parse(stream, contents, metadata);
         } finally {
             stream.close();
         }
-        assertEquals("Sample Word Document", contents.get("title").getValue());
+        assertEquals("Sample Word Document", metadata.get(Metadata.TITLE));
     }
 
     public void testEXCELExtraction() throws Exception {
@@ -162,15 +163,16 @@
                 .contains(expected));
         ParserConfig config = tc.getParserConfig("application/vnd.ms-excel");
         Parser parser = ParserFactory.getParser(config);
-        Map<String, Content> contents = config.getContents();
+        Collection<Content> contents = config.getContents();
         assertNotNull(contents);
+        Metadata metadata = new Metadata();;
         InputStream stream = new FileInputStream(file);
         try {
-            parser.parse(stream, contents.values());
+            parser.parse(stream, contents, metadata);
         } finally {
             stream.close();
         }
-        assertEquals("Simple Excel document", contents.get("title").getValue());
+        assertEquals("Simple Excel document", metadata.get(Metadata.TITLE));
     }
 
     public void testOOExtraction() throws Exception {
@@ -191,18 +193,18 @@
         Parser parser = ParserFactory.getParser(config);
         assertNotNull(parser);
 
-        Map<String, Content> contents = config.getContents();
+        Collection<Content> contents = config.getContents();
         assertNotNull(contents);
+        Metadata metadata = new Metadata();
         InputStream stream = new FileInputStream(file);
         try {
-            parser.parse(stream, contents.values());
+            parser.parse(stream, contents, metadata);
         } finally {
             stream.close();
         }
-        assertEquals("Title : Test Indexation Html", contents.get("title")
-                .getValue());
+        assertEquals("Title : Test Indexation Html", metadata.get(Metadata.TITLE));
 
-        final String text = Utils.toString(contents);
+        final String text = metadata.toString();
         final String expected = "Test Indexation Html";
         assertTrue("text contains '" + expected + "'", text.contains(expected));
     }
