LinkedPageBase follows a LinkPath element.
diff --git a/openstack/identity/v3/endpoints/requests.go b/openstack/identity/v3/endpoints/requests.go
index 71be65d..186d0fc 100644
--- a/openstack/identity/v3/endpoints/requests.go
+++ b/openstack/identity/v3/endpoints/requests.go
@@ -111,7 +111,7 @@
 	}
 
 	createPage := func(r pagination.LastHTTPResponse) pagination.Page {
-		return EndpointPage{pagination.LinkedPageBase(r)}
+		return EndpointPage{pagination.LinkedPageBase{LastHTTPResponse: r}}
 	}
 
 	u := getListURL(client) + utils.BuildQuery(q)
diff --git a/openstack/identity/v3/services/requests.go b/openstack/identity/v3/services/requests.go
index fbd6a7c..405a9a6 100644
--- a/openstack/identity/v3/services/requests.go
+++ b/openstack/identity/v3/services/requests.go
@@ -57,7 +57,7 @@
 	u := getListURL(client) + utils.BuildQuery(q)
 
 	createPage := func(r pagination.LastHTTPResponse) pagination.Page {
-		return ServicePage{pagination.LinkedPageBase(r)}
+		return ServicePage{pagination.LinkedPageBase{LastHTTPResponse: r}}
 	}
 
 	return pagination.NewPager(client, u, createPage)
diff --git a/openstack/networking/v2/networks/requests.go b/openstack/networking/v2/networks/requests.go
index 0d74eb5..7fed58e 100644
--- a/openstack/networking/v2/networks/requests.go
+++ b/openstack/networking/v2/networks/requests.go
@@ -73,7 +73,7 @@
 
 	u := listURL(c) + utils.BuildQuery(q)
 	return pagination.NewPager(c, u, func(r pagination.LastHTTPResponse) pagination.Page {
-		return NetworkPage{pagination.LinkedPageBase(r)}
+		return NetworkPage{pagination.LinkedPageBase{LastHTTPResponse: r}}
 	})
 }
 
diff --git a/openstack/networking/v2/ports/requests.go b/openstack/networking/v2/ports/requests.go
index 3b7e605..0c4ae74 100644
--- a/openstack/networking/v2/ports/requests.go
+++ b/openstack/networking/v2/ports/requests.go
@@ -97,7 +97,7 @@
 
 	u := listURL(c) + utils.BuildQuery(q)
 	return pagination.NewPager(c, u, func(r pagination.LastHTTPResponse) pagination.Page {
-		return PortPage{pagination.LinkedPageBase(r)}
+		return PortPage{pagination.LinkedPageBase{LastHTTPResponse: r}}
 	})
 }
 
diff --git a/openstack/networking/v2/subnets/requests.go b/openstack/networking/v2/subnets/requests.go
index 9cbf5ab..591af24 100644
--- a/openstack/networking/v2/subnets/requests.go
+++ b/openstack/networking/v2/subnets/requests.go
@@ -78,7 +78,7 @@
 
 	u := listURL(c) + utils.BuildQuery(q)
 	return pagination.NewPager(c, u, func(r pagination.LastHTTPResponse) pagination.Page {
-		return SubnetPage{pagination.LinkedPageBase(r)}
+		return SubnetPage{pagination.LinkedPageBase{LastHTTPResponse: r}}
 	})
 }
 
diff --git a/pagination/linked.go b/pagination/linked.go
index fc88a55..0376edb 100644
--- a/pagination/linked.go
+++ b/pagination/linked.go
@@ -1,29 +1,63 @@
 package pagination
 
-import "github.com/mitchellh/mapstructure"
+import "fmt"
 
 // LinkedPageBase may be embedded to implement a page that provides navigational "Next" and "Previous" links within its result.
-type LinkedPageBase LastHTTPResponse
+type LinkedPageBase struct {
+	LastHTTPResponse
+
+	// LinkPath lists the keys that should be traversed within a response to arrive at the "next" pointer.
+	// If any link along the path is missing, an empty URL will be returned.
+	// If any link results in an unexpected value type, an error will be returned.
+	// When left as "nil", []string{"links", "next"} will be used as a default.
+	LinkPath []string
+}
 
 // NextPageURL extracts the pagination structure from a JSON response and returns the "next" link, if one is present.
 // It assumes that the links are available in a "links" element of the top-level response object.
 // If this is not the case, override NextPageURL on your result type.
 func (current LinkedPageBase) NextPageURL() (string, error) {
-	type response struct {
-		Links struct {
-			Next *string `mapstructure:"next,omitempty"`
-		} `mapstructure:"links"`
+	var path []string
+	var key string
+
+	if current.LinkPath == nil {
+		path = []string{"links", "next"}
+	} else {
+		path = current.LinkPath
 	}
 
-	var r response
-	err := mapstructure.Decode(current.Body, &r)
-	if err != nil {
-		return "", err
+	submap, ok := current.Body.(map[string]interface{})
+	if !ok {
+		return "", fmt.Errorf("Expected an object, but was %#v", current.Body)
 	}
 
-	if r.Links.Next == nil {
-		return "", nil
-	}
+	for {
+		key, path = path[0], path[1:len(path)]
 
-	return *r.Links.Next, nil
+		value, ok := submap[key]
+		if !ok {
+			return "", nil
+		}
+
+		fmt.Printf("key = %#v, path = %#v, value = %#v\n", key, path, value)
+
+		if len(path) > 0 {
+			submap, ok = value.(map[string]interface{})
+			if !ok {
+				return "", fmt.Errorf("Expected an object, but was %#v", value)
+			}
+		} else {
+			if value == nil {
+				// Actual null element.
+				return "", nil
+			}
+
+			url, ok := value.(string)
+			if !ok {
+				return "", fmt.Errorf("Expected a string, but was %#v", value)
+			}
+
+			return url, nil
+		}
+	}
 }
diff --git a/pagination/linked_test.go b/pagination/linked_test.go
index 2093755..2621f98 100644
--- a/pagination/linked_test.go
+++ b/pagination/linked_test.go
@@ -58,7 +58,7 @@
 	client := createClient()
 
 	createPage := func(r LastHTTPResponse) Page {
-		return LinkedPageResult{LinkedPageBase(r)}
+		return LinkedPageResult{LinkedPageBase{LastHTTPResponse: r}}
 	}
 
 	return NewPager(client, testhelper.Server.URL+"/page1", createPage)