more consistent naming
diff --git a/openstack/blockstorage/v1/apiversions/results.go b/openstack/blockstorage/v1/apiversions/results.go
index 79a89de..f510c6d 100644
--- a/openstack/blockstorage/v1/apiversions/results.go
+++ b/openstack/blockstorage/v1/apiversions/results.go
@@ -26,12 +26,11 @@
 
 // ExtractAPIVersions takes a collection page, extracts all of the elements,
 // and returns them a slice of APIVersion structs. It is effectively a cast.
-func ExtractAPIVersions(page pagination.Page) ([]APIVersion, error) {
-	r := page.(APIVersionPage)
+func ExtractAPIVersions(r pagination.Page) ([]APIVersion, error) {
 	var s struct {
 		Versions []APIVersion `json:"versions"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(APIVersionPage)).ExtractInto(&s)
 	return s.Versions, err
 }
 
diff --git a/openstack/blockstorage/v1/snapshots/results.go b/openstack/blockstorage/v1/snapshots/results.go
index f0f8864..195200d 100644
--- a/openstack/blockstorage/v1/snapshots/results.go
+++ b/openstack/blockstorage/v1/snapshots/results.go
@@ -74,12 +74,11 @@
 }
 
 // ExtractSnapshots extracts and returns Snapshots. It is used while iterating over a snapshots.List call.
-func ExtractSnapshots(page pagination.Page) ([]Snapshot, error) {
-	r := page.(SnapshotPage)
+func ExtractSnapshots(r pagination.Page) ([]Snapshot, error) {
 	var s struct {
 		Snapshots []Snapshot `json:"snapshots"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(SnapshotPage)).ExtractInto(&s)
 	return s.Snapshots, err
 }
 
@@ -93,7 +92,6 @@
 	if r.Err != nil {
 		return nil, r.Err
 	}
-
 	m := r.Body.(map[string]interface{})["metadata"]
 	return m.(map[string]interface{}), nil
 }
diff --git a/openstack/blockstorage/v1/volumes/results.go b/openstack/blockstorage/v1/volumes/results.go
index 6371840..09d1ba6 100644
--- a/openstack/blockstorage/v1/volumes/results.go
+++ b/openstack/blockstorage/v1/volumes/results.go
@@ -74,12 +74,11 @@
 }
 
 // ExtractVolumes extracts and returns Volumes. It is used while iterating over a volumes.List call.
