diff --git a/sharethis.module b/sharethis.module
index 3ac3aa3..91883e0 100644
--- a/sharethis.module
+++ b/sharethis.module
@@ -78,19 +78,9 @@ function sharethis_configuration_form($form, &$form_state) {
   }
   $service_string_markup = drupal_substr($service_string_markup, 0, -1);
 
-  // Create an array of node types.
-  $node_type_array = node_type_get_types();
-  $node_type_options = array();
-  foreach ($node_type_array as $k => $v) {
-    $node_type_options[$k] = $v->name;
-  }
-  // Figure out which nodeTypes are currently selected
-  $nodes_string = $current_options_array['nodeType'];
-  $nodes_selected = explode(",", $nodes_string);
   // Create the variables for publisher keys.
   $publisher = $current_options_array['publisherID'];
   // Create the variables for teasers.
-  $teaser = $current_options_array['viewMode'] == "1" ? TRUE : FALSE;
 
   $form = array();
   $form['options'] = array(
@@ -154,27 +144,7 @@ function sharethis_configuration_form($form, &$form_state) {
     '#group' => 'additional_settings',
     '#description' => t('Configure where the ShareThis widget should appear.'),
   );
-  $form['context']['sharethis_node_option'] = array(
-    '#title' => t("Node types"),
-    '#description' => t('Select which nodes the ShareThis widget should appear on.'),
-    '#required' => TRUE,
-    '#type' => 'checkboxes',
-    '#options' => $node_type_options,
-    '#default_value' => $nodes_selected
-  );
-  $form['context']['sharethis_teaser_option'] = array(
-    '#title' => t('Only full view'),
-    '#type' => 'checkbox',
-    '#default_value' => $teaser ? 1 : 0,
-    '#description' => t('When checked, will not show the widget on node teasers.'),
-  );
-  $form['context']['sharethis_comments'] = array(
-    '#title' => t('Comments'),
-    '#type' => 'checkbox',
-    '#default_value' => variable_get('sharethis_comments', FALSE),
-    '#description' => t('Display ShareThis on comments.'),
-    '#access' => module_exists('comment'),
-  );
+
   $form['context']['sharethis_location'] = array(
     '#title' => t('Location'),
     '#type' => 'radios',
@@ -184,7 +154,63 @@ function sharethis_configuration_form($form, &$form_state) {
       'links' => t('Links area'),
     ),
     '#default_value' => variable_get('sharethis_location', 'content'),
-    '#description' => t('Choose where the ShareThis widget should appear. When selected to display as a block, you must choose which region to display the <em>ShareThis block</em> in from the <a href="@blocksadmin">Blocks administration</a>.', array('@blocksadmin' => url('admin/structure/block'))),
+  );
+
+  // Add an information section for each location type, each dependent on the
+  // currently selected location.
+  foreach (array('links', 'content', 'block') as $location_type) {
+    $form['context'][$location_type]['#type'] = 'container';
+    $form['context'][$location_type]['#states']['visible'][':input[name="sharethis_location"]'] = array('value' => $location_type);
+  }
+
+  // Add help text for the 'content' location.
+  $form['context']['content']['help'] = array(
+    '#markup' => t('When using the Content location, you must place the ShareThis links in the <a href="@url">Manage Display</a> section of each content type.', array('@url' => url('admin/structure/types'))),
+    '#weight' => 10,
+    '#prefix' => '<em>',
+    '#suffix' => '</em>',
+  );
+  // Add help text for the 'block' location.
+  $form['context']['block']['#children'] = t('You must choose which region to display the <em>ShareThis block</em> in from the <a href="@blocksadmin">Blocks administration</a>.', array('@blocksadmin' => url('admin/structure/block')));
+
+  // Add checkboxes for each view mode of each bundle.
+  $entity_info = entity_get_info('node');
+  $modes = array();
+  foreach ($entity_info['view modes'] as $mode => $mode_info) {
+    $modes[$mode] = $mode_info['label'];
+  }
+  // Get a list of content types and view modes
+  $view_modes_selected = $current_options_array['view_modes'];
+  foreach ($entity_info['bundles'] as $bundle => $bundle_info) {
+    $form['context']['links']['sharethis_' . $bundle . '_options'] = array(
+      '#title' => t('%label View Modes', array('%label' => $bundle_info['label'])),
+      '#description' => t('Select which view modes the ShareThis widget should appear on for %label nodes.', array('%label' => $bundle_info['label'])),
+      '#type' => 'checkboxes',
+      '#options' => $modes,
+      '#default_value' => $view_modes_selected[$bundle],
+    );
+  }
+
+  // Allow the user to choose which content types will have ShareThis added
+  // when using the 'Content' location.
+  $content_types = array();
+  $enabled_content_types = variable_get('sharethis_node_types', array());
+  foreach($entity_info['bundles'] as $bundle => $bundle_info) {
+    $content_types[$bundle] = t($bundle_info['label']);
+  }
+  $form['context']['content']['sharethis_node_types'] = array(
+    '#title' => t('Node Types'),
+    '#description' => t('Select which node types the ShareThis widget should appear on.'),
+    '#type' => 'checkboxes',
+    '#options' => $content_types,
+    '#default_value' => $enabled_content_types,
+  );
+  $form['context']['sharethis_comments'] = array(
+    '#title' => t('Comments'),
+    '#type' => 'checkbox',
+    '#default_value' => variable_get('sharethis_comments', FALSE),
+    '#description' => t('Display ShareThis on comments.'),
+    '#access' => module_exists('comment'),
   );
   $form['context']['sharethis_weight'] = array(
     '#title' => t('Weight'),
@@ -236,11 +262,12 @@ function sharethis_configuration_form($form, &$form_state) {
     '#description' => t('If disabled, the ShareThis widget will be displayed on click instead of hover.'),
     '#default_value' => variable_get('sharethis_option_onhover', TRUE),
   );
+  $form['#submit'][] = 'sharethis_configuration_form_submit';
   return system_settings_form($form);
 }
 
 /**
- * Form submission handler for sharethis_configuration_form().
+ * Form validation handler for sharethis_configuration_form().
  */
 function sharethis_configuration_form_validate($form, &$form_state) {
   //Additional filters for the service option input
@@ -251,12 +278,6 @@ function sharethis_configuration_form_validate($form, &$form_state) {
   //Additional filters for the option extras input
   $form_state['values']['sharethis_option_extras'] = (isset($form_state['values']['sharethis_option_extras'])) ? $form_state['values']['sharethis_option_extras'] : array();
 
-  // Implode the node options
-  $form_state['values']['sharethis_node_option'] = implode(',', $form_state['values']['sharethis_node_option']);
-
-  // Set a default value for the teaser option
-  $form_state['values']['sharethis_teaser_option'] = (isset($form_state['values']['sharethis_teaser_option'])) ? $form_state['values']['sharethis_teaser_option'] : 0;
-
   // Sanitize the publisher ID option.  Since it's a text field, remove anything that resembles code
   $form_state['values']['sharethis_publisherID'] = filter_xss($form_state['values']['sharethis_publisherID'], array());
 
@@ -270,6 +291,18 @@ function sharethis_configuration_form_validate($form, &$form_state) {
   $form_state['values']['sharethis_twitter_recommends'] = (isset($form_state['values']['sharethis_twitter_recommends'])) ? $form_state['values']['sharethis_twitter_recommends'] : '';
 }
 
+/**
+ * Form submission handler for sharethis_configuration_form().
+ */
+function sharethis_configuration_form_submit($form, &$form_state) {
+  // If the location is changing to/from 'content', clear the Field Info cache.
+  $current_location = variable_get('sharethis_location', 'content');
+  $new_location = $form_state['values']['sharethis_location'];
+  if (($current_location == 'content' || $new_location == 'content') && $current_location != $new_location) {
+    field_info_cache_clear();
+  }
+}
+
  /**
  * Implements hook_menu().
  *
@@ -336,43 +369,62 @@ function sharethis_node_view($node, $view_mode, $langcode) {
   $mPath = $base_url . $path_module;
   $mTitle = $node->title;
 
-  // Only display the ShareThis buttons if this node fits all the requirements
-  if (strpos($data_options['nodeType'], $node->type) !== FALSE) { // Make sure this is the right type of node.
-    if (($data_options['viewMode'] == "1") && ($view_mode == "teaser")) { // If "don't show for teaser" is enabled, and this is a teaser, don't do anything
-      // Do nothing.
-    }
-    else {
-      // Check where we want to display the ShareThis widget.
-      switch (variable_get('sharethis_location', 'content')) {
-        case 'content':
-          $node->content['sharethis'] = array(
-            '#tag' => 'div', // Wrap it in a div.
-            '#type' => 'html_tag',
-            '#attributes' => array('class' => 'sharethis-buttons'),
-            '#value' => sharethis_get_button_HTML($data_options, $mPath, $mTitle),
-            '#weight' => intval(variable_get('sharethis_weight', 10)),
-          );
-        break;
-        case 'links':
-          $links['sharethis'] = array(
-            'html' => TRUE,
-            'title' => sharethis_get_button_HTML($data_options, $mPath, $mTitle),
-            'attributes' => array('class' => 'sharethis-buttons'),
-          );
-          $node->content['links']['sharethis'] = array(
-            '#theme' => 'links',
-            '#links' => $links,
-            '#attributes' => array(
-              'class' => array('links', 'inline'),
-            ),
-            '#tag' => 'div', // Wrap it in a div.
-            '#type' => 'html_tag',
-            '#weight' => intval(variable_get('sharethis_weight', 10)),
-          );
-        break;
+  // Check where we want to display the ShareThis widget.
+  switch (variable_get('sharethis_location', 'content')) {
+    case 'content':
+      $enabled_types = variable_get('sharethis_node_types', array());
+      if (isset($enabled_types[$node->type]) && $enabled_types[$node->type]) {
+        $node->content['sharethis'] = array(
+          '#tag' => 'div', // Wrap it in a div.
+          '#type' => 'html_tag',
+          '#attributes' => array('class' => 'sharethis-buttons'),
+          '#value' => sharethis_get_button_HTML($data_options, $mPath, $mTitle),
+          '#weight' => intval(variable_get('sharethis_weight', 10)),
+        );
+      }
+    break;
+    case 'links':
+      $enabled_view_modes = variable_get('sharethis_' . $node->type . '_options', array());
+      if (isset($enabled_view_modes[$view_mode]) && $enabled_view_modes[$view_mode]) {
+        $links['sharethis'] = array(
+          'html' => TRUE,
+          'title' => sharethis_get_button_HTML($data_options, $mPath, $mTitle),
+          'attributes' => array('class' => 'sharethis-buttons'),
+        );
+        $node->content['links']['sharethis'] = array(
+          '#theme' => 'links',
+          '#links' => $links,
+          '#attributes' => array(
+            'class' => array('links', 'inline'),
+          ),
+          '#tag' => 'div', // Wrap it in a div.
+          '#type' => 'html_tag',
+          '#weight' => intval(variable_get('sharethis_weight', 10)),
+        );
       }
+    break;
+  }
+}
+
+/**
+ * Implements hook_field_extra_fields().
+ */
+function sharethis_field_extra_fields() {
+  $extra = array();
+  // Only add extra fields if the location is the node content.
+  if (variable_get('sharethis_location', 'content') == 'content') {
+    $entity_info = entity_get_info('node');
+    foreach ($entity_info['bundles'] as $bundle => $bundle_info) {
+      $extra['node'][$bundle]['display'] = array(
+        'sharethis' => array(
+          'label' => t('ShareThis'),
+          'description' => t('ShareThis links'),
+          'weight' => intval(variable_get('sharethis_weight', 10)),
+        ),
+      );
     }
   }
+  return $extra;
 }
 
 /**
@@ -383,19 +435,22 @@ function sharethis_node_view($node, $view_mode, $langcode) {
  * @TODO: Switch from this function to just straight variable_get() calls.
  */
 function sharethis_get_options_array() {
+  $view_modes = array();
+  foreach (array_keys(node_type_get_types()) as $type) {
+    $view_modes[$type] = variable_get('sharethis_' . $type . '_options', array());
+  }
   return array(
     'buttons' => variable_get('sharethis_button_option', 'stbc_large'),
-    'nodeType' => variable_get('sharethis_node_option', 'page,article'),
     'publisherID' => variable_get('sharethis_publisherID', ''),
     'services' => variable_get('sharethis_service_option', '"Tweet:twitter","Facebook:facebook","ShareThis:sharethis"'),
     'option_extras' => variable_get('sharethis_option_extras', array()),
-    'viewMode' => variable_get('sharethis_teaser_option', 0),
     'widget' => variable_get('sharethis_widget_option', 'st_multi'),
     'onhover' => variable_get('sharethis_option_onhover', TRUE),
     'twitter_suffix' => variable_get('sharethis_twitter_suffix', ''),
     'twitter_handle' => variable_get('sharethis_twitter_handle', ''),
     'twitter_recommends' => variable_get('sharethis_twitter_recommends', ''),
     'late_load' => variable_get('sharethis_late_load', FALSE),
+    'view_modes' => $view_modes,
   );
 }
 
