diff --git a/date.field.inc b/date.field.inc
index 5a4fa81..26b06bd 100644
--- a/date.field.inc
+++ b/date.field.inc
@@ -125,8 +125,16 @@ function date_field_formatter_view($entity_type, $entity, $field, $instance, $la
     'attributes' => array(),
     'rdf_mapping' => array(),
     'add_rdf' => module_exists('rdf'),
+    'microdata' => array(),
+    'add_microdata' => module_exists('microdata'),
   );
 
+  // If the microdata module is enabled, the microdata mapping will have been
+  // passed in via the entity.
+  if ($variables['add_microdata'] && isset($entity->microdata[$field['field_name']])) {
+    $variables['microdata'] = $microdata = $entity->microdata[$field['field_name']];
+  }
+
   // If there is an RDf mapping for this date field, pass it down to the theme.
   $rdf_mapping = array();
   if (!empty($entity->rdf_mapping) && function_exists('rdf_rdfa_attributes')) {
diff --git a/date.module b/date.module
index 4f6a013..78dffff 100644
--- a/date.module
+++ b/date.module
@@ -78,6 +78,8 @@ function date_theme() {
         'attributes' => array(),
         'rdf_mapping' => NULL,
         'add_rdf' => NULL,
+        'add_microdata' => NULL,
+        'microdata' => NULL,
       ),
     ),
     'date_display_range' => $base + array(
@@ -95,6 +97,8 @@ function date_theme() {
         'attributes_end' => array(),
         'rdf_mapping' => NULL,
         'add_rdf' => NULL,
+        'add_microdata' => NULL,
+        'microdata' => NULL,
     )),
     'date_display_combination' => $base + array(
       'variables' => array(
@@ -110,6 +114,8 @@ function date_theme() {
         'attributes' => array(),
         'rdf_mapping' => NULL,
         'add_rdf' => NULL,
+        'add_microdata' => NULL,
+        'microdata' => NULL,
       ),
     ),
     'date_display_interval' => $base + array(
@@ -126,6 +132,8 @@ function date_theme() {
         'attributes' => array(),
         'rdf_mapping' => NULL,
         'add_rdf' => NULL,
+        'add_microdata' => NULL,
+        'microdata' => NULL,
        ),
     ),
   );
@@ -543,6 +551,8 @@ function date_entity_metadata_property_info_alter(&$info, $entity_type, $field,
         // The getter and setter callbacks for 'value' and 'value2'
         // will not provide the field name as $name, we'll add it to $info.
         'field_name' => $field['field_name'],
+        // Alert Microdata module that this value can be exposed in microdata.
+        'microdata' => TRUE,
       ),
       'value2' => array(
         'type' => 'date',
@@ -552,6 +562,8 @@ function date_entity_metadata_property_info_alter(&$info, $entity_type, $field,
         // The getter and setter callbacks for 'value' and 'value2'
         // will not provide the field name as $name, we'll add it to $info.
         'field_name' => $field['field_name'],
+        // Alert Microdata module that this value can be exposed in microdata.
+        'microdata' => TRUE,
       ),
       'duration' => array(
         'type' => 'duration',
diff --git a/date.theme b/date.theme
index 0d28be0..691c0d8 100644
--- a/date.theme
+++ b/date.theme
@@ -74,6 +74,8 @@ function theme_date_display_combination($variables) {
   $attributes  = $variables['attributes'];
   $rdf_mapping = $variables['rdf_mapping'];
   $add_rdf     = $variables['add_rdf'];
+  $microdata   = $variables['microdata'];
+  $add_microdata = $variables['add_microdata'];
   $precision   = date_granularity_precision($field['settings']['granularity']);
 
   $output = '';
@@ -162,6 +164,8 @@ function theme_date_display_combination($variables) {
       'attributes' => $attributes,
       'rdf_mapping' => $rdf_mapping,
       'add_rdf' => $add_rdf,
+      'microdata' => $microdata,
+      'add_microdata' => $add_microdata,
       'dates' => $dates,
     ));
   }
@@ -179,6 +183,8 @@ function theme_date_display_combination($variables) {
       'attributes' => $attributes,
       'rdf_mapping' => $rdf_mapping,
       'add_rdf' => $add_rdf,
+      'add_microdata' => $variables['add_microdata'],
+      'microdata' => $variables['microdata'],
       'dates' => $dates,
     ));
     $replaced = str_replace($time1, $time, $date1);
