Index: src/test/java/org/apache/tika/TestParsers.java
===================================================================
--- src/test/java/org/apache/tika/TestParsers.java	(revision 1339249)
+++ src/test/java/org/apache/tika/TestParsers.java	(working copy)
@@ -22,6 +22,7 @@
 
 import org.apache.tika.config.TikaConfig;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.xml.sax.helpers.DefaultHandler;
@@ -51,7 +52,7 @@
         } finally {
             stream.close();
         }
-        assertEquals("Sample Word Document", metadata.get(Metadata.TITLE));
+        assertEquals("Sample Word Document", metadata.get(TikaCoreProperties.TITLE));
     }
 
     public void testEXCELExtraction() throws Exception {
@@ -69,7 +70,7 @@
         } finally {
             stream.close();
         }
-        assertEquals("Simple Excel document", metadata.get(Metadata.TITLE));
+        assertEquals("Simple Excel document", metadata.get(TikaCoreProperties.TITLE));
     }
 
     public void testOptionalHyphen() throws Exception {
Index: src/test/java/org/apache/tika/parser/image/ImageMetadataExtractorTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/image/ImageMetadataExtractorTest.java	(revision 1339328)
+++ src/test/java/org/apache/tika/parser/image/ImageMetadataExtractorTest.java	(working copy)
@@ -20,8 +20,8 @@
 import java.util.GregorianCalendar;
 import java.util.Iterator;
 
-import org.apache.tika.metadata.DublinCore;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 
 import com.drew.metadata.Directory;
 import com.drew.metadata.MetadataException;
@@ -66,7 +66,7 @@
         Metadata metadata = new Metadata();
         
         new ImageMetadataExtractor.ExifHandler().handle(exif, metadata);
-        assertEquals("Should be ISO date without time zone", "2000-01-01T00:00:00", metadata.get(Metadata.DATE));
+        assertEquals("Should be ISO date without time zone", "2000-01-01T00:00:00", metadata.get(TikaCoreProperties.DATE));
     }
 
     public void testExifHandlerParseDateFallback() throws MetadataException {
@@ -77,7 +77,7 @@
         Metadata metadata = new Metadata();
         
         new ImageMetadataExtractor.ExifHandler().handle(exif, metadata);
-        assertEquals("Should try EXIF Date/Time if Original is not set", "1999-01-01T00:00:00", metadata.get(Metadata.DATE));
+        assertEquals("Should try EXIF Date/Time if Original is not set", "1999-01-01T00:00:00", metadata.get(TikaCoreProperties.DATE));
     }
     
     public void testExifHandlerParseDateError() throws MetadataException {
@@ -88,7 +88,7 @@
         Metadata metadata = new Metadata();
         
         new ImageMetadataExtractor.ExifHandler().handle(exif, metadata);
-        assertEquals("Parsing should proceed without date", null, metadata.get(Metadata.DATE));
+        assertEquals("Parsing should proceed without date", null, metadata.get(TikaCoreProperties.DATE));
     }
     
     public void testCopyUnknownFieldsHandler() throws MetadataException {
@@ -100,7 +100,7 @@
         when(t2.getTagName()).thenReturn(Metadata.KEYWORDS);
         when(t2.getDescription()).thenReturn("known");
         Tag t3 = mock(Tag.class);
-        when(t3.getTagName()).thenReturn(Metadata.DESCRIPTION);
+        when(t3.getTagName()).thenReturn(TikaCoreProperties.DESCRIPTION.getName());
         when(t3.getDescription()).thenReturn("known");
         Iterator<Tag> tags = Arrays.asList(t1, t2, t3).iterator();
         when(d.getTagIterator()).thenReturn(tags);
@@ -109,7 +109,7 @@
         assertEquals("t1", metadata.get("Image Description"));
         assertNull("keywords should be excluded from bulk copy because it is a defined field",
                 metadata.get(Metadata.KEYWORDS));
-        assertNull(metadata.get(Metadata.DESCRIPTION));
+        assertNull(metadata.get(TikaCoreProperties.DESCRIPTION));
     }
     
 }
Index: src/test/java/org/apache/tika/parser/image/xmp/JempboxExtractorTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/image/xmp/JempboxExtractorTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/image/xmp/JempboxExtractorTest.java	(working copy)
@@ -23,6 +23,7 @@
 
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.image.xmp.JempboxExtractor;
 
 import junit.framework.TestCase;
@@ -33,20 +34,20 @@
         Metadata metadata = new Metadata();
         InputStream stream = getClass().getResourceAsStream("/test-documents/testJPEG_commented.jpg");
         // set some values before extraction to see that they are overridden
-        metadata.set(Metadata.TITLE, "old title");
-        metadata.set(Metadata.DESCRIPTION, "old description");
-        metadata.set(Metadata.CREATOR, "previous author");
+        metadata.set(TikaCoreProperties.TITLE, "old title");
+        metadata.set(TikaCoreProperties.DESCRIPTION, "old description");
+        metadata.set(TikaCoreProperties.CREATOR, "previous author");
         // ... or kept in case the field is multi-value
-        metadata.add(Metadata.SUBJECT, "oldkeyword");
+        metadata.add(TikaCoreProperties.SUBJECT, "oldkeyword");
         
         JempboxExtractor extractor = new JempboxExtractor(metadata);
         extractor.parse(stream);
         
         // DublinCore fields
-        assertEquals("Tosteberga \u00C4ngar", metadata.get(Metadata.TITLE));
-        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(Metadata.DESCRIPTION));
-        assertEquals("Some Tourist", metadata.get(Metadata.CREATOR));
-        Collection<String> keywords = Arrays.asList(metadata.getValues(Metadata.SUBJECT));  
+        assertEquals("Tosteberga \u00C4ngar", metadata.get(TikaCoreProperties.TITLE));
+        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(TikaCoreProperties.DESCRIPTION));
+        assertEquals("Some Tourist", metadata.get(TikaCoreProperties.CREATOR));
+        Collection<String> keywords = Arrays.asList(metadata.getValues(TikaCoreProperties.SUBJECT));  
         assertTrue(keywords.contains("oldkeyword"));
         assertTrue(keywords.contains("grazelands"));
         assertTrue(keywords.contains("nature reserve"));
@@ -62,10 +63,10 @@
         extractor.parse(stream);
         
         // DublinCore fields
-        assertEquals("Tosteberga \u00C4ngar", metadata.get(Metadata.TITLE));
-        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(Metadata.DESCRIPTION));
-        assertEquals("Some Tourist", metadata.get(Metadata.CREATOR));
-        Collection<String> keywords = Arrays.asList(metadata.getValues(Metadata.SUBJECT));  
+        assertEquals("Tosteberga \u00C4ngar", metadata.get(TikaCoreProperties.TITLE));
+        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(TikaCoreProperties.DESCRIPTION));
+        assertEquals("Some Tourist", metadata.get(TikaCoreProperties.CREATOR));
+        Collection<String> keywords = Arrays.asList(metadata.getValues(TikaCoreProperties.SUBJECT));  
         assertTrue(keywords.contains("bird watching"));
         assertTrue(keywords.contains("coast"));
     }
@@ -78,8 +79,8 @@
         extractor.parse(stream);
         
         // XnViewMp fields not understood by Jempbox
-        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(Metadata.DESCRIPTION));
-        Collection<String> keywords = Arrays.asList(metadata.getValues(Metadata.SUBJECT));
+        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(TikaCoreProperties.DESCRIPTION));
+        Collection<String> keywords = Arrays.asList(metadata.getValues(TikaCoreProperties.SUBJECT));
         assertTrue(keywords.contains("coast"));
         assertTrue(keywords.contains("nature reserve"));
     }
Index: src/test/java/org/apache/tika/parser/image/TiffParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/image/TiffParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/image/TiffParserTest.java	(working copy)
@@ -22,6 +22,7 @@
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.image.TiffParser;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.xml.sax.helpers.DefaultHandler;
 
 import java.io.InputStream;
@@ -41,7 +42,7 @@
         assertEquals("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.", metadata.get(Metadata.DESCRIPTION));
+        		"copyright ownership.", metadata.get(TikaCoreProperties.DESCRIPTION));
         
         // All EXIF/TIFF tags
         assertEquals("Inch", metadata.get(Metadata.RESOLUTION_UNIT));
@@ -53,7 +54,7 @@
         assertEquals("3", metadata.get(Metadata.SAMPLES_PER_PIXEL));
         
         // Embedded XMP
-        List<String> subject = Arrays.asList(metadata.getValues(Metadata.SUBJECT));
+        List<String> subject = Arrays.asList(metadata.getValues(TikaCoreProperties.SUBJECT));
         assertTrue("got " + subject, subject.contains("cat"));
         assertTrue("got " + subject, subject.contains("garden"));
     }
Index: src/test/java/org/apache/tika/parser/image/MetadataFieldsTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/image/MetadataFieldsTest.java	(revision 1339328)
+++ src/test/java/org/apache/tika/parser/image/MetadataFieldsTest.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.tika.parser.image;
 
-import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TIFF;
+import org.apache.tika.metadata.TikaCoreProperties;
 
 import junit.framework.TestCase;
 
@@ -26,7 +26,7 @@
     public void testIsMetadataField() {
         assertFalse(MetadataFields.isMetadataField("random string that is not a field"));
         assertFalse(MetadataFields.isMetadataField("xyz"));
-        assertTrue(MetadataFields.isMetadataField(Metadata.SUBJECT));
+        assertTrue(MetadataFields.isMetadataField(TikaCoreProperties.SUBJECT));
         assertTrue(MetadataFields.isMetadataField(TIFF.F_NUMBER.getName()));
     }
 
Index: src/test/java/org/apache/tika/parser/jpeg/JpegParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/jpeg/JpegParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/jpeg/JpegParserTest.java	(working copy)
@@ -24,6 +24,7 @@
 
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TIFF;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.xml.sax.helpers.DefaultHandler;
@@ -65,8 +66,8 @@
         // Common tags
         //assertEquals("2009-10-02T23:02:49", metadata.get(Metadata.LAST_MODIFIED));
         assertEquals("Date/Time Original for when the photo was taken, unspecified time zone",
-                "2009-08-11T09:09:45", metadata.get(Metadata.DATE));
-        List<String> keywords = Arrays.asList(metadata.getValues(Metadata.SUBJECT));
+                "2009-08-11T09:09:45", metadata.get(TikaCoreProperties.DATE));
+        List<String> keywords = Arrays.asList(metadata.getValues(TikaCoreProperties.SUBJECT));
         assertTrue("'canon-55-250' expected in " + keywords, keywords.contains("canon-55-250"));
         assertTrue("'moscow-birds' expected in " + keywords, keywords.contains("moscow-birds")); 
         assertTrue("'serbor' expected in " + keywords, keywords.contains("serbor"));
@@ -108,7 +109,7 @@
         
         // Common tags
         assertEquals("Date/Time Original for when the photo was taken, unspecified time zone",
-                "2009-08-11T09:09:45", metadata.get(Metadata.DATE));
+                "2009-08-11T09:09:45", metadata.get(TikaCoreProperties.DATE));
         assertEquals("This image has different Date/Time than Date/Time Original, so it is probably modification date",
                 "2009-10-02T23:02:49", metadata.get(Metadata.LAST_MODIFIED));
         assertEquals("Date/Time Original should be stored in EXIF field too",
@@ -141,17 +142,17 @@
         parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
           
         // embedded comments with non-ascii characters
-        assertEquals("Tosteberga \u00C4ngar", metadata.get(Metadata.TITLE));
-        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(Metadata.DESCRIPTION));
+        assertEquals("Tosteberga \u00C4ngar", metadata.get(TikaCoreProperties.TITLE));
+        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(TikaCoreProperties.DESCRIPTION));
         assertEquals("Some Tourist", metadata.get(Metadata.AUTHOR));
-        assertEquals("Some Tourist", metadata.get(Metadata.CREATOR)); // Dublin Core
+        assertEquals("Some Tourist", metadata.get(TikaCoreProperties.CREATOR)); // Dublin Core
         // xmp handles spaces in keywords, returns "bird watching, nature reserve, coast, grazelands"
         // but we have to replace them with underscore
         
         List<String> keywords = Arrays.asList(metadata.getValues(Metadata.KEYWORDS));
         assertTrue(keywords.contains("coast"));
         assertTrue(keywords.contains("bird watching"));
-        assertEquals(keywords, Arrays.asList(metadata.getValues(Metadata.SUBJECT)));
+        assertEquals(keywords, Arrays.asList(metadata.getValues(TikaCoreProperties.SUBJECT)));
         
         // Core EXIF/TIFF tags
         assertEquals("103", metadata.get(Metadata.IMAGE_WIDTH));
@@ -180,10 +181,10 @@
         parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
           
         // embedded comments with non-ascii characters
-        assertEquals("Tosteberga \u00C4ngar", metadata.get(Metadata.TITLE));
-        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(Metadata.DESCRIPTION));
-        assertEquals("Some Tourist", metadata.get(Metadata.CREATOR));
-        List<String> subject = Arrays.asList(metadata.getValues(Metadata.SUBJECT));
+        assertEquals("Tosteberga \u00C4ngar", metadata.get(TikaCoreProperties.TITLE));
+        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(TikaCoreProperties.DESCRIPTION));
+        assertEquals("Some Tourist", metadata.get(TikaCoreProperties.CREATOR));
+        List<String> subject = Arrays.asList(metadata.getValues(TikaCoreProperties.SUBJECT));
         assertTrue("got " + subject, subject.contains("bird watching")); 
     }
     
@@ -196,10 +197,10 @@
           
         // XnViewMp's default comment dialog has only comment, not headline.
         // Comment is embedded only if "Write comments in XMP" is enabled in settings
-        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(Metadata.DESCRIPTION));
+        assertEquals("Bird site in north eastern Sk\u00E5ne, Sweden.\n(new line)", metadata.get(TikaCoreProperties.DESCRIPTION));
         // xmp handles spaces in keywords, returns "bird watching, nature reserve, coast, grazelands"
         // but we have to replace them with underscore
-        String[] subject = metadata.getValues(Metadata.SUBJECT);
+        String[] subject = metadata.getValues(TikaCoreProperties.SUBJECT);
         List<String> keywords = Arrays.asList(subject);
         assertTrue("'coast'" + " not in " + keywords, keywords.contains("coast"));
         assertTrue("'nature reserve'" + " not in " + keywords, keywords.contains("nature reserve"));     
@@ -212,8 +213,8 @@
            getClass().getResourceAsStream("/test-documents/testJPEG_oddTagComponent.jpg");
        parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
        
