diff --git a/flag.install b/flag.install
index d68671c..5475be7 100644
--- a/flag.install
+++ b/flag.install
@@ -652,3 +652,36 @@ function flag_update_7305() {
     '!url' => 'http://drupal.org/node/1724256',
   ));
 }
+
+/**
+ * Convert flag view modes settings.
+ */
+function flag_update_7306() {
+  foreach (flag_get_flags() as $flag) {
+    // Update show_on_teaser property to use new view mode settings.
+    if (isset($flag->show_on_teaser)) {
+      $flag->show_in_links['teaser'] = TRUE;
+      unset($flag->show_on_teaser);
+    }
+
+    // Update show_on_page property to use new view mode settings.
+    if (isset($flag->show_on_page)) {
+      $flag->show_in_links['full'] = TRUE;
+      unset($flag->show_on_page);
+    }
+
+    // Update show_on_comment and show_on_entity properties to use new view
+    // mode settings. Since the old logic was to show on all view modes, do that.
+    if (isset($flag->show_on_entity) || isset($flag->show_on_comment)) {
+      if ($entity_info = entity_get_info($flag->entity_type)) {
+        foreach ($entity_info['view modes'] as $view_mode => $value) {
+          $flag->show_in_links[$view_mode] = TRUE;
+        }
+      }
+
+      unset($flag->show_on_entity, $flag->show_on_comment);
+    }
+
+    $flag->save();
+  }
+}
diff --git a/flag.module b/flag.module
index a1b45ea..dbaabda 100644
--- a/flag.module
+++ b/flag.module
@@ -908,12 +908,12 @@ function flag_contextual_links_view_alter(&$element, $items) {
 /**
  * Implements hook_entity_view().
  *
- * Handles the 'show_on_entity' flag option.
+ * Handles the 'show_in_links' flag option.
  *
  * Note this is broken for taxonomy terms for version of Drupal core < 7.17.
  */
 function flag_entity_view($entity, $type, $view_mode, $langcode) {
-  $links = flag_link($type, $entity, $view_mode == 'teaser');
+  $links = flag_link($type, $entity, $view_mode);
   if (isset($links)) {
     $entity->content['links']['flag'] = array(
       '#theme' => 'links',
@@ -930,13 +930,13 @@ function flag_entity_view($entity, $type, $view_mode, $langcode) {
  *  The entity type.
  * @param $entity
  *  The entity
- * @param $teaser
- *  Boolean indicating whether the current view mode is 'teaser'.
+ * @param $view_mode
+ *  String indicating the current view mode.
  *
  * @return
  *  An array of link data, suitable for passing to theme_links().
  */
-function flag_link($type, $entity = NULL, $teaser = FALSE) {
+function flag_link($type, $entity = NULL, $view_mode) {
   if (!isset($entity) || !flag_fetch_definition($type)) {
     return;
   }
@@ -947,7 +947,7 @@ function flag_link($type, $entity = NULL, $teaser = FALSE) {
   foreach ($flags as $flag) {
     $entity_id = $flag->get_entity_id($entity);
 
-    if (!$flag->uses_hook_link($teaser)) {
+    if (!$flag->uses_hook_link($view_mode)) {
       // Flag is not configured to show its link here.
       continue;
     }
diff --git a/flag_bookmark/flag_bookmark.install b/flag_bookmark/flag_bookmark.install
index bce09f2..284784a 100644
--- a/flag_bookmark/flag_bookmark.install
+++ b/flag_bookmark/flag_bookmark.install
@@ -23,8 +23,10 @@ function flag_bookmark_enable() {
     $configuration = array(
         'name' => 'bookmarks',
         'global' => 0,
-        'show_on_page' => 1,
-        'show_on_teaser' => 1,
+        'show_in_links' => array(
+          'full' => 1,
+          'teaser' => 1,
+        ),
         'show_on_form' => 1,
         // The following UI labels aren't wrapped in t() because they are written
         // to the DB in English. They are passed to t() later, thus allowing for
diff --git a/includes/flag.export.inc b/includes/flag.export.inc
index 1501407..9e3cbc7 100644
--- a/includes/flag.export.inc
+++ b/includes/flag.export.inc
@@ -340,5 +340,29 @@ class FlagUpdate_3 {
     if (isset($flag->roles)) {
       $flag->import_roles = $flag->roles;
     }
+
+    // Update show_on_teaser property to use new view mode settings.
+    if (isset($flag->show_on_teaser)) {
+      $flag->show_in_links['teaser'] = TRUE;
+      unset($flag->show_on_teaser);
+    }
+
+    // Update show_on_page property to use new view mode settings.
+    if (isset($flag->show_on_page)) {
+      $flag->show_in_links['full'] = TRUE;
+      unset($flag->show_on_page);
+    }
+
+    // Update show_on_comment and show_on_entity properties to use new view
+    // mode settings. Since the old logic was to show on all view modes, do that.
+    if (isset($flag->show_on_entity) || isset($flag->show_on_comment)) {
+      if ($entity_info = entity_get_info($flag->entity_type)) {
+        foreach ($entity_info['view modes'] as $view_mode => $value) {
+          $flag->show_in_links[$view_mode] = TRUE;
+        }
+      }
+
+      unset($flag->show_on_entity, $flag->show_on_comment);
+    }
   }
 }
diff --git a/includes/flag/flag_comment.inc b/includes/flag/flag_comment.inc
index 19158fd..58b15fc 100644
--- a/includes/flag/flag_comment.inc
+++ b/includes/flag/flag_comment.inc
@@ -11,11 +11,8 @@
 class flag_comment extends flag_entity {
   function options() {
     $options = parent::options();
-    // Use own display settings in the meanwhile.
-    unset($options['show_on_entity']);
     $options += array(
       'access_author' => '',
-      'show_on_comment' => TRUE,
     );
     return $options;
   }
@@ -39,14 +36,6 @@ class flag_comment extends flag_entity {
       '#default_value' => $this->access_author,
       '#description' => t("Restrict access to this flag based on the user's ownership of the content. Users must also have access to the flag through the role settings."),
     );
-
-    $form['display']['show_on_comment'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Display link under comment'),
-      '#default_value' => $this->show_on_comment,
-    );
-
-    unset($form['display']['show_on_entity']);
   }
 
   function type_access_multiple($entity_ids, $account) {
@@ -80,10 +69,6 @@ class flag_comment extends flag_entity {
     return $comment->cid;
   }
 
-  function uses_hook_link($teaser) {
-    return $this->show_on_comment;
-  }
-
   function get_labels_token_types() {
     return array_merge(array('comment', 'node'), parent::get_labels_token_types());
   }
diff --git a/includes/flag/flag_entity.inc b/includes/flag/flag_entity.inc
index c30efa5..2b0e89f 100644
--- a/includes/flag/flag_entity.inc
+++ b/includes/flag/flag_entity.inc
@@ -16,8 +16,10 @@ class flag_entity extends flag_flag {
     $options = parent::options();
     $options += array(
       // Output the flag in the entity links.
+      // This is empty for now and will get overriden for different
+      // entities.
       // @see hook_entity_view().
-      'show_on_entity' => TRUE,
+      'show_in_links' => array(),
       // Add a checkbox for the flag in the entity form.
       // @see hook_field_attach_form().
       'show_on_form' => FALSE,
@@ -43,20 +45,30 @@ class flag_entity extends flag_flag {
       '#description' => t('Select the bundles that this flag may be used on. Leave blank to allow on all bundles for the entity type.'),
       '#default_value' => $this->types,
     );
-    // Handlers may want to unset this option if they provide their own more
-    // specific ways to show links.
-    $form['display']['show_on_entity'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Display link on entity'),
-      '#default_value' => isset($this->show_on_entity) ? $this->show_on_entity : TRUE,
-      '#weight' => 0,
+
+    // Add checkboxes to show flag link on each entity view mode.
+    $options = array();
+    $defaults = array();
+    foreach ($entity_info['view modes'] as $name => $view_mode) {
+      $options[$name] = t('Display on @name view mode', array('@name' => $view_mode['label']));
+      $defaults[$name] = !empty($this->show_in_links[$name]) ? $name : 0;
+    }
+
+    $form['display']['show_in_links'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Display in entity links'),
+      '#description' => t('Show the flag link with the other links on the entity.'),
+      '#options' => $options,
+      '#default_value' => $defaults,
     );
+
     $form['display']['show_on_form'] = array(
       '#type' => 'checkbox',
       '#title' => t('Display checkbox on entity edit form'),
       '#default_value' => $this->show_on_form,
       '#weight' => 5,
     );
+
     // We use FieldAPI to put the flag checkbox on the entity form, so therefore
     // require the entity to be fielable. Since this is a potential DX
     // headscratcher for a developer wondering where this option has gone,
@@ -141,9 +153,10 @@ class flag_entity extends flag_flag {
   /**
    * Returns TRUE if the link should be displayed.
    */
-  function uses_hook_link($teaser) {
-    if ($this->show_on_entity) {
-      return TRUE;
+  function uses_hook_link($view_mode) {
+    // Check for settings for the given view mode.
+    if (isset($this->show_in_links[$view_mode])) {
+      return (bool) $this->show_in_links[$view_mode];
     }
     return FALSE;
   }
diff --git a/includes/flag/flag_flag.inc b/includes/flag/flag_flag.inc
index edf1c0d..7541fad 100644
--- a/includes/flag/flag_flag.inc
+++ b/includes/flag/flag_flag.inc
@@ -631,7 +631,7 @@ class flag_flag {
    * Returns TRUE if the flag is configured to show the flag-link using hook_link.
    * Derived classes are likely to implement this.
    */
-  function uses_hook_link($teaser) {
+  function uses_hook_link($view_mode) {
     return FALSE;
   }
 
diff --git a/includes/flag/flag_node.inc b/includes/flag/flag_node.inc
index db9141c..1f087b8 100644
--- a/includes/flag/flag_node.inc
+++ b/includes/flag/flag_node.inc
@@ -12,11 +12,7 @@ class flag_node extends flag_entity {
   function options() {
     $options = parent::options();
     // Use own display settings in the meanwhile.
-    unset($options['show_on_entity']);
     $options += array(
-      'show_on_page' => TRUE,
-      'show_on_teaser' => TRUE,
-      'show_on_form' => FALSE,
       'i18n' => 0,
     );
     return $options;
@@ -54,24 +50,11 @@ class flag_node extends flag_entity {
       '#weight' => 5,
     );
 
-    $form['display']['show_on_teaser'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Display link on node teaser'),
-      '#default_value' => $this->show_on_teaser,
-    );
-
-    $form['display']['show_on_page'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Display link on node page'),
-      '#default_value' => $this->show_on_page,
-    );
     // Override the UI texts for nodes.
     $form['display']['show_on_form'] = array(
       '#title' => t('Display checkbox on node edit form'),
       '#description' => t('If you elect to have a checkbox on the node edit form, you may specify its initial state in the settings form <a href="@content-types-url">for each content type</a>.', array('@content-types-url' => url('admin/structure/types'))),
     ) + $form['display']['show_on_form'];
-
-    unset($form['display']['show_on_entity']);
   }
 
   function type_access_multiple($entity_ids, $account) {
@@ -113,13 +96,6 @@ class flag_node extends flag_entity {
     return $entity_id;
   }
 
-  function uses_hook_link($teaser) {
-    if ($teaser && $this->show_on_teaser || !$teaser && $this->show_on_page) {
-      return TRUE;
-    }
-    return FALSE;
-  }
-
   function flag($action, $entity_id, $account = NULL, $skip_permission_check = FALSE, $flagging = NULL) {
     $entity_id = $this->get_translation_id($entity_id);
     return parent::flag($action, $entity_id, $account, $skip_permission_check, $flagging);
diff --git a/includes/flag/flag_user.inc b/includes/flag/flag_user.inc
index b438d13..72dc201 100644
--- a/includes/flag/flag_user.inc
+++ b/includes/flag/flag_user.inc
@@ -11,9 +11,6 @@
 class flag_user extends flag_entity {
   function options() {
     $options = parent::options();
-    // We supersede, but do not supplant, the regular entity display with an
-    // option that's formatted in the style of user profiles.
-    $options['show_on_entity'] = FALSE;
     $options += array(
       'show_on_profile' => TRUE,
       'access_uid' => '',
@@ -46,8 +43,6 @@ class flag_user extends flag_entity {
       // Put this above 'show on entity'.
       '#weight' => -1,
     );
-    // Explain how 'show on entity' is different.
-    $form['display']['show_on_entity']['#description'] = t('Show the link in the same format as on other entities.');
   }
 
   function form_input($form_values) {
diff --git a/tests/flag.test b/tests/flag.test
index 31c0f4a..4f99ed0 100644
--- a/tests/flag.test
+++ b/tests/flag.test
@@ -72,8 +72,10 @@ class FlagFlaggingCRUDTestCase extends FlagTestCaseBase {
       'show_on_form' => 0,
       'access_author' => '',
       'show_contextual_link' => 0,
-      'show_on_page' => 1,
-      'show_on_teaser' => 1,
+      'show_in_links' => array(
+        'full' => 1,
+        'teaser' => 1,
+      ),
       'i18n' => 0,
       'api_version' => 3,
     );
@@ -250,15 +252,19 @@ class FlagAdminTestCase extends FlagTestCaseBase {
       'roles[unflag][2]' => TRUE,
       'types[article]' => FALSE,
       'types[page]' => TRUE,
-      'show_on_teaser' => FALSE,
-      'show_on_page' => FALSE,
+      'show_in_links[full]' => FALSE,
+      'show_in_links[teaser]' => FALSE,
+      'show_in_links[rss]' => FALSE,
+      'show_in_links[search_index]' => FALSE,
+      'show_in_links[search_result]' => FALSE,
       'show_on_form' => FALSE,
       'link_type' => 'toggle',
     );
     $saved = $edit;
     $saved['roles'] = array('flag' => array(2), 'unflag' => array(2));
     $saved['types'] = array('page');
-    unset($saved['roles[flag][2]'], $saved['roles[unflag][2]'], $saved['types[article]'], $saved['types[page]']);
+    $saved['show_in_links'] = array('full' => 0, 'teaser' => 0, 'rss' => 0, 'search_index' => 0, 'search_result' => 0);
+    unset($saved['roles[flag][2]'], $saved['roles[unflag][2]'], $saved['types[article]'], $saved['types[page]'], $saved['show_in_links[full]'], $saved['show_in_links[teaser]'], $saved['show_in_links[rss]'], $saved['show_in_links[search_index]'], $saved['show_in_links[search_result]']);
 
     $this->drupalPost(FLAG_ADMIN_PATH . '/add/node', $edit, t('Save flag'));
 
@@ -300,15 +306,19 @@ class FlagAdminTestCase extends FlagTestCaseBase {
       'roles[unflag][2]' => TRUE,
       'types[article]' => TRUE,
       'types[page]' => FALSE,
-      'show_on_teaser' => TRUE,
-      'show_on_page' => TRUE,
+      'show_in_links[full]' => TRUE,
+      'show_in_links[teaser]' => TRUE,
+      'show_in_links[rss]' => FALSE,
+      'show_in_links[search_index]' => FALSE,
+      'show_in_links[search_result]' => FALSE,
       'show_on_form' => TRUE,
       'link_type' => 'normal',
     );
     $saved = $edit;
     $saved['roles'] = array('flag' => array(2), 'unflag' => array(2));
     $saved['types'] = array('article');
-    unset($saved['roles[flag][2]'], $saved['roles[unflag][2]'], $saved['types[article]'], $saved['types[page]']);
+    $saved['show_in_links'] = array('full' => TRUE, 'teaser' => TRUE, 'rss' => 0, 'search_index' => 0, 'search_result' => 0);
+    unset($saved['roles[flag][2]'], $saved['roles[unflag][2]'], $saved['types[article]'], $saved['types[page]'], $saved['show_in_links[full]'], $saved['show_in_links[teaser]'], $saved['show_in_links[rss]'], $saved['show_in_links[search_index]'], $saved['show_in_links[search_result]']);
 
     $this->drupalPost(FLAG_ADMIN_PATH . '/manage/' . $flag->name, $edit, t('Save flag'));
 
@@ -400,8 +410,10 @@ class FlagAccessFormTestCase extends FlagTestCaseBase {
       'show_on_form' => 1,
       'access_author' => '',
       'show_contextual_link' => 0,
-      'show_on_page' => 1,
-      'show_on_teaser' => 1,
+      'show_in_links' => array(
+        'full' => 1,
+        'teaser' => 1,
+      ),
       'i18n' => 0,
       'api_version' => 3,
     );
@@ -489,8 +501,10 @@ class FlagAccessLinkTestCase extends FlagTestCaseBase {
       'show_on_form' => 0,
       'access_author' => '',
       'show_contextual_link' => 0,
-      'show_on_page' => 1,
-      'show_on_teaser' => 1,
+      'show_in_links' => array(
+        'full' => 1,
+        'teaser' => 1,
+      ),
       'i18n' => 0,
       'api_version' => 3,
     );
@@ -612,8 +626,10 @@ class FlagLinkTypeConfirmTestCase extends DrupalWebTestCase {
       'show_on_form' => 0,
       'access_author' => '',
       'show_contextual_link' => 0,
-      'show_on_page' => 1,
-      'show_on_teaser' => 1,
+      'show_in_links' => array(
+        'full' => 1,
+        'teaser' => 1,
+      ),
       'i18n' => 0,
       'api_version' => 3,
     );
