diff --git a/better_statistics.admin.inc b/better_statistics.admin.inc
index bccc75c..befe33d 100644
--- a/better_statistics.admin.inc
+++ b/better_statistics.admin.inc
@@ -14,6 +14,55 @@ function _better_statistics_form_statistics_settings_form_alter(&$form, &$form_s
   $log_description = &$form['access']['statistics_enable_access_log']['#description'];
   $log_description .= ' ' . t('Also required by the Better Statistics module.');
 
+  // Alter the access log settings to be able to capture inclusion settings.
+  $form['access']['filters'] = array(
+    '#type' => 'fieldset',
+    '#collapsible' => TRUE,
+    '#title' => t('Filters'),
+    '#description' => t('Define optional filters for page access logging.'),
+    '#weight' => 0,
+    // Only show this fieldset if the accesslog is enabled.
+    '#states' => array(
+      'visible' => array(
+        ':input[name="statistics_enable_access_log"]' => array('checked' => TRUE),
+      ),
+    ),
+  );
+  if (variable_get('cache', 0)) {
+    $form['access']['filters']['log_cached_status'] = array(
+      '#type' => 'item',
+      '#title' => t("Caching"),
+      '#markup' => t(
+        "Tracking of page requests served through cache is currently <strong>@log_cached_status</strong>. Visit <a href='!url'>Performance configuration</a> to change settings.",
+        array(
+          '@log_cached_status' => variable_get('statistics_access_log_cached', TRUE) ? t('enabled') : t('disabled'),
+          '!url' => url('admin/config/development/performance'),
+        )
+      ),
+    );
+  }
+  $form['access']['filters']['statistics_access_log_include_pages'] = array(
+    '#type' => 'textarea',
+    '#rows' => 2,
+    '#title' => t("Page requests to be included in the access log"),
+    '#default_value' => variable_get('statistics_access_log_include_pages', '*'),
+    '#description' => t("Enter relative request paths, one per line. Use Drupal internal request paths, not the URL aliases. The asterisk by itself means any page on your site."),
+  );
+  $form['access']['filters']['statistics_access_log_exclude_pages'] = array(
+    '#type' => 'textarea',
+    '#rows' => 3,
+    '#title' => t('Exceptions: page requests excluded from the set specified above'),
+    '#default_value' => variable_get('statistics_access_log_exclude_pages', ''),
+    '#description' => t('As above, one path specification per line.'),
+  );
+  $form['access']['filters']['statistics_access_log_roles'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t("User roles"),
+    '#default_value' => variable_get('statistics_access_log_roles', array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID)),
+    '#options' => user_roles(),
+    '#description' => t('Only requests from users with the selected roles will be included in the access log.'),
+  );
+
   // Create a fieldset for our settings.
   $form['better_statistics'] = array(
     '#type' => 'fieldset',
@@ -110,6 +159,23 @@ function _better_statistics_form_statistics_settings_form_alter(&$form, &$form_s
   array_unshift($form['#submit'], 'better_statistics_settings_form_submit');
 }
 
+/**
+ * Makes alterations to the core site performance settings configuration form.
+ */
+function _better_statistics_form_system_performance_settings_alter(&$form, &$form_state, $form_id) {
+  $form['caching']['statistics_access_log_cached'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Log access statistics for pages served by the cache'),
+    '#description' => t("Logging access statistics for cached pages generates significant overhead."),
+    '#default_value' => variable_get('statistics_access_log_cached', TRUE),
+    // Only show this field if caching is enabled.
+    '#states' => array(
+      'visible' => array(
+        ':input[name="cache"]' => array('checked' => TRUE),
+      ),
+    ),
+  );
+}
 
 /**
  * Submit handler for Better Statistics configuration settings.
diff --git a/better_statistics.api.php b/better_statistics.api.php
index d824fe2..0c8e488 100644
--- a/better_statistics.api.php
+++ b/better_statistics.api.php
@@ -174,5 +174,24 @@ function hook_better_statistics_fields() {
 }
 
 /**
+ * Tell Statistics API to skip data collection on this request. That is to say,
+ * use this to declare you DO NOT want statistics collected under your specific
+ * circumstances.
+ *
+ * @return
+ *   A boolean TRUE if statistics should NOT be collected on this request.
+ *   Otherwise, FALSE.
+ */
+function hook_better_statistics_skip() {
+  // Never record statistics for user 1.
+  global $user;
+  if ($user->uid == 1) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/**
  * @}
  */
diff --git a/better_statistics.install b/better_statistics.install
index 5adb77f..85833b4 100644
--- a/better_statistics.install
+++ b/better_statistics.install
@@ -54,4 +54,8 @@ function better_statistics_uninstall() {
   }
 
   variable_del('better_statistics_fields');
+  variable_del('statistics_access_log_include_pages');
+  variable_del('statistics_access_log_exclude_pages');
+  variable_del('statistics_access_log_roles');
+  variable_del('statistics_access_log_cached');
 }
diff --git a/better_statistics.module b/better_statistics.module
index fb45409..832ac3a 100644
--- a/better_statistics.module
+++ b/better_statistics.module
@@ -76,21 +76,37 @@ function better_statistics_exit() {
     drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION);
     include_once DRUPAL_ROOT . '/includes/unicode.inc';
 
-    // Get all declared fields and their computed values.
-    $fields = better_statistics_get_fields_data();
+    // Load all relevant module.statistics.inc files for hook invocations.
+    better_statistics_load_active_incs();
 
-    // Now that we have data, try to insert it.
-    try {
-      db_insert('accesslog')->fields($fields)->execute();
+    // Test if Statistics should be collected on this request.
+    $skip = FALSE;
+    foreach (module_implements('better_statistics_skip') as $module) {
+      $skip_test = $module . '_' . 'better_statistics_skip';
+      if ($skip_test()) {
+        $skip = TRUE;
+        break;
+      }
     }
-    catch (Exception $e) {
-      // At least log core fields.
-      $defaults = better_statistics_get_default_fields();
-      $core_fields = array_intersect_key($fields, $defaults);
-      db_insert('accesslog')->fields($core_fields)->execute();
 
-      // Log the error.
-      watchdog('better statistics', 'There was an error collecting statistics data:<br /><br />@error', array('@error' => $e->getMessage()), WATCHDOG_ERROR);
+    // Don't collect statistics if we're told to skip.
+    if (!$skip) {
+      // Get all declared fields and their computed values.
+      $fields = better_statistics_get_fields_data();
+
+      // Now that we have data, try to insert it.
+      try {
+        db_insert('accesslog')->fields($fields)->execute();
+      }
+      catch (Exception $e) {
+        // At least log core fields.
+        $defaults = better_statistics_get_default_fields();
+        $core_fields = array_intersect_key($fields, $defaults);
+        db_insert('accesslog')->fields($core_fields)->execute();
+
+        // Log the error.
+        watchdog('better statistics', 'There was an error collecting statistics data:<br /><br />@error', array('@error' => $e->getMessage()), WATCHDOG_ERROR);
+      }
     }
   }
 
@@ -136,6 +152,15 @@ function better_statistics_form_statistics_settings_form_alter(&$form, &$form_st
   _better_statistics_form_statistics_settings_form_alter($form, $form_state, $form_id);
 }
 
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * @see _better_statistics_form_system_performance_settings_form_alter()
+ */
+function better_statistics_form_system_performance_settings_alter(&$form, &$form_state, $form_id) {
+  module_load_include('inc', 'better_statistics', 'better_statistics.admin');
+  _better_statistics_form_system_performance_settings_alter($form, $form_state, $form_id);
+}
 
 /**
  * Submit handler for the Better Statistics configuration form.
@@ -192,22 +217,14 @@ function better_statistics_get_default_fields() {
  * Returns data for all valid, declared fields in preparation for DB insertion.
  */
 function better_statistics_get_fields_data() {
-  // Include this module's API file because of how core fields are implemented.
-  require_once(dirname(__FILE__) . '/better_statistics.statistics.inc');
+  // Ensure all module.statistics.inc files are loaded.
+  better_statistics_load_active_incs();
 
   $fields = variable_get('better_statistics_fields', better_statistics_get_default_fields());
   $field_data = array();
 
   // Loop through all custom fields.
   foreach ($fields as $field => $data) {
-    // If there's an inc file and it hasn't been loaded yet, load it.
-    if (isset($data['_file']) && !isset($already[$data['_file']])) {
-      if (file_exists(DRUPAL_ROOT . '/' . $data['_file'])) {
-        require_once(DRUPAL_ROOT . '/' . $data['_file']);
-        $already[$data['_file']] = TRUE;
-      }
-    }
-
     // Only insert data into this field if there's a callback to get data.
     if (is_callable($data['callback'])) {
       $field_data[$field] = $data['callback']($field);
@@ -216,3 +233,31 @@ function better_statistics_get_fields_data() {
 
   return $field_data;
 }
+
+
+/**
+ * Loads module.statistics.inc files for all active fields.
+ */
+function better_statistics_load_active_incs() {
+  // Prevent this function from loading it multiple times.
+  static $loaded;
+
+  if (empty($loaded)) {
+    $loaded = TRUE;
+
+    // Include this module's API file because of how core fields are implemented.
+    require_once(dirname(__FILE__) . '/better_statistics.statistics.inc');
+
+    $fields = variable_get('better_statistics_fields', better_statistics_get_default_fields());
+
+    // Loop through each declaring field and require associated files.
+    foreach ($fields as $field => $data) {
+      // If there's an inc file and it hasn't been loaded yet, load it.
+      if (isset($data['_file'])) {
+        if (file_exists(DRUPAL_ROOT . '/' . $data['_file'])) {
+          require_once(DRUPAL_ROOT . '/' . $data['_file']);
+        }
+      }
+    }
+  }
+}
diff --git a/better_statistics.statistics.inc b/better_statistics.statistics.inc
index e8544e4..1cb1a37 100644
--- a/better_statistics.statistics.inc
+++ b/better_statistics.statistics.inc
@@ -119,3 +119,48 @@ function better_statistics_get_field_value($field) {
       return truncate_utf8($_SERVER['HTTP_USER_AGENT'], 255);
   }
 }
+
+/**
+ * Implements hook_better_statistics_skip().
+ *
+ * Better Statistics provides inclusion/exclusion criteria for collecting
+ * access logs based on request paths, user roles and cache status.
+ *
+ * @return
+ *   A boolean TRUE if statistics should NOT be collected on this request.
+ *   Otherwise, FALSE.
+ */
+function better_statistics_better_statistics_skip() {
+  // Skip if page is served from cache and Better Statistics is set to
+  // exclude logging cached requests.
+  // @todo use to-be better_statistics_cache_status() function to test cache status
+  if (/*page-served-from-cache*/ FALSE and variable_get('statistics_access_log_cached', TRUE)) {
+    return TRUE;
+  }
+
+  // Make sure drupal_match_path() is available.
+  require_once DRUPAL_ROOT . '/' . variable_get('path_inc', 'includes/path.inc');
+
+  // Skip if page request path is not in the included paths.
+  $path = truncate_utf8($_GET['q'], 255);
+  $include_requests = variable_get('statistics_access_log_include_pages', '*');
+  if (!drupal_match_path($path, $include_requests)) {
+    return TRUE;
+  }
+
+  // Skip if page request path is in the excluded paths.
+  $exclude_requests = variable_get('statistics_access_log_exclude_pages', '');
+  if (drupal_match_path($path, $exclude_requests)) {
+    return TRUE;
+  }
+
+  // Skip if user is not part of a role included.
+  global $user;
+  $role_includes = variable_get('statistics_access_log_roles', array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID));
+  $roles_check = array_intersect($role_includes, array_keys($user->roles));
+  if (empty($roles_check)) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