-       assertEquals(null, metadata.get(Metadata.TITLE));
-       assertEquals(null, metadata.get(Metadata.DESCRIPTION));
+       assertEquals(null, metadata.get(TikaCoreProperties.TITLE));
+       assertEquals(null, metadata.get(TikaCoreProperties.DESCRIPTION));
        assertEquals("251", metadata.get(Metadata.IMAGE_WIDTH));
        assertEquals("384", metadata.get(Metadata.IMAGE_LENGTH));
     }
Index: src/test/java/org/apache/tika/parser/rtf/RTFParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/rtf/RTFParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/rtf/RTFParserTest.java	(working copy)
@@ -30,6 +30,7 @@
 import org.apache.tika.TikaTest;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.WriteOutContentHandler;
 
@@ -132,7 +133,7 @@
 
         // Verify title, since it was also encoded with MS932:
         Result r = getResult("testRTF-ms932.rtf");
-        assertEquals("\u30bf\u30a4\u30c8\u30eb", r.metadata.get(Metadata.TITLE));
+        assertEquals("\u30bf\u30a4\u30c8\u30eb", r.metadata.get(TikaCoreProperties.TITLE));
     }
 
     public void testUmlautSpacesExtraction() throws Exception {
@@ -153,7 +154,7 @@
         // Verify title -- this title uses upr escape inside
         // title info field:
         assertEquals("\u30be\u30eb\u30b2\u3068\u5c3e\u5d0e\u3001\u6de1\u3005\u3068\u6700\u671f\u3000",
-                     r.metadata.get(Metadata.TITLE));
+                     r.metadata.get(TikaCoreProperties.TITLE));
         assertEquals("VMazel", r.metadata.get(Metadata.AUTHOR));
         assertEquals("StarWriter", r.metadata.get(Metadata.COMMENT));
         assertContains("1.", content);
@@ -267,7 +268,7 @@
 
         assertContains("Subject is here", content);
         assertEquals("Subject is here",
-                     r.metadata.get(Metadata.SUBJECT));
+                     r.metadata.get(TikaCoreProperties.SUBJECT));
 
         assertContains("Suddenly some Japanese text:", content);
         // Special version of (GHQ)
Index: src/test/java/org/apache/tika/parser/iwork/IWorkParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/iwork/IWorkParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/iwork/IWorkParserTest.java	(working copy)
@@ -21,6 +21,7 @@
 import junit.framework.TestCase;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
@@ -48,13 +49,13 @@
         ContentHandler handler = new BodyContentHandler();
         iWorkParser.parse(input, handler, metadata, parseContext);
 
-        assertEquals(6, metadata.size());
+        assertEquals(7, metadata.size());
         assertEquals("application/vnd.apple.keynote", metadata.get(Metadata.CONTENT_TYPE));
         assertEquals("3", metadata.get(Metadata.SLIDE_COUNT));
         assertEquals("1024", metadata.get(KeynoteContentHandler.PRESENTATION_WIDTH));
         assertEquals("768", metadata.get(KeynoteContentHandler.PRESENTATION_HEIGHT));
         assertEquals("Tika user", metadata.get(Metadata.AUTHOR));
-        assertEquals("Apache tika", metadata.get(Metadata.TITLE));
+        assertEquals("Apache tika", metadata.get(TikaCoreProperties.TITLE));
 
         String content = handler.toString();
         assertTrue(content.contains("A sample presentation"));
@@ -82,13 +83,13 @@
         ContentHandler handler = new BodyContentHandler();
         iWorkParser.parse(input, handler, metadata, parseContext);
 
-        assertEquals(51, metadata.size());
+        assertEquals(53, metadata.size());
         assertEquals("application/vnd.apple.pages", metadata.get(Metadata.CONTENT_TYPE));
         assertEquals("Tika user", metadata.get(Metadata.AUTHOR));
-        assertEquals("Apache tika", metadata.get(Metadata.TITLE));
+        assertEquals("Apache tika", metadata.get(TikaCoreProperties.TITLE));
         assertEquals("2010-05-09T21:34:38+0200", metadata.get(Metadata.CREATION_DATE));
         assertEquals("2010-05-09T23:50:36+0200", metadata.get(Metadata.LAST_MODIFIED));
-        assertEquals("en", metadata.get(Metadata.LANGUAGE));
+        assertEquals("en", metadata.get(TikaCoreProperties.LANGUAGE));
         assertEquals("2", metadata.get(Metadata.PAGE_COUNT));
 
         String content = handler.toString();
@@ -123,7 +124,7 @@
         assertEquals(9, metadata.size());
         assertEquals("2", metadata.get(Metadata.PAGE_COUNT));
         assertEquals("Tika User", metadata.get(Metadata.AUTHOR));
-        assertEquals("Account checking", metadata.get(Metadata.TITLE));
+        assertEquals("Account checking", metadata.get(TikaCoreProperties.TITLE));
         assertEquals("a comment", metadata.get(Metadata.COMMENT));
 
         assertTrue(content.contains("Category"));
Index: src/test/java/org/apache/tika/parser/mp3/Mp3ParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/mp3/Mp3ParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/mp3/Mp3ParserTest.java	(working copy)
@@ -22,6 +22,7 @@
 import junit.framework.TestCase;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.metadata.XMPDM;
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.parser.ParseContext;
@@ -51,7 +52,7 @@
         }
 
         assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
-        assertEquals("Test Title", metadata.get(Metadata.TITLE));
+        assertEquals("Test Title", metadata.get(TikaCoreProperties.TITLE));
         assertEquals("Test Artist", metadata.get(Metadata.AUTHOR));
 
         String content = handler.toString();
@@ -86,7 +87,7 @@
 
         // Check core properties
         assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
-        assertEquals("Test Title", metadata.get(Metadata.TITLE));
+        assertEquals("Test Title", metadata.get(TikaCoreProperties.TITLE));
         assertEquals("Test Artist", metadata.get(Metadata.AUTHOR));
 
         // Check the textual contents
@@ -135,7 +136,7 @@
         }
 
         assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
-        assertEquals("Test Title", metadata.get(Metadata.TITLE));
+        assertEquals("Test Title", metadata.get(TikaCoreProperties.TITLE));
         assertEquals("Test Artist", metadata.get(Metadata.AUTHOR));
 
         String content = handler.toString();
@@ -169,7 +170,7 @@
         }
 
         assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
-        assertEquals("Test Title", metadata.get(Metadata.TITLE));
+        assertEquals("Test Title", metadata.get(TikaCoreProperties.TITLE));
         assertEquals("Test Artist", metadata.get(Metadata.AUTHOR));
 
         String content = handler.toString();
@@ -203,7 +204,7 @@
        }
 
        assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
-       assertEquals("Une chason en Fran\u00e7ais", metadata.get(Metadata.TITLE));
+       assertEquals("Une chason en Fran\u00e7ais", metadata.get(TikaCoreProperties.TITLE));
        assertEquals("Test Artist \u2468\u2460", metadata.get(Metadata.AUTHOR));
        assertEquals("Test Artist \u2468\u2460", metadata.get(XMPDM.ARTIST));
        assertEquals("Test Album \u2460\u2468", metadata.get(XMPDM.ALBUM));
@@ -241,7 +242,7 @@
         }
 
         assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
-        assertEquals("Test Title", metadata.get(Metadata.TITLE));
+        assertEquals("Test Title", metadata.get(TikaCoreProperties.TITLE));
         assertEquals("Test Artist", metadata.get(Metadata.AUTHOR));
 
         String content = handler.toString();
@@ -306,7 +307,7 @@
        }
 
        assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
-       assertEquals("Plus loin vers l'ouest", metadata.get(Metadata.TITLE));
+       assertEquals("Plus loin vers l'ouest", metadata.get(TikaCoreProperties.TITLE));
        assertEquals("Merzhin", metadata.get(Metadata.AUTHOR));
 
        String content = handler.toString();
@@ -341,7 +342,7 @@
 
        // Check we coud get the headers from the start
        assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
-       assertEquals("Girl you have no faith in medicine", metadata.get(Metadata.TITLE));
+       assertEquals("Girl you have no faith in medicine", metadata.get(TikaCoreProperties.TITLE));
        assertEquals("The White Stripes", metadata.get(Metadata.AUTHOR));
 
        String content = handler.toString();
Index: src/test/java/org/apache/tika/parser/mp4/MP4ParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/mp4/MP4ParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/mp4/MP4ParserTest.java	(working copy)
@@ -22,6 +22,7 @@
 
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.metadata.XMPDM;
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.parser.ParseContext;
@@ -52,10 +53,10 @@
 
         // Check core properties
         assertEquals("audio/mp4", metadata.get(Metadata.CONTENT_TYPE));
-        assertEquals("Test Title", metadata.get(Metadata.TITLE));
+        assertEquals("Test Title", metadata.get(TikaCoreProperties.TITLE));
         assertEquals("Test Artist", metadata.get(Metadata.AUTHOR));
         assertEquals("2012-01-28T18:39:18Z", metadata.get(Metadata.CREATION_DATE));
-        assertEquals("2012-01-28T18:40:25Z", metadata.get(Metadata.MODIFIED));
+        assertEquals("2012-01-28T18:40:25Z", metadata.get(TikaCoreProperties.MODIFIED));
 
         // Check the textual contents
         String content = handler.toString();
Index: src/test/java/org/apache/tika/parser/html/HtmlParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/html/HtmlParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/html/HtmlParserTest.java	(working copy)
@@ -36,6 +36,7 @@
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Geographic;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.BodyContentHandler;
 import org.apache.tika.sax.TeeContentHandler;
@@ -76,7 +77,7 @@
         }
 
         assertEquals(
-                "Title : Test Indexation Html", metadata.get(Metadata.TITLE));
+                "Title : Test Indexation Html", metadata.get(TikaCoreProperties.TITLE));
         assertEquals("Tika Developers", metadata.get("Author"));
         assertEquals("5", metadata.get("refresh"));
         
@@ -120,7 +121,7 @@
                 HtmlParserTest.class.getResourceAsStream(path), metadata);
 
         assertEquals("application/xhtml+xml", metadata.get(Metadata.CONTENT_TYPE));
-        assertEquals("XHTML test document", metadata.get(Metadata.TITLE));
+        assertEquals("XHTML test document", metadata.get(TikaCoreProperties.TITLE));
 
         assertEquals("Tika Developers", metadata.get("Author"));
         assertEquals("5", metadata.get("refresh"));
@@ -258,7 +259,7 @@
         new HtmlParser().parse (
                 new ByteArrayInputStream(test.getBytes("UTF-8")),
                 new BodyContentHandler(),  metadata, new ParseContext());
