diff --git a/includes/callback_comment_access.inc b/includes/callback_comment_access.inc
new file mode 100644
index 0000000..9057a30
--- /dev/null
+++ b/includes/callback_comment_access.inc
@@ -0,0 +1,109 @@
+<?php
+/**
+ * @file
+ * Contains the SearchAPiCommentAccess class.
+ */
+
+/**
+ * Adds node access information to comment indexes.
+ */
+class SearchApiAlterCommentAccess extends SearchApiAbstractAlterCallback {
+
+  /**
+   * Check whether this data-alter callback is applicable for a certain index.
+   *
+   * Returns TRUE only for indexes on nodes.
+   *
+   * @param SearchApiIndex $index
+   *   The index to check for.
+   *
+   * @return boolean
+   *   TRUE if the callback can run on the given index; FALSE otherwise.
+   */
+  public function supportsIndex(SearchApiIndex $index) {
+    return $index->getEntityType() === 'comment';
+  }
+
+  /**
+   * Declare the properties that are (or can be) added to items with this callback.
+   *
+   * Adds the "search_api_comment_node_access" property.
+   *
+   * @see hook_entity_property_info()
+   *
+   * @return array
+   *   Information about all additional properties, as specified by
+   *   hook_entity_property_info() (only the inner "properties" array).
+   */
+  public function propertyInfo() {
+    return array(
+      'comment_node_access' => array(
+        'label' => t('Node access information'),
+        'description' => t('Data needed to apply node access on comments.'),
+        'type' => 'list<token>',
+      ),
+    );
+  }
+
+  /**
+   * Alter items before indexing.
+   *
+   * Items which are removed from the array won't be indexed, but will be marked
+   * as clean for future indexing. This could for instance be used to implement
+   * some sort of access filter for security purposes (e.g., don't index
+   * unpublished nodes or comments).
+   *
+   * @param array $items
+   *   An array of items to be altered, keyed by item IDs.
+   */
+  public function alterItems(array &$items) {
+    static $account;
+
+    if (!isset($account)) {
+      // Load the anonymous user.
+      $account = drupal_anonymous_user();
+    }
+
+    foreach ($items as $cid => &$item) {
+      $node = node_load($item->nid);
+      // Check whether all users have access to the node where the comment posted.
+      if (!node_access('view', $node, $account)) {
+        // Get node access grants.
+        $result = db_query('SELECT * FROM {node_access} WHERE (nid = 0 OR nid = :nid) AND grant_view = 1', array(':nid' => $node->nid));
+
+        // Store all grants together with it's realms in the item.
+        foreach ($result as $grant) {
+          if (!isset($items[$cid]->comment_node_access)) {
+            $items[$cid]->comment_node_access = array();
+          }
+          $items[$cid]->comment_node_access[] = "node_access_$grant->realm:$grant->gid";
+        }
+      }
+      else {
+        // Add the generic view grant if we are not using node access or the
+        // node is viewable by anonymous users.
+        $items[$cid]->comment_access = array('node_access__all');
+      }
+    }
+  }
+
+  /**
+   * Submit callback for the configuration form.
+   *
+   * If the data alteration is being enabled, set "Published" and "Author" to
+   * "indexed", because both are needed for the node access filter.
+   */
+  public function configurationFormSubmit(array $form, array &$values, array &$form_state) {
+    $old_status = !empty($form_state['index']->options['data_alter_callbacks']['search_api_alter_comment_access']['status']);
+    $new_status = !empty($form_state['values']['callbacks']['search_api_alter_comment_access']['status']);
+
+    if (!$old_status && $new_status) {
+      $form_state['index']->options['fields']['status']['type'] = 'boolean';
+      $form_state['index']->options['fields']['author']['type'] = 'integer';
+      $form_state['index']->options['fields']['author']['entity_type'] = 'user';
+    }
+
+    return parent::configurationFormSubmit($form, $values, $form_state);
+  }
+
+}
diff --git a/search_api.info b/search_api.info
index 330858d..3dcad71 100644
--- a/search_api.info
+++ b/search_api.info
@@ -13,6 +13,7 @@ files[] = includes/callback_add_viewed_entity.inc
 files[] = includes/callback_bundle_filter.inc
 files[] = includes/callback_language_control.inc
 files[] = includes/callback_node_access.inc
+files[] = includes/callback_comment_access.inc
 files[] = includes/callback_node_status.inc
 files[] = includes/callback_role_filter.inc
 files[] = includes/datasource.inc
diff --git a/search_api.module b/search_api.module
index 3faf2d0..41af273 100644
--- a/search_api.module
+++ b/search_api.module
@@ -1002,6 +1002,11 @@ function search_api_search_api_alter_callback_info() {
     'description' => t('Add node access information to the index.'),
     'class' => 'SearchApiAlterNodeAccess',
   );