-func ExtractVolumes(page pagination.Page) ([]Volume, error) {
-	r := page.(VolumePage)
+func ExtractVolumes(r pagination.Page) ([]Volume, error) {
 	var s struct {
 		Volumes []Volume `json:"volumes"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(VolumePage)).ExtractInto(&s)
 	return s.Volumes, err
 }
 
diff --git a/openstack/blockstorage/v1/volumetypes/results.go b/openstack/blockstorage/v1/volumetypes/results.go
index 74e193f..2c31238 100644
--- a/openstack/blockstorage/v1/volumetypes/results.go
+++ b/openstack/blockstorage/v1/volumetypes/results.go
@@ -39,12 +39,11 @@
 }
 
 // ExtractVolumeTypes extracts and returns Volume Types.
-func ExtractVolumeTypes(page pagination.Page) ([]VolumeType, error) {
-	r := page.(VolumeTypePage)
+func ExtractVolumeTypes(r pagination.Page) ([]VolumeType, error) {
 	var s struct {
 		VolumeTypes []VolumeType `json:"volume_types"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(VolumeTypePage)).ExtractInto(&s)
 	return s.VolumeTypes, err
 }
 
diff --git a/openstack/cdn/v1/flavors/results.go b/openstack/cdn/v1/flavors/results.go
index 1b15dbc..02c2851 100644
--- a/openstack/cdn/v1/flavors/results.go
+++ b/openstack/cdn/v1/flavors/results.go
@@ -34,20 +34,16 @@
 // IsEmpty returns true if a FlavorPage contains no Flavors.
 func (r FlavorPage) IsEmpty() (bool, error) {
 	flavors, err := ExtractFlavors(r)
-	if err != nil {
-		return true, err
-	}
-	return len(flavors) == 0, nil
+	return len(flavors) == 0, err
 }
 
 // ExtractFlavors extracts and returns Flavors. It is used while iterating over
 // a flavors.List call.
-func ExtractFlavors(page pagination.Page) ([]Flavor, error) {
-	r := page.(FlavorPage)
+func ExtractFlavors(r pagination.Page) ([]Flavor, error) {
 	var s struct {
 		Flavors []Flavor `json:"flavors"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(FlavorPage)).ExtractInto(&s)
 	return s.Flavors, err
 }
 
@@ -58,7 +54,7 @@
 
 // Extract is a function that extracts a flavor from a GetResult.
 func (r GetResult) Extract() (*Flavor, error) {
-	var s Flavor
+	var s *Flavor
 	err := r.ExtractInto(&s)
-	return &s, err
+	return s, err
 }
diff --git a/openstack/cdn/v1/services/results.go b/openstack/cdn/v1/services/results.go
index e37fafa..6de3497 100644
--- a/openstack/cdn/v1/services/results.go
+++ b/openstack/cdn/v1/services/results.go
@@ -230,10 +230,7 @@
 // IsEmpty returns true if a ListResult contains no services.
 func (r ServicePage) IsEmpty() (bool, error) {
 	services, err := ExtractServices(r)
-	if err != nil {
-		return true, err
-	}
-	return len(services) == 0, nil
+	return len(services) == 0, err
 }
 
 // LastMarker returns the last service in a ListResult.
@@ -249,12 +246,11 @@
 }
 
 // ExtractServices is a function that takes a ListResult and returns the services' information.
-func ExtractServices(page pagination.Page) ([]Service, error) {
-	r := page.(ServicePage)
+func ExtractServices(r pagination.Page) ([]Service, error) {
 	var s struct {
 		Services []Service `json:"services"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(ServicePage)).ExtractInto(&s)
 	return s.Services, err
 }
 
diff --git a/openstack/common/extensions/results.go b/openstack/common/extensions/results.go
index 05de97e..d5f8650 100755
--- a/openstack/common/extensions/results.go
+++ b/openstack/common/extensions/results.go
@@ -38,20 +38,16 @@
 // IsEmpty checks whether an ExtensionPage struct is empty.
 func (r ExtensionPage) IsEmpty() (bool, error) {
 	is, err := ExtractExtensions(r)
-	if err != nil {
-		return true, err
-	}
-	return len(is) == 0, nil
+	return len(is) == 0, err
 }
 
 // ExtractExtensions accepts a Page struct, specifically an ExtensionPage struct, and extracts the
 // elements into a slice of Extension structs.
 // In other words, a generic collection is mapped into a relevant slice.
-func ExtractExtensions(page pagination.Page) ([]Extension, error) {
-	r := page.(ExtensionPage)
+func ExtractExtensions(r pagination.Page) ([]Extension, error) {
 	var s struct {
 		Extensions []Extension `json:"extensions"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(ExtensionPage)).ExtractInto(&s)
 	return s.Extensions, err
 }
diff --git a/openstack/compute/v2/extensions/defsecrules/results.go b/openstack/compute/v2/extensions/defsecrules/results.go
index 00d0bb5..61b918d 100644
--- a/openstack/compute/v2/extensions/defsecrules/results.go
+++ b/openstack/compute/v2/extensions/defsecrules/results.go
@@ -18,20 +18,16 @@
 // IsEmpty determines whether or not a page of default rules contains any results.
 func (page DefaultRulePage) IsEmpty() (bool, error) {
 	users, err := ExtractDefaultRules(page)
-	if err != nil {
-		return false, err
-	}
-	return len(users) == 0, nil
+	return len(users) == 0, err
 }
 
 // ExtractDefaultRules returns a slice of DefaultRules contained in a single
 // page of results.
-func ExtractDefaultRules(page pagination.Page) ([]DefaultRule, error) {
-	r := page.(DefaultRulePage)
+func ExtractDefaultRules(r pagination.Page) ([]DefaultRule, error) {
 	var s struct {
 		DefaultRules []DefaultRule `json:"security_group_default_rules"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(DefaultRulePage)).ExtractInto(&s)
 	return s.DefaultRules, err
 }
 
diff --git a/openstack/compute/v2/extensions/floatingips/results.go b/openstack/compute/v2/extensions/floatingips/results.go
index c77ed77..753f3af 100644
--- a/openstack/compute/v2/extensions/floatingips/results.go
+++ b/openstack/compute/v2/extensions/floatingips/results.go
@@ -37,12 +37,11 @@
 
 // ExtractFloatingIPs interprets a page of results as a slice of
 // FloatingIPs.
-func ExtractFloatingIPs(page pagination.Page) ([]FloatingIP, error) {
-	r := page.(FloatingIPPage)
+func ExtractFloatingIPs(r pagination.Page) ([]FloatingIP, error) {
 	var s struct {
 		FloatingIPs []FloatingIP `json:"floating_ips"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(FloatingIPPage)).ExtractInto(&s)
 	return s.FloatingIPs, err
 }
 
diff --git a/openstack/compute/v2/extensions/keypairs/results.go b/openstack/compute/v2/extensions/keypairs/results.go
index 2b40943..f4d8d35 100644
--- a/openstack/compute/v2/extensions/keypairs/results.go
+++ b/openstack/compute/v2/extensions/keypairs/results.go
@@ -39,15 +39,14 @@
 }
 
 // ExtractKeyPairs interprets a page of results as a slice of KeyPairs.
-func ExtractKeyPairs(page pagination.Page) ([]KeyPair, error) {
-	r := page.(KeyPairPage)
+func ExtractKeyPairs(r pagination.Page) ([]KeyPair, error) {
 	type pair struct {
 		KeyPair KeyPair `json:"keypair"`
 	}
 	var s struct {
 		KeyPairs []pair `json:"keypairs"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(KeyPairPage)).ExtractInto(&s)
 	results := make([]KeyPair, len(s.KeyPairs))
 	for i, pair := range s.KeyPairs {
 		results[i] = pair.KeyPair
diff --git a/openstack/compute/v2/extensions/networks/results.go b/openstack/compute/v2/extensions/networks/results.go
index d9b746e..cbcce31 100644
--- a/openstack/compute/v2/extensions/networks/results.go
+++ b/openstack/compute/v2/extensions/networks/results.go
@@ -105,12 +105,11 @@
 }
 
 // ExtractNetworks interprets a page of results as a slice of Networks
-func ExtractNetworks(page pagination.Page) ([]Network, error) {
-	r := page.(NetworkPage)
+func ExtractNetworks(r pagination.Page) ([]Network, error) {
 	var s struct {
 		Networks []Network `json:"networks"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(NetworkPage)).ExtractInto(&s)
 	return s.Networks, err
 }
 
diff --git a/openstack/compute/v2/extensions/secgroups/results.go b/openstack/compute/v2/extensions/secgroups/results.go
index 5e18c0b..764f580 100644
--- a/openstack/compute/v2/extensions/secgroups/results.go
+++ b/openstack/compute/v2/extensions/secgroups/results.go
@@ -76,12 +76,11 @@
 }
 
 // ExtractSecurityGroups returns a slice of SecurityGroups contained in a single page of results.
-func ExtractSecurityGroups(page pagination.Page) ([]SecurityGroup, error) {
-	r := page.(SecurityGroupPage)
+func ExtractSecurityGroups(r pagination.Page) ([]SecurityGroup, error) {
 	var s struct {
 		SecurityGroups []SecurityGroup `json:"security_groups"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(SecurityGroupPage)).ExtractInto(&s)
 	return s.SecurityGroups, err
 }
 
diff --git a/openstack/compute/v2/extensions/servergroups/results.go b/openstack/compute/v2/extensions/servergroups/results.go
index ff64a7e..ab49b35 100644
--- a/openstack/compute/v2/extensions/servergroups/results.go
+++ b/openstack/compute/v2/extensions/servergroups/results.go
@@ -37,12 +37,11 @@
 
 // ExtractServerGroups interprets a page of results as a slice of
 // ServerGroups.
-func ExtractServerGroups(page pagination.Page) ([]ServerGroup, error) {
-	r := page.(ServerGroupPage)
+func ExtractServerGroups(r pagination.Page) ([]ServerGroup, error) {
 	var s struct {
 		ServerGroups []ServerGroup `json:"server_groups"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(ServerGroupPage)).ExtractInto(&s)
 	return s.ServerGroups, err
 }
 
diff --git a/openstack/compute/v2/extensions/tenantnetworks/results.go b/openstack/compute/v2/extensions/tenantnetworks/results.go
index 5db5cbd..88cbc80 100644
--- a/openstack/compute/v2/extensions/tenantnetworks/results.go
+++ b/openstack/compute/v2/extensions/tenantnetworks/results.go
@@ -30,12 +30,11 @@
 }
 
 // ExtractNetworks interprets a page of results as a slice of Networks
-func ExtractNetworks(page pagination.Page) ([]Network, error) {
-	r := page.(NetworkPage)
+func ExtractNetworks(r pagination.Page) ([]Network, error) {
 	var s struct {
 		Networks []Network `json:"networks"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(NetworkPage)).ExtractInto(&s)
 	return s.Networks, err
 }
 
diff --git a/openstack/compute/v2/extensions/volumeattach/requests.go b/openstack/compute/v2/extensions/volumeattach/requests.go
index 7017da2..17cb72e 100644
--- a/openstack/compute/v2/extensions/volumeattach/requests.go
+++ b/openstack/compute/v2/extensions/volumeattach/requests.go
@@ -10,7 +10,7 @@
 // List returns a Pager that allows you to iterate over a collection of VolumeAttachments.
 func List(client *gophercloud.ServiceClient, serverId string) pagination.Pager {
 	return pagination.NewPager(client, listURL(client, serverId), func(r pagination.PageResult) pagination.Page {
-		return VolumeAttachmentsPage{pagination.SinglePageBase(r)}
+		return VolumeAttachmentPage{pagination.SinglePageBase(r)}
 	})
 }
 
diff --git a/openstack/compute/v2/extensions/volumeattach/results.go b/openstack/compute/v2/extensions/volumeattach/results.go
index 62e7398..2eef0cd 100644
--- a/openstack/compute/v2/extensions/volumeattach/results.go
+++ b/openstack/compute/v2/extensions/volumeattach/results.go
@@ -20,26 +20,25 @@
 	ServerID string `json:"serverId"`
 }
 
-// VolumeAttachmentsPage stores a single, only page of VolumeAttachments
+// VolumeAttachmentPage stores a single, only page of VolumeAttachments
 // results from a List call.
-type VolumeAttachmentsPage struct {
+type VolumeAttachmentPage struct {
 	pagination.SinglePageBase
 }
 
 // IsEmpty determines whether or not a VolumeAttachmentsPage is empty.
-func (page VolumeAttachmentsPage) IsEmpty() (bool, error) {
+func (page VolumeAttachmentPage) IsEmpty() (bool, error) {
 	va, err := ExtractVolumeAttachments(page)
 	return len(va) == 0, err
 }
 
 // ExtractVolumeAttachments interprets a page of results as a slice of
 // VolumeAttachments.
-func ExtractVolumeAttachments(page pagination.Page) ([]VolumeAttachment, error) {
-	r := page.(VolumeAttachmentsPage)
+func ExtractVolumeAttachments(r pagination.Page) ([]VolumeAttachment, error) {
 	var s struct {
 		VolumeAttachments []VolumeAttachment `json:"volumeAttachments"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(VolumeAttachmentPage)).ExtractInto(&s)
 	return s.VolumeAttachments, err
 }
 
diff --git a/openstack/compute/v2/flavors/results.go b/openstack/compute/v2/flavors/results.go
index 3f14e76..0edc7d2 100644
--- a/openstack/compute/v2/flavors/results.go
+++ b/openstack/compute/v2/flavors/results.go
@@ -71,11 +71,10 @@
 }
 
 // ExtractFlavors provides access to the list of flavors in a page acquired from the List operation.
-func ExtractFlavors(page pagination.Page) ([]Flavor, error) {
-	r := page.(FlavorPage)
+func ExtractFlavors(r pagination.Page) ([]Flavor, error) {
 	var s struct {
 		Flavors []Flavor `json:"flavors"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(FlavorPage)).ExtractInto(&s)
 	return s.Flavors, err
 }
diff --git a/openstack/compute/v2/images/results.go b/openstack/compute/v2/images/results.go
index c9832d4..f38466b 100644
--- a/openstack/compute/v2/images/results.go
+++ b/openstack/compute/v2/images/results.go
@@ -72,11 +72,10 @@
 }
 
 // ExtractImages converts a page of List results into a slice of usable Image structs.
-func ExtractImages(page pagination.Page) ([]Image, error) {
-	r := page.(ImagePage)
+func ExtractImages(r pagination.Page) ([]Image, error) {
 	var s struct {
 		Images []Image `json:"images"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(ImagePage)).ExtractInto(&s)
 	return s.Images, err
 }
diff --git a/openstack/compute/v2/servers/results.go b/openstack/compute/v2/servers/results.go
index 2517e65..4d80667 100644
--- a/openstack/compute/v2/servers/results.go
+++ b/openstack/compute/v2/servers/results.go
@@ -170,12 +170,11 @@
 }
 
 // ExtractServers interprets the results of a single page from a List() call, producing a slice of Server entities.
-func ExtractServers(page pagination.Page) ([]Server, error) {
-	r := page.(ServerPage)
+func ExtractServers(r pagination.Page) ([]Server, error) {
 	var s struct {
 		Servers []Server `json:"servers"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(ServerPage)).ExtractInto(&s)
 	return s.Servers, err
 }
 
@@ -258,12 +257,11 @@
 
 // ExtractAddresses interprets the results of a single page from a ListAddresses() call,
 // producing a map of addresses.
-func ExtractAddresses(page pagination.Page) (map[string][]Address, error) {
-	r := page.(AddressPage)
+func ExtractAddresses(r pagination.Page) (map[string][]Address, error) {
 	var s struct {
 		Addresses map[string][]Address `json:"addresses"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(AddressPage)).ExtractInto(&s)
 	return s.Addresses, err
 }
 
@@ -282,10 +280,9 @@
 
 // ExtractNetworkAddresses interprets the results of a single page from a ListAddressesByNetwork() call,
 // producing a slice of addresses.
-func ExtractNetworkAddresses(page pagination.Page) ([]Address, error) {
-	r := page.(NetworkAddressPage)
+func ExtractNetworkAddresses(r pagination.Page) ([]Address, error) {
 	var s map[string][]Address
-	err := r.ExtractInto(&s)
+	err := (r.(NetworkAddressPage)).ExtractInto(&s)
 	if err != nil {
 		return nil, err
 	}
diff --git a/openstack/db/v1/configurations/results.go b/openstack/db/v1/configurations/results.go
index a708abd..c52a654 100644
--- a/openstack/db/v1/configurations/results.go
+++ b/openstack/db/v1/configurations/results.go
@@ -32,12 +32,11 @@
 }
 
 // ExtractConfigs will retrieve a slice of Config structs from a page.
-func ExtractConfigs(page pagination.Page) ([]Config, error) {
-	r := page.(ConfigPage)
+func ExtractConfigs(r pagination.Page) ([]Config, error) {
 	var s struct {
 		Configs []Config `json:"configurations"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(ConfigPage)).ExtractInto(&s)
 	return s.Configs, err
 }
 
@@ -100,12 +99,11 @@
 }
 
 // ExtractParams will retrieve a slice of Param structs from a page.
-func ExtractParams(page pagination.Page) ([]Param, error) {
-	r := page.(ParamPage)
+func ExtractParams(r pagination.Page) ([]Param, error) {
 	var s struct {
 		Params []Param `json:"configuration-parameters"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(ParamPage)).ExtractInto(&s)
 	return s.Params, err
 }
 
@@ -117,7 +115,7 @@
 
 // Extract will retrieve a param from an operation result.
 func (r ParamResult) Extract() (*Param, error) {
-	var s Param
+	var s *Param
 	err := r.ExtractInto(&s)
-	return &s, err
+	return s, err
 }
diff --git a/openstack/db/v1/datastores/results.go b/openstack/db/v1/datastores/results.go
index e893884..a6e27d2 100644
--- a/openstack/db/v1/datastores/results.go
+++ b/openstack/db/v1/datastores/results.go
@@ -53,12 +53,11 @@
 
 // ExtractDatastores retrieves a slice of datastore structs from a paginated
 // collection.
-func ExtractDatastores(page pagination.Page) ([]Datastore, error) {
-	r := page.(DatastorePage)
+func ExtractDatastores(r pagination.Page) ([]Datastore, error) {
 	var s struct {
 		Datastores []Datastore `json:"datastores"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(DatastorePage)).ExtractInto(&s)
 	return s.Datastores, err
 }
 
@@ -83,12 +82,11 @@
 }
 
 // ExtractVersions retrieves a slice of versions from a paginated collection.
-func ExtractVersions(page pagination.Page) ([]Version, error) {
-	r := page.(VersionPage)
+func ExtractVersions(r pagination.Page) ([]Version, error) {
 	var s struct {
 		Versions []Version `json:"versions"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(VersionPage)).ExtractInto(&s)
 	return s.Versions, err
 }
 
diff --git a/openstack/db/v1/flavors/results.go b/openstack/db/v1/flavors/results.go
index d2a5cba..f74f20c 100644
--- a/openstack/db/v1/flavors/results.go
+++ b/openstack/db/v1/flavors/results.go
@@ -58,11 +58,10 @@
 }
 
 // ExtractFlavors provides access to the list of flavors in a page acquired from the List operation.
-func ExtractFlavors(page pagination.Page) ([]Flavor, error) {
-	r := page.(FlavorPage)
+func ExtractFlavors(r pagination.Page) ([]Flavor, error) {
 	var s struct {
 		Flavors []Flavor `json:"flavors"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(FlavorPage)).ExtractInto(&s)
 	return s.Flavors, err
 }
diff --git a/openstack/db/v1/instances/results.go b/openstack/db/v1/instances/results.go
index 905b32c..f32632c 100644
--- a/openstack/db/v1/instances/results.go
+++ b/openstack/db/v1/instances/results.go
@@ -109,12 +109,11 @@
 
 // ExtractInstances will convert a generic pagination struct into a more
 // relevant slice of Instance structs.
-func ExtractInstances(page pagination.Page) ([]Instance, error) {
-	r := page.(InstancePage)
+func ExtractInstances(r pagination.Page) ([]Instance, error) {
 	var s struct {
 		Instances []Instance `json:"instances"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(InstancePage)).ExtractInto(&s)
 	return s.Instances, err
 }
 
diff --git a/openstack/db/v1/users/results.go b/openstack/db/v1/users/results.go
index 018b7c3..d12a681 100644
--- a/openstack/db/v1/users/results.go
+++ b/openstack/db/v1/users/results.go
@@ -53,11 +53,10 @@
 
 // ExtractUsers will convert a generic pagination struct into a more
 // relevant slice of User structs.
-func ExtractUsers(page pagination.Page) ([]User, error) {
-	r := page.(UserPage)
+func ExtractUsers(r pagination.Page) ([]User, error) {
 	var s struct {
 		Users []User `json:"users"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(UserPage)).ExtractInto(&s)
 	return s.Users, err
 }
diff --git a/openstack/identity/v2/extensions/admin/roles/results.go b/openstack/identity/v2/extensions/admin/roles/results.go
index 608f206..28de6bb 100644
--- a/openstack/identity/v2/extensions/admin/roles/results.go
+++ b/openstack/identity/v2/extensions/admin/roles/results.go
@@ -26,18 +26,17 @@
 }
 
 // IsEmpty determines whether or not a page of Tenants contains any results.
-func (page RolePage) IsEmpty() (bool, error) {
-	users, err := ExtractRoles(page)
+func (r RolePage) IsEmpty() (bool, error) {
+	users, err := ExtractRoles(r)
 	return len(users) == 0, err
 }
 
 // ExtractRoles returns a slice of roles contained in a single page of results.
-func ExtractRoles(page pagination.Page) ([]Role, error) {
-	r := page.(RolePage)
+func ExtractRoles(r pagination.Page) ([]Role, error) {
 	var s struct {
 		Roles []Role `json:"roles"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(RolePage)).ExtractInto(&s)
 	return s.Roles, err
 }
 
diff --git a/openstack/identity/v2/tenants/results.go b/openstack/identity/v2/tenants/results.go
index bf52554..3ce1e67 100644
--- a/openstack/identity/v2/tenants/results.go
+++ b/openstack/identity/v2/tenants/results.go
@@ -26,17 +26,17 @@
 }
 
 // IsEmpty determines whether or not a page of Tenants contains any results.
-func (page TenantPage) IsEmpty() (bool, error) {
-	tenants, err := ExtractTenants(page)
+func (r TenantPage) IsEmpty() (bool, error) {
+	tenants, err := ExtractTenants(r)
 	return len(tenants) == 0, err
 }
 
 // NextPageURL extracts the "next" link from the tenants_links section of the result.
-func (page TenantPage) NextPageURL() (string, error) {
+func (r TenantPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"tenants_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -44,11 +44,10 @@
 }
 
 // ExtractTenants returns a slice of Tenants contained in a single page of results.
-func ExtractTenants(page pagination.Page) ([]Tenant, error) {
-	r := page.(TenantPage)
+func ExtractTenants(r pagination.Page) ([]Tenant, error) {
 	var s struct {
 		Tenants []Tenant `json:"tenants"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(TenantPage)).ExtractInto(&s)
 	return s.Tenants, err
 }
diff --git a/openstack/identity/v2/users/results.go b/openstack/identity/v2/users/results.go
index c353c61..c493383 100644
--- a/openstack/identity/v2/users/results.go
+++ b/openstack/identity/v2/users/results.go
@@ -47,34 +47,32 @@
 }
 
 // IsEmpty determines whether or not a page of Tenants contains any results.
-func (page UserPage) IsEmpty() (bool, error) {
-	users, err := ExtractUsers(page)
+func (r UserPage) IsEmpty() (bool, error) {
+	users, err := ExtractUsers(r)
 	return len(users) == 0, err
 }
 
 // ExtractUsers returns a slice of Tenants contained in a single page of results.
-func ExtractUsers(page pagination.Page) ([]User, error) {
-	r := page.(UserPage)
+func ExtractUsers(r pagination.Page) ([]User, error) {
 	var s struct {
 		Users []User `json:"users"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(UserPage)).ExtractInto(&s)
 	return s.Users, err
 }
 
 // IsEmpty determines whether or not a page of Tenants contains any results.
-func (page RolePage) IsEmpty() (bool, error) {
-	users, err := ExtractRoles(page)
+func (r RolePage) IsEmpty() (bool, error) {
+	users, err := ExtractRoles(r)
 	return len(users) == 0, err
 }
 
 // ExtractRoles returns a slice of Roles contained in a single page of results.
-func ExtractRoles(page pagination.Page) ([]Role, error) {
-	r := page.(RolePage)
+func ExtractRoles(r pagination.Page) ([]Role, error) {
 	var s struct {
 		Roles []Role `json:"roles"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(RolePage)).ExtractInto(&s)
 	return s.Roles, err
 }
 
diff --git a/openstack/identity/v3/endpoints/results.go b/openstack/identity/v3/endpoints/results.go
index 09e58e5..2788f16 100644
--- a/openstack/identity/v3/endpoints/results.go
+++ b/openstack/identity/v3/endpoints/results.go
@@ -55,17 +55,16 @@
 }
 
 // IsEmpty returns true if no Endpoints were returned.
-func (p EndpointPage) IsEmpty() (bool, error) {
-	es, err := ExtractEndpoints(p)
+func (r EndpointPage) IsEmpty() (bool, error) {
+	es, err := ExtractEndpoints(r)
 	return len(es) == 0, err
 }
 
 // ExtractEndpoints extracts an Endpoint slice from a Page.
-func ExtractEndpoints(page pagination.Page) ([]Endpoint, error) {
-	r := page.(EndpointPage)
+func ExtractEndpoints(r pagination.Page) ([]Endpoint, error) {
 	var s struct {
 		Endpoints []Endpoint `json:"endpoints"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(EndpointPage)).ExtractInto(&s)
 	return s.Endpoints, err
 }
diff --git a/openstack/identity/v3/roles/requests.go b/openstack/identity/v3/roles/requests.go
index f825627..0264347 100644
--- a/openstack/identity/v3/roles/requests.go
+++ b/openstack/identity/v3/roles/requests.go
@@ -43,7 +43,7 @@
 	}
 	url += query
 	createPage := func(r pagination.PageResult) pagination.Page {
-		return RoleAssignmentsPage{pagination.LinkedPageBase{PageResult: r}}
+		return RoleAssignmentPage{pagination.LinkedPageBase{PageResult: r}}
 	}
 
 	return pagination.NewPager(client, url, createPage)
diff --git a/openstack/identity/v3/roles/results.go b/openstack/identity/v3/roles/results.go
index 86f21a0..e8a3aa9 100644
--- a/openstack/identity/v3/roles/results.go
+++ b/openstack/identity/v3/roles/results.go
@@ -35,34 +35,33 @@
 	ID string `json:"id,omitempty"`
 }
 
-// RoleAssignmentsPage is a single page of RoleAssignments results.
-type RoleAssignmentsPage struct {
+// RoleAssignmentPage is a single page of RoleAssignments results.
+type RoleAssignmentPage struct {
 	pagination.LinkedPageBase
 }
 
 // IsEmpty returns true if the page contains no results.
-func (p RoleAssignmentsPage) IsEmpty() (bool, error) {
-	roleAssignments, err := ExtractRoleAssignments(p)
+func (r RoleAssignmentPage) IsEmpty() (bool, error) {
+	roleAssignments, err := ExtractRoleAssignments(r)
 	return len(roleAssignments) == 0, err
 }
 
 // NextPageURL uses the response's embedded link reference to navigate to the next page of results.
-func (page RoleAssignmentsPage) NextPageURL() (string, error) {
+func (r RoleAssignmentPage) NextPageURL() (string, error) {
 	var s struct {
 		Links struct {
 			Next string `json:"next"`
 		} `json:"links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	return s.Links.Next, err
 }
 
 // ExtractRoleAssignments extracts a slice of RoleAssignments from a Collection acquired from List.
-func ExtractRoleAssignments(page pagination.Page) ([]RoleAssignment, error) {
-	r := page.(RoleAssignmentsPage)
+func ExtractRoleAssignments(r pagination.Page) ([]RoleAssignment, error) {
 	var s struct {
 		RoleAssignments []RoleAssignment `json:"role_assignments"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(RoleAssignmentPage)).ExtractInto(&s)
 	return s.RoleAssignments, err
 }
diff --git a/openstack/identity/v3/services/results.go b/openstack/identity/v3/services/results.go
index 45040c6..b0d36fb 100644
--- a/openstack/identity/v3/services/results.go
+++ b/openstack/identity/v3/services/results.go
@@ -59,11 +59,10 @@
 }
 
 // ExtractServices extracts a slice of Services from a Collection acquired from List.
-func ExtractServices(page pagination.Page) ([]Service, error) {
-	r := page.(ServicePage)
+func ExtractServices(r pagination.Page) ([]Service, error) {
 	var s struct {
 		Services []Service `json:"services"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(ServicePage)).ExtractInto(&s)
 	return s.Services, err
 }
diff --git a/openstack/networking/v2/extensions/external/results.go b/openstack/networking/v2/extensions/external/results.go
index 2c5173a..7e10c6d 100644
--- a/openstack/networking/v2/extensions/external/results.go
+++ b/openstack/networking/v2/extensions/external/results.go
@@ -67,11 +67,10 @@
 // ExtractList accepts a Page struct, specifically a NetworkPage struct, and
 // extracts the elements into a slice of NetworkExternal structs. In other
 // words, a generic collection is mapped into a relevant slice.
-func ExtractList(page pagination.Page) ([]NetworkExternal, error) {
-	r := page.(networks.NetworkPage)
+func ExtractList(r pagination.Page) ([]NetworkExternal, error) {
 	var s struct {
 		Networks []NetworkExternal `json:"networks" json:"networks"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(networks.NetworkPage)).ExtractInto(&s)
 	return s.Networks, err
 }
diff --git a/openstack/networking/v2/extensions/fwaas/firewalls/results.go b/openstack/networking/v2/extensions/fwaas/firewalls/results.go
index 2b4338c..ab6cf8e 100644
--- a/openstack/networking/v2/extensions/fwaas/firewalls/results.go
+++ b/openstack/networking/v2/extensions/fwaas/firewalls/results.go
@@ -38,11 +38,11 @@
 // NextPageURL is invoked when a paginated collection of firewalls has reached
 // the end of a page and the pager seeks to traverse over a new one. In order
 // to do this, it needs to construct the next page's URL.
-func (page FirewallPage) NextPageURL() (string, error) {
+func (r FirewallPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"firewalls_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -50,19 +50,19 @@
 }
 
 // IsEmpty checks whether a FirewallPage struct is empty.
-func (page FirewallPage) IsEmpty() (bool, error) {
-	is, err := ExtractFirewalls(page)
+func (r FirewallPage) IsEmpty() (bool, error) {
+	is, err := ExtractFirewalls(r)
 	return len(is) == 0, err
 }
 
 // ExtractFirewalls accepts a Page struct, specifically a RouterPage struct,
 // and extracts the elements into a slice of Router structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractFirewalls(page pagination.Page) ([]Firewall, error) {
+func ExtractFirewalls(r pagination.Page) ([]Firewall, error) {
 	var s struct {
 		Firewalls []Firewall `json:"firewalls" json:"firewalls"`
 	}
-	err := (page.(FirewallPage)).ExtractInto(&s)
+	err := (r.(FirewallPage)).ExtractInto(&s)
 	return s.Firewalls, err
 }
 
diff --git a/openstack/networking/v2/extensions/fwaas/policies/results.go b/openstack/networking/v2/extensions/fwaas/policies/results.go
index d23c81d..7bdea5b 100644
--- a/openstack/networking/v2/extensions/fwaas/policies/results.go
+++ b/openstack/networking/v2/extensions/fwaas/policies/results.go
@@ -38,11 +38,11 @@
 // NextPageURL is invoked when a paginated collection of firewall policies has
 // reached the end of a page and the pager seeks to traverse over a new one.
 // In order to do this, it needs to construct the next page's URL.
-func (page PolicyPage) NextPageURL() (string, error) {
+func (r PolicyPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"firewall_policies_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -50,19 +50,19 @@
 }
 
 // IsEmpty checks whether a PolicyPage struct is empty.
-func (page PolicyPage) IsEmpty() (bool, error) {
-	is, err := ExtractPolicies(page)
+func (r PolicyPage) IsEmpty() (bool, error) {
+	is, err := ExtractPolicies(r)
 	return len(is) == 0, err
 }
 
 // ExtractPolicies accepts a Page struct, specifically a RouterPage struct,
 // and extracts the elements into a slice of Router structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractPolicies(page pagination.Page) ([]Policy, error) {
+func ExtractPolicies(r pagination.Page) ([]Policy, error) {
 	var s struct {
 		Policies []Policy `json:"firewall_policies"`
 	}
-	err := (page.(PolicyPage)).ExtractInto(&s)
+	err := (r.(PolicyPage)).ExtractInto(&s)
 	return s.Policies, err
 }
 
diff --git a/openstack/networking/v2/extensions/fwaas/rules/results.go b/openstack/networking/v2/extensions/fwaas/rules/results.go
index 4afdf22..c44e5a9 100644
--- a/openstack/networking/v2/extensions/fwaas/rules/results.go
+++ b/openstack/networking/v2/extensions/fwaas/rules/results.go
@@ -33,11 +33,11 @@
 // NextPageURL is invoked when a paginated collection of firewall rules has
 // reached the end of a page and the pager seeks to traverse over a new one.
 // In order to do this, it needs to construct the next page's URL.
-func (page RulePage) NextPageURL() (string, error) {
+func (r RulePage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"firewall_rules_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -45,20 +45,19 @@
 }
 
 // IsEmpty checks whether a RulePage struct is empty.
-func (p RulePage) IsEmpty() (bool, error) {
-	is, err := ExtractRules(p)
+func (r RulePage) IsEmpty() (bool, error) {
+	is, err := ExtractRules(r)
 	return len(is) == 0, err
 }
 
 // ExtractRules accepts a Page struct, specifically a RouterPage struct,
 // and extracts the elements into a slice of Router structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractRules(page pagination.Page) ([]Rule, error) {
-	r := page.(RulePage)
+func ExtractRules(r pagination.Page) ([]Rule, error) {
 	var s struct {
 		Rules []Rule `json:"firewall_rules"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(RulePage)).ExtractInto(&s)
 	return s.Rules, err
 }
 
diff --git a/openstack/networking/v2/extensions/layer3/floatingips/results.go b/openstack/networking/v2/extensions/layer3/floatingips/results.go
index c33b139..838ca2c 100644
--- a/openstack/networking/v2/extensions/layer3/floatingips/results.go
+++ b/openstack/networking/v2/extensions/layer3/floatingips/results.go
@@ -78,11 +78,11 @@
 // NextPageURL is invoked when a paginated collection of floating IPs has reached
 // the end of a page and the pager seeks to traverse over a new one. In order
 // to do this, it needs to construct the next page's URL.
-func (page FloatingIPPage) NextPageURL() (string, error) {
+func (r FloatingIPPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"floatingips_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -90,19 +90,18 @@
 }
 
 // IsEmpty checks whether a NetworkPage struct is empty.
-func (page FloatingIPPage) IsEmpty() (bool, error) {
-	is, err := ExtractFloatingIPs(page)
+func (r FloatingIPPage) IsEmpty() (bool, error) {
+	is, err := ExtractFloatingIPs(r)
 	return len(is) == 0, err
 }
 
 // ExtractFloatingIPs accepts a Page struct, specifically a FloatingIPPage struct,
 // and extracts the elements into a slice of FloatingIP structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractFloatingIPs(page pagination.Page) ([]FloatingIP, error) {
-	r := page.(FloatingIPPage)
+func ExtractFloatingIPs(r pagination.Page) ([]FloatingIP, error) {
 	var s struct {
 		FloatingIPs []FloatingIP `json:"floatingips"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(FloatingIPPage)).ExtractInto(&s)
 	return s.FloatingIPs, err
 }
diff --git a/openstack/networking/v2/extensions/layer3/routers/results.go b/openstack/networking/v2/extensions/layer3/routers/results.go
index e26f243..d849d45 100644
--- a/openstack/networking/v2/extensions/layer3/routers/results.go
+++ b/openstack/networking/v2/extensions/layer3/routers/results.go
@@ -60,11 +60,11 @@
 // NextPageURL is invoked when a paginated collection of routers has reached
 // the end of a page and the pager seeks to traverse over a new one. In order
 // to do this, it needs to construct the next page's URL.
-func (page RouterPage) NextPageURL() (string, error) {
+func (r RouterPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"routers_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -72,20 +72,19 @@
 }
 
 // IsEmpty checks whether a RouterPage struct is empty.
-func (page RouterPage) IsEmpty() (bool, error) {
-	is, err := ExtractRouters(page)
+func (r RouterPage) IsEmpty() (bool, error) {
+	is, err := ExtractRouters(r)
 	return len(is) == 0, err
 }
 
 // ExtractRouters accepts a Page struct, specifically a RouterPage struct,
 // and extracts the elements into a slice of Router structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractRouters(page pagination.Page) ([]Router, error) {
-	r := page.(RouterPage)
+func ExtractRouters(r pagination.Page) ([]Router, error) {
 	var s struct {
 		Routers []Router `json:"routers"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(RouterPage)).ExtractInto(&s)
 	return s.Routers, err
 }
 
diff --git a/openstack/networking/v2/extensions/lbaas/members/results.go b/openstack/networking/v2/extensions/lbaas/members/results.go
index ae9f341..933e1ae 100644
--- a/openstack/networking/v2/extensions/lbaas/members/results.go
+++ b/openstack/networking/v2/extensions/lbaas/members/results.go
@@ -42,11 +42,11 @@
 // NextPageURL is invoked when a paginated collection of members has reached
 // the end of a page and the pager seeks to traverse over a new one. In order
 // to do this, it needs to construct the next page's URL.
-func (page MemberPage) NextPageURL() (string, error) {
+func (r MemberPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"members_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -54,20 +54,19 @@
 }
 
 // IsEmpty checks whether a MemberPage struct is empty.
-func (page MemberPage) IsEmpty() (bool, error) {
-	is, err := ExtractMembers(page)
+func (r MemberPage) IsEmpty() (bool, error) {
+	is, err := ExtractMembers(r)
 	return len(is) == 0, err
 }
 
 // ExtractMembers accepts a Page struct, specifically a MemberPage struct,
 // and extracts the elements into a slice of Member structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractMembers(page pagination.Page) ([]Member, error) {
-	r := page.(MemberPage)
+func ExtractMembers(r pagination.Page) ([]Member, error) {
 	var s struct {
 		Members []Member `json:"members"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(MemberPage)).ExtractInto(&s)
 	return s.Members, err
 }
 
diff --git a/openstack/networking/v2/extensions/lbaas/monitors/results.go b/openstack/networking/v2/extensions/lbaas/monitors/results.go
index 86c24bd..11ba7df 100644
--- a/openstack/networking/v2/extensions/lbaas/monitors/results.go
+++ b/openstack/networking/v2/extensions/lbaas/monitors/results.go
@@ -70,11 +70,11 @@
 // NextPageURL is invoked when a paginated collection of monitors has reached
 // the end of a page and the pager seeks to traverse over a new one. In order
 // to do this, it needs to construct the next page's URL.
-func (page MonitorPage) NextPageURL() (string, error) {
+func (r MonitorPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"health_monitors_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -83,20 +83,19 @@
 }
 
 // IsEmpty checks whether a PoolPage struct is empty.
-func (page MonitorPage) IsEmpty() (bool, error) {
-	is, err := ExtractMonitors(page)
+func (r MonitorPage) IsEmpty() (bool, error) {
+	is, err := ExtractMonitors(r)
 	return len(is) == 0, err
 }
 
 // ExtractMonitors accepts a Page struct, specifically a MonitorPage struct,
 // and extracts the elements into a slice of Monitor structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractMonitors(page pagination.Page) ([]Monitor, error) {
-	r := page.(MonitorPage)
+func ExtractMonitors(r pagination.Page) ([]Monitor, error) {
 	var s struct {
 		Monitors []Monitor `json:"health_monitors"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(MonitorPage)).ExtractInto(&s)
 	return s.Monitors, err
 }
 
diff --git a/openstack/networking/v2/extensions/lbaas/pools/results.go b/openstack/networking/v2/extensions/lbaas/pools/results.go
index 135046a..2ca1963 100644
--- a/openstack/networking/v2/extensions/lbaas/pools/results.go
+++ b/openstack/networking/v2/extensions/lbaas/pools/results.go
@@ -64,11 +64,11 @@
 // NextPageURL is invoked when a paginated collection of pools has reached
 // the end of a page and the pager seeks to traverse over a new one. In order
 // to do this, it needs to construct the next page's URL.
-func (page PoolPage) NextPageURL() (string, error) {
+func (r PoolPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"pools_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -76,20 +76,19 @@
 }
 
 // IsEmpty checks whether a PoolPage struct is empty.
-func (page PoolPage) IsEmpty() (bool, error) {
-	is, err := ExtractPools(page)
+func (r PoolPage) IsEmpty() (bool, error) {
+	is, err := ExtractPools(r)
 	return len(is) == 0, err
 }
 
 // ExtractPools accepts a Page struct, specifically a RouterPage struct,
 // and extracts the elements into a slice of Router structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractPools(page pagination.Page) ([]Pool, error) {
-	r := page.(PoolPage)
+func ExtractPools(r pagination.Page) ([]Pool, error) {
 	var s struct {
 		Pools []Pool `json:"pools"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(PoolPage)).ExtractInto(&s)
 	return s.Pools, err
 }
 
diff --git a/openstack/networking/v2/extensions/lbaas/vips/results.go b/openstack/networking/v2/extensions/lbaas/vips/results.go
index 398c981..7ac7e79 100644
--- a/openstack/networking/v2/extensions/lbaas/vips/results.go
+++ b/openstack/networking/v2/extensions/lbaas/vips/results.go
@@ -89,11 +89,11 @@
 // NextPageURL is invoked when a paginated collection of routers has reached
 // the end of a page and the pager seeks to traverse over a new one. In order
 // to do this, it needs to construct the next page's URL.
-func (page VIPPage) NextPageURL() (string, error) {
+func (r VIPPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"vips_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -101,20 +101,19 @@
 }
 
 // IsEmpty checks whether a VIPPage struct is empty.
-func (page VIPPage) IsEmpty() (bool, error) {
-	is, err := ExtractVIPs(page)
+func (r VIPPage) IsEmpty() (bool, error) {
+	is, err := ExtractVIPs(r)
 	return len(is) == 0, err
 }
 
 // ExtractVIPs accepts a Page struct, specifically a VIPPage struct,
 // and extracts the elements into a slice of VirtualIP structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractVIPs(page pagination.Page) ([]VirtualIP, error) {
-	r := page.(VIPPage)
+func ExtractVIPs(r pagination.Page) ([]VirtualIP, error) {
 	var s struct {
 		VIPs []VirtualIP `json:"vips"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(VIPPage)).ExtractInto(&s)
 	return s.VIPs, err
 }
 
diff --git a/openstack/networking/v2/extensions/provider/results.go b/openstack/networking/v2/extensions/provider/results.go
index f437461..394045a 100755
--- a/openstack/networking/v2/extensions/provider/results.go
+++ b/openstack/networking/v2/extensions/provider/results.go
@@ -94,11 +94,10 @@
 // ExtractList accepts a Page struct, specifically a NetworkPage struct, and
 // extracts the elements into a slice of NetworkExtAttrs structs. In other
 // words, a generic collection is mapped into a relevant slice.
-func ExtractList(page pagination.Page) ([]NetworkExtAttrs, error) {
-	r := page.(networks.NetworkPage)
+func ExtractList(r pagination.Page) ([]NetworkExtAttrs, error) {
 	var s struct {
 		Networks []NetworkExtAttrs `json:"networks" json:"networks"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(networks.NetworkPage)).ExtractInto(&s)
 	return s.Networks, err
 }
diff --git a/openstack/networking/v2/extensions/security/groups/results.go b/openstack/networking/v2/extensions/security/groups/results.go
index 7479e19..ea3ad65 100644
--- a/openstack/networking/v2/extensions/security/groups/results.go
+++ b/openstack/networking/v2/extensions/security/groups/results.go
@@ -36,11 +36,11 @@
 // NextPageURL is invoked when a paginated collection of security groups has
 // reached the end of a page and the pager seeks to traverse over a new one. In
 // order to do this, it needs to construct the next page's URL.
-func (page SecGroupPage) NextPageURL() (string, error) {
+func (r SecGroupPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"security_groups_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -49,20 +49,19 @@
 }
 
 // IsEmpty checks whether a SecGroupPage struct is empty.
-func (page SecGroupPage) IsEmpty() (bool, error) {
-	is, err := ExtractGroups(page)
+func (r SecGroupPage) IsEmpty() (bool, error) {
+	is, err := ExtractGroups(r)
 	return len(is) == 0, err
 }
 
 // ExtractGroups accepts a Page struct, specifically a SecGroupPage struct,
 // and extracts the elements into a slice of SecGroup structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractGroups(page pagination.Page) ([]SecGroup, error) {
-	r := page.(SecGroupPage)
+func ExtractGroups(r pagination.Page) ([]SecGroup, error) {
 	var s struct {
 		SecGroups []SecGroup `json:"security_groups"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(SecGroupPage)).ExtractInto(&s)
 	return s.SecGroups, err
 }
 
diff --git a/openstack/networking/v2/extensions/security/rules/results.go b/openstack/networking/v2/extensions/security/rules/results.go
index a9d6f1b..18476a6 100644
--- a/openstack/networking/v2/extensions/security/rules/results.go
+++ b/openstack/networking/v2/extensions/security/rules/results.go
@@ -61,11 +61,11 @@
 // NextPageURL is invoked when a paginated collection of security group rules has
 // reached the end of a page and the pager seeks to traverse over a new one. In
 // order to do this, it needs to construct the next page's URL.
-func (page SecGroupRulePage) NextPageURL() (string, error) {
+func (r SecGroupRulePage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"security_group_rules_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -73,20 +73,19 @@
 }
 
 // IsEmpty checks whether a SecGroupRulePage struct is empty.
-func (page SecGroupRulePage) IsEmpty() (bool, error) {
-	is, err := ExtractRules(page)
+func (r SecGroupRulePage) IsEmpty() (bool, error) {
+	is, err := ExtractRules(r)
 	return len(is) == 0, err
 }
 
 // ExtractRules accepts a Page struct, specifically a SecGroupRulePage struct,
 // and extracts the elements into a slice of SecGroupRule structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractRules(page pagination.Page) ([]SecGroupRule, error) {
-	r := page.(SecGroupRulePage)
+func ExtractRules(r pagination.Page) ([]SecGroupRule, error) {
 	var s struct {
 		SecGroupRules []SecGroupRule `json:"security_group_rules"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(SecGroupRulePage)).ExtractInto(&s)
 	return s.SecGroupRules, err
 }
 
diff --git a/openstack/networking/v2/networks/results.go b/openstack/networking/v2/networks/results.go
index 7f64ddb..d928980 100644
--- a/openstack/networking/v2/networks/results.go
+++ b/openstack/networking/v2/networks/results.go
@@ -72,11 +72,11 @@
 // NextPageURL is invoked when a paginated collection of networks has reached
 // the end of a page and the pager seeks to traverse over a new one. In order
 // to do this, it needs to construct the next page's URL.
-func (page NetworkPage) NextPageURL() (string, error) {
+func (r NetworkPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"networks_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -84,19 +84,18 @@
 }
 
 // IsEmpty checks whether a NetworkPage struct is empty.
-func (page NetworkPage) IsEmpty() (bool, error) {
-	is, err := ExtractNetworks(page)
+func (r NetworkPage) IsEmpty() (bool, error) {
+	is, err := ExtractNetworks(r)
 	return len(is) == 0, err
 }
 
 // ExtractNetworks accepts a Page struct, specifically a NetworkPage struct,
 // and extracts the elements into a slice of Network structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractNetworks(page pagination.Page) ([]Network, error) {
-	r := page.(NetworkPage)
+func ExtractNetworks(r pagination.Page) ([]Network, error) {
 	var s struct {
 		Networks []Network `json:"networks"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(NetworkPage)).ExtractInto(&s)
 	return s.Networks, err
 }
diff --git a/openstack/networking/v2/ports/results.go b/openstack/networking/v2/ports/results.go
index e757a54..57a1765 100644
--- a/openstack/networking/v2/ports/results.go
+++ b/openstack/networking/v2/ports/results.go
@@ -90,11 +90,11 @@
 // NextPageURL is invoked when a paginated collection of ports has reached
 // the end of a page and the pager seeks to traverse over a new one. In order
 // to do this, it needs to construct the next page's URL.
-func (page PortPage) NextPageURL() (string, error) {
+func (r PortPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"ports_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -102,19 +102,18 @@
 }
 
 // IsEmpty checks whether a PortPage struct is empty.
-func (page PortPage) IsEmpty() (bool, error) {
-	is, err := ExtractPorts(page)
+func (r PortPage) IsEmpty() (bool, error) {
+	is, err := ExtractPorts(r)
 	return len(is) == 0, err
 }
 
 // ExtractPorts accepts a Page struct, specifically a PortPage struct,
 // and extracts the elements into a slice of Port structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractPorts(page pagination.Page) ([]Port, error) {
-	r := page.(PortPage)
+func ExtractPorts(r pagination.Page) ([]Port, error) {
 	var s struct {
 		Ports []Port `json:"ports"`
 	}
-	err := r.ExtractInto(&s)
+	err := (r.(PortPage)).ExtractInto(&s)
 	return s.Ports, err
 }
diff --git a/openstack/networking/v2/subnets/results.go b/openstack/networking/v2/subnets/results.go
index 22cff1e..ab5cce1 100644
--- a/openstack/networking/v2/subnets/results.go
+++ b/openstack/networking/v2/subnets/results.go
@@ -88,11 +88,11 @@
 // NextPageURL is invoked when a paginated collection of subnets has reached
 // the end of a page and the pager seeks to traverse over a new one. In order
 // to do this, it needs to construct the next page's URL.
-func (page SubnetPage) NextPageURL() (string, error) {
+func (r SubnetPage) NextPageURL() (string, error) {
 	var s struct {
 		Links []gophercloud.Link `json:"subnets_links"`
 	}
-	err := page.ExtractInto(&s)
+	err := r.ExtractInto(&s)
 	if err != nil {
 		return "", err
 	}
@@ -100,18 +100,18 @@
 }
 
 // IsEmpty checks whether a SubnetPage struct is empty.
-func (page SubnetPage) IsEmpty() (bool, error) {
-	is, err := ExtractSubnets(page)
+func (r SubnetPage) IsEmpty() (bool, error) {
+	is, err := ExtractSubnets(r)
 	return len(is) == 0, err
 }
 
 // ExtractSubnets accepts a Page struct, specifically a SubnetPage struct,
 // and extracts the elements into a slice of Subnet structs. In other words,
 // a generic collection is mapped into a relevant slice.
-func ExtractSubnets(page pagination.Page) ([]Subnet, error) {
+func ExtractSubnets(r pagination.Page) ([]Subnet, error) {
 	var s struct {
 		Subnets []Subnet `json:"subnets"`
 	}
-	err := (page.(SubnetPage)).ExtractInto(&s)
+	err := (r.(SubnetPage)).ExtractInto(&s)
 	return s.Subnets, err
 }
diff --git a/openstack/objectstorage/v1/accounts/results.go b/openstack/objectstorage/v1/accounts/results.go
index 50032bd..f9e5fcd 100644
--- a/openstack/objectstorage/v1/accounts/results.go
+++ b/openstack/objectstorage/v1/accounts/results.go
@@ -47,21 +47,21 @@
 
 // Extract will return a struct of headers returned from a call to Get. To obtain
 // a map of headers, call the ExtractHeader method on the GetResult.
-func (gr GetResult) Extract() (*GetHeader, error) {
-	var gh *GetHeader
-	err := gr.ExtractInto(&gh)
-	return gh, err
+func (r GetResult) Extract() (*GetHeader, error) {
+	var s *GetHeader
+	err := r.ExtractInto(&s)
+	return s, err
 }
 
 // ExtractMetadata is a function that takes a GetResult (of type *http.Response)
 // and returns the custom metatdata associated with the account.
-func (gr GetResult) ExtractMetadata() (map[string]string, error) {
-	if gr.Err != nil {
-		return nil, gr.Err
+func (r GetResult) ExtractMetadata() (map[string]string, error) {
+	if r.Err != nil {
+		return nil, r.Err
 	}
 
 	metadata := make(map[string]string)
-	for k, v := range gr.Header {
+	for k, v := range r.Header {
 		if strings.HasPrefix(k, "X-Account-Meta-") {
 			key := strings.TrimPrefix(k, "X-Account-Meta-")
 			metadata[key] = v[0]
diff --git a/openstack/orchestration/v1/stackresources/results.go b/openstack/orchestration/v1/stackresources/results.go
index 951f144..bd3e29f 100644
--- a/openstack/orchestration/v1/stackresources/results.go
+++ b/openstack/orchestration/v1/stackresources/results.go
@@ -161,8 +161,5 @@
 		return nil, r.Err
 	}
 	template, err := json.MarshalIndent(r.Body, "", "  ")
-	if err != nil {
-		return nil, err
-	}
-	return template, nil
+	return template, err
 }
diff --git a/openstack/orchestration/v1/stacks/results.go b/openstack/orchestration/v1/stacks/results.go
index 5da178e..6b6f3a3 100644
--- a/openstack/orchestration/v1/stacks/results.go
+++ b/openstack/orchestration/v1/stacks/results.go
@@ -176,8 +176,5 @@
 // the result of an Abandon operation to an AdoptOpts AdoptStackData field.
 func (r AbandonResult) String() (string, error) {
 	out, err := json.Marshal(r)
-	if err != nil {
-		return "", err
-	}
-	return string(out), nil
+	return string(out), err
 }
diff --git a/results.go b/results.go
index 0de2223..1a3aaa4 100644
--- a/results.go
+++ b/results.go
@@ -114,7 +114,9 @@
 
 	tmpHeaderMap := map[string]string{}
 	for k, v := range r.Header {
-		tmpHeaderMap[k] = v[0]
+		if len(v) > 0 {
+			tmpHeaderMap[k] = v[0]
+		}
 	}
 
 	b, err := json.Marshal(tmpHeaderMap)
@@ -203,7 +205,7 @@
 	return nil
 }
 
-// StackFmtTime is the time format used in Heat (Orchestration).
+// RFC3339NoZ is the time format used in Heat (Orchestration).
 const RFC3339NoZ = "2006-01-02T15:04:05"
 
 type JSONRFC3339NoZ time.Time