-        assertEquals("\u017d", metadata.get(Metadata.TITLE));
+        assertEquals("\u017d", metadata.get(TikaCoreProperties.TITLE));
     }
 
     /**
Index: src/test/java/org/apache/tika/parser/prt/PRTParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/prt/PRTParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/prt/PRTParserTest.java	(working copy)
@@ -20,6 +20,7 @@
 
 import org.apache.tika.TikaTest;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.sax.BodyContentHandler;
 import org.xml.sax.ContentHandler;
 
@@ -38,11 +39,11 @@
 
           // This file has a date
           assertEquals("2011-06-20T16:54:00",
-                metadata.get(Metadata.DATE));
+                metadata.get(TikaCoreProperties.DATE));
           assertEquals("2011-06-20T16:54:00",
                 metadata.get(Metadata.CREATION_DATE));
           // But no description
-          assertEquals(null, metadata.get(Metadata.DESCRIPTION));
+          assertEquals(null, metadata.get(TikaCoreProperties.DESCRIPTION));
 
           String contents = handler.toString();
           
@@ -80,7 +81,7 @@
           assertEquals("1997-04-01T08:59:00",
                 metadata.get(Metadata.CREATION_DATE));
           assertEquals("TIKA TEST PART DESCRIPTION INFORMATION\r\n",
-                metadata.get(Metadata.DESCRIPTION));
+                metadata.get(TikaCoreProperties.DESCRIPTION));
 
           String contents = handler.toString();
           
Index: src/test/java/org/apache/tika/parser/microsoft/PowerPointParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/microsoft/PowerPointParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/microsoft/PowerPointParserTest.java	(working copy)
@@ -21,6 +21,7 @@
 
 import org.apache.tika.TikaTest;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.BodyContentHandler;
 import org.xml.sax.ContentHandler;
@@ -38,7 +39,7 @@
             assertEquals(
                     "application/vnd.ms-powerpoint",
                     metadata.get(Metadata.CONTENT_TYPE));
-            assertEquals("Sample Powerpoint Slide", metadata.get(Metadata.TITLE));
+            assertEquals("Sample Powerpoint Slide", metadata.get(TikaCoreProperties.TITLE));
             assertEquals("Keith Bennett", metadata.get(Metadata.AUTHOR));
             String content = handler.toString();
             assertTrue(content.contains("Sample Powerpoint Slide"));
@@ -104,7 +105,7 @@
 
         assertContains("Subject is here", content);
         assertEquals("Subject is here",
-                     metadata.get(Metadata.SUBJECT));
+                     metadata.get(TikaCoreProperties.SUBJECT));
 
         assertContains("Suddenly some Japanese text:", content);
         // Special version of (GHQ)
@@ -203,7 +204,7 @@
        assertEquals("2011-08-22T13:30:53Z", metadata.get(Metadata.CREATION_DATE));
        assertEquals("1",                    metadata.get(Metadata.SLIDE_COUNT));
        assertEquals("3",                    metadata.get(Metadata.WORD_COUNT));
-       assertEquals("Test extraction properties pptx", metadata.get(Metadata.TITLE));
+       assertEquals("Test extraction properties pptx", metadata.get(TikaCoreProperties.TITLE));
        assertEquals("true",                 metadata.get("custom:myCustomBoolean"));
        assertEquals("3",                    metadata.get("custom:myCustomNumber"));
        assertEquals("MyStringValue",        metadata.get("custom:MyCustomString"));
Index: src/test/java/org/apache/tika/parser/microsoft/ProjectParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/microsoft/ProjectParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/microsoft/ProjectParserTest.java	(working copy)
@@ -19,6 +19,7 @@
 import java.io.InputStream;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.BodyContentHandler;
 import org.xml.sax.ContentHandler;
@@ -61,8 +62,8 @@
                "application/vnd.ms-project",
                metadata.get(Metadata.CONTENT_TYPE));
        
-       assertEquals("The quick brown fox jumps over the lazy dog", metadata.get(Metadata.TITLE));
-       assertEquals("Gym class featuring a brown fox and lazy dog", metadata.get(Metadata.SUBJECT));
+       assertEquals("The quick brown fox jumps over the lazy dog", metadata.get(TikaCoreProperties.TITLE));
+       assertEquals("Gym class featuring a brown fox and lazy dog", metadata.get(TikaCoreProperties.SUBJECT));
        assertEquals("Nevin Nollop", metadata.get(Metadata.AUTHOR));
        assertEquals("", metadata.get(Metadata.LAST_AUTHOR));
        assertEquals("Pangram, fox, dog", metadata.get(Metadata.KEYWORDS));
Index: src/test/java/org/apache/tika/parser/microsoft/VisioParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/microsoft/VisioParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/microsoft/VisioParserTest.java	(working copy)
@@ -19,6 +19,7 @@
 import java.io.InputStream;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.BodyContentHandler;
 import org.xml.sax.ContentHandler;
@@ -38,7 +39,7 @@
             assertEquals(
                     "application/vnd.visio",
                     metadata.get(Metadata.CONTENT_TYPE));
-            assertEquals("", metadata.get(Metadata.TITLE));
+            assertEquals("", metadata.get(TikaCoreProperties.TITLE));
             assertEquals("Hogwarts", metadata.get(Metadata.AUTHOR));
             String content = handler.toString();
             assertTrue(content.contains("Some random text, on a page"));
Index: src/test/java/org/apache/tika/parser/microsoft/WordParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/microsoft/WordParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/microsoft/WordParserTest.java	(working copy)
@@ -27,6 +27,7 @@
 
 import org.apache.tika.TikaTest;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.microsoft.ooxml.OOXMLParserTest;
 import org.apache.tika.sax.BodyContentHandler;
@@ -45,7 +46,7 @@
             assertEquals(
                     "application/msword",
                     metadata.get(Metadata.CONTENT_TYPE));
-            assertEquals("Sample Word Document", metadata.get(Metadata.TITLE));
+            assertEquals("Sample Word Document", metadata.get(TikaCoreProperties.TITLE));
             assertEquals("Keith Bennett", metadata.get(Metadata.AUTHOR));
             assertTrue(handler.toString().contains("Sample Word Document"));
         } finally {
@@ -114,7 +115,7 @@
         assertEquals(
                      "application/msword",
                      metadata.get(Metadata.CONTENT_TYPE));
-        assertEquals("Sample Word Document", metadata.get(Metadata.TITLE));
+        assertEquals("Sample Word Document", metadata.get(TikaCoreProperties.TITLE));
         assertEquals("Keith Bennett", metadata.get(Metadata.AUTHOR));
         assertTrue(xml.contains("Sample Word Document"));
 
@@ -176,8 +177,8 @@
             assertEquals(
                     "application/msword",
                     metadata.get(Metadata.CONTENT_TYPE));
-            assertEquals("The quick brown fox jumps over the lazy dog", metadata.get(Metadata.TITLE));
-            assertEquals("Gym class featuring a brown fox and lazy dog", metadata.get(Metadata.SUBJECT));
+            assertEquals("The quick brown fox jumps over the lazy dog", metadata.get(TikaCoreProperties.TITLE));
+            assertEquals("Gym class featuring a brown fox and lazy dog", metadata.get(TikaCoreProperties.SUBJECT));
             assertEquals("Nevin Nollop", metadata.get(Metadata.AUTHOR));
             assertTrue(handler.toString().contains("The quick brown fox jumps over the lazy dog"));
         } finally {
@@ -241,7 +242,7 @@
 
         assertContains("Subject is here", content);
         assertEquals("Subject is here",
-                     metadata.get(Metadata.SUBJECT));
+                     metadata.get(TikaCoreProperties.SUBJECT));
 
         assertContains("Suddenly some Japanese text:", content);
         // Special version of (GHQ)
@@ -278,11 +279,11 @@
        assertEquals("Microsoft Office Word",metadata.get(Metadata.APPLICATION_NAME));
        assertEquals("1",                    metadata.get(Metadata.PAGE_COUNT));
        assertEquals("2",                    metadata.get(Metadata.WORD_COUNT));
-       assertEquals("My Title",             metadata.get(Metadata.TITLE));
+       assertEquals("My Title",             metadata.get(TikaCoreProperties.TITLE));
        assertEquals("My Keyword",           metadata.get(Metadata.KEYWORDS));
        assertEquals("Normal.dotm",          metadata.get(Metadata.TEMPLATE));
        assertEquals("My Comments",          metadata.get(Metadata.COMMENTS));
-       assertEquals("My subject",           metadata.get(Metadata.SUBJECT));
+       assertEquals("My subject",           metadata.get(TikaCoreProperties.SUBJECT));
        assertEquals("EDF-DIT",              metadata.get(Metadata.COMPANY));
        assertEquals("MyStringValue",        metadata.get("custom:MyCustomString"));
        assertEquals("2010-12-30T23:00:00Z", metadata.get("custom:MyCustomDate"));
Index: src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java	(working copy)
@@ -29,6 +29,7 @@
 import junit.framework.TestCase;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
@@ -58,7 +59,7 @@
                 metadata.get(Metadata.CONTENT_TYPE));
         assertEquals(
                 "Microsoft Outlook Express 6",
-                metadata.get(Metadata.TITLE));
+                metadata.get(TikaCoreProperties.TITLE));
         assertEquals(
                 "Nouvel utilisateur de Outlook Express",
                 metadata.get(Metadata.MESSAGE_RECIPIENT_ADDRESS));
@@ -69,7 +70,7 @@
         // Stored as Thu, 5 Apr 2007 09:26:06 -0700
         assertEquals(
                 "2007-04-05T16:26:06Z",
-                metadata.get(Metadata.DATE));
+                metadata.get(TikaCoreProperties.DATE));
 
         String content = handler.toString();
         assertTrue(content.contains(""));
@@ -131,7 +132,7 @@
                 metadata.get(Metadata.CONTENT_TYPE));
         assertEquals(
                 "Welcome to Microsoft Office Outlook 2003",
-                metadata.get(Metadata.TITLE));
+                metadata.get(TikaCoreProperties.TITLE));
 
         String content = handler.toString();
         assertTrue(content.contains("Outlook 2003"));
Index: src/test/java/org/apache/tika/parser/microsoft/TNEFParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/microsoft/TNEFParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/microsoft/TNEFParserTest.java	(working copy)
@@ -22,6 +22,7 @@
 import org.apache.tika.extractor.ParserContainerExtractor;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.BodyContentHandler;
@@ -54,7 +55,7 @@
       TNEFParser tnef = new TNEFParser();
       tnef.parse(stream, handler, metadata, new ParseContext());
       
-      assertEquals("This is a test message", metadata.get(Metadata.SUBJECT));
+      assertEquals("This is a test message", metadata.get(TikaCoreProperties.SUBJECT));
    }
    
     /**
Index: src/test/java/org/apache/tika/parser/microsoft/PublisherParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/microsoft/PublisherParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/microsoft/PublisherParserTest.java	(working copy)
@@ -19,6 +19,7 @@
 import java.io.InputStream;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.BodyContentHandler;
 import org.xml.sax.ContentHandler;
@@ -38,7 +39,7 @@
             assertEquals(
                     "application/x-mspublisher",
                     metadata.get(Metadata.CONTENT_TYPE));
-            assertEquals(null, metadata.get(Metadata.TITLE));
+            assertEquals(null, metadata.get(TikaCoreProperties.TITLE));
             assertEquals("Nick Burch", metadata.get(Metadata.AUTHOR));
             String content = handler.toString();
             assertTrue(content.contains("0123456789"));
Index: src/test/java/org/apache/tika/parser/microsoft/ExcelParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/microsoft/ExcelParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/microsoft/ExcelParserTest.java	(working copy)
@@ -24,6 +24,7 @@
 import org.apache.tika.detect.DefaultDetector;
 import org.apache.tika.detect.Detector;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.parser.ParseContext;
@@ -45,7 +46,7 @@
             assertEquals(
                     "application/vnd.ms-excel",
                     metadata.get(Metadata.CONTENT_TYPE));
-            assertEquals("Simple Excel document", metadata.get(Metadata.TITLE));
+            assertEquals("Simple Excel document", metadata.get(TikaCoreProperties.TITLE));
             assertEquals("Keith Bennett", metadata.get(Metadata.AUTHOR));
             
             // Mon Oct 01 17:13:56 BST 2007
Index: src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParserTest.java	(revision 1339390)
+++ src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParserTest.java	(working copy)
@@ -28,6 +28,7 @@
 import org.apache.tika.TikaTest;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.metadata.TikaMetadataKeys;
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.parser.ParseContext;
@@ -57,7 +58,7 @@
             assertEquals(
                     "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                     metadata.get(Metadata.CONTENT_TYPE));
-            assertEquals("Simple Excel document", metadata.get(Metadata.TITLE));
+            assertEquals("Simple Excel document", metadata.get(TikaCoreProperties.TITLE));
             assertEquals("Keith Bennett", metadata.get(Metadata.AUTHOR));
             String content = handler.toString();
             assertTrue(content.contains("Sample Excel Worksheet"));
@@ -184,7 +185,7 @@
                         "Mime-type checking for " + filename,
                         mimeTypes[i],
                         metadata.get(Metadata.CONTENT_TYPE));
-                assertEquals("Attachment Test", metadata.get(Metadata.TITLE));
+                assertEquals("Attachment Test", metadata.get(TikaCoreProperties.TITLE));
                 assertEquals("Rajiv", metadata.get(Metadata.AUTHOR));
                 
                 String content = handler.toString();
@@ -273,7 +274,7 @@
             assertEquals(
                     "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
                     metadata.get(Metadata.CONTENT_TYPE));
-            assertEquals("Sample Word Document", metadata.get(Metadata.TITLE));
+            assertEquals("Sample Word Document", metadata.get(TikaCoreProperties.TITLE));
             assertEquals("Keith Bennett", metadata.get(Metadata.AUTHOR));
             assertTrue(handler.toString().contains("Sample Word Document"));
         } finally {
@@ -344,7 +345,7 @@
       assertEquals(
                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
                    metadata.get(Metadata.CONTENT_TYPE));
-      assertEquals("Sample Word Document", metadata.get(Metadata.TITLE));
+      assertEquals("Sample Word Document", metadata.get(TikaCoreProperties.TITLE));
       assertEquals("Keith Bennett", metadata.get(Metadata.AUTHOR));
       assertTrue(xml.contains("Sample Word Document"));
             
@@ -557,7 +558,7 @@
 
         assertContains("Subject is here", content);
         assertEquals("Subject is here",
-                     metadata.get(Metadata.SUBJECT));
+                     metadata.get(TikaCoreProperties.SUBJECT));
 
         assertContains("Suddenly some Japanese text:", content);
         // Special version of (GHQ)
@@ -625,7 +626,7 @@
 
         assertContains("Subject is here", content);
         assertEquals("Subject is here",
-                     metadata.get(Metadata.SUBJECT));
+                     metadata.get(TikaCoreProperties.SUBJECT));
 
         assertContains("Suddenly some Japanese text:", content);
         // Special version of (GHQ)
@@ -729,7 +730,7 @@
              metadata.get(Metadata.CONTENT_TYPE));
        assertEquals(null,                   metadata.get(Metadata.AUTHOR));
        assertEquals(null,                   metadata.get(Metadata.LAST_AUTHOR));
-       assertEquals("2006-09-12T15:06:44Z", metadata.get(Metadata.DATE));
+       assertEquals("2006-09-12T15:06:44Z", metadata.get(TikaCoreProperties.DATE));
        assertEquals("2006-09-12T15:06:44Z", metadata.get(Metadata.CREATION_DATE));
        assertEquals("2011-08-22T14:24:38Z", metadata.get(Metadata.LAST_MODIFIED));
        assertEquals("Microsoft Excel",      metadata.get(Metadata.APPLICATION_NAME));
@@ -758,17 +759,17 @@
              metadata.get(Metadata.CONTENT_TYPE));
        assertEquals("EJ04325S",             metadata.get(Metadata.AUTHOR));
        assertEquals("Etienne Jouvin",       metadata.get(Metadata.LAST_AUTHOR));
-       assertEquals("2011-07-29T16:52:00Z", metadata.get(Metadata.DATE));
+       assertEquals("2011-07-29T16:52:00Z", metadata.get(TikaCoreProperties.DATE));
        assertEquals("2011-07-29T16:52:00Z", metadata.get(Metadata.CREATION_DATE));
        assertEquals("2012-01-03T22:14:00Z", metadata.get(Metadata.LAST_MODIFIED));
        assertEquals("Microsoft Office Word",metadata.get(Metadata.APPLICATION_NAME));
        assertEquals("1",                    metadata.get(Metadata.PAGE_COUNT));
        assertEquals("2",                    metadata.get(Metadata.WORD_COUNT));
-       assertEquals("My Title",             metadata.get(Metadata.TITLE));
+       assertEquals("My Title",             metadata.get(TikaCoreProperties.TITLE));
        assertEquals("My Keyword",           metadata.get(Metadata.KEYWORDS));
        assertEquals("Normal.dotm",          metadata.get(Metadata.TEMPLATE));
-       assertEquals("My subject",           metadata.get(Metadata.SUBJECT));
-       assertEquals("EDF-DIT",              metadata.get(Metadata.PUBLISHER));
+       assertEquals("My subject",           metadata.get(TikaCoreProperties.SUBJECT));
+       assertEquals("EDF-DIT",              metadata.get(TikaCoreProperties.PUBLISHER));
        assertEquals("true",                 metadata.get("custom:myCustomBoolean"));
        assertEquals("3",                    metadata.get("custom:myCustomNumber"));
        assertEquals("MyStringValue",        metadata.get("custom:MyCustomString"));
@@ -794,12 +795,12 @@
              metadata.get(Metadata.CONTENT_TYPE));
        assertEquals("JOUVIN ETIENNE",       metadata.get(Metadata.AUTHOR));
        assertEquals("EJ04325S",             metadata.get(Metadata.LAST_AUTHOR));
-       assertEquals("2011-08-22T13:30:53Z", metadata.get(Metadata.DATE));
+       assertEquals("2011-08-22T13:30:53Z", metadata.get(TikaCoreProperties.DATE));
        assertEquals("2011-08-22T13:30:53Z", metadata.get(Metadata.CREATION_DATE));
        assertEquals("2011-08-22T13:32:49Z", metadata.get(Metadata.LAST_MODIFIED));
        assertEquals("1",                    metadata.get(Metadata.SLIDE_COUNT));
        assertEquals("3",                    metadata.get(Metadata.WORD_COUNT));
-       assertEquals("Test extraction properties pptx", metadata.get(Metadata.TITLE));
+       assertEquals("Test extraction properties pptx", metadata.get(TikaCoreProperties.TITLE));
        assertEquals("true",                 metadata.get("custom:myCustomBoolean"));
        assertEquals("3",                    metadata.get("custom:myCustomNumber"));
        assertEquals("MyStringValue",        metadata.get("custom:MyCustomString"));
Index: src/test/java/org/apache/tika/parser/ParsingReaderTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/ParsingReaderTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/ParsingReaderTest.java	(working copy)
@@ -21,6 +21,7 @@
 import java.io.Reader;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 
 import junit.framework.TestCase;
 
@@ -83,7 +84,7 @@
                 new AutoDetectParser(), stream, metadata, new ParseContext());
         try {
             // Metadata should already be available
-            assertEquals("Simple Excel document", metadata.get(Metadata.TITLE));
+            assertEquals("Simple Excel document", metadata.get(TikaCoreProperties.TITLE));
             // Check that the internal buffering isn't broken
             assertEquals('F', (char) reader.read());
             assertEquals('e', (char) reader.read());
Index: src/test/java/org/apache/tika/parser/txt/TXTParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/txt/TXTParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/txt/TXTParserTest.java	(working copy)
@@ -20,6 +20,7 @@
 import java.io.StringWriter;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.sax.BodyContentHandler;
@@ -51,7 +52,7 @@
         
         // TIKA-501: Remove language detection from TXTParser
         assertNull(metadata.get(Metadata.CONTENT_LANGUAGE));
-        assertNull(metadata.get(Metadata.LANGUAGE));
+        assertNull(metadata.get(TikaCoreProperties.LANGUAGE));
 
         assertTrue(content.contains("Hello"));
         assertTrue(content.contains("World"));
@@ -169,13 +170,13 @@
         final String test = "Simple Content";
 
         Metadata metadata = new Metadata();
-        metadata.set(Metadata.LANGUAGE, "en");
+        metadata.set(TikaCoreProperties.LANGUAGE, "en");
 
         parser.parse(
                 new ByteArrayInputStream(test.getBytes("UTF-8")),
                 new BodyContentHandler(),  metadata, new ParseContext());
 
-        assertEquals("en", metadata.get(Metadata.LANGUAGE));
+        assertEquals("en", metadata.get(TikaCoreProperties.LANGUAGE));
     }
 
     public void testCP866() throws Exception {
Index: src/test/java/org/apache/tika/parser/asm/ClassParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/asm/ClassParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/asm/ClassParserTest.java	(working copy)
@@ -20,6 +20,7 @@
 
 import org.apache.tika.Tika;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 
 /**
  * Test case for parsing Java class files.
@@ -32,7 +33,7 @@
         String content = new Tika().parseToString(
                 ClassParserTest.class.getResourceAsStream(path), metadata);
 
-        assertEquals("AutoDetectParser", metadata.get(Metadata.TITLE));
+        assertEquals("AutoDetectParser", metadata.get(TikaCoreProperties.TITLE));
         assertEquals(
                 "AutoDetectParser.class",
                 metadata.get(Metadata.RESOURCE_NAME_KEY));
Index: src/test/java/org/apache/tika/parser/dwg/DWGParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/dwg/DWGParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/dwg/DWGParserTest.java	(working copy)
@@ -21,6 +21,7 @@
 import junit.framework.TestCase;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.sax.BodyContentHandler;
 import org.xml.sax.ContentHandler;
 
@@ -76,9 +77,9 @@
             assertEquals("image/vnd.dwg", metadata.get(Metadata.CONTENT_TYPE));
 
             assertEquals("The quick brown fox jumps over the lazy dog", 
-                    metadata.get(Metadata.TITLE));
+                    metadata.get(TikaCoreProperties.TITLE));
             assertEquals("Gym class featuring a brown fox and lazy dog",
-                    metadata.get(Metadata.SUBJECT));
+                    metadata.get(TikaCoreProperties.SUBJECT));
             assertEquals("Nevin Nollop",
                     metadata.get(Metadata.AUTHOR));
             assertEquals("Pangram, fox, dog",
@@ -86,7 +87,7 @@
             assertEquals("Lorem ipsum",
                     metadata.get(Metadata.COMMENTS).substring(0,11));
             assertEquals("http://www.alfresco.com",
-                    metadata.get(Metadata.RELATION));
+                    metadata.get(TikaCoreProperties.RELATION));
 
             String content = handler.toString();
             assertTrue(content.contains("The quick brown fox jumps over the lazy dog"));
@@ -105,12 +106,12 @@
 
             assertEquals("image/vnd.dwg", metadata.get(Metadata.CONTENT_TYPE));
             
-            assertNull(metadata.get(Metadata.TITLE));
-            assertNull(metadata.get(Metadata.SUBJECT));
+            assertNull(metadata.get(TikaCoreProperties.TITLE));
+            assertNull(metadata.get(TikaCoreProperties.SUBJECT));
             assertNull(metadata.get(Metadata.AUTHOR));
             assertNull(metadata.get(Metadata.KEYWORDS));
             assertNull(metadata.get(Metadata.COMMENTS));
-            assertNull(metadata.get(Metadata.RELATION));
+            assertNull(metadata.get(TikaCoreProperties.RELATION));
 
             String content = handler.toString();
             assertTrue(content.contains(""));
@@ -128,9 +129,9 @@
             assertEquals("image/vnd.dwg", metadata.get(Metadata.CONTENT_TYPE));
 
             assertEquals("Test Title", 
-                    metadata.get(Metadata.TITLE));
+                    metadata.get(TikaCoreProperties.TITLE));
             assertEquals("Test Subject",
-                    metadata.get(Metadata.SUBJECT));
+                    metadata.get(TikaCoreProperties.SUBJECT));
             assertEquals("My Author",
                     metadata.get(Metadata.AUTHOR));
             assertEquals("My keyword1, MyKeyword2",
@@ -140,7 +141,7 @@
             assertEquals("bejanpol",
                     metadata.get(Metadata.LAST_AUTHOR));
             assertEquals("http://mycompany/drawings",
-                    metadata.get(Metadata.RELATION));
+                    metadata.get(TikaCoreProperties.RELATION));
             assertEquals("MyCustomPropertyValue",
                   metadata.get("MyCustomProperty"));
 
Index: src/test/java/org/apache/tika/parser/mail/RFC822ParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/mail/RFC822ParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/mail/RFC822ParserTest.java	(working copy)
@@ -31,6 +31,7 @@
 import org.apache.james.mime4j.stream.MimeConfig;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.sax.BodyContentHandler;
@@ -59,7 +60,7 @@
             verify(handler).endDocument();
             //note no leading spaces, and no quotes
             assertEquals("Julien Nioche (JIRA) <jira@apache.org>", metadata.get(Metadata.AUTHOR));
-            assertEquals("[jira] Commented: (TIKA-461) RFC822 messages not parsed", metadata.get(Metadata.SUBJECT));
+            assertEquals("[jira] Commented: (TIKA-461) RFC822 messages not parsed", metadata.get(TikaCoreProperties.SUBJECT));
         } catch (Exception e) {
             fail("Exception thrown: " + e.getMessage());
         }
@@ -147,7 +148,7 @@
             //tests correct decoding of internationalized headers, both
             //quoted-printable (Q) and Base64 (B).
             assertEquals("Keld J\u00F8rn Simonsen <keld@dkuug.dk>", metadata.get(Metadata.AUTHOR));
-            assertEquals("If you can read this you understand the example.", metadata.get(Metadata.SUBJECT));
+            assertEquals("If you can read this you understand the example.", metadata.get(TikaCoreProperties.SUBJECT));
         } catch (Exception e) {
             fail("Exception thrown: " + e.getMessage());
         }
@@ -165,7 +166,7 @@
 
        parser.parse(stream, handler, metadata, new ParseContext());
        assertEquals("Saved by Windows Internet Explorer 7", metadata.get(Metadata.AUTHOR));
-       assertEquals("Air Permit Programs | Air & Radiation | US EPA", metadata.get(Metadata.SUBJECT));
+       assertEquals("Air Permit Programs | Air & Radiation | US EPA", metadata.get(TikaCoreProperties.SUBJECT));
     }
 
     /**
@@ -220,7 +221,7 @@
        assertEquals(true, metadata.isMultiValued(Metadata.MESSAGE_TO));
        assertEquals("abc", metadata.getValues(Metadata.MESSAGE_TO)[0]);
        assertEquals("def", metadata.getValues(Metadata.MESSAGE_TO)[1]);
-       assertEquals("abcd", metadata.get(Metadata.SUBJECT));
+       assertEquals("abcd", metadata.get(TikaCoreProperties.SUBJECT));
        assertTrue(handler.toString().contains("bar biz bat"));
     }
 
Index: src/test/java/org/apache/tika/parser/ibooks/iBooksParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/ibooks/iBooksParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/ibooks/iBooksParserTest.java	(working copy)
@@ -21,6 +21,7 @@
 import junit.framework.TestCase;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.epub.EpubParser;
 import org.apache.tika.sax.BodyContentHandler;
@@ -39,11 +40,11 @@
             assertEquals("application/x-ibooks+zip",
                     metadata.get(Metadata.CONTENT_TYPE));
             assertEquals("en-GB",
-                    metadata.get(Metadata.LANGUAGE));
+                    metadata.get(TikaCoreProperties.LANGUAGE));
             assertEquals("iBooks Author v1.0",
-                    metadata.get(Metadata.CONTRIBUTOR));
+                    metadata.get(TikaCoreProperties.CONTRIBUTOR));
             assertEquals("Apache",
-                    metadata.get(Metadata.CREATOR));
+                    metadata.get(TikaCoreProperties.CREATOR));
 
             /* TODO For some reason, the xhtml files in iBooks-style ePub are not parsed properly, and the content comes back empty.git che
             String content = handler.toString();
Index: src/test/java/org/apache/tika/parser/epub/EpubParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/epub/EpubParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/epub/EpubParserTest.java	(working copy)
@@ -21,6 +21,7 @@
 import junit.framework.TestCase;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.BodyContentHandler;
 import org.xml.sax.ContentHandler;
@@ -38,11 +39,11 @@
             assertEquals("application/epub+zip",
                     metadata.get(Metadata.CONTENT_TYPE));
             assertEquals("en",
-                    metadata.get(Metadata.LANGUAGE));
+                    metadata.get(TikaCoreProperties.LANGUAGE));
             assertEquals("This is an ePub test publication for Tika.",
-                    metadata.get(Metadata.DESCRIPTION));
+                    metadata.get(TikaCoreProperties.DESCRIPTION));
             assertEquals("Apache",
-                    metadata.get(Metadata.PUBLISHER));
+                    metadata.get(TikaCoreProperties.PUBLISHER));
 
             String content = handler.toString();
             assertTrue(content.contains("Plus a simple div"));
Index: src/test/java/org/apache/tika/parser/xml/DcXMLParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/xml/DcXMLParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/xml/DcXMLParserTest.java	(working copy)
@@ -21,6 +21,7 @@
 import junit.framework.TestCase;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.sax.BodyContentHandler;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.helpers.DefaultHandler;
@@ -38,34 +39,34 @@
             assertEquals(
                     "application/xml",
                     metadata.get(Metadata.CONTENT_TYPE));
-            assertEquals("Tika test document", metadata.get(Metadata.TITLE));
-            assertEquals("Rida Benjelloun", metadata.get(Metadata.CREATOR));
+            assertEquals("Tika test document", metadata.get(TikaCoreProperties.TITLE));
+            assertEquals("Rida Benjelloun", metadata.get(TikaCoreProperties.CREATOR));
             
             // The file contains 5 dc:subject tags, which come through as
             //  a multi-valued Tika Metadata entry in file order
-            assertEquals(true, metadata.isMultiValued(Metadata.SUBJECT));
-            assertEquals(5,      metadata.getValues(Metadata.SUBJECT).length);
-            assertEquals("Java", metadata.getValues(Metadata.SUBJECT)[0]);
-            assertEquals("XML",  metadata.getValues(Metadata.SUBJECT)[1]);
-            assertEquals("XSLT", metadata.getValues(Metadata.SUBJECT)[2]);
-            assertEquals("JDOM", metadata.getValues(Metadata.SUBJECT)[3]);
-            assertEquals("Indexation", metadata.getValues(Metadata.SUBJECT)[4]);
+            assertEquals(true, metadata.isMultiValued(TikaCoreProperties.SUBJECT));
+            assertEquals(5,      metadata.getValues(TikaCoreProperties.SUBJECT).length);
+            assertEquals("Java", metadata.getValues(TikaCoreProperties.SUBJECT)[0]);
+            assertEquals("XML",  metadata.getValues(TikaCoreProperties.SUBJECT)[1]);
+            assertEquals("XSLT", metadata.getValues(TikaCoreProperties.SUBJECT)[2]);
+            assertEquals("JDOM", metadata.getValues(TikaCoreProperties.SUBJECT)[3]);
+            assertEquals("Indexation", metadata.getValues(TikaCoreProperties.SUBJECT)[4]);
 
             assertEquals(
                     "Framework d\'indexation des documents XML, HTML, PDF etc..",
-                    metadata.get(Metadata.DESCRIPTION));
+                    metadata.get(TikaCoreProperties.DESCRIPTION));
             assertEquals(
                     "http://www.apache.org",
-                    metadata.get(Metadata.IDENTIFIER));
-            assertEquals("test", metadata.get(Metadata.TYPE));
-            assertEquals("application/msword", metadata.get(Metadata.FORMAT));
-            assertEquals("Fr", metadata.get(Metadata.LANGUAGE));
-            assertTrue(metadata.get(Metadata.RIGHTS).contains("testing chars"));
+                    metadata.get(TikaCoreProperties.IDENTIFIER));
+            assertEquals("test", metadata.get(TikaCoreProperties.TYPE));
+            assertEquals("application/msword", metadata.get(TikaCoreProperties.FORMAT));
+            assertEquals("Fr", metadata.get(TikaCoreProperties.LANGUAGE));
+            assertTrue(metadata.get(TikaCoreProperties.RIGHTS).contains("testing chars"));
 
             String content = handler.toString();
             assertTrue(content.contains("Tika test document"));
             
-            assertEquals("2000-12-01T00:00:00.000Z", metadata.get(Metadata.DATE));
+            assertEquals("2000-12-01T00:00:00.000Z", metadata.get(TikaCoreProperties.DATE));
         } finally {
             input.close();
         }
@@ -78,7 +79,7 @@
             new DcXMLParser().parse(input, new DefaultHandler(), metadata);
             
             final String expected = "Archim\u00E8de et Lius \u00E0 Ch\u00E2teauneuf testing chars en \u00E9t\u00E9";
-            assertEquals(expected,metadata.get(Metadata.RIGHTS));
+            assertEquals(expected,metadata.get(TikaCoreProperties.RIGHTS));
         } finally {
             input.close();
         }
Index: src/test/java/org/apache/tika/parser/feed/FeedParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/feed/FeedParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/feed/FeedParserTest.java	(working copy)
@@ -21,6 +21,7 @@
 import junit.framework.TestCase;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.BodyContentHandler;
 import org.xml.sax.ContentHandler;
@@ -41,8 +42,8 @@
             assertFalse(content == null);
 
             assertEquals("Sample RSS File for Junit test",
-                    metadata.get(Metadata.DESCRIPTION));
-            assertEquals("TestChannel", metadata.get(Metadata.TITLE));
+                    metadata.get(TikaCoreProperties.DESCRIPTION));
+            assertEquals("TestChannel", metadata.get(TikaCoreProperties.TITLE));
 
             // TODO find a way of testing the paragraphs and anchors
 
Index: src/test/java/org/apache/tika/parser/netcdf/NetCDFParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/netcdf/NetCDFParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/netcdf/NetCDFParserTest.java	(working copy)
@@ -21,6 +21,7 @@
 
 //TIKA imports
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.sax.BodyContentHandler;
@@ -52,7 +53,7 @@
             stream.close();
         }
 
-        assertEquals(metadata.get(Metadata.TITLE),
+        assertEquals(metadata.get(TikaCoreProperties.TITLE),
                 "model output prepared for IPCC AR4");
         assertEquals(metadata.get(Metadata.CONTACT), "ccsm@ucar.edu");
         assertEquals(metadata.get(Metadata.PROJECT_ID),
Index: src/test/java/org/apache/tika/parser/mbox/MboxParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/mbox/MboxParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/mbox/MboxParserTest.java	(working copy)
@@ -27,6 +27,7 @@
 import junit.framework.TestCase;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.sax.XHTMLContentHandler;
@@ -69,14 +70,14 @@
             verify(handler).characters(new String("Test content").toCharArray(), 0, 12);
             verify(handler).endDocument();
 
-            assertEquals("subject", metadata.get(Metadata.TITLE));
-            assertEquals("subject", metadata.get(Metadata.SUBJECT));
+            assertEquals("subject", metadata.get(TikaCoreProperties.TITLE));
+            assertEquals("subject", metadata.get(TikaCoreProperties.SUBJECT));
             assertEquals("<author@domain.com>", metadata.get(Metadata.AUTHOR));
-            assertEquals("<author@domain.com>", metadata.get(Metadata.CREATOR));
+            assertEquals("<author@domain.com>", metadata.get(TikaCoreProperties.CREATOR));
             assertEquals(null, metadata.get(Metadata.MESSAGE_RECIPIENT_ADDRESS));
             assertEquals("<name@domain.com>", metadata.get("MboxParser-return-path"));
             assertEquals("Should be ISO date in UTC, converted from 'Tue, 9 Jun 2009 23:58:45 -0400'", 
-                    "2009-06-10T03:58:45Z", metadata.get(Metadata.DATE));
+                    "2009-06-10T03:58:45Z", metadata.get(TikaCoreProperties.DATE));
         } catch (Exception e) {
             fail("Exception thrown: " + e.getMessage());
         }
@@ -133,10 +134,10 @@
         try {
             parser.parse(stream, handler, metadata, new ParseContext());
 
-            assertEquals("Re: question about when shuffle/sort start working", metadata.get(Metadata.TITLE));
-            assertEquals("Re: question about when shuffle/sort start working", metadata.get(Metadata.SUBJECT));
+            assertEquals("Re: question about when shuffle/sort start working", metadata.get(TikaCoreProperties.TITLE));
+            assertEquals("Re: question about when shuffle/sort start working", metadata.get(TikaCoreProperties.SUBJECT));
             assertEquals("Jothi Padmanabhan <jothipn@yahoo-inc.com>", metadata.get(Metadata.AUTHOR));
-            assertEquals("Jothi Padmanabhan <jothipn@yahoo-inc.com>", metadata.get(Metadata.CREATOR));
+            assertEquals("Jothi Padmanabhan <jothipn@yahoo-inc.com>", metadata.get(TikaCoreProperties.CREATOR));
             assertEquals("core-user@hadoop.apache.org", metadata.get(Metadata.MESSAGE_RECIPIENT_ADDRESS));
             
             verify(handler).startDocument();
Index: src/test/java/org/apache/tika/parser/font/AdobeFontMetricParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/font/AdobeFontMetricParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/font/AdobeFontMetricParserTest.java	(working copy)
@@ -19,6 +19,7 @@
 import junit.framework.TestCase;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
@@ -46,7 +47,7 @@
         }
 
         assertEquals("application/x-font-adobe-metric", metadata.get(Metadata.CONTENT_TYPE));
-        assertEquals("TestFullName", metadata.get(Metadata.TITLE));
+        assertEquals("TestFullName", metadata.get(TikaCoreProperties.TITLE));
         assertEquals("Fri Jul 15 17:50:51 2011", metadata.get(Metadata.CREATION_DATE));
         
         assertEquals("TestFontName", metadata.get("FontName"));
Index: src/test/java/org/apache/tika/parser/odf/ODFParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/odf/ODFParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/odf/ODFParserTest.java	(working copy)
@@ -20,6 +20,8 @@
 
 import org.apache.tika.TikaTest;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
+import org.apache.tika.metadata.Office;
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
@@ -76,15 +78,24 @@
              assertEquals(
                    "application/vnd.oasis.opendocument.text",
                    metadata.get(Metadata.CONTENT_TYPE));
-             assertEquals("2007-09-14T11:07:10", metadata.get(Metadata.DATE));
+             assertEquals("2007-09-14T11:07:10", metadata.get(TikaCoreProperties.DATE));
              assertEquals("2007-09-14T11:06:08", metadata.get(Metadata.CREATION_DATE));
-             assertEquals("en-US", metadata.get(Metadata.LANGUAGE));
+             assertEquals("en-US", metadata.get(TikaCoreProperties.LANGUAGE));
              assertEquals("PT1M7S", metadata.get(Metadata.EDIT_TIME));
              assertEquals(
                    "NeoOffice/2.2$Unix OpenOffice.org_project/680m18$Build-9161",
                    metadata.get("generator"));
              
              // Check the document statistics
+             assertEquals("1", metadata.get(Office.PAGE_COUNT));
+             assertEquals("1", metadata.get(Office.PARAGRAPH_COUNT));
+             assertEquals("14", metadata.get(Office.WORD_COUNT));
+             assertEquals("78", metadata.get(Office.CHARACTER_COUNT));
+             assertEquals("0", metadata.get(Office.TABLE_COUNT));
+             assertEquals("0", metadata.get(Office.OBJECT_COUNT));
+             assertEquals("0", metadata.get(Office.IMAGE_COUNT));
+             
+             // Check the Tika-1.0 style document statistics
              assertEquals("1", metadata.get(Metadata.PAGE_COUNT));
              assertEquals("1", metadata.get(Metadata.PARAGRAPH_COUNT));
              assertEquals("14", metadata.get(Metadata.WORD_COUNT));
@@ -93,7 +104,7 @@
              assertEquals("0", metadata.get(Metadata.OBJECT_COUNT));
              assertEquals("0", metadata.get(Metadata.IMAGE_COUNT));
              
-             // Check the old style statistics (these will be removed shortly)
+             // Check the very old style statistics (these will be removed shortly)
              assertEquals("0", metadata.get("nbTab"));
              assertEquals("0", metadata.get("nbObject"));
              assertEquals("0", metadata.get("nbImg"));
@@ -133,10 +144,10 @@
            assertEquals(
                    "application/vnd.oasis.opendocument.formula",
                    metadata.get(Metadata.CONTENT_TYPE));
-           assertEquals(null, metadata.get(Metadata.DATE));
+           assertEquals(null, metadata.get(TikaCoreProperties.DATE));
            assertEquals("2006-01-27T11:55:22", metadata.get(Metadata.CREATION_DATE));
-           assertEquals("The quick brown fox jumps over the lazy dog", metadata.get(Metadata.TITLE));
-           assertEquals("Gym class featuring a brown fox and lazy dog", metadata.get(Metadata.SUBJECT));
+           assertEquals("The quick brown fox jumps over the lazy dog", metadata.get(TikaCoreProperties.TITLE));
+           assertEquals("Gym class featuring a brown fox and lazy dog", metadata.get(TikaCoreProperties.SUBJECT));
            assertEquals("PT0S", metadata.get(Metadata.EDIT_TIME));
            assertEquals("1", metadata.get("editing-cycles"));
            assertEquals(
@@ -188,12 +199,12 @@
            assertEquals(
                    "application/vnd.oasis.opendocument.text",
                    metadata.get(Metadata.CONTENT_TYPE));
-           assertEquals("2009-10-05T21:22:38", metadata.get(Metadata.DATE));
+           assertEquals("2009-10-05T21:22:38", metadata.get(TikaCoreProperties.DATE));
            assertEquals("2009-10-05T19:04:01", metadata.get(Metadata.CREATION_DATE));
-           assertEquals("Apache Tika", metadata.get(Metadata.TITLE));
-           assertEquals("Test document", metadata.get(Metadata.SUBJECT));
-           assertEquals("A rather complex document", metadata.get(Metadata.DESCRIPTION));
-           assertEquals("Bart Hanssens", metadata.get(Metadata.CREATOR));
+           assertEquals("Apache Tika", metadata.get(TikaCoreProperties.TITLE));
+           assertEquals("Test document", metadata.get(TikaCoreProperties.SUBJECT));
+           assertEquals("A rather complex document", metadata.get(TikaCoreProperties.DESCRIPTION));
+           assertEquals("Bart Hanssens", metadata.get(TikaCoreProperties.CREATOR));
            assertEquals("Bart Hanssens", metadata.get("initial-creator"));
            assertEquals("2", metadata.get("editing-cycles"));
            assertEquals("PT02H03M24S", metadata.get(Metadata.EDIT_TIME));
@@ -209,6 +220,15 @@
            assertEquals(null, metadata.get("custom:Info 4"));
            
            // Check the document statistics
+           assertEquals("2", metadata.get(Office.PAGE_COUNT));
+           assertEquals("13", metadata.get(Office.PARAGRAPH_COUNT));
+           assertEquals("54", metadata.get(Office.WORD_COUNT));
+           assertEquals("351", metadata.get(Office.CHARACTER_COUNT));
+           assertEquals("0", metadata.get(Office.TABLE_COUNT));
+           assertEquals("2", metadata.get(Office.OBJECT_COUNT));
+           assertEquals("0", metadata.get(Office.IMAGE_COUNT));
+           
+           // Check the Tika-1.0 style document statistics
            assertEquals("2", metadata.get(Metadata.PAGE_COUNT));
            assertEquals("13", metadata.get(Metadata.PARAGRAPH_COUNT));
            assertEquals("54", metadata.get(Metadata.WORD_COUNT));
Index: src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
===================================================================
--- src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java	(revision 1339249)
+++ src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java	(working copy)
@@ -26,6 +26,7 @@
 
 import org.apache.tika.TikaTest;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
@@ -53,7 +54,7 @@
 
         assertEquals("application/pdf", metadata.get(Metadata.CONTENT_TYPE));
         assertEquals("Bertrand Delacr\u00e9taz", metadata.get(Metadata.AUTHOR));
-        assertEquals("Apache Tika - Apache Tika", metadata.get(Metadata.TITLE));
+        assertEquals("Apache Tika - Apache Tika", metadata.get(TikaCoreProperties.TITLE));
         
         // Can't reliably test dates yet - see TIKA-451 
 //        assertEquals("Sat Sep 15 10:02:31 BST 2007", metadata.get(Metadata.CREATION_DATE));
@@ -87,7 +88,7 @@
 
         assertEquals("application/pdf", metadata.get(Metadata.CONTENT_TYPE));
         assertEquals("Document author", metadata.get(Metadata.AUTHOR));
-        assertEquals("Document title", metadata.get(Metadata.TITLE));
+        assertEquals("Document title", metadata.get(TikaCoreProperties.TITLE));
         
         assertEquals("Custom Value", metadata.get("Custom Property"));
         assertEquals("Array Entry 1", metadata.get("Custom Array"));
@@ -120,8 +121,8 @@
 
        assertEquals("application/pdf", metadata.get(Metadata.CONTENT_TYPE));
        assertEquals("The Bank of England", metadata.get(Metadata.AUTHOR));
-       assertEquals("Speeches by Andrew G Haldane", metadata.get(Metadata.SUBJECT));
-       assertEquals("Rethinking the Financial Network, Speech by Andrew G Haldane, Executive Director, Financial Stability delivered at the Financial Student Association, Amsterdam on 28 April 2009", metadata.get(Metadata.TITLE));
+       assertEquals("Speeches by Andrew G Haldane", metadata.get(TikaCoreProperties.SUBJECT));
+       assertEquals("Rethinking the Financial Network, Speech by Andrew G Haldane, Executive Director, Financial Stability delivered at the Financial Student Association, Amsterdam on 28 April 2009", metadata.get(TikaCoreProperties.TITLE));
 
        String content = handler.toString();
        assertTrue(content.contains("RETHINKING THE FINANCIAL NETWORK"));
@@ -150,8 +151,8 @@
 
        assertEquals("application/pdf", metadata.get(Metadata.CONTENT_TYPE));
        assertEquals("The Bank of England", metadata.get(Metadata.AUTHOR));
-       assertEquals("Speeches by Andrew G Haldane", metadata.get(Metadata.SUBJECT));
-       assertEquals("Rethinking the Financial Network, Speech by Andrew G Haldane, Executive Director, Financial Stability delivered at the Financial Student Association, Amsterdam on 28 April 2009", metadata.get(Metadata.TITLE));
+       assertEquals("Speeches by Andrew G Haldane", metadata.get(TikaCoreProperties.SUBJECT));
+       assertEquals("Rethinking the Financial Network, Speech by Andrew G Haldane, Executive Director, Financial Stability delivered at the Financial Student Association, Amsterdam on 28 April 2009", metadata.get(TikaCoreProperties.TITLE));
 
        assertTrue(content.contains("RETHINKING THE FINANCIAL NETWORK"));
        assertTrue(content.contains("On 16 November 2002"));
@@ -233,7 +234,7 @@
 
         assertContains("Subject is here", content);
         assertEquals("Subject is here",
-                     metadata.get(Metadata.SUBJECT));
+                     metadata.get(TikaCoreProperties.SUBJECT));
 
         assertContains("Suddenly some Japanese text:", content);
         // Special version of (GHQ)
Index: src/main/java/org/apache/tika/parser/asm/XHTMLClassVisitor.java
===================================================================
--- src/main/java/org/apache/tika/parser/asm/XHTMLClassVisitor.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/asm/XHTMLClassVisitor.java	(working copy)
@@ -21,6 +21,7 @@
 
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.sax.XHTMLContentHandler;
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.Attribute;
@@ -78,7 +79,7 @@
             className = className.substring(dot + 1);
         }
 
-        metadata.set(Metadata.TITLE, className);
+        metadata.set(TikaCoreProperties.TITLE, className);
         metadata.set(Metadata.RESOURCE_NAME_KEY, className + ".class");
 
         try {
Index: src/main/java/org/apache/tika/parser/dwg/DWGParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/dwg/DWGParser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/dwg/DWGParser.java	(working copy)
@@ -26,6 +26,7 @@
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.EndianUtils;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
@@ -52,22 +53,22 @@
 
     /** The order of the fields in the header */
     private static final String[] HEADER_PROPERTIES_ENTRIES = {
-        Metadata.TITLE, 
-        Metadata.SUBJECT,
+        TikaCoreProperties.TITLE.getName(), 
+        TikaCoreProperties.SUBJECT.getName(),
         Metadata.AUTHOR,
         Metadata.KEYWORDS,
         Metadata.COMMENTS,
         Metadata.LAST_AUTHOR,
         null, // Unknown?
-        Metadata.RELATION, // Hyperlink
+        TikaCoreProperties.RELATION.getName(), // Hyperlink
     };
 
     /** For the 2000 file, they're indexed */
     private static final String[] HEADER_2000_PROPERTIES_ENTRIES = {
        null, 
-       Metadata.RELATION, // 0x01
-       Metadata.TITLE,    // 0x02
-       Metadata.SUBJECT,  // 0x03
+       TikaCoreProperties.RELATION.getName(), // 0x01
+       TikaCoreProperties.TITLE.getName(),    // 0x02
+       TikaCoreProperties.SUBJECT.getName(),  // 0x03
        Metadata.AUTHOR,   // 0x04
        null,
        Metadata.COMMENTS, // 0x06 
Index: src/main/java/org/apache/tika/parser/image/ImageMetadataExtractor.java
===================================================================
--- src/main/java/org/apache/tika/parser/image/ImageMetadataExtractor.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/image/ImageMetadataExtractor.java	(working copy)
@@ -33,6 +33,7 @@
 import org.apache.tika.metadata.Geographic;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.xml.sax.SAXException;
 
 import com.drew.imaging.jpeg.JpegProcessingException;
@@ -300,9 +301,9 @@
          * Use IPTC for other annotation fields, and XMP for unicode support.
          */
         public void handleCommentTags(Directory directory, Metadata metadata) {
-            if (metadata.get(Metadata.DESCRIPTION) == null &&
+            if (metadata.get(TikaCoreProperties.DESCRIPTION) == null &&
                     directory.containsTag(ExifDirectory.TAG_IMAGE_DESCRIPTION)) {
-                metadata.set(Metadata.DESCRIPTION, directory.getString(ExifDirectory.TAG_IMAGE_DESCRIPTION));
+                metadata.set(TikaCoreProperties.DESCRIPTION, directory.getString(ExifDirectory.TAG_IMAGE_DESCRIPTION));
             }
         }
         /**
@@ -415,7 +416,7 @@
                 // Unless we have GPS time we don't know the time zone so date must be set
                 // as ISO 8601 datetime without timezone suffix (no Z or +/-)
                 String datetimeNoTimeZone = DATE_UNSPECIFIED_TZ.format(original); // Same time zone as Metadata Extractor uses
-                metadata.set(Metadata.DATE, datetimeNoTimeZone);
+                metadata.set(TikaCoreProperties.DATE, datetimeNoTimeZone);
                 metadata.set(Metadata.ORIGINAL_DATE, datetimeNoTimeZone);
             }
             if (directory.containsTag(ExifDirectory.TAG_DATETIME)) {
@@ -424,7 +425,7 @@
                 metadata.set(Metadata.LAST_MODIFIED, datetimeNoTimeZone);
                 // If Date/Time Original does not exist this might be creation date
                 if (original == null) {
-                    metadata.set(Metadata.DATE, datetimeNoTimeZone);
+                    metadata.set(TikaCoreProperties.DATE, datetimeNoTimeZone);
                 }
             }
         }
@@ -447,15 +448,15 @@
                 }
             }
             if (directory.containsTag(IptcDirectory.TAG_HEADLINE)) {
-                metadata.set(Metadata.TITLE, directory.getString(IptcDirectory.TAG_HEADLINE));
+                metadata.set(TikaCoreProperties.TITLE, directory.getString(IptcDirectory.TAG_HEADLINE));
             } else if (directory.containsTag(IptcDirectory.TAG_OBJECT_NAME)) {
-                metadata.set(Metadata.TITLE, directory.getString(IptcDirectory.TAG_OBJECT_NAME));
+                metadata.set(TikaCoreProperties.TITLE, directory.getString(IptcDirectory.TAG_OBJECT_NAME));
             }
             if (directory.containsTag(IptcDirectory.TAG_BY_LINE)) {
                 metadata.set(Metadata.AUTHOR, directory.getString(IptcDirectory.TAG_BY_LINE));
             }
             if (directory.containsTag(IptcDirectory.TAG_CAPTION)) {
-                metadata.set(Metadata.DESCRIPTION,
+                metadata.set(TikaCoreProperties.DESCRIPTION,
                         // Looks like metadata extractor returns IPTC newlines as a single carriage return,
                         // but the exiv2 command does not so we change to line feed here because that is less surprising to users                        
                         directory.getString(IptcDirectory.TAG_CAPTION).replaceAll("\r\n?", "\n"));
Index: src/main/java/org/apache/tika/parser/image/PSDParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/image/PSDParser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/image/PSDParser.java	(working copy)
@@ -29,6 +29,7 @@
 import org.apache.tika.io.EndianUtils;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TIFF;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
@@ -114,7 +115,7 @@
            
            // Is it one we can do something useful with?
            if(rb.id == ResourceBlock.ID_CAPTION) {
-              metadata.add(Metadata.DESCRIPTION, rb.getDataAsString()); 
+              metadata.add(TikaCoreProperties.DESCRIPTION, rb.getDataAsString()); 
            } else if(rb.id == ResourceBlock.ID_EXIF_1) {
               // TODO Parse the EXIF info
            } else if(rb.id == ResourceBlock.ID_EXIF_3) {
Index: src/main/java/org/apache/tika/parser/image/xmp/JempboxExtractor.java
===================================================================
--- src/main/java/org/apache/tika/parser/image/xmp/JempboxExtractor.java	(revision 1339328)
+++ src/main/java/org/apache/tika/parser/image/xmp/JempboxExtractor.java	(working copy)
@@ -28,8 +28,8 @@
 import org.apache.jempbox.xmp.XMPMetadata;
 import org.apache.jempbox.xmp.XMPSchemaDublinCore;
 import org.apache.tika.exception.TikaException;
-import org.apache.tika.metadata.DublinCore;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.xml.sax.InputSource;
 
 public class JempboxExtractor {
@@ -59,18 +59,18 @@
             XMPSchemaDublinCore dc = xmp.getDublinCoreSchema();
             if (dc != null) {
                 if (dc.getTitle() != null) {
-                    metadata.set(Metadata.TITLE, dc.getTitle());
+                    metadata.set(TikaCoreProperties.TITLE, dc.getTitle());
                 }
                 if (dc.getDescription() != null) {
-                    metadata.set(Metadata.DESCRIPTION, dc.getDescription());
+                    metadata.set(TikaCoreProperties.DESCRIPTION, dc.getDescription());
                 }
                 if (dc.getCreators() != null && dc.getCreators().size() > 0) {
-                    metadata.set(Metadata.CREATOR, joinCreators(dc.getCreators()));
+                    metadata.set(TikaCoreProperties.CREATOR, joinCreators(dc.getCreators()));
                 }
                 if (dc.getSubjects() != null && dc.getSubjects().size() > 0) {
                     Iterator<String> keywords = dc.getSubjects().iterator();
                     while (keywords.hasNext()) {
-                        metadata.add(Metadata.SUBJECT, keywords.next());
+                        metadata.add(TikaCoreProperties.SUBJECT, keywords.next());
                     }
                     // TODO should we set KEYWORDS too?
                     // All tested photo managers set the same in Iptc.Application2.Keywords and Xmp.dc.subject
Index: src/main/java/org/apache/tika/parser/image/MetadataFields.java
===================================================================
--- src/main/java/org/apache/tika/parser/image/MetadataFields.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/image/MetadataFields.java	(working copy)
@@ -22,6 +22,7 @@
 
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 
 /**
  * Knowns about all declared {@link Metadata} fields.
@@ -32,9 +33,8 @@
     
     private static HashSet<String> known;
     
-    static {
-        known = new HashSet<String>();
-        Field[] fields = Metadata.class.getFields();
+    private static void setKnownForClass(Class<?> clazz) {
+        Field[] fields = clazz.getFields();
         for (Field f : fields) {
             int mod = f.getModifiers();
             if (Modifier.isPublic(mod) && Modifier.isStatic(mod) && Modifier.isFinal(mod)) {
@@ -67,8 +67,18 @@
         }
     }
     
+    static {
+        known = new HashSet<String>();
+        setKnownForClass(TikaCoreProperties.class);
+        setKnownForClass(Metadata.class);
+    }
+    
     public static boolean isMetadataField(String name) {
         return known.contains(name);
     }
     
+    public static boolean isMetadataField(Property property) {
+        return known.contains(property.getName());
+    }
+    
 }
Index: src/main/java/org/apache/tika/parser/mail/MailContentHandler.java
===================================================================
--- src/main/java/org/apache/tika/parser/mail/MailContentHandler.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/mail/MailContentHandler.java	(working copy)
@@ -24,7 +24,6 @@
 import org.apache.james.mime4j.codec.DecoderUtil;
 import org.apache.james.mime4j.dom.address.Address;
 import org.apache.james.mime4j.dom.address.AddressList;
-import org.apache.james.mime4j.dom.address.Group;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.dom.address.MailboxList;
 import org.apache.james.mime4j.dom.field.AddressListField;
@@ -38,6 +37,7 @@
 import org.apache.james.mime4j.stream.Field;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.sax.BodyContentHandler;
 import org.apache.tika.sax.EmbeddedContentHandler;
@@ -161,7 +161,7 @@
                     metadata.add(Metadata.AUTHOR, from);
                 }
             } else if (fieldname.equalsIgnoreCase("Subject")) {
-                metadata.add(Metadata.SUBJECT,
+                metadata.add(TikaCoreProperties.SUBJECT,
                         ((UnstructuredField) parsedField).getValue());
             } else if (fieldname.equalsIgnoreCase("To")) {
                 processAddressList(parsedField, "To:", Metadata.MESSAGE_TO);
@@ -171,7 +171,7 @@
                 processAddressList(parsedField, "Bcc:", Metadata.MESSAGE_BCC);
             } else if (fieldname.equalsIgnoreCase("Date")) {
                 DateTimeField dateField = (DateTimeField) parsedField;
-                metadata.set(Metadata.DATE, dateField.getDate());
+                metadata.set(TikaCoreProperties.DATE, dateField.getDate());
                 metadata.set(Metadata.CREATION_DATE, dateField.getDate());
             }
         } catch (RuntimeException me) {
Index: src/main/java/org/apache/tika/parser/rtf/TextExtractor.java
===================================================================
--- src/main/java/org/apache/tika/parser/rtf/TextExtractor.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/rtf/TextExtractor.java	(working copy)
@@ -32,6 +32,7 @@
 
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.sax.XHTMLContentHandler;
 import org.apache.tika.utils.CharsetUtils;
 import org.xml.sax.SAXException;
@@ -827,9 +828,9 @@
                 if (equals("author")) {
                     nextMetaData = Metadata.AUTHOR;
                 } else if (equals("title")) {
-                    nextMetaData = Metadata.TITLE;
+                    nextMetaData = TikaCoreProperties.TITLE.getName();
                 } else if (equals("subject")) {
-                    nextMetaData = Metadata.SUBJECT;
+                    nextMetaData = TikaCoreProperties.SUBJECT.getName();
                 } else if (equals("keywords")) {
                     nextMetaData = Metadata.KEYWORDS;
                 } else if (equals("category")) {
Index: src/main/java/org/apache/tika/parser/iwork/NumbersContentHandler.java
===================================================================
--- src/main/java/org/apache/tika/parser/iwork/NumbersContentHandler.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/iwork/NumbersContentHandler.java	(working copy)
@@ -17,6 +17,8 @@
 package org.apache.tika.parser.iwork;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.sax.XHTMLContentHandler;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -36,7 +38,7 @@
     private boolean parseText = false;
 
     private boolean inMetadata = false;
-    private String metadataKey;
+    private Property metadataKey;
     private String metadataPropertyQName;
 
     private boolean inTable = false;
@@ -202,11 +204,13 @@
         }
     }
 
-    private String resolveMetadataKey(String localName) {
+    private Property resolveMetadataKey(String localName) {
         if ("authors".equals(localName)) {
-            return Metadata.AUTHOR;
+            return Property.internalText(Metadata.AUTHOR);
         }
-
-        return localName;
+        if ("title".equals(localName)) {
+            return TikaCoreProperties.TITLE;
+        }
+        return Property.internalText(localName);
     }
 }
\ No newline at end of file
Index: src/main/java/org/apache/tika/parser/iwork/KeynoteContentHandler.java
===================================================================
--- src/main/java/org/apache/tika/parser/iwork/KeynoteContentHandler.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/iwork/KeynoteContentHandler.java	(working copy)
@@ -17,6 +17,7 @@
 package org.apache.tika.parser.iwork;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.sax.XHTMLContentHandler;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -90,7 +91,7 @@
         } else if (inMetadata && "key:authors".equals(qName)) {
             inMetaDataAuthors = true;
         } else if (inMetaDataTitle && "key:string".equals(qName)) {
-            metadata.set(Metadata.TITLE, attributes.getValue("sfa:string"));
+            metadata.set(TikaCoreProperties.TITLE, attributes.getValue("sfa:string"));
         } else if (inMetaDataAuthors && "key:string".equals(qName)) {
             metadata.add(Metadata.AUTHOR, attributes.getValue("sfa:string"));
         } else if (inSlide && "sf:tabular-model".equals(qName)) {
Index: src/main/java/org/apache/tika/parser/iwork/PagesContentHandler.java
===================================================================
--- src/main/java/org/apache/tika/parser/iwork/PagesContentHandler.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/iwork/PagesContentHandler.java	(working copy)
@@ -18,6 +18,7 @@
 
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.sax.XHTMLContentHandler;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -252,13 +253,13 @@
         if ("sf:authors".equals(metaDataQName)) {
             metaDataKey = Metadata.AUTHOR;
         } else if ("sf:title".equals(metaDataQName)) {
-            metaDataKey = Metadata.TITLE;
+            metaDataKey = TikaCoreProperties.TITLE;
         } else if ("sl:SLCreationDateProperty".equals(metaDataQName)) {
             metaDataKey = Metadata.CREATION_DATE;
         } else if ("sl:SLLastModifiedDateProperty".equals(metaDataQName)) {
             metaDataKey = Metadata.LAST_MODIFIED;
         } else if ("sl:language".equals(metaDataQName)) {
-            metaDataKey = Metadata.LANGUAGE;
+            metaDataKey = TikaCoreProperties.LANGUAGE;
         }
         return metaDataKey;
     }
Index: src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java
===================================================================
--- src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/mp3/Mp3Parser.java	(working copy)
@@ -25,6 +25,7 @@
 
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.metadata.XMPDM;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
@@ -71,7 +72,7 @@
         if (audioAndTags.tags.length > 0) {
            CompositeTagHandler tag = new CompositeTagHandler(audioAndTags.tags);
 
-           metadata.set(Metadata.TITLE, tag.getTitle());
+           metadata.set(TikaCoreProperties.TITLE, tag.getTitle());
            metadata.set(Metadata.AUTHOR, tag.getArtist());
            metadata.set(XMPDM.ARTIST, tag.getArtist());
            metadata.set(XMPDM.COMPOSER, tag.getComposer());
Index: src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java	(revision 1339328)
+++ src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java	(working copy)
@@ -18,8 +18,6 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.Charset;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Collections;
@@ -29,8 +27,8 @@
 import java.util.TimeZone;
 
 import org.apache.tika.exception.TikaException;
-import org.apache.tika.metadata.DublinCore;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
@@ -772,19 +770,19 @@
       // every property that gets set must be non-null, or it will cause NPE
       // in other consuming applications, like Lucene
       metadata.set(Metadata.CONTENT_TYPE,  clean("text/anpa-1312"));
-      metadata.set(Metadata.TITLE,         clean(properties.get("title")));
-      metadata.set(Metadata.SUBJECT,       clean(properties.get("subject")));
+      metadata.set(TikaCoreProperties.TITLE,         clean(properties.get("title")));
+      metadata.set(TikaCoreProperties.SUBJECT,       clean(properties.get("subject")));
       metadata.set(Metadata.AUTHOR,        clean(properties.get("author")));
       metadata.set(Metadata.CREATION_DATE, clean(properties.get("created")));
-      metadata.set(Metadata.MODIFIED,      clean(properties.get("modified")));
-      metadata.set(Metadata.SOURCE,      clean(properties.get("source")));
-//      metadata.set(Metadata.PUBLISHER,     clean(properties.get("publisher")));
-      metadata.set(Metadata.PUBLISHER,     clean(this.getFormatName()));
+      metadata.set(TikaCoreProperties.MODIFIED,      clean(properties.get("modified")));
+      metadata.set(TikaCoreProperties.SOURCE,      clean(properties.get("source")));
+//      metadata.set(TikaCoreProperties.PUBLISHER,     clean(properties.get("publisher")));
+      metadata.set(TikaCoreProperties.PUBLISHER,     clean(this.getFormatName()));
 
 /*
-        metadata.set(Metadata.DATE, font.getHeader().getCreated().getTime());
+        metadata.set(TikaCoreProperties.DATE, font.getHeader().getCreated().getTime());
         metadata.set(
-                Property.internalDate(Metadata.MODIFIED),
+                Property.internalDate(TikaCoreProperties.MODIFIED),
                 font.getHeader().getModified().getTime());
 */
    }
Index: src/main/java/org/apache/tika/parser/xml/DcXMLParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/xml/DcXMLParser.java	(revision 1339328)
+++ src/main/java/org/apache/tika/parser/xml/DcXMLParser.java	(working copy)
@@ -16,8 +16,9 @@
  */
 package org.apache.tika.parser.xml;
 
-import org.apache.tika.metadata.DublinCore;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.sax.TeeContentHandler;
 import org.xml.sax.ContentHandler;
@@ -31,28 +32,28 @@
     private static final long serialVersionUID = 4905318835463880819L;
 
     private static ContentHandler getDublinCoreHandler(
-            Metadata metadata, String name, String element) {
+            Metadata metadata, Property property, String element) {
         return new ElementMetadataHandler(
                 "http://purl.org/dc/elements/1.1/", element,
-                metadata, name);
+                metadata, property);
     }
 
     protected ContentHandler getContentHandler(
             ContentHandler handler, Metadata metadata, ParseContext context) {
         return new TeeContentHandler(
                 super.getContentHandler(handler, metadata, context),
-                getDublinCoreHandler(metadata, Metadata.TITLE, "title"),
-                getDublinCoreHandler(metadata, Metadata.SUBJECT, "subject"),
-                getDublinCoreHandler(metadata, Metadata.CREATOR, "creator"),
-                getDublinCoreHandler(metadata, Metadata.DESCRIPTION, "description"),
-                getDublinCoreHandler(metadata, Metadata.PUBLISHER, "publisher"),
-                getDublinCoreHandler(metadata, Metadata.CONTRIBUTOR, "contributor"),
-                getDublinCoreHandler(metadata, Metadata.DATE.getName(), "date"),
-                getDublinCoreHandler(metadata, Metadata.TYPE, "type"),
-                getDublinCoreHandler(metadata, Metadata.FORMAT, "format"),
-                getDublinCoreHandler(metadata, Metadata.IDENTIFIER, "identifier"),
-                getDublinCoreHandler(metadata, Metadata.LANGUAGE, "language"),
-                getDublinCoreHandler(metadata, Metadata.RIGHTS, "rights"));
+                getDublinCoreHandler(metadata, TikaCoreProperties.TITLE, "title"),
+                getDublinCoreHandler(metadata, TikaCoreProperties.SUBJECT, "subject"),
+                getDublinCoreHandler(metadata, TikaCoreProperties.CREATOR, "creator"),
+                getDublinCoreHandler(metadata, TikaCoreProperties.DESCRIPTION, "description"),
+                getDublinCoreHandler(metadata, TikaCoreProperties.PUBLISHER, "publisher"),
+                getDublinCoreHandler(metadata, TikaCoreProperties.CONTRIBUTOR, "contributor"),
+                getDublinCoreHandler(metadata, TikaCoreProperties.DATE, "date"),
+                getDublinCoreHandler(metadata, TikaCoreProperties.TYPE, "type"),
+                getDublinCoreHandler(metadata, TikaCoreProperties.FORMAT, "format"),
+                getDublinCoreHandler(metadata, TikaCoreProperties.IDENTIFIER, "identifier"),
+                getDublinCoreHandler(metadata, TikaCoreProperties.LANGUAGE, "language"),
+                getDublinCoreHandler(metadata, TikaCoreProperties.RIGHTS, "rights"));
     }
 
 }
