diff --git a/modules/schemaorg_contrib/schemaorg_contrib.addressfield.inc b/modules/schemaorg_contrib/schemaorg_contrib.addressfield.inc
new file mode 100644
index 0000000..d753076
--- /dev/null
+++ b/modules/schemaorg_contrib/schemaorg_contrib.addressfield.inc
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Addressfield field formatter specific code for schema.org.
+ */
+
+function schemaorg_contrib_field_preprocess_addressfield(&$variables) {
+  $element = $variables['element'];
+
+  foreach ($element['#items'] as $delta => $item) {
+    // Add typeof attribute to the field item wrapper.
+    $variables['item_attributes_array'][$delta]['typeof'] = 'schema:PostalAddress';
+    // Inject property RDFa attribute on each element of the address field
+    // formatter output.
+    _schemaorg_contrib_addressfield_add_attributes($variables['items'][$delta], $element['#items'][$delta]);
+  }
+}
+
+/**
+ * Helper function to recursively inject RDFa attributes in an address item.
+ */
+function _schemaorg_contrib_addressfield_add_attributes(&$address, $values) {
+  // Define schema.org mappings which will be injected in the addressfield
+  // formatter output.
+  static $mappings = array(
+    'thoroughfare' => 'schema:streetAddress',
+    // 'premise' => // not defined on schema.org
+    'postal_code' => 'schema:postalCode',
+    'locality' => 'schema:addressLocality',
+    'administrative_area' => 'schema:addressRegion',
+    'country' => 'schema:addressCountry',
+  );
+
+  foreach (element_children($address) as $key) {
+    $child = &$address[$key];
+    // Automatically add RDFa property attribute to each address element.
+    if (in_array($key, array_keys($mappings), TRUE)) {
+      $child['#attributes']['property'][] = $mappings[$key];
+      // Use ISO country code as country value.
+      if ($key == 'country' && $values['country']) {
+        $child['#attributes']['content'] = $values['country'];
+      }
+    }
+
+    // Recurse through the child.
+    _schemaorg_contrib_addressfield_add_attributes($child, $values);
+  }
+}
diff --git a/modules/schemaorg_contrib/schemaorg_contrib.fivestar.inc b/modules/schemaorg_contrib/schemaorg_contrib.fivestar.inc
new file mode 100644
index 0000000..f2c6f0e
--- /dev/null
+++ b/modules/schemaorg_contrib/schemaorg_contrib.fivestar.inc
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Fivestar field formatter specific code for schema.org.
+ */
+
+function schemaorg_contrib_field_preprocess_fivestar(&$variables) {
+  $element = $variables['element'];
+
+  foreach ($element['#items'] as $delta => $item) {
+    // Add typeof attribute to the field item wrapper.
+    $variables['item_attributes_array'][$delta]['typeof'] = 'schema:AggregateReview';
+    // Generate RDFa markup for the vote average and count.
+    $metadata_markup = '';
+    if (!empty($element['#items'][$delta]['average'])) {
+      $average = round(($element['#items'][$delta]['average']/100) * 5, 1);
+      $metadata_markup .= '<meta property="schema:average" content="' . $average . '"/>';
+    }
+    if (!empty($element['#items'][$delta]['count'])) {
+      $metadata_markup .= '<meta property="schema:count" content="' . $element['#items'][$delta]['count'] . '"/>';
+    }
+    // Insert markup after fivestar summary.
+    if ($metadata_markup) {
+      // The render array can differ depending on the field formatter settings,
+      // such as for example whether users can vote while viewing (form).
+      if (!empty($variables['items'][$delta]['average']['#description'])) {
+        $variables['items'][$delta]['average']['#description'] .= $metadata_markup;
+      }
+      elseif (!empty($variables['items'][$delta]['vote']['vote']['#description'])) {
+        $variables['items'][$delta]['vote']['vote']['#description'] .= $metadata_markup;
+      }
+    }
+  }
+}
diff --git a/modules/schemaorg_contrib/schemaorg_contrib.info b/modules/schemaorg_contrib/schemaorg_contrib.info
new file mode 100644
index 0000000..1790037
--- /dev/null
+++ b/modules/schemaorg_contrib/schemaorg_contrib.info
@@ -0,0 +1,6 @@
+name = Schema.org support for contributed modules
+description = Add support for fields from contributed modules such as addressfield and fivestar.
+package = "Schema.org"
+dependencies[] = schemaorg
+core = 7.x
+files[] = schemaorg_contrib.test
diff --git a/modules/schemaorg_contrib/schemaorg_contrib.module b/modules/schemaorg_contrib/schemaorg_contrib.module
new file mode 100644
index 0000000..2238286
--- /dev/null
+++ b/modules/schemaorg_contrib/schemaorg_contrib.module
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Add schema.org support for compound fields from contributed modules.
+ */
+
+/**
+ * Implements MODULE_preprocess_HOOK().
+ */
+function schemaorg_contrib_preprocess_field(&$variables) {
+  $element = $variables['element'];
+  $field_name = $element['#field_name'];
+
+  // Address field module integration.
+  if ($element['#field_type'] == 'addressfield' && $element['#formatter'] == 'addressfield_default' && !empty($element['#object']->rdf_mapping[$field_name]['predicates'])) {
+    module_load_include('inc', 'schemaorg_contrib', 'schemaorg_contrib.addressfield');
+    schemaorg_contrib_field_preprocess_addressfield($variables);
+  }
+
+  // Fivestar module integration.
+  if ($element['#field_type'] == 'fivestar' && !empty($element['#object']->rdf_mapping[$field_name]['predicates'])) {
+    module_load_include('inc', 'schemaorg_contrib', 'schemaorg_contrib.fivestar');
+    schemaorg_contrib_field_preprocess_fivestar($variables);
+  }
+}
