diff --git a/facetapi.admin.inc b/facetapi.admin.inc
index f355afa..3c7ec2c 100644
--- a/facetapi.admin.inc
+++ b/facetapi.admin.inc
@@ -76,6 +76,30 @@ function facetapi_realm_settings_form($form, &$form_state, $searcher, $realm_nam
     '#default_value' => $default_value,
   );
 
+  // Checks whether block caching is enabled, sets description accordingly.
+  if (!$disabled = (module_implements('node_grants') || !variable_get('block_cache', FALSE))) {
+    $description = t('Configure the appropriate cache setting for facet blocks.');
+  }
+  else {
+    $description = t(
+      'To enable block caching, visit the <a href="@performance-page">performance page</a>.',
+      array('@performance-page' => url('admin/config/development/performance', array('query' => array('destination' => $_GET['q']))))
+    );
+  }
+  $form['block_cache'] = array(
+    '#type' => 'select',
+    '#access' => ('block' == $realm_name),
+    '#title' => t('Block cache settings'),
+    '#disabled' => $disabled,
+    '#options' => array(
+      DRUPAL_NO_CACHE => t('Do not cache'),
+      DRUPAL_CACHE_PER_ROLE | DRUPAL_CACHE_PER_PAGE => t('Per role'),
+      DRUPAL_CACHE_PER_USER | DRUPAL_CACHE_PER_PAGE => t('Per user'),
+    ),
+    '#default_value' => variable_get('facetapi:block_cache:' . $searcher, DRUPAL_NO_CACHE),
+    '#description' => $description,
+  );
+
   $form['actions'] = array(
     '#type' => 'actions',
     '#weight' => 20,
@@ -125,6 +149,16 @@ function facetapi_realm_settings_form_submit($form, &$form_state) {
     }
   }
 
+  // Saves block cache settings, clears block cache if setting was changed.
+  if (isset($form_state['values']['block_cache'])) {
+    $name = 'facetapi:block_cache:' . $adapter->getSearcher();
+    $original = variable_get($name, DRUPAL_NO_CACHE);
+    variable_set($name, $form_state['values']['block_cache']);
+    if ($original != $form_state['values']['block_cache']) {
+      cache_clear_all(NULL, 'cache_block');
+    }
+  }
+
   // Clears delta map cache.
   cache_clear_all('facetapi:delta_map', 'cache');
 }
diff --git a/facetapi.block.inc b/facetapi.block.inc
index 6873490..334680d 100644
--- a/facetapi.block.inc
+++ b/facetapi.block.inc
@@ -14,11 +14,14 @@ function facetapi_get_block_info($realm_name = 'block') {
   // Gets delta map, iterates over all enabled facets.
   $map = facetapi_get_delta_map();
   foreach (facetapi_get_searcher_info() as $searcher => $info) {
+    // Gets cache settings for the searcher.
+    $cache = variable_get('facetapi:block_cache:' . $searcher, DRUPAL_NO_CACHE);
+
     // Adds "Current Search" blocks.
     $delta = array_search($searcher . ':current_search', $map);
     $blocks[$delta] = array(
       'info' => 'Facet API: ' . $info['label'] . ' : ' . t('Current Search'),
-      //'cache' => BLOCK_NO_CACHE,
+      'cache' => $cache,
     );
 
     // Adds facet blocks.
@@ -30,10 +33,9 @@ function facetapi_get_block_info($realm_name = 'block') {
       $delta = array_search($string, $map);
 
       // Defines the block.
-      // @todo Explore more efficient caching options.
       $blocks[$delta] = array(
         'info' => 'Facet API: ' . $info['label'] . ' : ' . $facet['label'],
-        //'cache' => BLOCK_NO_CACHE,
+        'cache' => $cache,
       );
     }
   }