Index: src/main/java/org/apache/tika/parser/xml/ElementMetadataHandler.java
===================================================================
--- src/main/java/org/apache/tika/parser/xml/ElementMetadataHandler.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/xml/ElementMetadataHandler.java	(working copy)
@@ -164,12 +164,11 @@
         if (logger.isTraceEnabled()) {
             logger.trace("adding " + name + "=" + value);
         }
-        if (targetProperty != null && targetProperty.getPropertyType() != null &&
-             targetProperty.getPropertyType() == Property.PropertyType.BAG) {
+        if (targetProperty != null && targetProperty.isMultiValuePermitted()) {
             if (value != null && value.length() > 0) {
                 String[] previous = metadata.getValues(name);
                 if (previous == null || !Arrays.asList(previous).contains(value)) {
-                    metadata.add(name, value);
+                    metadata.add(targetProperty, value);
                 }
             }
         } else {
Index: src/main/java/org/apache/tika/parser/mp4/MP4Parser.java
===================================================================
--- src/main/java/org/apache/tika/parser/mp4/MP4Parser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/mp4/MP4Parser.java	(working copy)
@@ -30,6 +30,7 @@
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.metadata.XMPDM;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
@@ -162,7 +163,7 @@
                  MP4TimeToDate(mHeader.getCreationTime())
            );
            metadata.set(
-                 Property.externalDate(Metadata.MODIFIED), // TODO Should be a real property
+                 TikaCoreProperties.MODIFIED,
                  MP4TimeToDate(mHeader.getModificationTime())
            );
            
@@ -188,7 +189,7 @@
                  MP4TimeToDate(header.getCreationTime())
            );
            metadata.set(
-                 Property.externalDate(Metadata.MODIFIED), // TODO Should be a real property
+                 TikaCoreProperties.MODIFIED,
                  MP4TimeToDate(header.getModificationTime())
            );
            
