diff --git a/title.core.inc b/title.core.inc
index db8a3b1..6fae166 100644
--- a/title.core.inc
+++ b/title.core.inc
@@ -26,6 +26,11 @@ function title_entity_info() {
     'widget' => array(
       'weight' => -5,
     ),
+    'display' => array(
+      'default' => array(
+        'type' => 'hidden',
+      ),
+    ),
   );
 
   $info['node'] = array(
@@ -49,6 +54,7 @@ function title_entity_info() {
             'label' => t('Name'),
             'description' => t('A field replacing taxonomy term name.'),
           ) + $instance,
+          'preprocess_key' => 'term_name',
         ),
         'description' => array(
           'field' => array(
@@ -82,6 +88,7 @@ function title_entity_info() {
             'label' => t('Subject'),
             'description' => t('A field replacing comment subject.'),
           ) + $instance,
+          'preprocess_key' => 'title',
         ),
       ),
     );
@@ -147,3 +154,48 @@ function title_field_text_with_summary_sync_set($entity_type, $entity, $legacy_f
   $wrapper->language($langcode);
   $wrapper->{$info['field']['field_name']}->set($value);
 }
+
+/**
+ * Process variables for page.tpl.php.
+ */
+function title_process_page(&$variables) {
+  // Ugly but necessary: there is no standardized way to tell if the current
+  // page is an entity view page. This information should be injected here in
+  // some form by entity-defining modules.
+  $entity_types = array(
+    'comment' => 1,
+    'node' => 1,
+    'taxonomy_term' => 2,
+  );
+
+  foreach ($entity_types as $entity_type => $position) {
+    if ($entity = menu_get_object($entity_type, $position)) {
+      break;
+    }
+  }
+
+  if ($entity) {
+    title_field_replacement_hide_label($entity_type, $entity, $variables, TRUE);
+  }
+}
+
+/**
+ * Process variables for node.tpl.php.
+ */
+function title_process_node(&$variables) {
+  title_field_replacement_hide_label('node', $variables['node'], $variables);
+}
+
+/**
+ * Process variables for taxonomy-term.tpl.php.
+ */
+function title_process_taxonomy_term(&$variables) {
+  title_field_replacement_hide_label('taxonomy_term', $variables['term'], $variables);
+}
+
+/**
+ * Process variables for comment.tpl.php.
+ */
+function title_process_comment(&$variables) {
+  title_field_replacement_hide_label('comment', $variables['comment'], $variables);
+}
diff --git a/title.module b/title.module
index 5aea248..4fdda2a 100644
--- a/title.module
+++ b/title.module
@@ -47,6 +47,7 @@ function title_entity_info_alter(&$info) {
         // Support add explicit support for entity_label().
         if (isset($entity_info['entity keys']['label']) && $entity_info['entity keys']['label'] == $legacy_field) {
           $info[$entity_type]['label callback'] = 'title_entity_label';
+          $fr_info += array('preprocess_key' => $info[$entity_type]['entity keys']['label']);
         }
       }
     }
@@ -610,3 +611,134 @@ function title_tokens_alter(array &$replacements, array $context) {
     }
   }
 }
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function title_form_field_ui_field_edit_form_alter(&$form, $form_state) {
+  $instance = $form['#instance'];
+  $entity_type = $instance['entity_type'];
+
+  if (title_field_replacement_is_label($entity_type, $instance['field_name'])) {
+    $info = entity_get_info($entity_type);
+    $form['instance']['settings']['hide_label'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Label replacement'),
+      '#description' => t('Check these options if you wish to display the @entity_type label in the content area.', array('@entity_type' => $info['label'])),
+      '#default_value' => !empty($instance['settings']['hide_label']) ? $instance['settings']['hide_label'] : array(),
+      '#options' => array(
+        'page' => t('Hide page title'),
+        'entity' => t('Hide entity label'),
+      ),
+    );
+  }
+}
+
+/**
+ * Checks whether the given field name is a replaced entity label.
+ *
+ * @param $entity_type
+ *   The name of the entity type.
+ * @param $field_name
+ *   The replacing field name.
+ *
+ * @return
+ *   TRUE id the give field is replacing the entity label, FALSE otherwise.
+ */
+function title_field_replacement_is_label($entity_type, $field_name) {
+  $label = FALSE;
+  $legacy_field = title_field_replacement_get_legacy_field($entity_type, $field_name);
+
+  if ($legacy_field) {
+    $info = entity_get_info($entity_type);
+    $label = $legacy_field == $info['entity keys']['label'];
+  }
+
+  return $label;
+}
+
+/**
+ * Returns the legacy field replaced by the given field name.
+ *
+  * @param $entity_type
+ *   The name of the entity type.
+ * @param $field_name
+ *   The replacing field name.
+ *
+ *  @return
+ *    The replaced legacy field name or FALSE if none available.
+ */
+function title_field_replacement_get_legacy_field($entity_type, $field_name) {
+  $result = FALSE;
+  $fr_info = title_field_replacement_info($entity_type);
+
+  if ($fr_info) {
+    foreach ($fr_info as $legacy_field => $info) {
+      if ($info['field']['field_name'] == $field_name) {
+        $result = $legacy_field;
+        break;
+      }
+    }
+  }
+
+  return $result;
+}
+
+/**
+ * Returns the field instance replacing the given entity type's label.
+ *
+ * @param $entity_type
+ *   The name of the entity type.
+ * @param $bundle
+ *   The name of the bundle the instance is attached to.
+ *
+ *  @return
+ *   The field instance replacing the label or FALSE if none available.
+ */
+function title_field_replacement_get_label_field($entity_type, $bundle) {
+  $instance = FALSE;
+  $info = entity_get_info($entity_type);
+
+  if (!empty($info['field replacement'])) {
+    $fr_info = $info['field replacement'];
+    $legacy_field = $info['entity keys']['label'];
+    if (!empty($fr_info[$legacy_field]['field'])) {
+      $instance = field_info_instance($entity_type, $fr_info[$legacy_field]['field']['field_name'], $bundle);
+    }
+  }
+
+  return $instance;
+}
+
+/**
+ * Hides the label from the given variables.
+ *
+ * @param $entity_type
+ *   The name of the entity type.
+ * @param $entity
+ *   The entity to work with.
+ * @param $vaiables
+ *   A reference to the variables array related to the template being processed.
+ * @param $page
+ *   (Optional) The current render phase: page or entity. Defaults to entity.
+ */
+function title_field_replacement_hide_label($entity_type, $entity, &$variables, $page = FALSE) {
+  list(, , $bundle) = entity_extract_ids($entity_type, $entity);
+  $instance = title_field_replacement_get_label_field($entity_type, $bundle);
+  $settings_key = $page ? 'page' : 'entity';
+
+  if (!empty($instance['settings']['hide_label'][$settings_key])) {
+    // If no key is passed default to the label one.
+    if ($page) {
+      $key = 'title';
+    }
+    else {
+      $info = entity_get_info($entity_type);
+      $key = $info['field replacement'][$info['entity keys']['label']]['preprocess_key'];
+    }
+
+    // We cannot simply unset the variable value since this may cause templates
+    // to throw notices.
+    $variables[$key] = FALSE;
+  }
+}
