diff --git a/flag.module b/flag.module
index a3c6fdb..34aa847 100644
--- a/flag.module
+++ b/flag.module
@@ -920,7 +920,7 @@ function flag_contextual_links_view_alter(&$element, $items) {
  * 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',
@@ -937,13 +937,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;
   }
@@ -955,7 +955,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..11953a5 100644
--- a/flag_bookmark/flag_bookmark.install
+++ b/flag_bookmark/flag_bookmark.install
@@ -23,8 +23,11 @@ function flag_bookmark_enable() {
     $configuration = array(
         'name' => 'bookmarks',
         'global' => 0,
-        'show_on_page' => 1,
-        'show_on_teaser' => 1,
+        'show_on_entity' => 1,
+        'show_on_view_modes' => 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/flag_comment.inc b/includes/flag/flag_comment.inc
index 4930d77..60388e7 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 389becb..3d14148 100644
--- a/includes/flag/flag_entity.inc
+++ b/includes/flag/flag_entity.inc
@@ -18,6 +18,9 @@ class flag_entity extends flag_flag {
       // Output the flag in the entity links.
       // @see hook_entity_view().
       'show_on_entity' => TRUE,
+      // This is empty for now and will get overriden for different
+      // entities.
+      'show_on_view_modes' => array(),
       // Add a checkbox for the flag in the entity form.
       // @see hook_field_attach_form().
       'show_on_form' => FALSE,
@@ -51,6 +54,26 @@ class flag_entity extends flag_flag {
       '#default_value' => isset($this->show_on_entity) ? $this->show_on_entity : TRUE,
       '#weight' => 0,
     );
+
+    // Add extra checkboxes for each entity view mode.
+    $form['display']['show_on_view_modes'] = array(
+      '#type' => 'container',
+      '#states' => array(
+        'visible' => array(
+          "input[name='show_on_entity']" => array('checked' => TRUE),
+        ),
+      ),
+      '#tree' => TRUE,
+    );
+
+    foreach ($entity_info['view modes'] as $key => $value) {
+      $form['display']['show_on_view_modes'][$key] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Display on @name view mode', array('@name' => $value['label'])),
+        '#default_value' => isset($this->show_on_view_modes[$key]) ? $this->show_on_view_modes[$key] : FALSE,
+      );
+    }
+
     $form['display']['show_on_form'] = array(
       '#type' => 'checkbox',
       '#title' => t('Display checkbox on entity edit form'),
@@ -141,9 +164,12 @@ class flag_entity extends flag_flag {
   /**
    * Returns TRUE if the link should be displayed.
    */
-  function uses_hook_link($teaser) {
+  function uses_hook_link($view_mode) {
     if ($this->show_on_entity) {
-      return TRUE;
+      // Check for settings for the given view mode.
+      if (isset($this->show_on_view_modes[$view_mode])) {
+        return (bool) $this->show_on_view_modes[$view_mode];
+      }
     }
     return FALSE;
   }
diff --git a/includes/flag/flag_flag.inc b/includes/flag/flag_flag.inc
index 0bda839..0287dbb 100644
--- a/includes/flag/flag_flag.inc
+++ b/includes/flag/flag_flag.inc
@@ -619,7 +619,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/tests/flag.test b/tests/flag.test
index 31c0f4a..d29f2a8 100644
--- a/tests/flag.test
+++ b/tests/flag.test
@@ -72,8 +72,11 @@ class FlagFlaggingCRUDTestCase extends FlagTestCaseBase {
       'show_on_form' => 0,
       'access_author' => '',
       'show_contextual_link' => 0,
-      'show_on_page' => 1,
-      'show_on_teaser' => 1,
+      'show_on_entity' => 1,
+      'show_on_view_modes' => array(
+        'full' => 1,
+        'teaser' => 1,
+      ),
       'i18n' => 0,
       'api_version' => 3,
     );
@@ -250,8 +253,9 @@ class FlagAdminTestCase extends FlagTestCaseBase {
       'roles[unflag][2]' => TRUE,
       'types[article]' => FALSE,
       'types[page]' => TRUE,
-      'show_on_teaser' => FALSE,
-      'show_on_page' => FALSE,
+      'show_on_entity' => FALSE,
+      'show_on_view_modes[full]' => FALSE,
+      'show_on_view_modes[teaser]' => FALSE,
       'show_on_form' => FALSE,
       'link_type' => 'toggle',
     );
@@ -300,8 +304,9 @@ class FlagAdminTestCase extends FlagTestCaseBase {
       'roles[unflag][2]' => TRUE,
       'types[article]' => TRUE,
       'types[page]' => FALSE,
-      'show_on_teaser' => TRUE,
-      'show_on_page' => TRUE,
+      'show_on_entity' => TRUE,
+      'show_on_view_modes[full]' => TRUE,
+      'show_on_view_modes[teaser]' => TRUE,
       'show_on_form' => TRUE,
       'link_type' => 'normal',
     );
@@ -400,8 +405,11 @@ class FlagAccessFormTestCase extends FlagTestCaseBase {
       'show_on_form' => 1,
       'access_author' => '',
       'show_contextual_link' => 0,
-      'show_on_page' => 1,
-      'show_on_teaser' => 1,
+      'show_on_entity' => 1,
+      'show_on_view_modes' => array(
+        'full' => 1,
+        'teaser' => 1,
+      ),
       'i18n' => 0,
       'api_version' => 3,
     );
@@ -489,8 +497,11 @@ class FlagAccessLinkTestCase extends FlagTestCaseBase {
       'show_on_form' => 0,
       'access_author' => '',
       'show_contextual_link' => 0,
-      'show_on_page' => 1,
-      'show_on_teaser' => 1,
+      'show_on_entity' => 1,
+      'show_on_view_modes' => array(
+        'full' => 1,
+        'teaser' => 1,
+      ),
       'i18n' => 0,
       'api_version' => 3,
     );
@@ -612,8 +623,11 @@ class FlagLinkTypeConfirmTestCase extends DrupalWebTestCase {
       'show_on_form' => 0,
       'access_author' => '',
       'show_contextual_link' => 0,
-      'show_on_page' => 1,
-      'show_on_teaser' => 1,
+      'show_on_entity' => 1,
+      'show_on_view_modes' => array(
+        'full' => 1,
+        'teaser' => 1,
+      ),
       'i18n' => 0,
       'api_version' => 3,
     );
