Index: src/main/java/org/apache/tika/metadata/DublinCore.java
===================================================================
--- src/main/java/org/apache/tika/metadata/DublinCore.java	(revision 1236764)
+++ src/main/java/org/apache/tika/metadata/DublinCore.java	(working copy)
@@ -24,6 +24,10 @@
  * @see <a href="http://dublincore.org">dublincore.org</a>
  */
 public interface DublinCore {
+	
+	String NAMESPACE_URI_DC = "http://purl.org/dc/elements/1.1/";
+	String PREFIX_DC = "dc";
+	String PREFIX_DELIMITER = ":";
 
     /**
      * Typically, Format may include the media-type or dimensions of the
@@ -32,8 +36,23 @@
      * of dimensions include size and duration. Recommended best practice is
      * to select a value from a controlled vocabulary (for example, the list
      * of Internet Media Types [MIME] defining computer media formats).
+     * 
+     * @deprecated
+     * @see {@link DC_FORMAT}
      */
+	@Deprecated
     String FORMAT = "format";
+    
+    /**
+     * Typically, Format may include the media-type or dimensions of the
+     * resource. Format may be used to determine the software, hardware or
+     * other equipment needed to display or operate the resource. Examples
+     * of dimensions include size and duration. Recommended best practice is
+     * to select a value from a controlled vocabulary (for example, the list
+     * of Internet Media Types [MIME] defining computer media formats).
+     */
+    Property DC_FORMAT = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "format");
 
     /**
      * Recommended best practice is to identify the resource by means of
@@ -42,22 +61,60 @@
      * Identifier (URI) (including the Uniform Resource Locator (URL)),
      * the Digital Object Identifier (DOI) and the International Standard
      * Book Number (ISBN).
+     * 
+     * @deprecated
+     * @see {@link DC_IDENTIFIER}
      */
+    @Deprecated
     String IDENTIFIER = "identifier";
+    
+    /**
+     * Recommended best practice is to identify the resource by means of
+     * a string or number conforming to a formal identification system.
+     * Example formal identification systems include the Uniform Resource
+     * Identifier (URI) (including the Uniform Resource Locator (URL)),
+     * the Digital Object Identifier (DOI) and the International Standard
+     * Book Number (ISBN).
+     */
+    Property DC_IDENTIFIER = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "identifier");
 
     /**
      * Date on which the resource was changed.
      * TODO Make me a Date Property
+     * 
+     * @deprecated
+     * @see {@link DC_MODIFIED}
      */
+    @Deprecated
     String MODIFIED = "modified";
 
     /**
+     * Date on which the resource was changed.
+     */
+    Property DC_MODIFIED = Property.internalDate(
+			PREFIX_DC + PREFIX_DELIMITER + "modified");
+    
+    /**
      * An entity responsible for making contributions to the content of the
      * resource. Examples of a Contributor include a person, an organisation,
      * or a service. Typically, the name of a Contributor should be used to
      * indicate the entity.
+     * 
+     * @deprecated
+     * @see {@link DC_CONTRIBUTOR}
      */
+    @Deprecated
     String CONTRIBUTOR = "contributor";
+    
+    /**
+     * An entity responsible for making contributions to the content of the
+     * resource. Examples of a Contributor include a person, an organisation,
+     * or a service. Typically, the name of a Contributor should be used to
+     * indicate the entity.
+     */
+    Property DC_CONTRIBUTOR = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "contributor");
 
     /**
      * The extent or scope of the content of the resource. Coverage will
@@ -68,15 +125,45 @@
      * example, the Thesaurus of Geographic Names [TGN]) and that, where
      * appropriate, named places or time periods be used in preference to
      * numeric identifiers such as sets of coordinates or date ranges.
+     * 
+     * @deprecated
+     * @see {@link DC_COVERAGE}
      */
+    @Deprecated
     String COVERAGE = "coverage";