@@ -224,7 +225,7 @@
            if (apple != null) {
               // Title
               AppleTrackTitleBox title = getOrNull(apple, AppleTrackTitleBox.class);
-              addMetadata(Metadata.TITLE, metadata, title);
+              addMetadata(TikaCoreProperties.TITLE, metadata, title);
 
               // Artist
               AppleArtistBox artist = getOrNull(apple, AppleArtistBox.class);
Index: src/main/java/org/apache/tika/parser/feed/FeedParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/feed/FeedParser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/feed/FeedParser.java	(working copy)
@@ -26,6 +26,7 @@
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.CloseShieldInputStream;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
@@ -72,8 +73,8 @@
             String title = stripTags(feed.getTitleEx());
             String description = stripTags(feed.getDescriptionEx());
 
-            metadata.set(Metadata.TITLE, title);
-            metadata.set(Metadata.DESCRIPTION, description);
+            metadata.set(TikaCoreProperties.TITLE, title);
+            metadata.set(TikaCoreProperties.DESCRIPTION, description);
             // store the other fields in the metadata
 
             XHTMLContentHandler xhtml =
Index: src/main/java/org/apache/tika/parser/netcdf/NetCDFParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/netcdf/NetCDFParser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/netcdf/NetCDFParser.java	(working copy)
@@ -26,6 +26,8 @@
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.IOUtils;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
@@ -86,12 +88,12 @@
 
             // first parse out the set of global attributes
             for (Attribute attr : ncFile.getGlobalAttributes()) {
-                String attrName = attr.getName();
+                Property property = resolveMetadataKey(attr.getName());
                 if (attr.getDataType().isString()) {
-                    metadata.add(attrName, attr.getStringValue());
+                    metadata.add(property, attr.getStringValue());
                 } else if (attr.getDataType().isNumeric()) {
                     int value = attr.getNumericValue().intValue();
-                    metadata.add(attrName, String.valueOf(value));
+                    metadata.add(property, String.valueOf(value));
                 }
             }
         } catch (IOException e) {
@@ -102,5 +104,12 @@
         xhtml.startDocument();
         xhtml.endDocument();
     }
