diff --git a/schemaorg.module b/schemaorg.module
index 4613e73..98bc3b9 100644
--- a/schemaorg.module
+++ b/schemaorg.module
@@ -61,24 +61,6 @@ function schemaorg_node_type_form_submit($form, &$form_state) {
   $mapping = rdf_mapping_load('node', $bundle);
   $mapping['rdftype'] = schemaorg_terms_merge($form_state['values']['schemaorg_type'], $mapping['rdftype']);
 
-
-  if ($form_state['values']['schemaorg_type']) {
-    // Specifies the title mapping as expected by schema.org. This mapping is
-    // always set to schema:name and is not exposed in the UI.
-    $mapping['title']['predicates'] = schemaorg_terms_merge('name', $mapping['title']['predicates']);
-    // Sets the mapping for the url of the node. This mapping is
-    // always set to schema:url and is not exposed in the UI.
-    $mapping['url']['predicates'] = array('schema:url');
-    $mapping['url']['type'] = 'rel';
-  }
-  else {
-    // Makes sure no schema.org mapping for title remains if no type is defined.
-    $mapping['title']['predicates'] = array_filter($mapping['title']['predicates'], 'schemaorg_filter_schema_term');
-    // Since this pseudo-field mapping is only used for the purpose of
-    // schema.org, it is entirely remove when no type mapping is defined.
-    unset($mapping['url']);
-  }
-
   rdf_mapping_save(array(
     'type' => 'node',
     'bundle' => $bundle,
@@ -107,7 +89,7 @@ function schemaorg_form_field_ui_field_edit_form_alter(&$form, &$form_state) {
     '#type' => 'textfield',
     '#title' => t('Property'),
     '#description' => t('Specify the property you want to associated to this field.'),
-    '#default_value' => schemaorg_term_load('node', $bundle, $field_name),
+    '#default_value' => schemaorg_term_load($entity_type, $bundle, $field_name),
     '#attributes' => array('class' => array('schemaorg-autocomplete-properties')),
   );
 
@@ -127,11 +109,12 @@ function schemaorg_form_field_ui_field_edit_form_alter(&$form, &$form_state) {
  * Submit function for edit field form.
  */
 function schemaorg_field_ui_field_edit_form_submit($form, &$form_state) {
-  $bundle = $form['instance']['bundle']['#value'];
+  $entity_type = $form['#instance']['entity_type'];
+  $bundle = $form['#instance']['bundle'];
   $field_name = $form['#field']['field_name'];
   $field_type = $form['#field']['type'];
 
-  $mapping = rdf_mapping_load('node', $bundle);
+  $mapping = rdf_mapping_load($entity_type, $bundle);
 
   // This field might not have an RDF mapping yet.
   if (empty($mapping[$field_name])) {
@@ -158,8 +141,60 @@ function schemaorg_field_ui_field_edit_form_submit($form, &$form_state) {
     array_unshift($mapping[$field_name]['predicates'], 'schema:' . $legacy_properties[$property]);
   }
 
+  // Performs some maintenance tasks based on whether the mapping contains
+  // schema.org terms or not.
+  // Scans the mapping array to see if some fields are mapped to schema.org.
+  $schemaorg_mappings = FALSE;
+  // Some fields are ignored since they are not input by the user.
+  $ignored_fields = array('title', 'name', 'url');
+  foreach ($mapping as $field => $info) {
+    if (!empty($info['predicates']) && !in_array($field, $ignored_fields)) {
+      if (count($info['predicates']) != count(array_filter($info['predicates'], 'schemaorg_filter_schema_term'))) {
+        $schemaorg_mappings = TRUE;
+        break;
+      }
+    }
+  }
+  if ($schemaorg_mappings) {
+    // Specifies the title/name mapping as expected by schema.org. This mapping
+    // is always set to schema:name and is not exposed in the UI.
+    // The label of an entity is usually either 'title' (e.g. node) or
+    // 'name' (e.g. user).
+    if (!empty($mapping['title'])) {
+      $mapping['title']['predicates'] = array('schema:name');
+    }
+    if (!empty($mapping['name'])) {
+      $mapping['name']['predicates'] = array('schema:name');
+    }
+    // Sets the mapping for the url of the entity. This mapping is always set
+    // to schema:url and is not exposed in the UI.
+    $mapping['url']['predicates'] = array('schema:url');
+    $mapping['url']['type'] = 'rel';
+    // Add schema:Person type to user mapping.
+    if ($entity_type == 'user' && $bundle == 'user' ) {
+      $mapping['rdftype'] = schemaorg_terms_merge('Person', $mapping['rdftype']);
+    }
+  }
+  else {
+    // Makes sure no schema.org mapping for title/name remains if no schema.org
+    // terms are used.
+    if (!empty($mapping['title'])) {
+      $mapping['title']['predicates'] = array_filter($mapping['title']['predicates'], 'schemaorg_filter_schema_term');
+    }
+    if (!empty($mapping['name'])) {
+      $mapping['name']['predicates'] = array_filter($mapping['name']['predicates'], 'schemaorg_filter_schema_term');
+    }
+    // Since this pseudo-field mapping is only used for the purpose of
+    // schema.org, it is entirely removed.
+    unset($mapping['url']);
+    // Remove schema.org type from the user mapping.
+    if ($entity_type == 'user' && $bundle == 'user' ) {
+      $mapping['rdftype'] = array_filter($mapping['rdftype'], 'schemaorg_filter_schema_term');
+    }
+  }
+
   rdf_mapping_save(array(
-    'type' => 'node',
+    'type' => $entity_type,
     'bundle' => $bundle,
     'mapping' => $mapping,
     )
@@ -167,26 +202,33 @@ function schemaorg_field_ui_field_edit_form_submit($form, &$form_state) {
 }
 
 /**
- * Implements hook_node_view().
+ * Implements hook_entity_view().
  */
-function schemaorg_node_view($node, $view_mode, $langcode) {
-  // Adds the schema.org url to the node content as RDF metadata.
-  if (!empty($node->rdf_mapping['url']['predicates'])) {
-    $attributes = rdf_rdfa_attributes($node->rdf_mapping['url']);
-    $attributes['resource'] = url('node/' . $node->nid);
-    $node->content['schemaorg_url'] = array(
+function schemaorg_entity_view($entity, $type, $view_mode, $langcode) {
+  // Adds the schema.org url to the entity content as RDF metadata.
+  if (!empty($entity->rdf_mapping['url']['predicates'])) {
+    $attributes = rdf_rdfa_attributes($entity->rdf_mapping['url']);
+    $uri = entity_uri($type, $entity);
+    $attributes['resource'] = url($uri['path'], $uri['options']);
+    $entity->content['schemaorg_url'] = array(
       '#markup' => theme('rdf_metadata', array('metadata' => array('span' => $attributes))),
       '#weight' => 100,
     );
   }
 
-  // It seems parsers are expecting to find the title/name of the node within
-  // the body of the node. Drupal displays the title outside the body on full
-  // node display, so we assert it in the body as hidden RDF metadata.
-  if (!empty($node->rdf_mapping['title']['predicates'])) {
-    $attributes = rdf_rdfa_attributes($node->rdf_mapping['title']);
-    $attributes['content'] = $node->title;
-    $node->content['schemaorg_name'] = array(
+  // It seems parsers are expecting to find the title/name of the entity within
+  // the main content of the entity. Drupal displays the title outside the main
+  // content on full entity display, so we assert it as hidden RDF metadata.
+  foreach (array('title', 'subject', 'name') as $field_name) {
+    if (!empty($entity->{$field_name})) {
+      $label_field = $field_name;
+      break;
+    }
+  }
+  if (!empty($entity->rdf_mapping[$label_field]['predicates'])) {
+    $attributes = rdf_rdfa_attributes($entity->rdf_mapping[$label_field]);
+    $attributes['content'] = $entity->{$label_field};
+    $entity->content['schemaorg_name'] = array(
       '#markup' => theme('rdf_metadata', array('metadata' => array('span' => $attributes))),
       '#weight' => 100,
     );
diff --git a/schemaorg.test b/schemaorg.test
index 45572f1..9cd71b6 100644
--- a/schemaorg.test
+++ b/schemaorg.test
@@ -80,21 +80,7 @@ class SchemaorgFieldUIManageFieldsTestCase extends FieldUITestCase {
       'schema:WebPage',
       'foaf:Document',
     );
-    $rdf_mapping_title_expected = array(
-      'predicates' => array(
-        'schema:name',
-        'dc:title',
-      ),
-    );
-    $rdf_mapping_url_expected = array(
-      'predicates' => array(
-        'schema:url',
-      ),
-      'type' => 'rel',
-    );
     $this->assertEqual($rdf_mapping['rdftype'], $rdf_mapping_type_expected, t('The schema.org type was correctly saved.'));
-    $this->assertEqual($rdf_mapping['title'], $rdf_mapping_title_expected, t('The schema.org title property was correctly saved.'));
-    $this->assertEqual($rdf_mapping['url'], $rdf_mapping_url_expected, t('The schema.org url property was correctly saved.'));
 
     // Check that the schema.org terms shows up in the form
     $this->drupalGet($admin_path);
@@ -110,14 +96,7 @@ class SchemaorgFieldUIManageFieldsTestCase extends FieldUITestCase {
     $rdf_mapping_type_expected = array(
       1 => 'foaf:Document',
     );
-    $rdf_mapping_title_expected = array(
-      'predicates' => array(
-        1 => 'dc:title',
-      ),
-    );
     $this->assertEqual($rdf_mapping['rdftype'], $rdf_mapping_type_expected, t('The schema.org type mapping was correctly saved.'));
-    $this->assertEqual($rdf_mapping['title'], $rdf_mapping_title_expected, t('The schema.org title mapping was correctly saved.'));
-    $this->assertTrue(!isset($rdf_mapping['url']), t('The schema.org url mapping was correctly saved.'));
   }
 
   /**
@@ -146,20 +125,33 @@ class SchemaorgFieldUIManageFieldsTestCase extends FieldUITestCase {
     $this->assertFieldById($element_id, '', t('The schema.org property was empty.'));
 
     // Check that the schema.org property is saved.
-    $edit = array($element_name => 'url');
+    $edit = array($element_name => 'telephone');
     $this->drupalPost($admin_path, $edit, t('Save settings'));
     $this->assertText("Saved $field_name configuration", t('The form was successfully submitted.'));
     $rdf_mapping = rdf_mapping_load('node', $this->type);
-    $rdf_mapping_field_expected = array(
+    $rdf_mapping_title_expected = array(
+      'predicates' => array(
+        'schema:name',
+      ),
+    );
+    $rdf_mapping_url_expected = array(
       'predicates' => array(
         'schema:url',
       ),
+      'type' => 'rel',
+    );
+    $rdf_mapping_field_expected = array(
+      'predicates' => array(
+        'schema:telephone',
+      ),
     );
+    $this->assertEqual($rdf_mapping['title'], $rdf_mapping_title_expected, t('The schema.org title property was correctly saved.'));
+    $this->assertEqual($rdf_mapping['url'], $rdf_mapping_url_expected, t('The schema.org url property was correctly saved.'));
     $this->assertEqual($rdf_mapping[$field_name], $rdf_mapping_field_expected, t('The schema.org property was correctly saved.'));
 
     // Check that the schema.org property shows up in the form
     $this->drupalGet($admin_path);
-    $this->assertFieldById($element_id, 'url', t('The schema.org property form element was displayed with the correct value.'));
+    $this->assertFieldById($element_id, 'telephone', t('The schema.org property form element was displayed with the correct value.'));
 
     // Check that the schema.org property can be emptied.
     $edit = array($element_name => '');
@@ -167,9 +159,14 @@ class SchemaorgFieldUIManageFieldsTestCase extends FieldUITestCase {
     $this->assertText("Saved $field_name configuration", t('The form was successfully submitted.'));
     entity_info_cache_clear();
     $rdf_mapping = rdf_mapping_load('node', $this->type);
+    $rdf_mapping_title_expected = array(
+      'predicates' => array(),
+    );
     $rdf_mapping_field_expected = array(
       'predicates' => array(),
     );
+    $this->assertEqual($rdf_mapping['title'], $rdf_mapping_title_expected, t('The schema.org title mapping was correctly saved.'));
+    $this->assertTrue(!isset($rdf_mapping['url']), t('The schema.org url mapping was correctly removed.'));
     $this->assertEqual($rdf_mapping[$field_name], $rdf_mapping_field_expected, t('The schema.org property was correctly saved.'));
   }
 
@@ -200,13 +197,13 @@ class SchemaorgFieldUIManageFieldsTestCase extends FieldUITestCase {
     $this->assertFieldById($element_id, '', t('The schema.org property was empty.'));
 
     // Check that the schema.org property is saved.
-    $edit = array($element_name => 'url');
+    $edit = array($element_name => 'telephone');
     $this->drupalPost($admin_path, $edit, t('Save settings'));
     $this->assertText("Saved $field_name configuration", t('The form was successfully submitted.'));
     $rdf_mapping = rdf_mapping_load('node', $this->type);
     $rdf_mapping_field_expected = array(
       'predicates' => array(
-        'schema:url',
+        'schema:telephone',
       ),
       'type' => 'rel',
     );
@@ -214,7 +211,7 @@ class SchemaorgFieldUIManageFieldsTestCase extends FieldUITestCase {
 
     // Check that the schema.org property shows up in the form
     $this->drupalGet($admin_path);
-    $this->assertFieldById($element_id, 'url', t('The schema.org property form element was displayed with the correct value.'));
+    $this->assertFieldById($element_id, 'telephone', t('The schema.org property form element was displayed with the correct value.'));
 
     // Check that the schema.org property can be emptied.
     $edit = array($element_name => '');
