diff --git a/comment_notify.inc b/comment_notify.inc
index c01e8d3..3ba4635 100644
--- a/comment_notify.inc
+++ b/comment_notify.inc
@@ -45,7 +45,7 @@ function comment_notify_get_user_notification_setting($uid) {
 function comment_notify_get_default_notification_setting() {
   return (object) array(
     'comment_notify' => \Drupal::config('comment_notify.settings')->get('enable_default.watcher'),
-    'node_notify' => \Drupal::config('comment_notify.settings')->get('enable_default.entity_author')
+    'entity_notify' => \Drupal::config('comment_notify.settings')->get('enable_default.entity_author')
   );
 }
 
@@ -76,37 +76,37 @@ function comment_notify_get_user_comment_notify_preference($uid) {
 }
 
 /**
- * Get a user's default preference for node update notification.
+ * Get a user's default preference for entity update notification.
  *
- * This is notification on nodes where the user is the author.
+ * This is notification on entity where the user is the author.
  *
  * @param integer $uid
  * @return integer
  */
-function comment_notify_get_user_node_notify_preference($uid) {
+function comment_notify_get_user_entity_notify_preference($uid) {
   $setting = comment_notify_get_user_notification_setting($uid);
   if (!$setting) {
     $setting = comment_notify_get_default_notification_setting();
   }
-  return $setting->node_notify;
+  return $setting->entity_notify;
 }
 
 /**
  * Sets the notification preferences for a specific user.
  *
  * @param integer $uid
- * @param integer $node_notification
+ * @param integer $entity_notification
  * @param integer $comment_notification
  * @return boolean
  */
-function comment_notify_set_user_notification_setting($uid, $node_notification = NULL, $comment_notification = NULL) {
+function comment_notify_set_user_notification_setting($uid, $entity_notification = NULL, $comment_notification = NULL) {
   if (!$uid) {
     throw new Exception('Cannot set user preference, uid missing');
   }
   $fields = array('uid' => $uid);
 
-  if (!is_null($node_notification)) {
-    $fields['node_notify'] = $node_notification;
+  if (!is_null($entity_notification)) {
+    $fields['entity_notify'] = $entity_notification;
   }
   if (!is_null($comment_notification)) {
     $fields['comment_notify'] = $comment_notification;
@@ -184,15 +184,17 @@ function comment_notify_get_notification_type($cid) {
 }
 
 /**
- * Get a list of mails which need to be contacted for a node.
+ * Get a list of mails which need to be contacted for an entity.
  *
- * @param integer $nid
+ * @param integer $entity_id
+ * @param integer $entity_type
  * @return \Drupal\comment\CommentInterface[]
  *   A list of comment entities.
  */
-function comment_notify_get_watchers($nid) {
-  $cids = db_query("SELECT c.cid FROM {comment_field_data} c INNER JOIN {comment_notify} cn ON c.cid = cn.cid LEFT JOIN {users_field_data} u ON c.uid = u.uid WHERE c.entity_id = :nid AND c.status = :status AND cn.notify <> :notify AND (u.uid = 0 OR u.status = 1)", array(
-    ':nid' => $nid,
+function comment_notify_get_watchers($entity_id, $entity_type) {
+  $cids = db_query("SELECT c.cid FROM {comment_field_data} c INNER JOIN {comment_notify} cn ON c.cid = cn.cid LEFT JOIN {users_field_data} u ON c.uid = u.uid WHERE c.entity_id = :entity_id AND c.entity_type=:entity_type AND c.status = :status AND cn.notify <> :notify AND (u.uid = 0 OR u.status = 1)", array(
+    ':entity_id' => $entity_id,
+    ':entity_type' => $entity_type,
     ':status' => CommentInterface::PUBLISHED,
     ':notify' => COMMENT_NOTIFY_DISABLED,
   ))->fetchCol();
@@ -258,7 +260,7 @@ function comment_notify_unsubscribe_by_hash($hash) {
   $query->condition('cn.notify_hash', $hash)
       ->condition('cn.notify', COMMENT_NOTIFY_DISABLED, '!=')
       ->fields('cn', array('cid', 'notify', 'notified'))
-      ->fields('cf', array('entity_id', 'uid'))
+      ->fields('cf', array('entity_id', 'entity_type', 'uid'))
       ->execute()->fetchObject();
   $notification = $query->execute()->fetchObject();
 
@@ -266,10 +268,10 @@ function comment_notify_unsubscribe_by_hash($hash) {
     return FALSE;
   }
 
-  // If this notification is at the node level and the commenter has a Drupal
-  // account, delete all notifications for this node.
-  if (COMMENT_NOTIFY_NODE == $notification->notify && $notification->uid) {
-    $result = db_query("SELECT cid FROM {comment_field_data} WHERE entity_id = :entity_id AND uid = :uid", array(':entity_id' => $notification->entity_id, ':uid' => $notification->uid));
+  // If this notification is at the entity level and the commenter has a Drupal
+  // account, delete all notifications for this entity.
+  if (COMMENT_NOTIFY_ENTITY == $notification->notify && $notification->uid) {
+    $result = db_query("SELECT cid FROM {comment_field_data} WHERE entity_id = :entity_id AND entity_type = :entity_type AND uid = :uid", array(':entity_id' => $notification->entity_id, ':entity_type' => $notification->entity_type, ':uid' => $notification->uid));
     $cids = $result->fetchCol();
 
     // Update all comment notifications to be disabled.
diff --git a/comment_notify.install b/comment_notify.install
index 440d120..2d0017e 100644
--- a/comment_notify.install
+++ b/comment_notify.install
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * @file
  * comment_notify.install.
@@ -62,33 +63,91 @@ function comment_notify_schema() {
     ),
     'primary key' => array('cid'),
     'indexes' => array(
-      'notify_hash' => array('notify_hash')),
+      'notify_hash' => array('notify_hash'),
+    ),
   );
   $schema['comment_notify_user_settings'] = array(
     'fields' => array(
-        'uid' => array(
-          'type' => 'int',
-          'unsigned' => TRUE,
-          'description' => 'The user id from {users}.cid',
-          'not null' => TRUE,
-          'disp-width' => '11'),
-        'node_notify' => array(
-          'type' => 'int',
-          'description' => 'An integer indicating the default type of subscription: 0 means not subscribed, 1 means subscribed to all comments, and 2 means only subscribed to replies of this comment.',
-          'size' => 'tiny',
-          'not null' => TRUE,
-          'default' => 0,
-          'disp-width' => '11'),
-        'comment_notify' => array(
-          'type' => 'int',
-          'description' => 'An integer indicating the default type of subscription: 0 means not subscribed, 1 means subscribed to all comments, and 2 means only subscribed to replies of this comment.',
-          'size' => 'tiny',
-          'not null' => TRUE,
-          'default' => 0,
-          'disp-width' => '11'),
+      'uid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'description' => 'The user id from {users}.cid',
+        'not null' => TRUE,
+        'disp-width' => '11',
+      ),
+      'entity_notify' => array(
+        'type' => 'int',
+        'description' => 'An integer indicating the default type of subscription: 0 means not subscribed, 1 means subscribed to all comments, and 2 means only subscribed to replies of this comment.',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+        'disp-width' => '11',
+      ),
+      'comment_notify' => array(
+        'type' => 'int',
+        'description' => 'An integer indicating the default type of subscription: 0 means not subscribed, 1 means subscribed to all comments, and 2 means only subscribed to replies of this comment.',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+        'disp-width' => '11',
+      ),
     ),
     'primary key' => array('uid'),
   );
 
   return $schema;
 }
+
+/**
+ * Implementations of hook_update().
+ */
+
+/**
+ * Rename db column name from node_notify to entity_notify.
+ */
+function comment_notify_update_8001() {
+  $spec = array(
+    'type' => 'int',
+    'description' => 'An integer indicating the default type of subscription: 0 means not subscribed, 1 means subscribed to all comments, and 2 means only subscribed to replies of this comment.',
+    'size' => 'tiny',
+    'not null' => TRUE,
+    'default' => 0,
+    'disp-width' => '11'
+  );
+  db_change_field('comment_notify_user_settings', 'node_notify', 'entity_notify', $spec);
+}
+
+/**
+ * Preserve node notification settings.
+ */
+function comment_notify_update_8002() {
+  $node_values = \Drupal::config('comment_notify.settings')->get('node_types');
+  $bundle_types = [];
+  foreach ($node_values as $node_value) {
+    $bundle_types[] = 'node--' . $node_value . '--comment';
+  }
+  \Drupal::configFactory()
+    ->getEditable('comment_notify.settings')
+    ->set('bundle_types', $bundle_types)
+    ->save();
+}
+
+/**
+ * Update settings for generic entity support.
+ */
+function comment_notify_update_8100() {
+  $config = \Drupal::service('config.factory')
+    ->getEditable('comment_notify.settings');
+  $vars = [
+    'mail_templates.watcher.subject' => 'mail_templates.watcher.node.subject',
+    'mail_templates.watcher.body' => 'mail_templates.watcher.node.body',
+    'mail_templates.entity_author.subject' => 'mail_templates.entity_author.node.subject',
+    'mail_templates.entity_author.body' => 'mail_templates.entity_author.node.body',
+  ];
+  foreach ($vars as $old => $new) {
+    $value = $config->get($old);
+    $config->set($new, $value);
+    $config->clear($old);
+  }
+  $config->save();
+}
diff --git a/comment_notify.module b/comment_notify.module
index 49deacd..a325681 100644
--- a/comment_notify.module
+++ b/comment_notify.module
@@ -13,10 +13,12 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\field\Entity\FieldConfig;
-use Drupal\node\Entity\NodeType;
+use Drupal\Core\Entity\EntityFieldManager;
+use Drupal\comment_notify\Form\CommentNotifySettings;
+use Drupal\comment\CommentFieldItemList;
 
 define('COMMENT_NOTIFY_DISABLED', 0);
-define('COMMENT_NOTIFY_NODE', 1);
+define('COMMENT_NOTIFY_ENTITY', 1);
 define('COMMENT_NOTIFY_COMMENT', 2);
 
 /**
@@ -24,7 +26,7 @@
  */
 function _comment_notify_options() {
   $total_options = array(
-    COMMENT_NOTIFY_NODE     => t('All comments'),
+    COMMENT_NOTIFY_ENTITY   => t('All comments'),
     COMMENT_NOTIFY_COMMENT  => t('Replies to my comment')
   );
 
@@ -34,19 +36,20 @@ function _comment_notify_options() {
   return $available_options;
 }
 
-
 function comment_notify_form_comment_form_alter(&$form, FormStateInterface $form_state, $form_id) {
   $user = \Drupal::currentUser();
   if (!($user->hasPermission('subscribe to comments') || $user->hasPermission('administer comments'))) {
     return;
   }
 
-  /** @var \Drupal\Core\Entity\EntityInterface $commented_entity */
-  $commented_entity = $form_state->getFormObject()->getEntity()->getCommentedEntity();
+  /** @var \Drupal\Core\Entity\EntityInterface $comment_entity */
+  $comment_entity = $form_state->getFormObject()->getEntity();
+  $field_identifier = CommentNotifySettings::getCommentFieldIdentifier($comment_entity);
 
   // Only add the checkbox if this is an enabled content type
-  $enabled_types = \Drupal::config('comment_notify.settings')->get('node_types');
-  if (!in_array($commented_entity->bundle(), $enabled_types)) {
+  $enabled_types = \Drupal::config('comment_notify.settings')->get('bundle_types');
+  
+  if (!in_array($field_identifier, $enabled_types)) {
     return;
   }
 
@@ -89,7 +92,7 @@ function comment_notify_form_comment_form_alter(&$form, FormStateInterface $form
     $notify = comment_notify_get_notification_type($comment->id());
     $form['comment_notify_settings']['notify']['#default_value'] = (bool) $notify;
     if (count($available_options) > 1) {
-      $form['comment_notify_settings']['notify_type']['#default_value'] = empty($notify) ? COMMENT_NOTIFY_NODE : $notify;
+      $form['comment_notify_settings']['notify_type']['#default_value'] = empty($notify) ? COMMENT_NOTIFY_ENTITY : $notify;
     }
     else {
       $form['comment_notify_settings']['notify_type']['#default_value'] = key($available_options);
@@ -181,6 +184,22 @@ function comment_notify_comment_delete(CommentInterface $comment) {
   comment_notify_remove_all_notifications($comment->id());
 }
 
+/**
+ * Returns array of comment notify enabled entity type & bundles.
+ */
+function _comment_notify_get_comment_enabled_bundles() {
+  $field_manager = \Drupal::service('entity_field.manager');
+  $bundles_with_comment_fields = [];
+  $comment_field_map = $field_manager->getFieldMapByFieldType('comment');
+  foreach ($comment_field_map as $entity_type => $comment_fields) {
+    foreach ($comment_fields as $field_name => $field_info) {
+      foreach ($field_info['bundles'] as $field_bundle) {
+        $bundles_with_comment_fields[$entity_type] = $field_bundle;
+      }
+    }
+  }
+  return $bundles_with_comment_fields;
+}
 
 /**
  * Implement hook_form_alter().
@@ -199,25 +218,26 @@ function comment_notify_form_user_form_alter(&$form, FormStateInterface &$form_s
     '#open' => TRUE,
   );
 
-  // Only show the node followup UI if the user has permission to create nodes.
-  $nodes = FALSE;
-  foreach (node_type_get_names() as $type => $name) {
-    if (\Drupal::entityManager()->getAccessControlHandler('node')->createAccess($type)) {
-      $nodes = TRUE;
+  // Only show the entity followup UI if the user has permission to create entities.
+  $bundles = FALSE;
+  foreach (_comment_notify_get_comment_enabled_bundles() as $entity_type => $bundle) {
+    if (\Drupal::entityManager()->getAccessControlHandler($entity_type)->createAccess($bundle)) {
+      $bundles = TRUE;
       break;
     }
   }
 
-  if (\Drupal::currentUser()->hasPermission('administer nodes') || $nodes) {
-    $form['comment_notify_settings']['node_notify'] = array(
+  // @todo: Review this change closely. Removed access check on "administer node" permission.
+  if ($bundles) {
+    $form['comment_notify_settings']['entity_notify'] = array(
       '#type' => 'checkbox',
       '#title' => t('Receive content follow-up notification e-mails'),
-      '#default_value' => $notify_settings->node_notify,
+      '#default_value' => $notify_settings->entity_notify,
       '#description' => t('Check this box to receive an e-mail notification for follow-ups on your content. You can not disable notifications for individual threads.')
     );
   }
   else {
-    $form['comment_notify_settings']['node_notify'] = array(
+    $form['comment_notify_settings']['entity_notify'] = array(
       '#type' => 'hidden',
       '#value' => COMMENT_NOTIFY_DISABLED,
     );
@@ -247,7 +267,7 @@ function _comment_notify_submit_user_form(array &$form, FormStateInterface $form
 
   if (!$user->isAnonymous()) {
     // Save the values to {comment_notify_user_settings}.
-    comment_notify_set_user_notification_setting($user->id(), $form_state->getValue('node_notify'), $form_state->getValue('comment_notify'));
+    comment_notify_set_user_notification_setting($user->id(), $form_state->getValue('entity_notify'), $form_state->getValue('comment_notify'));
   }
 }
 
@@ -289,12 +309,15 @@ function comment_notify_comment_load($comments) {
  *   The comment entity.
  */
 function _comment_notify_mailalert(CommentInterface $comment) {
-
   module_load_include('inc', 'comment_notify', 'comment_notify');
 
   $config = \Drupal::config('comment_notify.settings');
   $user = \Drupal::currentUser();
-  $nid = $comment->getCommentedEntityId();
+
+  $entity_id = $comment->getCommentedEntityId();
+  $entity_type = $comment->getCommentedEntityTypeId();
+  $field_identifier = CommentNotifySettings::getCommentFieldIdentifier($comment);
+
 
   // Check to see if a notification has already been sent for this
   // comment so that edits to a comment don't trigger an additional
@@ -303,12 +326,12 @@ function _comment_notify_mailalert(CommentInterface $comment) {
     return;
   }
 
-  /** @var \Drupal\node\NodeInterface $node */
-  $node = \Drupal::entityManager()->getStorage('node')->load($nid);
+  /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+  $entity = \Drupal::entityManager()->getStorage($entity_type)->load($entity_id);
 
   // No mails if this is not an enabled content type
-  $enabled_types = $config->get('node_types');
-  if (!in_array($node->bundle(), $enabled_types) && !empty($enabled_types)) {
+  $enabled_types = $config->get('bundle_types');
+  if (!empty($enabled_types) && !in_array($field_identifier, $enabled_types)) {
     return;
   }
 
@@ -323,36 +346,53 @@ function _comment_notify_mailalert(CommentInterface $comment) {
   }
   $sent_to = array();
 
-  // Send to a subscribed author if they are not the current commenter.
-  $author = $node->getOwner();
-  $author_notify_settings = comment_notify_get_user_notification_setting($author->id()) ?: comment_notify_get_default_notification_setting();
+  // @todo Add hook to allow entity types to specify their type's author field?
+  $author_fields = ['uid', 'user_id'];
+  foreach ($author_fields as $author_field) {
+    // Send to a subscribed author if they are not the current commenter.
+    if ($entity->hasField($author_field)) {
+      $author = $entity->getOwner();
+      $author_notify_settings = comment_notify_get_user_notification_setting($author->id()) ?: comment_notify_get_default_notification_setting();
+      $author_email = $author->getEmail();
 
-  // Do they explicitly want this? Or is it default to send to users?
-  // Is the comment author not the node author? Do they have access? Do they have an email (e.g. anonymous)?
-  if (
-    (
-      (!empty($author_notify_settings->node_notify) && $author_notify_settings->node_notify == 1)
-      || ($config->get('enable_default.entity_author') == 1 && !isset($author_notify_settings->node_notify))
-    )
-    && $user->id() != $author->id()
-    && $node->access('view', $author)
-    && !empty($author->getEmail())
-  ) {
-    $raw_values = $config->get('mail_templates.entity_author');
-    $token_data = ['comment' => $comment, 'node' => $node];
-    $message['subject'] = PlainTextOutput::renderFromHtml(\Drupal::token()->replace($raw_values['subject'], $token_data));
-    $message['body'] = \Drupal::token()->replace($raw_values['body'], $token_data);
+      // Do they explicitly want this? Or is it default to send to users? Is
+      // the comment author not the entity author? Do they have access? Do they
+      // have an email (e.g. anonymous)?
+      $entity_notify_a = !empty($author_notify_settings->entity_notify) && $author_notify_settings->entity_notify == 1;
+      $entity_notify_b = $config->get('enable_default.entity_author') == 1 && !isset($author_notify_settings->entity_notify);
+      if (!empty($author_email)
+        && ($entity_notify_a || $entity_notify_b)
+        && $user->id() != $author->id()
+        && $entity->access('view', $author)
+      ) {
+        if (in_array($author_email, $sent_to)) {
+          continue;
+        }
+        $raw_values = $config->get('mail_templates.entity_author.' . $entity->getEntityTypeId());
+        $token_data = [
+          'comment' => $comment,
+          'user' => $author,
+        ];
+        if ($entity_type == 'node') {
+          $token_data['node'] = $entity;
+        }
+        $message['subject'] = PlainTextOutput::renderFromHtml(\Drupal::token()->replace($raw_values['subject'], $token_data));
+        $message['body'] = \Drupal::token()->replace($raw_values['body'], $token_data);
 
-    $language = $author->getPreferredLangcode();
-    \Drupal::service('plugin.manager.mail')->mail('comment_notify', 'comment_notify_mail', $author->getEmail(), $language, $message);
-    $sent_to[] = strtolower($author->getEmail());
+        $language = $author->getPreferredLangcode();
+        \Drupal::service('plugin.manager.mail')->mail('comment_notify', 'comment_notify_mail', $author->getEmail(), $language, $message);
+        $sent_to[] = strtolower($author->getEmail());
+      }
+      // This field existed, so there's no need to try again.
+      break;
+    }
   }
 
   // For "reply to my comments" notifications, figure out what thread this is.
   $thread = $comment->getThread() ?: '';
 
   // Get the list of commenters to notify.
-  $watchers = comment_notify_get_watchers($nid);
+  $watchers = comment_notify_get_watchers($entity_id, $entity_type);
 
   foreach ($watchers as $alert) {
     // If the user is not anonymous, always load the current e-mail address
@@ -368,18 +408,24 @@ function _comment_notify_mailalert(CommentInterface $comment) {
     if ($mail != $comment_mail && !in_array(strtolower($mail), $sent_to) && ($alert->getOwnerId() != $comment->getOwnerId() || $alert->getOwnerId() == 0)) {
       $message = array();
 
-      // Make sure they have access to this node before showing a bunch of node information.
-      if (!$node->access('view', $recipient_user)) {
+      // Make sure they have access to this entity before showing a bunch of
+      // entity information.
+      if (!$entity->access('view', $recipient_user)) {
         continue;
       }
 
-      $raw_values = $config->get('mail_templates.watcher');
-      $token_data = ['comment' => $comment, 'node' => $node, 'comment-subscribed' => $alert];
+      $raw_values = $config->get('mail_templates.watcher.' . $entity->getEntityTypeId());
+      kint($raw_values);
+      $token_data = ['comment' => $comment, 'comment-subscribed' => $alert];
+      if ($entity_type == 'node') {
+        $token_data['node'] = $entity;
+      }
       $message['subject'] = PlainTextOutput::renderFromHtml(\Drupal::token()->replace($raw_values['subject'], $token_data));
       $message['body'] = \Drupal::token()->replace($raw_values['body'], $token_data);
 
       $language = !empty($alert->uid) ? $recipient_user->getPreferredLangcode() : LanguageInterface::LANGCODE_DEFAULT;
-      \Drupal::service('plugin.manager.mail')->mail('comment_notify', 'comment_notify_mail', $mail, $language, $message);
+      \Drupal::service('plugin.manager.mail')
+        ->mail('comment_notify', 'comment_notify_mail', $mail, $language, $message);
       $sent_to[] = strtolower($mail);
 
       // Make the mail link to user's /edit, unless it's an anonymous user.
@@ -391,7 +437,12 @@ function _comment_notify_mailalert(CommentInterface $comment) {
       }
 
       // Add an entry to the watchdog log.
-      \Drupal::logger('comment_notify')->notice('Notified: @user_mail', ['@user_mail' => $user_mail, 'link' => $alert->link(t('source comment'))]);
+      $args = [
+        '@user_mail' => $user_mail,
+        'link' => $alert->link(t('source comment')),
+      ];
+      \Drupal::logger('comment_notify')
+        ->notice('Notified: @user_mail', $args);
     }
   }
   // Record that a notification was sent for this comment so that
@@ -432,13 +483,16 @@ function comment_notify_entity_extra_field_info() {
   module_load_include('inc', 'comment_notify', 'comment_notify');
   $extras = array();
 
-  foreach (\Drupal::config('comment_notify.settings')->get('node_types') as $node_type) {
-    $comment_field = FieldConfig::loadByName('node', $node_type, 'comment');
+  foreach (\Drupal::config('comment_notify.settings')->get('bundle_types') as $bundle_type) {
+    $field_identifier = explode('--', $bundle_type);
+    $comment_field = FieldConfig::loadByName($field_identifier[0], $field_identifier[1], $field_identifier[2]);
     if ($comment_field) {
+      $bundle_info = \Drupal::service("entity_type.bundle.info")->getBundleInfo($field_identifier[0]);
+      $bundle_label = $bundle_info[$field_identifier[1]]['label'];
       $comment_type = $comment_field->getSetting('comment_type');
       $extras['comment'][$comment_type]['form']['comment_notify_settings'] = array(
         'label' => t('Comment Notify settings'),
-        'description' => t('@node_type settings for Comment Notify', array('@node_type' => NodeType::load($node_type)->label())),
+        'description' => t('@bundle_type settings for Comment Notify', array('@bundle_type' => $bundle_label)),
         'weight' => 1,
       );
     }
diff --git a/config/install/comment_notify.settings.yml b/config/install/comment_notify.settings.yml
index 3e0b22b..1c86dd7 100644
--- a/config/install/comment_notify.settings.yml
+++ b/config/install/comment_notify.settings.yml
@@ -1,4 +1,4 @@
-node_types:
+bundle_types:
   - article
 available_alerts:
   1: true
@@ -8,46 +8,48 @@ enable_default:
   entity_author: false
 mail_templates:
   watcher:
-    subject: '[site:name] :: new comment on [node:title]'
-    body: |
-      Hi [comment-subscribed:author],
+    node:
+      subject: '[site:name] :: new comment on [node:title]'
+      body: |
+        Hi [comment-subscribed:author],
 
-      [comment:author] has commented on: "[node:title]"
+        [comment:author] has commented on: "[node:title]"
 
-      ----
-      [comment:title]
-      [comment:body]
-      ----
+        ----
+        [comment:title]
+        [comment:body]
+        ----
 
-      You can view the comment at the following url
-      [comment:url]
+        You can view the comment at the following url
+        [comment:url]
 
-      You can stop receiving emails when someone replies to this post,
-      by going to [comment-subscribed:unsubscribe-url]
+        You can stop receiving emails when someone replies to this post,
+        by going to [comment-subscribed:unsubscribe-url]
 
-      You can set up auto-following feature for all future posts
-      by creating your own user with a few clicks here [site:login-url]
+        You can set up auto-following feature for all future posts
+        by creating your own user with a few clicks here [site:login-url]
 
-      -- [site:name] team
-      [site:url]
+        -- [site:name] team
+        [site:url]
   entity_author:
-    subject: '[site:name] :: new comment for your post'
-    body: |
-      Hi [node:author],
+    node:
+      subject: '[site:name] :: new comment for your post'
+      body: |
+        Hi [node:author],
 
-      You have received a comment on: "[node:title]"
+        You have received a comment on: "[node:title]"
 
-      ----
-      [comment:title]
-      [comment:body]
-      ----
+        ----
+        [comment:title]
+        [comment:body]
+        ----
 
-      You can view the comment at the following url
-      [comment:url]
+        You can view the comment at the following url
+        [comment:url]
 
-      You will receive emails like this for all replies to your posts. You can
-      disable this by logging in and changing the settings on your user account at
-      [node:author:edit-url].
+        You will receive emails like this for all replies to your posts. You can
+        disable this by logging in and changing the settings on your user account at
+        [node:author:edit-url].
 
-      -- [site:name] team
-      [site:url]
+        -- [site:name] team
+        [site:url]
diff --git a/config/schema/comment_notify.schema.yml b/config/schema/comment_notify.schema.yml
index 4105cfd..2e7647e 100644
--- a/config/schema/comment_notify.schema.yml
+++ b/config/schema/comment_notify.schema.yml
@@ -1,16 +1,16 @@
 comment_notify.settings:
   type: config_object
   mapping:
-    node_types:
+    bundle_types:
       type: sequence
-      label: Content types to enable for comment notification
+      label: Bundle types to enable for comment notification
       sequence:
         type: string
     available_alerts:
       type: mapping
       label: Available subscription modes
       mapping:
-        # COMMENT_NOTIFY_NODE
+        # COMMENT_NOTIFY_ENTITY
         1:
           type: boolean
         # COMMENT_NOTIFY_COMMENT
@@ -24,28 +24,32 @@ comment_notify.settings:
           label: Default state for the notification selection box
         entity_author:
           type: boolean
-          label: Subscribe users to their node follow-up notification emails by default
+          label: Subscribe users to their entity follow-up notification emails by default
     mail_templates:
       type: mapping
       label: Default mail text for sending out notifications
       mapping:
-        watcher:
+        node:
           type: mapping
-          label: Notifications to commenters
+          label: Default mail text for sending out notifications for nodes
           mapping:
-            subject:
-              type: label
-              label: Subject
-            body:
-              type: text
-              label: Body
-        entity_author:
-          type: mapping
-          label: Notifications to owner of commented entity
-          mapping:
-            subject:
-              type: label
-              label: Subject
-            body:
-              type: text
-              label: Body
+            watcher:
+              type: mapping
+              label: Notifications to commenters
+              mapping:
+                subject:
+                  type: label
+                  label: Subject
+                body:
+                  type: text
+                  label: Body
+            entity_author:
+              type: mapping
+              label: Notifications to owner of commented entity
+              mapping:
+                subject:
+                  type: label
+                  label: Subject
+                body:
+                  type: text
+                  label: Body
diff --git a/src/Form/CommentNotifySettings.php b/src/Form/CommentNotifySettings.php
index 1b55088..2877669 100644
--- a/src/Form/CommentNotifySettings.php
+++ b/src/Form/CommentNotifySettings.php
@@ -6,15 +6,20 @@
 use Drupal\Core\Form\ConfigFormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\Element;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Entity\EntityFieldManager;
 use Drupal\field\Entity\FieldConfig;
-use Drupal\node\Entity\NodeType;
 use Drupal\user\Entity\User;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Settings form for the Comment Notify module.
  */
 class CommentNotifySettings extends ConfigFormBase {
 
+  /** @var  EntityFieldManager */
+  protected $fieldManager;
+
   /**
    * {@inheritdoc}
    */
@@ -29,20 +34,50 @@ protected function getEditableConfigNames() {
     return ['comment_notify.settings'];
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('config.factory'),
+      $container->get('entity_field.manager')
+    );
+  }
+
+  /**
+   * CommentNotifySettings constructor.
+   *
+   * @param \Drupal\Core\Entity\EntityFieldManager $field_manager
+   *   The entity field manager.
+   */
+  public function __construct(ConfigFactoryInterface $config_factory, EntityFieldManager $field_manager) {
+    parent::__construct($config_factory);
+    $this->fieldManager = $field_manager;
+  }
+
+
   public function buildForm(array $form, FormStateInterface $form_state) {
     $config = $this->config('comment_notify.settings');
 
-    // Only perform comment_notify for certain node types.
-    $enabled_types = $config->get('node_types');
+    $bundle_checkboxes = $this->getCommentFieldIdentifiers();
+    $default_bundles = array_keys($bundle_checkboxes);
     $anonymous_problems = '';
-    $checkboxes = [];
-    foreach (NodeType::loadMultiple() as $type_id => $type) {
-      $checkboxes[$type_id] = Html::escape($type->label());
-      $default[] = $type_id;
 
-      // If they don't have the ability to leave contact info, then we make a report
-      $comment_field = FieldConfig::loadByName('node', $type_id, 'comment');
-      if (in_array($type_id, $enabled_types) && $comment_field && $comment_field->getSetting('anonymous') == COMMENT_ANONYMOUS_MAYNOT_CONTACT) {
+    // Only perform comment_notify for certain bundle types.
+    $enabled_bundles = $config->get('bundle_types');
+
+    // If they don't have the ability to leave contact info, then we make a
+    // report.
+    $entity_types = [];
+    foreach ($bundle_checkboxes as $comment_field_identifier => $bundle_checkbox_label) {
+      $comment_field_info = explode('--', $comment_field_identifier);
+      $entity_type = $comment_field_info[0];
+      $entity_bundle = $comment_field_info[1];
+      $field_name = $comment_field_info[2];
+      $entity_types[$entity_type] = $entity_type;
+
+      $comment_field = FieldConfig::loadByName($entity_type, $entity_bundle, $field_name);
+      if (in_array($entity_bundle, $enabled_bundles) && $comment_field && $comment_field->getSetting('anonymous') == COMMENT_ANONYMOUS_MAYNOT_CONTACT) {
         if (User::getAnonymousUser()->hasPermission('subscribe to comments')) {
           $anonymous_problems[] = $type->link($type->label());
         }
@@ -55,12 +90,12 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       ]), 'status', FALSE);
     }
 
-    $form['node_types'] = [
+    $form['bundle_types'] = [
       '#type' => 'checkboxes',
-      '#title' => $this->t('Content types to enable for comment notification'),
-      '#default_value' => $enabled_types,
-      '#options' => $checkboxes,
-      '#description' => $this->t('Comments on content types enabled here will have the option of comment notification.'),
+      '#title' => $this->t('Bundles to enable for comment notification'),
+      '#default_value' => $enabled_bundles,
+      '#options' => $bundle_checkboxes,
+      '#description' => $this->t('Comments on bundle types enabled here will have the option of comment notification. Written as "Entity Type: Bundle: Comment field".'),
     ];
 
     $form['available_alerts'] = [
@@ -70,7 +105,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       '#default_value' => array_keys(array_filter($config->get('available_alerts'))),
       '#description' => $this->t('Choose which notification subscription styles are available for users'),
       '#options' => [
-        COMMENT_NOTIFY_NODE => $this->t('All comments'),
+        COMMENT_NOTIFY_ENTITY => $this->t('All comments'),
         COMMENT_NOTIFY_COMMENT => $this->t('Replies to my comment'),
       ],
     ];
@@ -94,60 +129,120 @@ public function buildForm(array $form, FormStateInterface $form_state) {
 
     $form['enable_default']['entity_author'] = [
       '#type' => 'checkbox',
-      '#title' => $this->t('Subscribe users to their node follow-up notification emails by default'),
+      '#title' => $this->t('Subscribe users to their entity follow-up notification emails by default'),
       '#default_value' => $config->get('enable_default.entity_author'),
-      '#description' => $this->t('If this is checked, new users will receive e-mail notifications for follow-ups on their nodes by default until they individually disable the feature.'),
+      '#description' => $this->t('If this is checked, new users will receive e-mail notifications for follow-ups on their entities by default until they individually disable the feature.'),
     ];
 
     $form['mail_templates'] = [
       '#type' => 'container',
       '#tree' => TRUE,
     ];
-
     $form['mail_templates']['watcher'] = [
       '#type' => 'container',
       '#tree' => TRUE,
     ];
-
-    $form['mail_templates']['watcher']['body'] = [
-      '#type' => 'textarea',
-      '#title' => $this->t('Default mail text for sending out notifications to commenters'),
-      '#default_value' => $config->get('mail_templates.watcher.body'),
-      '#cols' => 80,
-      '#rows' => 15,
-      '#token_types' => [
-        'comment', 'node'
-      ],
-      '#element_validate' => ['token_element_validate'],
-    ];
-
     $form['mail_templates']['entity_author'] = [
       '#type' => 'container',
       '#tree' => TRUE,
     ];
 
-    $form['mail_templates']['entity_author']['body'] = [
-      '#type' => 'textarea',
-      '#title' => $this->t('Default mail text for sending out the notifications to node authors'),
-      '#default_value' => $config->get('mail_templates.entity_author.body'),
-      '#cols' => 80,
-      '#rows' => 15,
-      '#token_types' => [
-        'comment', 'node'
-      ],
-      '#element_validate' => ['token_element_validate'],
-    ];
+    // Create notification options for each supported entity type.
+    foreach ($entity_types as $entity_type) {
+      $form['mail_templates']['watcher'][$entity_type] = [
+        '#type' => 'container',
+        '#tree' => TRUE,
+      ];
+      $form['mail_templates']['watcher'][$entity_type]['body'] = [
+        '#type' => 'textarea',
+        '#title' => $this->t('%label: Default mail text for sending out notifications to commenters', [
+          '%label' => $entity_type,
+        ]),
+        '#default_value' => $config->get('mail_templates.watcher.' . $entity_type . '.body'),
+        '#cols' => 80,
+        '#rows' => 15,
+        // @todo: Change from 'node' to 'entity'
+        // See Issue #1061750 on Drupal.org
+        '#token_types' => [
+          'comment', $entity_type,
+        ],
+        '#element_validate' => ['token_element_validate'],
+      ];
+
+      $form['mail_templates']['entity_author'][$entity_type] = [
+        '#type' => 'container',
+        '#tree' => TRUE,
+      ];
+      $form['mail_templates']['entity_author'][$entity_type]['body'] = [
+        '#type' => 'textarea',
+        '#title' => $this->t('%label: Default mail text for sending out the notifications to entity authors', [
+          '%label' => $entity_type,
+        ]),
+        '#default_value' => $config->get('mail_templates.entity_author.' . $entity_type . '.body'),
+        '#cols' => 80,
+        '#rows' => 15,
+        // @todo: Change token from 'node' to 'entity'
+        // See Issue #1061750 on Drupal.org
+        '#token_types' => [
+          'comment', $entity_type, 'user',
+        ],
+        '#element_validate' => ['token_element_validate'],
+      ];
+    }
 
     $form['token_help'] = [
       '#theme' => 'token_tree_link',
       '#token_types' => [
-        'comment', 'node'
+        'comment', 'node', 'user'
       ],
     ];
 
     return parent::buildForm($form, $form_state);
   }
 
+  /**
+   * Returns array of constructed machine names for each comment field.
+   *
+   * Machine names used as array keys, checkbox labels used as values.
+   *
+   * @return array $bundle_checkboxes
+   *   Identifier for each comment field, formatted: [entity_type]--[bundle]--[field_name].
+   */
+  public function getCommentFieldIdentifiers() {
+    $config = $this->config('comment_notify.settings');
+
+    $bundle_checkboxes = [];
+    // Provide all comment fields as options
+    $comment_field_map = $this->fieldManager->getFieldMapByFieldType('comment');
+    foreach ($comment_field_map as $entity_type => $comment_fields) {
+      foreach ($comment_fields as $field_name => $field_info) {
+        foreach ($field_info['bundles'] as $field_bundle) {
+          $bundle_checkboxes[$entity_type . '--' . $field_bundle . '--' . $field_name] = Html::escape($entity_type . ': ' . $field_bundle . ': ' . $field_name);
+        }
+      }
+    }
+    return $bundle_checkboxes;
+  }
+
+  /**
+   * Returns machine name of field identifier from bundle_types config for specific comment.
+   *
+   * @param \Drupal\Core\Entity\EntityInterface $comment
+   *   The comment entity.
+   * @return string $comment_on_identifier
+   *   Identifier for the comment field, formatted: [entity_type]--[bundle]--[field_name].
+   */
+  public static function getCommentFieldIdentifier(\Drupal\Core\Entity\EntityInterface $comment) {
+    $comment_on_entity_type = $comment->getCommentedEntityTypeId();
+    $comment_on_bundle_type = $comment->getCommentedEntity()->bundle();
+    $comment_on_field_name = $comment->getFieldName();
+    $comment_on_identifier = implode('--', [$comment_on_entity_type, $comment_on_bundle_type, $comment_on_field_name]);
+    return $comment_on_identifier;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function validateForm(array &$form, FormStateInterface $form_state) {
     if (!array_filter($form_state->getValue('available_alerts'))) {
       $form_state->setErrorByName('available_alerts', 'You must enable at least one subscription mode.');
@@ -158,13 +253,19 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
-    $this->config('comment_notify.settings')
-      ->set('node_types', array_keys(array_filter($form_state->getValue('node_types'))))
-      ->set('available_alerts', $form_state->getValue('available_alerts'))
-      ->set('enable_default', $form_state->getValue('enable_default'))
-      ->set('mail_templates.watcher.body', $form_state->getValue(['mail_templates', 'watcher', 'body']))
-      ->set('mail_templates.entity_author.body', $form_state->getValue(['mail_templates', 'entity_author', 'body']))
-      ->save();
+    $config = $this->config('comment_notify.settings');
+    $config->set('bundle_types', array_keys(array_filter($form_state->getValue('bundle_types'))));
+    $config->set('available_alerts', $form_state->getValue('available_alerts'));
+    $config->set('enable_default', $form_state->getValue('enable_default'));
+  
+    $bundle_checkboxes = $this->getCommentFieldIdentifiers();
+    foreach ($bundle_checkboxes as $identifier => $label) {
+      $comment_field_info = explode('--', $identifier);
+      $entity_type = $comment_field_info[0];
+      $config->set('mail_templates.watcher.' . $entity_type . '.body', $form_state->getValue(['mail_templates', 'watcher', $entity_type, 'body']));
+      $config->set('mail_templates.entity_author.' . $entity_type . '.body', $form_state->getValue(['mail_templates', 'entity_author', $entity_type, 'body']));
+    }
+    $config->save();
     parent::submitForm($form, $form_state);
   }
 