+    
+    
+    /**
+     * The extent or scope of the content of the resource. Coverage will
+     * typically include spatial location (a place name or geographic
+     * coordinates), temporal period (a period label, date, or date range)
+     * or jurisdiction (such as a named administrative entity). Recommended
+     * best practice is to select a value from a controlled vocabulary (for
+     * example, the Thesaurus of Geographic Names [TGN]) and that, where
+     * appropriate, named places or time periods be used in preference to
+     * numeric identifiers such as sets of coordinates or date ranges.
+     */
+    Property DC_COVERAGE = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "coverage");
 
     /**
      * An entity primarily responsible for making the content of the resource.
      * Examples of a Creator include a person, an organisation, or a service.
      * Typically, the name of a Creator should be used to indicate the entity.
+     * 
+     * @deprecated
+     * @see {@link DC_CREATOR}
      */
+    @Deprecated
     String CREATOR = "creator";
+    
+    /**
+     * An entity primarily responsible for making the content of the resource.
+     * Examples of a Creator include a person, an organisation, or a service.
+     * Typically, the name of a Creator should be used to indicate the entity.
+     */
+    Property DC_CREATOR = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "creator");
 
     /**
      * A date associated with an event in the life cycle of the resource.
@@ -84,16 +171,43 @@
      * the resource. Recommended best practice for encoding the date value is
      * defined in a profile of ISO 8601 [W3CDTF] and follows the YYYY-MM-DD
      * format.
+     * 
+     * @deprecated
+     * @see {@link DC_DATE}
      */
+    @Deprecated
     Property DATE = Property.internalDate("date");
+    
+    /**
+     * A date associated with an event in the life cycle of the resource.
+     * Typically, Date will be associated with the creation or availability of
+     * the resource. Recommended best practice for encoding the date value is
+     * defined in a profile of ISO 8601 [W3CDTF] and follows the YYYY-MM-DD
+     * format.
+     */
+    Property DC_DATE = Property.internalDate(
+    		PREFIX_DC + PREFIX_DELIMITER + "date");
 
     /**
      * An account of the content of the resource. Description may include
      * but is not limited to: an abstract, table of contents, reference to
      * a graphical representation of content or a free-text account of
      * the content.
+     * 
+     * @deprecated
+     * @see {@link DC_DESCRIPTION}
      */
+    @Deprecated
     String DESCRIPTION = "description";
+    
+    /**
+     * An account of the content of the resource. Description may include
+     * but is not limited to: an abstract, table of contents, reference to
+     * a graphical representation of content or a free-text account of
+     * the content.
+     */
+    Property DC_DESCRIPTION = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "description");
 
     /**
      * A language of the intellectual content of the resource. Recommended
@@ -101,22 +215,60 @@
      * with ISO 639 [ISO639], defines two- and three-letter primary language
      * tags with optional subtags. Examples include "en" or "eng" for English,
      * "akk" for Akkadian, and "en-GB" for English used in the United Kingdom.
+     * 
+     * @deprecated
+     * @see {@link DC_LANGUAGE}
      */
+    @Deprecated
     String LANGUAGE = "language";
+    
+    /**
+     * A language of the intellectual content of the resource. Recommended
+     * best practice is to use RFC 3066 [RFC3066], which, in conjunction
+     * with ISO 639 [ISO639], defines two- and three-letter primary language
+     * tags with optional subtags. Examples include "en" or "eng" for English,
+     * "akk" for Akkadian, and "en-GB" for English used in the United Kingdom.
+     */
+    Property DC_LANGUAGE = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "language");
 
     /**
      * An entity responsible for making the resource available. Examples of
      * a Publisher include a person, an organisation, or a service. Typically,
      * the name of a Publisher should be used to indicate the entity.
+     * 
+     * @deprecated
+     * @see {@link DC_PUBLISHER}
      */
+    @Deprecated
     String PUBLISHER = "publisher";
+    
+    /**
+     * An entity responsible for making the resource available. Examples of
+     * a Publisher include a person, an organisation, or a service. Typically,
+     * the name of a Publisher should be used to indicate the entity.
+     */
+    Property DC_PUBLISHER = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "publisher");
 
     /**
      * A reference to a related resource. Recommended best practice is to
      * reference the resource by means of a string or number conforming to
      * a formal identification system.
+     * 
+     * @deprecated
+     * @see {@link DC_RELATION}
      */