+    
+    private Property resolveMetadataKey(String localName) {
+        if ("title".equals(localName)) {
+            return TikaCoreProperties.TITLE;
+        }
+        return Property.internalText(localName);
+    }
 
 }
Index: src/main/java/org/apache/tika/parser/html/HtmlParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/html/HtmlParser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/html/HtmlParser.java	(working copy)
@@ -148,7 +148,7 @@
                 String language = match.getLanguage();
                 if (language != null) {
                     metadata.set(Metadata.CONTENT_LANGUAGE, match.getLanguage());
-                    metadata.set(Metadata.LANGUAGE, match.getLanguage());
+                    metadata.set(TikaCoreProperties.LANGUAGE, match.getLanguage());
                 }
                 */
                 
Index: src/main/java/org/apache/tika/parser/html/HtmlHandler.java
===================================================================
--- src/main/java/org/apache/tika/parser/html/HtmlHandler.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/html/HtmlHandler.java	(working copy)
@@ -26,6 +26,7 @@
 import java.util.regex.Pattern;
 
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.sax.TextContentHandler;
 import org.apache.tika.sax.XHTMLContentHandler;
@@ -233,7 +234,7 @@
         if (titleLevel > 0) {
             titleLevel--;
             if (titleLevel == 0) {
-                metadata.set(Metadata.TITLE, title.toString().trim());
+                metadata.set(TikaCoreProperties.TITLE, title.toString().trim());
             }
         }
         if (bodyLevel > 0) {
Index: src/main/java/org/apache/tika/parser/mbox/MboxParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/mbox/MboxParser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/mbox/MboxParser.java	(working copy)
@@ -32,6 +32,7 @@
 
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
@@ -198,7 +199,7 @@
 
         if (headerTag.equalsIgnoreCase("From")) {
             metadata.add(Metadata.AUTHOR, headerContent);
-            metadata.add(Metadata.CREATOR, headerContent);
+            metadata.set(TikaCoreProperties.CREATOR, headerContent);
         } else if (headerTag.equalsIgnoreCase("To") ||
         	headerTag.equalsIgnoreCase("Cc") ||
         	headerTag.equalsIgnoreCase("Bcc")) {
@@ -217,26 +218,26 @@
             }
             metadata.add(property, headerContent);
         } else if (headerTag.equalsIgnoreCase("Subject")) {
-            metadata.add(Metadata.SUBJECT, headerContent);
-            metadata.add(Metadata.TITLE, headerContent);
+            metadata.add(TikaCoreProperties.SUBJECT, headerContent);
+            metadata.set(TikaCoreProperties.TITLE, headerContent);
         } else if (headerTag.equalsIgnoreCase("Date")) {
             try {
                 Date date = parseDate(headerContent);
-                metadata.set(Metadata.DATE, date);
+                metadata.set(TikaCoreProperties.DATE, date);
                 metadata.set(Metadata.CREATION_DATE, date);
             } catch (ParseException e) {
                 // ignoring date because format was not understood
             }
         } else if (headerTag.equalsIgnoreCase("Message-Id")) {
-            metadata.add(Metadata.IDENTIFIER, headerContent);
+            metadata.set(TikaCoreProperties.IDENTIFIER, headerContent);
         } else if (headerTag.equalsIgnoreCase("In-Reply-To")) {
-            metadata.add(Metadata.RELATION, headerContent);
+            metadata.set(TikaCoreProperties.RELATION, headerContent);
         } else if (headerTag.equalsIgnoreCase("Content-Type")) {
             // TODO - key off content-type in headers to
             // set mapping to use for content and convert if necessary.
 
             metadata.add(Metadata.CONTENT_TYPE, headerContent);
-            metadata.add(Metadata.FORMAT, headerContent);
+            metadata.set(TikaCoreProperties.FORMAT, headerContent);
         } else {
             metadata.add(EMAIL_HEADER_METADATA_PREFIX + headerTag, headerContent);
         }
