diff --git a/pagination.go b/pagination.go
index 4b646a1..b0930e8 100644
--- a/pagination.go
+++ b/pagination.go
@@ -109,7 +109,7 @@
 	LastHTTPResponse
 
 	// lastMark is a captured function that returns the final entry on a given page.
-	lastMark func(MarkerPage) (string, error)
+	lastMark func(Page) (string, error)
 }
 
 // NextPageURL generates the URL for the page of results after this one.
@@ -133,20 +133,23 @@
 	initialURL string
 
 	fetchNextPage func(string) (Page, error)
+
+	countPage func(Page) (int, error)
 }
 
 // NewPager constructs a manually-configured pager.
-// Supply the URL for the first page and a function that requests a specific page given a URL.
-func NewPager(initialURL string, fetchNextPage func(string) (Page, error)) Pager {
+// Supply the URL for the first page, a function that requests a specific page given a URL, and a function that counts a page.
+func NewPager(initialURL string, fetchNextPage func(string) (Page, error), countPage func(Page) (int, error)) Pager {
 	return Pager{
 		initialURL:    initialURL,
 		fetchNextPage: fetchNextPage,
+		countPage:     countPage,
 	}
 }
 
 // NewSinglePager constructs a Pager that "iterates" over a single Page.
 // Supply the URL to request.
-func NewSinglePager(client *ServiceClient, onlyURL string) Pager {
+func NewSinglePager(client *ServiceClient, onlyURL string, countPage func(Page) (int, error)) Pager {
 	consumed := false
 	single := func(_ string) (Page, error) {
 		if !consumed {
@@ -168,11 +171,12 @@
 	return Pager{
 		initialURL:    "",
 		fetchNextPage: single,
+		countPage:     countPage,
 	}
 }
 
 // NewLinkedPager creates a Pager that uses a "links" element in the JSON response to locate the next page.
-func NewLinkedPager(client *ServiceClient, initialURL string) Pager {
+func NewLinkedPager(client *ServiceClient, initialURL string, countPage func(Page) (int, error)) Pager {
 	fetchNextPage := func(url string) (Page, error) {
 		resp, err := request(client, url)
 		if err != nil {
@@ -190,12 +194,15 @@
 	return Pager{
 		initialURL:    initialURL,
 		fetchNextPage: fetchNextPage,
+		countPage:     countPage,
 	}
 }
 
 // NewMarkerPager creates a Pager that iterates over successive pages by issuing requests with a "marker" parameter set to the
 // final element of the previous Page.
-func NewMarkerPager(client *ServiceClient, initialURL string, lastMark func(MarkerPage) (string, error)) Pager {
+func NewMarkerPager(client *ServiceClient, initialURL string,
+	lastMark func(Page) (string, error), countPage func(Page) (int, error)) Pager {
+
 	fetchNextPage := func(currentURL string) (Page, error) {
 		resp, err := request(client, currentURL)
 		if err != nil {
@@ -213,6 +220,7 @@
 	return Pager{
 		initialURL:    initialURL,
 		fetchNextPage: fetchNextPage,
+		countPage:     countPage,
 	}
 }
 
@@ -226,6 +234,14 @@
 			return err
 		}
 
+		count, err := p.countPage(currentPage)
+		if err != nil {
+			return err
+		}
+		if count == 0 {
+			return nil
+		}
+
 		ok, err := handler(currentPage)
 		if err != nil {
 			return err
diff --git a/pagination_test.go b/pagination_test.go
index a1c59bb..eb773bd 100644
--- a/pagination_test.go
+++ b/pagination_test.go
@@ -42,7 +42,15 @@
 		fmt.Fprintf(w, `{ "ints": [1, 2, 3] }`)
 	})
 
-	return NewSinglePager(client, testhelper.Server.URL+"/only")
+	countPage := func(p Page) (int, error) {
+		is, err := ExtractSingleInts(p)
+		if err != nil {
+			return 0, err
+		}
+		return len(is), nil
+	}
+
+	return NewSinglePager(client, testhelper.Server.URL+"/only", countPage)
 }
 
 func TestEnumerateSinglePaged(t *testing.T) {
@@ -107,7 +115,15 @@
 
 	client := createClient()
 
-	return NewLinkedPager(client, testhelper.Server.URL+"/page1")
+	countPage := func(p Page) (int, error) {
+		is, err := ExtractLinkedInts(p)
+		if err != nil {
+			return 0, err
+		}
+		return len(is), nil
+	}
+
+	return NewLinkedPager(client, testhelper.Server.URL+"/page1", countPage)
 }
 
 func TestEnumerateLinked(t *testing.T) {
@@ -174,18 +190,36 @@
 
 	client := createClient()
 
-	return NewMarkerPager(client, testhelper.Server.URL+"/page", func(p MarkerPage) (string, error) {
+	lastMark := func(p Page) (string, error) {
 		items, err := ExtractMarkerStrings(p)
 		if err != nil {
 			return "", err
 		}
 		return items[len(items)-1], nil
-	})
+	}
+
+	countPage := func(p Page) (int, error) {
+		items, err := ExtractMarkerStrings(p)
+		if err != nil {
+			return 0, err
+		}
+		fmt.Printf("Counting items [%#v] = [%d]\n", items, len(items))
+		return len(items), nil
+	}
+
+	return NewMarkerPager(client, testhelper.Server.URL+"/page", lastMark, countPage)
 }
 
 func ExtractMarkerStrings(page Page) ([]string, error) {
 	content := page.(MarkerPage).Body.([]uint8)
-	return strings.Split(string(content), "\n"), nil
+	parts := strings.Split(string(content), "\n")
+	results := make([]string, 0, len(parts))
+	for _, part := range parts {
+		if len(part) > 0 {
+			results = append(results, part)
+		}
+	}
+	return results, nil
 }
 
 func TestEnumerateMarker(t *testing.T) {