+    @Deprecated
     String RELATION = "relation";
+    
+    /**
+     * A reference to a related resource. Recommended best practice is to
+     * reference the resource by means of a string or number conforming to
+     * a formal identification system.
+     */
+    Property DC_RELATION = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "relation");
 
     /**
      * Information about rights held in and over the resource. Typically,
@@ -126,8 +278,24 @@
      * (IPR), Copyright, and various Property Rights. If the Rights element
      * is absent, no assumptions can be made about the status of these and
      * other rights with respect to the resource.
+     * 
+     * @deprecated
+     * @see {@link DC_RIGHTS}
      */
+    @Deprecated
     String RIGHTS = "rights";
+    
+    /**
+     * Information about rights held in and over the resource. Typically,
+     * a Rights element will contain a rights management statement for
+     * the resource, or reference a service providing such information.
+     * Rights information often encompasses Intellectual Property Rights
+     * (IPR), Copyright, and various Property Rights. If the Rights element
+     * is absent, no assumptions can be made about the status of these and
+     * other rights with respect to the resource.
+     */
+    Property DC_RIGHTS = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "rights");
 
     /**
      * A reference to a resource from which the present resource is derived.
@@ -135,8 +303,22 @@
      * or in part. Recommended best practice is to reference the resource by
      * means of a string or number conforming to a formal identification
      * system.
+     * 
+     * @deprecated
+     * @see {@link DC_SOURCE}
      */
+    @Deprecated
     String SOURCE = "source";
+    
+    /**
+     * A reference to a resource from which the present resource is derived.
+     * The present resource may be derived from the Source resource in whole
+     * or in part. Recommended best practice is to reference the resource by
+     * means of a string or number conforming to a formal identification
+     * system.
+     */
+    Property DC_SOURCE = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "source");
 
     /**
      * The topic of the content of the resource. Typically, a Subject will
@@ -144,14 +326,39 @@
      * describe a topic of the resource. Recommended best practice is to
      * select a value from a controlled vocabulary or formal classification
      * scheme.
+     * 
+     * @deprecated
+     * @see {@link DC_SUBJECT}
      */
+    @Deprecated
     String SUBJECT = "subject";
+    
+    /**
+     * The topic of the content of the resource. Typically, a Subject will
+     * be expressed as keywords, key phrases or classification codes that
+     * describe a topic of the resource. Recommended best practice is to
+     * select a value from a controlled vocabulary or formal classification
+     * scheme.
+     */
+    Property DC_SUBJECT = Property.internalTextBag(
+    		PREFIX_DC + PREFIX_DELIMITER + "subject");
 
     /**
      * A name given to the resource. Typically, a Title will be a name by
      * which the resource is formally known.
+     * 
+     * @deprecated
+     * @see {@link DC_TITLE}
      */
+    @Deprecated
     String TITLE = "title";
+    
+    /**
+     * A name given to the resource. Typically, a Title will be a name by
+     * which the resource is formally known.
+     */
+    Property DC_TITLE = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "title");
 
     /**
      * The nature or genre of the content of the resource. Type includes terms
@@ -160,7 +367,22 @@
      * controlled vocabulary (for example, the DCMI Type Vocabulary
      * [DCMITYPE]). To describe the physical or digital manifestation of
      * the resource, use the Format element.
+     * 
+     * @deprecated
+     * @see {@link DC_TYPE}
      */
+    @Deprecated
     String TYPE = "type";
+    
+    /**
+     * The nature or genre of the content of the resource. Type includes terms
+     * describing general categories, functions, genres, or aggregation levels
+     * for content. Recommended best practice is to select a value from a
+     * controlled vocabulary (for example, the DCMI Type Vocabulary
+     * [DCMITYPE]). To describe the physical or digital manifestation of
+     * the resource, use the Format element.
+     */
+    Property DC_TYPE = Property.internalText(
+    		PREFIX_DC + PREFIX_DELIMITER + "type");
 
 }