@@ -200,6 +206,8 @@ function theme_date_display_combination($variables) {
       'attributes' => $attributes,
       'rdf_mapping' => $rdf_mapping,
       'add_rdf' => $add_rdf,
+      'add_microdata' => $variables['add_microdata'],
+      'microdata' => $variables['microdata'],
       'dates' => $dates,
     ));
   }
@@ -222,6 +230,13 @@ function template_preprocess_date_display_single(&$variables) {
     );
     $variables['attributes'] = $variables['attributes'] + $base_attributes;
   }
+
+  // If microdata is enabled and the user has configured microdata for the
+  // start date property, add the ISO formatted date value to the microdata
+  // attributes. 
+  if ($variables['add_microdata'] && !empty($variables['microdata']['value']['#attributes']['itemprop'])) {
+    $variables['microdata']['value']['#attributes']['content'] = $variables['dates']['value']['formatted_iso'];
+  }
 }
 
 /**
@@ -231,9 +246,19 @@ function theme_date_display_single($variables) {
   $date = $variables['date'];
   $timezone = $variables['timezone'];
   $attributes = $variables['attributes'];
+  $microdata = $variables['microdata'];
 
   // Wrap the result with the attributes.
-  return '<span class="date-display-single"' . drupal_attributes($attributes) . '>' . $date . $timezone . '</span>';
+  $output = '<span class="date-display-single"' . drupal_attributes($attributes) . '>' . $date . $timezone . '</span>';
+
+  // If microdata attributes for the start date property have been passed in,
+  // add the microdata in a meta tag.
+  if (isset($microdata['value']) && !empty($microdata['value']['#attributes'])) {
+    $md_attributes = $microdata['value']['#attributes'];
+    $output .= '<meta' . drupal_attributes($md_attributes) . '/>';
+  }
+
+  return $output;
 }
 
 /**
@@ -261,6 +286,14 @@ function template_preprocess_date_display_range(&$variables) {
       $variables['attributes_end']['property'][$delta] = str_replace('start', 'end', $property);
     }
   }
+
+  // If microdata is enabled and the user has configured microdata for the
+  // start date property, add the ISO formatted date value to the microdata
+  // attributes. 
+  if ($variables['add_microdata'] && !empty($variables['microdata']['value']['#attributes']['itemprop'])) {
+    $variables['microdata']['value']['#attributes']['content'] = $variables['dates']['value']['formatted_iso'];
+    $variables['microdata']['value2']['#attributes']['content'] = $variables['dates']['value2']['formatted_iso'];
+  }
 }
 
 /**
@@ -272,11 +305,25 @@ function theme_date_display_range($variables) {
   $timezone = $variables['timezone'];
   $attributes_start = $variables['attributes_start'];
   $attributes_end = $variables['attributes_end'];
+  $microdata = $variables['microdata'];
+
+  $start_date = '<span class="date-display-start"' . drupal_attributes($attributes_start) . '>' . $date1 . '</span>';
+  $end_date = '<span class="date-display-end"' . drupal_attributes($attributes_end) . '>' . $date2 . $timezone . '</span>';
+
+  // If microdata attributes for the start date property have been passed in,
+  // add the microdata in a meta tag.
+  if (isset($microdata['value']) && !empty($microdata['value']['#attributes'])) {
+    $md_attributes = $microdata['value']['#attributes'];
+    $start_date .= '<meta' . drupal_attributes($md_attributes) . '/>';
+  }
+  if (isset($microdata['value2']) && !empty($microdata['value2']['#attributes'])) {
+    $md_attributes = $microdata['value2']['#attributes'];
+    $end_date .= '<meta' . drupal_attributes($md_attributes) . '/>';}
 
   // Wrap the result with the attributes.
   return t('!start-date to !end-date', array(
-    '!start-date' => '<span class="date-display-start"' . drupal_attributes($attributes_start) . '>' . $date1 . '</span>',
-    '!end-date' => '<span class="date-display-end"' . drupal_attributes($attributes_end) . '>' . $date2 . $timezone . '</span>',
+    '!start-date' => $start_date,
+    '!end-date' => $end_date,
   ));
 }
 
