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.
  *