+  $callbacks['search_api_alter_comment_access'] = array(
+    'name' => t('Access check'),
+    'description' => t('Add access information to comment index.'),
+    'class' => 'SearchApiAlterCommentAccess',
+  );
   $callbacks['search_api_alter_node_status'] = array(
     'name' => t('Exclude unpublished nodes'),
     'description' => t('Exclude unpublished nodes from the index.'),
@@ -1763,31 +1768,55 @@ function search_api_get_processors() {
 /**
  * Implements hook_search_api_query_alter().
  *
- * Adds node access to the query, if enabled.
+ * Adds access checks to the query, if enabled any.
  *
  * @param SearchApiQueryInterface $query
  *   The SearchApiQueryInterface object representing the search query.
  */
 function search_api_search_api_query_alter(SearchApiQueryInterface $query) {
+  global $user;
   $index = $query->getIndex();
   // Only add node access if the necessary fields are indexed in the index, and
   // unless disabled explicitly by the query.
   $fields = $index->options['fields'];
-  if (!empty($fields['search_api_access_node']) && !empty($fields['status']) && !empty($fields['author']) && !$query->getOption('search_api_bypass_access')) {
-    $account = $query->getOption('search_api_access_account', $GLOBALS['user']);
-    if (is_numeric($account)) {
-      $account = user_load($account);
-    }
-    if (is_object($account)) {
-      try {
-        _search_api_query_add_node_access($account, $query);
+  if ($index->item_type == 'node') {
+    if (!empty($fields['search_api_access_node']) && !empty($fields['status']) && !empty($fields['author']) && !$query->getOption('search_api_bypass_access')) {
+      $account = $query->getOption('search_api_access_account', $user);
+      if (is_numeric($account)) {
+        $account = user_load($account);
       }
-      catch (SearchApiException $e) {
-        watchdog_exception('search_api', $e);
+      if (is_object($account)) {
+        try {
+          _search_api_query_add_node_access($account, $query);
+        }
+        catch (SearchApiException $e) {
+          watchdog_exception('search_api', $e);
+        }
+      }
+      else {
+        watchdog('search_api', 'An illegal user UID was given for node access: @uid.', array('@uid' => $query->getOption('search_api_access_account', $user)), WATCHDOG_WARNING);
       }
     }
-    else {
-      watchdog('search_api', 'An illegal user UID was given for node access: @uid.', array('@uid' => $query->getOption('search_api_access_account', $GLOBALS['user'])), WATCHDOG_WARNING);
+  }
+  if ($index->item_type == 'comment') {
+    // Only add comment node access if the necessary fields are indexed in the index, and
+    // unless disabled explicitly by the query.
+    $fields = $index->options['fields'];
+    if (!empty($fields['comment_node_access']) && !empty($fields['status']) && !empty($fields['author']) && !$query->getOption('search_api_bypass_access')) {
+      $account = $query->getOption('search_api_access_account', $user);
+      if (is_numeric($account)) {
+        $account = user_load($account);
+      }
+      if (is_object($account)) {
+        try {
+          _search_api_query_add_comment_node_access($account, $query);
+        } catch (SearchApiException $e) {
+          watchdog_exception('search_api', $e);
+        }
+      }
+      else {
+        watchdog('search_api', 'An illegal user UID was given for comment node access: @uid.', array('@uid' => $query->getOption('search_api_access_account', $user)), WATCHDOG_WARNING);
+      }
     }
   }
 }
@@ -1835,6 +1864,41 @@ function _search_api_query_add_node_access($account, SearchApiQueryInterface $qu
 }
 
 /**
+ * Build a node access subquery for comments.
+ *
+ * @param $account
+ *   The user object, who searches.
+ * @param SearchApiQueryInterface $query
+ *   The SearchApiQueryInterface object representing the search query.
+ * @return SearchApiQueryFilter
+ */
+function _search_api_query_add_comment_node_access($account, SearchApiQueryInterface $query) {
+  // Check if user has access to comments and contents too.
+  if (!user_access('access comments', $account) && !user_access('access content', $account)) {
+    // Simple hack for returning no results.
+    $query->condition('status', 0);
+    $query->condition('status', 1);
+    watchdog('search_api', 'User !name tried to execute a search, but cannot access content.', array('!name' => theme('username', array('account' => $account))), WATCHDOG_NOTICE);
+    return;
+  }
+  // Only filter for user which don't have full node access.
+  if (!user_access('bypass node access', $account)) {
+    // Only list published comments.
+    $query->condition('status', COMMENT_PUBLISHED);
+    // Filter comments by node access grants.
+    $filter = $query->createFilter('OR');
+    $grants = node_access_grants('view', $account);
+    foreach ($grants as $realm => $gids) {
+      foreach ($gids as $gid) {
+        $filter->condition('comment_node_access', "node_access_$realm:$gid");
+      }
+    }
+    $filter->condition('comment_node_access', 'node_access__all');
+    $query->filter($filter);
+  }
+}
+
+/**
  * Utility function for determining whether a field of the given type contains
  * text data.
  *
