diff --git includes/pager.inc includes/pager.inc
index d8c82e6..faca79c 100644
--- includes/pager.inc
+++ includes/pager.inc
@@ -58,7 +58,6 @@ class PagerDefault extends SelectQueryExtender {
    * to it.
    */
   public function execute() {
-    global $pager_page_array, $pager_total, $pager_total_items, $pager_limits;
 
     // Add convenience tag to mark that this is an extended query. We have to
     // do this in the constructor to ensure that it is set before preExecute()
@@ -73,21 +72,9 @@ class PagerDefault extends SelectQueryExtender {
     }
     $this->ensureElement();
 
-    $page = isset($_GET['page']) ? $_GET['page'] : '';
-
-    // Convert comma-separated $page to an array, used by other functions.
-    $pager_page_array = explode(',', $page);
-
-    if (!isset($pager_page_array[$this->element])) {
-      $pager_page_array[$this->element] = 0;
-    }
-
-    // We calculate the total of pages as ceil(items / limit).
-    $pager_total_items[$this->element] = $this->getCountQuery()->execute()->fetchField();
-    $pager_total[$this->element] = ceil($pager_total_items[$this->element] / $this->limit);
-    $pager_page_array[$this->element] = max(0, min((int) $pager_page_array[$this->element], ((int) $pager_total[$this->element]) - 1));
-    $pager_limits[$this->element] = $this->limit;
-    $this->range($pager_page_array[$this->element] * $this->limit, $this->limit);
+    $total_items = $this->getCountQuery()->execute()->fetchField();
+    $current_page = pager_default_initialize($total_items, $this->limit, $this->element);
+    $this->range($current_page * $this->limit, $this->limit);
 
     // Now that we've added our pager-based range instructions, run the query normally.
     return $this->query->execute();
@@ -171,6 +158,83 @@ class PagerDefault extends SelectQueryExtender {
 }
 
 /**
+ * Helper function to find the current page to display.
+ *
+ * @param $element
+ *  An optional integer to distinguish between multiple pagers on one page.
+ *
+ * @return
+ *  The current page for $element. 0 by default if $_GET['page'] is empty.
+ *  This may be different from the return value of pager_default_initialize()
+ *  since this function is usually called before the total number of items
+ *  to be paged is known.
+ */
+function pager_find_page($element = 0) {
+  global $pager_page_array;
+
+  $page = isset($_GET['page']) ? $_GET['page'] : '';
+
+  $pager_page_array = explode(',', $page);
+
+  if (!isset($pager_page_array[$element])) {
+    $pager_page_array[$element] = 0;
+  }
+  return (int)$pager_page_array[$element];
+}
+
+/**
+ * Helper function to initialize a pager for theme('pager').
+ *
+ * Example #1, a page callback invoking an external search service where the
+ * total number matching comes with the result.  We call pager_find_page()
+ * to calculate the offset before the search is invoked.
+ * @code
+ *   $page = pager_find_page();
+ *   $num_per_page = variable_get('mymodule_num_per_page', 10);
+ *   $offset = $num_per_page * $page;
+ *   $result = mymodule_remote_search($keywords, $offset, $num_per_page);
+ *   pager_default_initialize($result->total, $num_per_page);
+ *   $output = theme('search_results', $result->data, 'remote');
+ *   $output .= theme('pager', NULL, $num_per_page);
+ * @endcode
+ *
+ * Example #2, a page callback invoking an external datastore with an
+ * SQL-like syntax.  A call to pager_find_page() is not needed.
+ * @code
+ *   $num_per_page = variable_get('mymodule_num_per_page', 10);
+ *   $where = "status = 1";
+ *   $total = mymodule_select("SELECT COUNT(*) FROM data " . $where)->result();
+ *   $page = pager_default_initialize($total, $num_per_page);
+ *   $offset = $num_per_page * $page;
+ *   $result = mymodule_select("SELECT * FROM data " . $where . " LIMIT %d, %d", $offset, $num_per_page)->fetch_all();
+ *   $output = theme('mymodule_results', $result);
+ *   $output .= theme('pager', NULL, $num_per_page);
+ * @endcode
+ *
+ * @param $total
+ *  The total number of items to be paged.
+ * @param $limit
+ *  The number of items the calling code will display per page.
+ * @param $element
+ *  An optional integer to distinguish between multiple pagers on one page.
+ *
+ * @return
+ *  The current page for $element. 0 by default if $_GET['page'] is empty.
+ */
+function pager_default_initialize($total, $limit = 10, $element = 0) {
+  global $pager_page_array, $pager_total, $pager_total_items, $pager_limits;
+
+  $page = pager_find_page($element);
+
+  // We calculate the total of pages as ceil(items / limit).
+  $pager_total_items[$element] = $total;
+  $pager_total[$element] = ceil($pager_total_items[$element] / $limit);
+  $pager_page_array[$element] = max(0, min($page, ((int)$pager_total[$element]) - 1));
+  $pager_limits[$element] = $limit;
+  return $pager_page_array[$element];
+}
+
+/**
  * Compose a URL query parameter array for pager links.
  *
  * @return