Index: src/main/java/org/apache/tika/parser/microsoft/TNEFParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/microsoft/TNEFParser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/microsoft/TNEFParser.java	(working copy)
@@ -33,6 +33,7 @@
 import org.apache.tika.extractor.ParsingEmbeddedDocumentExtractor;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
@@ -81,7 +82,7 @@
        // Set the message subject if known
        String subject = msg.getSubject();
        if(subject != null && subject.length() > 0) {
-          metadata.set(Metadata.SUBJECT, subject);
+          metadata.set(TikaCoreProperties.SUBJECT, subject);
        }
        
        // Recurse into the message body RTF
Index: src/main/java/org/apache/tika/parser/microsoft/ooxml/MetadataExtractor.java
===================================================================
--- src/main/java/org/apache/tika/parser/microsoft/ooxml/MetadataExtractor.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/microsoft/ooxml/MetadataExtractor.java	(working copy)
@@ -30,6 +30,7 @@
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.PagedText;
 import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.openxmlformats.schemas.officeDocument.x2006.customProperties.CTProperty;
 import org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.CTProperties;
 
@@ -65,21 +66,21 @@
         addProperty(metadata, Metadata.CATEGORY, propsHolder.getCategoryProperty());
         addProperty(metadata, Metadata.CONTENT_STATUS, propsHolder
                 .getContentStatusProperty());