Index: src/main/java/org/apache/tika/metadata/Metadata.java
===================================================================
--- src/main/java/org/apache/tika/metadata/Metadata.java	(revision 1238616)
+++ src/main/java/org/apache/tika/metadata/Metadata.java	(working copy)
@@ -21,8 +21,10 @@
 import java.text.DateFormatSymbols;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.Enumeration;
+import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
@@ -33,7 +35,7 @@
  * A multi-valued metadata container.
  */
 public class Metadata implements CreativeCommons, DublinCore, Geographic, HttpHeaders,
-        IPTC, Message, MSOffice, ClimateForcast, TIFF, TikaMetadataKeys, TikaMimeKeys,
+        Message, MSOffice, ClimateForcast, TIFF, TikaMetadataKeys, TikaMimeKeys,
         Serializable {
 
     /** Serial version UID */
@@ -45,11 +47,22 @@
     private Map<String, String[]> metadata = null;
 
     /**
-     * The ISO-8601 format string we use for Dates.
-     * All dates are represented as UTC
+     * The UTC time zone. Not sure if {@link TimeZone#getTimeZone(String)}
+     * understands "UTC" in all environments, but it'll fall back to GMT
+     * in such cases, which is in practice equivalent to UTC.
+     */
+    private static final TimeZone UTC = TimeZone.getTimeZone("UTC");
+
+    /**
+     * Custom time zone used to interpret date values without a time
+     * component in a way that most likely falls within the same day
+     * regardless of in which time zone it is later interpreted. For
+     * example, the "2012-02-17" date would map to "2012-02-17T12:00:00Z"
+     * (instead of the default "2012-02-17T00:00:00Z"), which would still
+     * map to "2012-02-17" if interpreted in say Pacific time (while the
+     * default mapping would result in "2012-02-16" for UTC-8).
      */
-    private static final DateFormat iso8601Format =
-        createDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", "UTC");
+    private static final TimeZone MIDDAY = TimeZone.getTimeZone("GMT-12:00");
 
     /**
      * Some parsers will have the date as a ISO-8601 string
@@ -61,23 +74,23 @@
      */
     private static final DateFormat[] iso8601InputFormats = new DateFormat[] {
         // yyyy-mm-ddThh...
-        iso8601Format,                                       // UTC/Zulu
+        createDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", UTC),   // UTC/Zulu
         createDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", null),    // With timezone
         createDateFormat("yyyy-MM-dd'T'HH:mm:ss", null),     // Without timezone
         // yyyy-mm-dd hh...
-        createDateFormat("yyyy-MM-dd' 'HH:mm:ss'Z'", "UTC"), // UTC/Zulu
+        createDateFormat("yyyy-MM-dd' 'HH:mm:ss'Z'", UTC),   // UTC/Zulu
         createDateFormat("yyyy-MM-dd' 'HH:mm:ssZ", null),    // With timezone
         createDateFormat("yyyy-MM-dd' 'HH:mm:ss", null),     // Without timezone
         // Date without time, set to Midday UTC
-        createDateFormat("yyyy-MM-dd", "GMT-12:00"), // Normal date format
-        createDateFormat("yyyy:MM:dd", "GMT-12:00"), // Image (IPTC/EXIF) format
+        createDateFormat("yyyy-MM-dd", MIDDAY),              // Normal date format
+        createDateFormat("yyyy:MM:dd", MIDDAY),              // Image (IPTC/EXIF) format
     };
 
-    private static DateFormat createDateFormat(String format, String timezone) {
+    private static DateFormat createDateFormat(String format, TimeZone timezone) {
         SimpleDateFormat sdf =
             new SimpleDateFormat(format, new DateFormatSymbols(Locale.US));
         if (timezone != null) {
-            sdf.setTimeZone(TimeZone.getTimeZone(timezone));
+            sdf.setTimeZone(timezone);
         }
         return sdf;
     }
@@ -118,8 +131,17 @@
      * @param date given date
      * @return ISO 8601 date string
      */
-    private static synchronized String formatDate(Date date) {
-        return iso8601Format.format(date);
+    private static String formatDate(Date date) {
+        Calendar calendar = GregorianCalendar.getInstance(UTC, Locale.US);
+        calendar.setTime(date);
+        return String.format(
+                "%04d-%02d-%02dT%02d:%02d:%02dZ",
+                calendar.get(Calendar.YEAR),
+                calendar.get(Calendar.MONTH) + 1,
+                calendar.get(Calendar.DAY_OF_MONTH),
+                calendar.get(Calendar.HOUR_OF_DAY),
+                calendar.get(Calendar.MINUTE),
+                calendar.get(Calendar.SECOND));
     }
 
     /**
@@ -139,6 +161,17 @@
     public boolean isMultiValued(final String name) {
         return metadata.get(name) != null && metadata.get(name).length > 1;
     }
+    
+    /**
+     * Returns true if property's value is multivalued.
+     * 
+     * @param property
+     *          metadata property
+     * @return true is property's value is multivalued, false if single value or null
+     */
+    public boolean isMultiValued(final Property property) {
+        return isMultiValued(property.getName());
+    }
 
     /**
      * Returns an array of the names contained in the metadata.
@@ -236,6 +269,17 @@
     public String[] getValues(final String name) {
         return _getValues(name);
     }
+    
+    /**
+     * Get the values associated to a metadata property.
+     * 
+     * @param property
+     *          metadata property.
+     * @return the values associated to a metadata property.
+     */
+    public String[] getValues(final Property property) {
+        return _getValues(property.getName());
+    }
 
     private String[] _getValues(final String name) {
         String[] values = metadata.get(name);
@@ -265,6 +309,27 @@
             metadata.put(name, newValues);
         }
     }
+    
+    /**
+     * Add a metadata property/value mapping. Add the specified value to the list of
+     * values associated to the specified metadata property.
+     * 
+     * @param name
+     *          the metadata name.
+     * @param value
+     *          the metadata value.
+     */
+    public void add(final Property property, final String value) {
+        String[] values = metadata.get(property.getName());
+        if (values == null) {
+            set(property, value);
+        } else {
+            String[] newValues = new String[values.length + 1];
+            System.arraycopy(values, 0, newValues, 0, values.length);
+            newValues[newValues.length - 1] = value;
+            metadata.put(property.getName(), newValues);
+        }
+    }
 
     /**
      * Copy All key-value pairs from properties.
Index: src/main/java/org/apache/tika/sax/XHTMLContentHandler.java
===================================================================
--- src/main/java/org/apache/tika/sax/XHTMLContentHandler.java	(revision 1237113)
+++ src/main/java/org/apache/tika/sax/XHTMLContentHandler.java	(working copy)
@@ -173,7 +173,7 @@
             }
             
             super.startElement(XHTML, "title", "title", EMPTY_ATTRIBUTES);
-            String title = metadata.get(Metadata.TITLE);
+            String title = metadata.get(Metadata.DC_TITLE);
             if (title != null && title.length() > 0) {
                 char[] titleChars = title.toCharArray();
                 super.characters(titleChars, 0, titleChars.length);
Index: src/test/java/org/apache/tika/metadata/TestMetadata.java
===================================================================
--- src/test/java/org/apache/tika/metadata/TestMetadata.java	(revision 1291001)
+++ src/test/java/org/apache/tika/metadata/TestMetadata.java	(working copy)
@@ -325,9 +325,9 @@
     public void testGetSetDateUnspecifiedTimezone() {
         Metadata meta = new Metadata();    
         
-        meta.set(Metadata.DATE, "1970-01-01T00:00:01");
+        meta.set(Metadata.DC_DATE, "1970-01-01T00:00:01");
         assertEquals("should return string without time zone specifier because zone is not known",
-        		"1970-01-01T00:00:01", meta.get(Metadata.DATE));
+        		"1970-01-01T00:00:01", meta.get(Metadata.DC_DATE));
     }
     
 }
