diff --git a/includes/callback_node_access.inc b/includes/callback_node_access.inc
index 5acc76c..a9da934 100644
--- a/includes/callback_node_access.inc
+++ b/includes/callback_node_access.inc
@@ -66,8 +66,8 @@ class SearchApiAlterNodeAccess extends SearchApiAbstractAlterCallback {
     }
 
     foreach ($items as $nid => &$item) {
-      // Check whether all users have access to the node.
-      if (!node_access('view', $item, $account)) {
+      // Check whether all users have access to the node or view_unpublished module enabled.
+      if (!node_access('view', $item, $account) || module_exists('view_unpublished')) {
         // Get node access grants.
         $result = db_query('SELECT * FROM {node_access} WHERE (nid = 0 OR nid = :nid) AND grant_view = 1', array(':nid' => $item->nid));
 
diff --git a/search_api.module b/search_api.module
index f3f66d3..f34e41c 100644
--- a/search_api.module
+++ b/search_api.module
@@ -1599,15 +1599,47 @@ function _search_api_query_add_node_access($account, SearchApiQueryInterface $qu
 
   // Only filter for user which don't have full node access.
   if (!user_access('bypass node access', $account)) {
-    // Filter by node "published" status.
-    if (user_access('view own unpublished content')) {
-      $filter = $query->createFilter('OR');
-      $filter->condition('status', NODE_PUBLISHED);
-      $filter->condition('author', $account->uid);
-      $query->filter($filter);
+
+    // Check if module view_unpublished is enabled.
+    if (module_exists('view_unpublished')) {
+
+      if (!user_access('view any unpublished content', $account)) {
+        $filter = $query->createFilter('OR');
+        foreach (node_type_get_types() as $type => $name) {
+          if (user_access("view any unpublished $type content", $account)) {
+            $filter->condition('type', $type);
+          }
+          else {
+            $sub_filter = $query->createFilter();
+            $sub_filter->condition('type', $type);
+
+
+            $sub_filter2 = $query->createFilter('OR');
+            if (user_access('view own unpublished content')) {
+              $sub_filter2->condition('status', NODE_PUBLISHED);
+              $sub_filter2->condition('author', $account->uid);
+            }
+            else {
+              $sub_filter2->condition('status', NODE_PUBLISHED);
+            }
+            $sub_filter->filter($sub_filter2);
+            $filter->filter($sub_filter);
+          }
+        }
+        $query->filter($filter);
+      }
     }
     else {
-      $query->condition('status', NODE_PUBLISHED);
+      // Filter by node "published" status.
+      if (user_access('view own unpublished content')) {
+        $filter = $query->createFilter('OR');
+        $filter->condition('status', NODE_PUBLISHED);
+        $filter->condition('author', $account->uid);
+        $query->filter($filter);
+      }
+      else {
+        $query->condition('status', NODE_PUBLISHED);
+      }
     }
     // Filter by node access grants.
     $filter = $query->createFilter('OR');