-        addProperty(metadata, Metadata.DATE, propsHolder
+        addProperty(metadata, TikaCoreProperties.DATE, propsHolder
                 .getCreatedProperty());
         addProperty(metadata, Metadata.CREATION_DATE, propsHolder
                 .getCreatedProperty());
-        addProperty(metadata, Metadata.CREATOR, propsHolder
+        addProperty(metadata, TikaCoreProperties.CREATOR, propsHolder
                 .getCreatorProperty());
         addProperty(metadata, Metadata.AUTHOR, propsHolder
                 .getCreatorProperty());
-        addProperty(metadata, Metadata.DESCRIPTION, propsHolder
+        addProperty(metadata, TikaCoreProperties.DESCRIPTION, propsHolder
                 .getDescriptionProperty());
-        addProperty(metadata, Metadata.IDENTIFIER, propsHolder
+        addProperty(metadata, TikaCoreProperties.IDENTIFIER, propsHolder
                 .getIdentifierProperty());
         addProperty(metadata, Metadata.KEYWORDS, propsHolder
                 .getKeywordsProperty());
-        addProperty(metadata, Metadata.LANGUAGE, propsHolder
+        addProperty(metadata, TikaCoreProperties.LANGUAGE, propsHolder
                 .getLanguageProperty());
         addProperty(metadata, Metadata.LAST_AUTHOR, propsHolder
                 .getLastModifiedByProperty());
@@ -89,9 +90,9 @@
                 .getModifiedProperty());
         addProperty(metadata, Metadata.REVISION_NUMBER, propsHolder
                 .getRevisionProperty());
-        addProperty(metadata, Metadata.SUBJECT, propsHolder
+        addProperty(metadata, TikaCoreProperties.SUBJECT, propsHolder
                 .getSubjectProperty());
-        addProperty(metadata, Metadata.TITLE, propsHolder.getTitleProperty());
+        addProperty(metadata, TikaCoreProperties.TITLE, propsHolder.getTitleProperty());
         addProperty(metadata, Metadata.VERSION, propsHolder.getVersionProperty());
     }
 
@@ -107,7 +108,7 @@
                 .getCharacters());
         addProperty(metadata, Metadata.CHARACTER_COUNT_WITH_SPACES, propsHolder
                 .getCharactersWithSpaces());
-        addProperty(metadata, Metadata.PUBLISHER, propsHolder.getCompany());
+        addProperty(metadata, TikaCoreProperties.PUBLISHER, propsHolder.getCompany());
         addProperty(metadata, Metadata.LINE_COUNT, propsHolder.getLines());
         addProperty(metadata, Metadata.MANAGER, propsHolder.getManager());
         addProperty(metadata, Metadata.NOTES, propsHolder.getNotes());
@@ -234,9 +235,18 @@
        }
     }
     
-    private void addProperty(Metadata metadata, Property property, Nullable<Date> value) {
-        if (value.getValue() != null) {
-            metadata.set(property, value.getValue());
+    private <T> void addProperty(Metadata metadata, Property property, Nullable<T> nullableValue) {
+        T value = nullableValue.getValue();
+        if (value != null) {
+            if (value instanceof Date) {
+                metadata.set(property, (Date) value);
+            } else if (value instanceof String) {
+                metadata.set(property, (String) value);
+            } else if (value instanceof Integer) {
+                metadata.set(property, (Integer) value);
+            } else if (value instanceof Double) {
+                metadata.set(property, (Double) value);
+            }
         }
     }
 
@@ -245,6 +255,12 @@
             addProperty(metadata, name, value.getValue().toString());
         }
     }
+    
+    private void addProperty(Metadata metadata, Property property, String value) {
+        if (value != null) {
+            metadata.set(property, value);
+        }
+    }
 
     private void addProperty(Metadata metadata, String name, String value) {
         if (value != null) {
Index: src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java
===================================================================
--- src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java	(working copy)
@@ -35,6 +35,7 @@
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.html.HtmlParser;
 import org.apache.tika.parser.mbox.MboxParser;
@@ -102,8 +103,8 @@
            metadata.set(Metadata.MESSAGE_CC, msg.getDisplayCC());
            metadata.set(Metadata.MESSAGE_BCC, msg.getDisplayBCC());
            
-           metadata.set(Metadata.TITLE, subject);
-           metadata.set(Metadata.SUBJECT, msg.getConversationTopic());
+           metadata.set(TikaCoreProperties.TITLE, subject);
+           metadata.set(TikaCoreProperties.SUBJECT, msg.getConversationTopic());
            
            try {
            for(String recipientAddress : msg.getRecipientEmailAddressList()) {
@@ -115,7 +116,7 @@
            // Date - try two ways to find it
            // First try via the proper chunk
            if(msg.getMessageDate() != null) {
-              metadata.set(Metadata.DATE, msg.getMessageDate().getTime());
+              metadata.set(TikaCoreProperties.DATE, msg.getMessageDate().getTime());
               metadata.set(Metadata.CREATION_DATE, msg.getMessageDate().getTime());
               metadata.set(Metadata.LAST_SAVED, msg.getMessageDate().getTime());
            } else {
@@ -130,12 +131,12 @@
                             // See if we can parse it as a normal mail date
                             try {
                                Date d = MboxParser.parseDate(date);
-                               metadata.set(Metadata.DATE, d);
+                               metadata.set(TikaCoreProperties.DATE, d);
                                metadata.set(Metadata.CREATION_DATE, d);
                                metadata.set(Metadata.LAST_SAVED, d);
                             } catch(ParseException e) {
                                // Store it as-is, and hope for the best...
-                               metadata.set(Metadata.DATE, date);
+                               metadata.set(TikaCoreProperties.DATE, date);
                                metadata.set(Metadata.CREATION_DATE, date);
                                metadata.set(Metadata.LAST_SAVED, date);
                             }
Index: src/main/java/org/apache/tika/parser/microsoft/SummaryExtractor.java
===================================================================
--- src/main/java/org/apache/tika/parser/microsoft/SummaryExtractor.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/microsoft/SummaryExtractor.java	(working copy)
@@ -35,6 +35,7 @@
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.PagedText;
 import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 
 /**
  * Outlook Message Parser.
@@ -90,10 +91,10 @@
     }
 
     private void parse(SummaryInformation summary) {
-        set(Metadata.TITLE, summary.getTitle());
+        set(TikaCoreProperties.TITLE, summary.getTitle());
         set(Metadata.AUTHOR, summary.getAuthor());
         set(Metadata.KEYWORDS, summary.getKeywords());
-        set(Metadata.SUBJECT, summary.getSubject());
+        set(TikaCoreProperties.SUBJECT, summary.getSubject());
         set(Metadata.LAST_AUTHOR, summary.getLastAuthor());
         set(Metadata.COMMENTS, summary.getComments());
         set(Metadata.TEMPLATE, summary.getTemplate());
@@ -115,7 +116,7 @@
     private void parse(DocumentSummaryInformation summary) {
         set(Metadata.COMPANY, summary.getCompany());
         set(Metadata.MANAGER, summary.getManager());
-        set(Metadata.LANGUAGE, getLanguage(summary));
+        set(TikaCoreProperties.LANGUAGE, getLanguage(summary));
         set(Metadata.CATEGORY, summary.getCategory());
         set(Metadata.SLIDE_COUNT, summary.getSlideCount());
         if (summary.getSlideCount() > 0) {
@@ -175,6 +176,12 @@
             metadata.set(name, value);
         }
     }
+    
+    private void set(Property property, String value) {
+        if (value != null) {
+            metadata.set(property, value);
+        }
+    }
 
     private void set(Property property, Date value) {
         if (value != null) {
Index: src/main/java/org/apache/tika/parser/prt/PRTParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/prt/PRTParser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/prt/PRTParser.java	(working copy)
@@ -26,6 +26,7 @@
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.EndianUtils;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
@@ -85,7 +86,7 @@
              "-" + dateStr.substring(6,8) + "T" + dateStr.substring(8,10) + ":" +
              dateStr.substring(10, 12) + ":00";
           metadata.set(Metadata.CREATION_DATE, formattedDate);
-          metadata.set(Metadata.DATE, formattedDate);
+          metadata.set(TikaCoreProperties.DATE, formattedDate);
        }
        metadata.set(Metadata.CONTENT_TYPE, PRT_MIME_TYPE);
        
@@ -94,7 +95,7 @@
        IOUtils.readFully(stream, desc);
        String description = extractText(desc, true);
        if(description.length() > 0) {
-          metadata.set(Metadata.DESCRIPTION, description);
+          metadata.set(TikaCoreProperties.DESCRIPTION, description);
        }
        
        // Now look for text
Index: src/main/java/org/apache/tika/parser/font/AdobeFontMetricParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/font/AdobeFontMetricParser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/font/AdobeFontMetricParser.java	(working copy)
@@ -27,6 +27,7 @@
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
@@ -67,7 +68,7 @@
        extractCreationDate( metadata, comments );
 
        metadata.set( Metadata.CONTENT_TYPE, AFM_TYPE.toString() );
-       metadata.set( Metadata.TITLE, fontMetrics.getFullName() );
+       metadata.set( TikaCoreProperties.TITLE, fontMetrics.getFullName() );
 
        // Add metadata associated with the font type
        addMetadataByString( metadata, "AvgCharacterWidth", Float.toString( fontMetrics.getAverageCharacterWidth() ) );
Index: src/main/java/org/apache/tika/parser/font/TrueTypeParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/font/TrueTypeParser.java	(revision 1339328)
+++ src/main/java/org/apache/tika/parser/font/TrueTypeParser.java	(working copy)
@@ -25,9 +25,8 @@
 import org.apache.fontbox.ttf.TrueTypeFont;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.TikaInputStream;
-import org.apache.tika.metadata.DublinCore;
 import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
@@ -67,9 +66,9 @@
         }
 
         metadata.set(Metadata.CONTENT_TYPE, TYPE.toString());
-        metadata.set(Metadata.DATE, font.getHeader().getCreated().getTime());
+        metadata.set(TikaCoreProperties.DATE, font.getHeader().getCreated().getTime());
         metadata.set(
-                Property.internalDate(Metadata.MODIFIED),
+                TikaCoreProperties.MODIFIED,
                 font.getHeader().getModified().getTime());
 
         XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
Index: src/main/java/org/apache/tika/parser/pdf/PDFParser.java
===================================================================
--- src/main/java/org/apache/tika/parser/pdf/PDFParser.java	(revision 1339249)
+++ src/main/java/org/apache/tika/parser/pdf/PDFParser.java	(working copy)
@@ -39,6 +39,7 @@
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.PagedText;
 import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.parser.AbstractParser;
 import org.apache.tika.parser.ParseContext;
@@ -152,12 +153,12 @@
             throws TikaException {
         PDDocumentInformation info = document.getDocumentInformation();
         metadata.set(PagedText.N_PAGES, document.getNumberOfPages());
-        addMetadata(metadata, Metadata.TITLE, info.getTitle());
+        addMetadata(metadata, TikaCoreProperties.TITLE, info.getTitle());
         addMetadata(metadata, Metadata.AUTHOR, info.getAuthor());
-        addMetadata(metadata, Metadata.CREATOR, info.getCreator());
+        addMetadata(metadata, TikaCoreProperties.CREATOR, info.getCreator());
         addMetadata(metadata, Metadata.KEYWORDS, info.getKeywords());
         addMetadata(metadata, "producer", info.getProducer());
-        addMetadata(metadata, Metadata.SUBJECT, info.getSubject());
+        addMetadata(metadata, TikaCoreProperties.SUBJECT, info.getSubject());
         addMetadata(metadata, "trapped", info.getTrapped());
         try {
             addMetadata(metadata, "created", info.getCreationDate());
@@ -186,6 +187,12 @@
         }
     }
 
+    private void addMetadata(Metadata metadata, Property property, String value) {
+        if (value != null) {
+            metadata.add(property, value);
+        }
+    }
+    
     private void addMetadata(Metadata metadata, String name, String value) {
         if (value != null) {
             metadata.add(name, value);
