Use clients and pagination for Servers, too.

Whew.
diff --git a/openstack/compute/v2/servers/requests.go b/openstack/compute/v2/servers/requests.go
index 95818da..e2875e3 100644
--- a/openstack/compute/v2/servers/requests.go
+++ b/openstack/compute/v2/servers/requests.go
@@ -2,123 +2,111 @@
 
 import (
 	"fmt"
+
 	"github.com/racker/perigee"
+	"github.com/rackspace/gophercloud"
+	"github.com/rackspace/gophercloud/pagination"
 )
 
-// ListResult abstracts the raw results of making a List() request against the
-// API.  As OpenStack extensions may freely alter the response bodies of
-// structures returned to the client, you may only safely access the data
-// provided through separate, type-safe accessors or methods.
-type ListResult map[string]interface{}
+// ListResult abstracts the raw results of making a List() request against the API.
+// As OpenStack extensions may freely alter the response bodies of structures returned to the client, you may only safely access the
+// data provided through the ExtractServers call.
+type ListResult struct {
+	pagination.MarkerPageBase
+}
 
-// ServerResult abstracts a single server description,
-// as returned by the OpenStack provider.
-// As OpenStack extensions may freely alter the response bodies of the
-// structures returned to the client,
-// you may only safely access the data provided through
-// separate, type-safe accessors or methods.
+// IsEmpty returns true if a page contains no Server results.
+func (page ListResult) IsEmpty() (bool, error) {
+	servers, err := ExtractServers(page)
+	if err != nil {
+		return true, err
+	}
+	return len(servers) == 0, nil
+}
+
+// LastMarker returns the ID of the final server on the current page.
+func (page ListResult) LastMarker() (string, error) {
+	servers, err := ExtractServers(page)
+	if err != nil {
+		return "", err
+	}
+	if len(servers) == 0 {
+		return "", nil
+	}
+	return servers[len(servers)-1].ID, nil
+}
+
+// ServerResult abstracts a single server description, as returned by the OpenStack provider.
+// As OpenStack extensions may freely alter the response bodies of the structures returned to the client,
+// you may only safely access the data provided through separate, type-safe accessors or methods.
 type ServerResult map[string]interface{}
 
 // List makes a request against the API to list servers accessible to you.
-func List(c *Client) (ListResult, error) {
-	var lr ListResult
-
-	h, err := c.getListHeaders()
-	if err != nil {
-		return nil, err
+func List(client *gophercloud.ServiceClient) pagination.Pager {
+	createPage := func(r pagination.LastHTTPResponse) pagination.Page {
+		p := ListResult{pagination.MarkerPageBase{LastHTTPResponse: r}}
+		p.MarkerPageBase.Owner = p
+		return p
 	}
 
-	err = perigee.Get(c.getListUrl(), perigee.Options{
-		Results:     &lr,
-		MoreHeaders: h,
-	})
-	return lr, err
+	return pagination.NewPager(client, getListURL(client), createPage)
 }
 
 // Create requests a server to be provisioned to the user in the current tenant.
-func Create(c *Client, opts map[string]interface{}) (ServerResult, error) {
+func Create(client *gophercloud.ServiceClient, opts map[string]interface{}) (ServerResult, error) {
 	var sr ServerResult
-
-	h, err := c.getCreateHeaders()
-	if err != nil {
-		return nil, err
-	}
-
-	err = perigee.Post(c.getCreateUrl(), perigee.Options{
+	_, err := perigee.Request("POST", getListURL(client), perigee.Options{
 		Results: &sr,
 		ReqBody: map[string]interface{}{
 			"server": opts,
 		},
-		MoreHeaders: h,
+		MoreHeaders: client.Provider.AuthenticatedHeaders(),
 		OkCodes:     []int{202},
 	})
 	return sr, err
 }
 
 // Delete requests that a server previously provisioned be removed from your account.
-func Delete(c *Client, id string) error {
-	h, err := c.getDeleteHeaders()
-	if err != nil {
-		return err
-	}
-
-	err = perigee.Delete(c.getDeleteUrl(id), perigee.Options{
-		MoreHeaders: h,
+func Delete(client *gophercloud.ServiceClient, id string) error {
+	_, err := perigee.Request("DELETE", getServerURL(client, id), perigee.Options{
+		MoreHeaders: client.Provider.AuthenticatedHeaders(),
 		OkCodes:     []int{204},
 	})
 	return err
 }
 
 // GetDetail requests details on a single server, by ID.
-func GetDetail(c *Client, id string) (ServerResult, error) {
+func GetDetail(client *gophercloud.ServiceClient, id string) (ServerResult, error) {
 	var sr ServerResult
-
-	h, err := c.getDetailHeaders()
-	if err != nil {
-		return nil, err
-	}
-
-	err = perigee.Get(c.getDetailUrl(id), perigee.Options{
+	_, err := perigee.Request("GET", getServerURL(client, id), perigee.Options{
 		Results:     &sr,
-		MoreHeaders: h,
+		MoreHeaders: client.Provider.AuthenticatedHeaders(),
 	})
 	return sr, err
 }
 
 // Update requests that various attributes of the indicated server be changed.
-func Update(c *Client, id string, opts map[string]interface{}) (ServerResult, error) {
+func Update(client *gophercloud.ServiceClient, id string, opts map[string]interface{}) (ServerResult, error) {
 	var sr ServerResult
-
-	h, err := c.getUpdateHeaders()
-	if err != nil {
-		return nil, err
-	}
-
-	err = perigee.Put(c.getUpdateUrl(id), perigee.Options{
+	_, err := perigee.Request("PUT", getServerURL(client, id), perigee.Options{
 		Results: &sr,
 		ReqBody: map[string]interface{}{
 			"server": opts,
 		},
-		MoreHeaders: h,
+		MoreHeaders: client.Provider.AuthenticatedHeaders(),
 	})
 	return sr, err
 }
 
-// ChangeAdminPassword alters the administrator or root password for a specified
-// server.
-func ChangeAdminPassword(c *Client, id, newPassword string) error {
-	h, err := c.getActionHeaders()
-	if err != nil {
-		return err
-	}
-
-	err = perigee.Post(c.getActionUrl(id), perigee.Options{
+// ChangeAdminPassword alters the administrator or root password for a specified server.
+func ChangeAdminPassword(client *gophercloud.ServiceClient, id, newPassword string) error {
+	_, err := perigee.Request("POST", getActionURL(client, id), perigee.Options{
 		ReqBody: struct {
 			C map[string]string `json:"changePassword"`
 		}{
 			map[string]string{"adminPass": newPassword},
 		},
-		MoreHeaders: h,
+		MoreHeaders: client.Provider.AuthenticatedHeaders(),
 		OkCodes:     []int{202},
 	})
 	return err
@@ -150,28 +138,29 @@
 	return e.Error()
 }
 
+// RebootMethod describes the mechanisms by which a server reboot can be requested.
+type RebootMethod string
+
 // These constants determine how a server should be rebooted.
 // See the Reboot() function for further details.
 const (
-	SoftReboot = "SOFT"
-	HardReboot = "HARD"
-	OSReboot   = SoftReboot
-	PowerCycle = HardReboot
+	SoftReboot RebootMethod = "SOFT"
+	HardReboot RebootMethod = "HARD"
+	OSReboot                = SoftReboot
+	PowerCycle              = HardReboot
 )
 
 // Reboot requests that a given server reboot.
 // Two methods exist for rebooting a server:
 //
-// HardReboot (aka PowerCycle) -- restarts the server instance by physically
-// cutting power to the machine, or if a VM, terminating it at the hypervisor
-// level.  It's done.  Caput.  Full stop.  Then, after a brief while, power is
-// restored or the VM instance restarted.
+// HardReboot (aka PowerCycle) restarts the server instance by physically cutting power to the machine, or if a VM,
+// terminating it at the hypervisor level.
+// It's done. Caput. Full stop.
+// Then, after a brief while, power is restored or the VM instance restarted.
 //
-// SoftReboot (aka OSReboot).  This approach simply tells the OS to restart
-// under its own procedures.  E.g., in Linux, asking it to enter runlevel 6,
-// or executing "sudo shutdown -r now", or by wasking Windows to restart the
-// machine.
-func Reboot(c *Client, id, how string) error {
+// SoftReboot (aka OSReboot) simply tells the OS to restart under its own procedures.
+// E.g., in Linux, asking it to enter runlevel 6, or executing "sudo shutdown -r now", or by asking Windows to restart the machine.
+func Reboot(client *gophercloud.ServiceClient, id string, how RebootMethod) error {
 	if (how != SoftReboot) && (how != HardReboot) {
 		return &ErrArgument{
 			Function: "Reboot",
@@ -180,36 +169,28 @@
 		}
 	}
 
-	h, err := c.getActionHeaders()
-	if err != nil {
-		return err
-	}
-
-	err = perigee.Post(c.getActionUrl(id), perigee.Options{
+	_, err := perigee.Request("POST", getActionURL(client, id), perigee.Options{
 		ReqBody: struct {
 			C map[string]string `json:"reboot"`
 		}{
-			map[string]string{"type": how},
+			map[string]string{"type": string(how)},
 		},
-		MoreHeaders: h,
+		MoreHeaders: client.Provider.AuthenticatedHeaders(),
 		OkCodes:     []int{202},
 	})
 	return err
 }
 
-// Rebuild requests that the Openstack provider reprovision the
-// server.  The rebuild will need to know the server's name and
-// new image reference or ID.  In addition, and unlike building
-// a server with Create(), you must provide an administrator
-// password.
+// Rebuild requests that the Openstack provider reprovision the server.
+// The rebuild will need to know the server's name and new image reference or ID.
+// In addition, and unlike building a server with Create(), you must provide an administrator password.
 //
 // Additional options may be specified with the additional map.
 // This function treats a nil map the same as an empty map.
 //
-// Rebuild returns a server result as though you had called
-// GetDetail() on the server's ID.  The information, however,
-// refers to the new server, not the old.
-func Rebuild(c *Client, id, name, password, imageRef string, additional map[string]interface{}) (ServerResult, error) {
+// Rebuild returns a server result as though you had called GetDetail() on the server's ID.
+// The information, however, refers to the new server, not the old.
+func Rebuild(client *gophercloud.ServiceClient, id, name, password, imageRef string, additional map[string]interface{}) (ServerResult, error) {
 	var sr ServerResult
 
 	if id == "" {
@@ -252,43 +233,34 @@
 	additional["imageRef"] = imageRef
 	additional["adminPass"] = password
 
-	h, err := c.getActionHeaders()
-	if err != nil {
-		return sr, err
-	}
-
-	err = perigee.Post(c.getActionUrl(id), perigee.Options{
+	_, err := perigee.Request("POST", getActionURL(client, id), perigee.Options{
 		ReqBody: struct {
 			R map[string]interface{} `json:"rebuild"`
 		}{
 			additional,
 		},
 		Results:     &sr,
-		MoreHeaders: h,
+		MoreHeaders: client.Provider.AuthenticatedHeaders(),
 		OkCodes:     []int{202},
 	})
 	return sr, err
 }
 
 // Resize instructs the provider to change the flavor of the server.
-// Note that this implies rebuilding it.  Unfortunately, one cannot pass rebuild parameters to the resize function.
+// Note that this implies rebuilding it.
+// Unfortunately, one cannot pass rebuild parameters to the resize function.
 // When the resize completes, the server will be in RESIZE_VERIFY state.
 // While in this state, you can explore the use of the new server's configuration.
 // If you like it, call ConfirmResize() to commit the resize permanently.
 // Otherwise, call RevertResize() to restore the old configuration.
-func Resize(c *Client, id, flavorRef string) error {
-	h, err := c.getActionHeaders()
-	if err != nil {
-		return err
-	}
-
-	err = perigee.Post(c.getActionUrl(id), perigee.Options{
+func Resize(client *gophercloud.ServiceClient, id, flavorRef string) error {
+	_, err := perigee.Request("POST", getActionURL(client, id), perigee.Options{
 		ReqBody: struct {
 			R map[string]interface{} `json:"resize"`
 		}{
 			map[string]interface{}{"flavorRef": flavorRef},
 		},
-		MoreHeaders: h,
+		MoreHeaders: client.Provider.AuthenticatedHeaders(),
 		OkCodes:     []int{202},
 	})
 	return err
@@ -296,15 +268,10 @@
 
 // ConfirmResize confirms a previous resize operation on a server.
 // See Resize() for more details.
-func ConfirmResize(c *Client, id string) error {
-	h, err := c.getActionHeaders()
-	if err != nil {
-		return err
-	}
-
-	err = perigee.Post(c.getActionUrl(id), perigee.Options{
+func ConfirmResize(client *gophercloud.ServiceClient, id string) error {
+	_, err := perigee.Request("POST", getActionURL(client, id), perigee.Options{
 		ReqBody:     map[string]interface{}{"confirmResize": nil},
-		MoreHeaders: h,
+		MoreHeaders: client.Provider.AuthenticatedHeaders(),
 		OkCodes:     []int{204},
 	})
 	return err
@@ -312,15 +279,10 @@
 
 // RevertResize cancels a previous resize operation on a server.
 // See Resize() for more details.
-func RevertResize(c *Client, id string) error {
-	h, err := c.getActionHeaders()
-	if err != nil {
-		return err
-	}
-
-	err = perigee.Post(c.getActionUrl(id), perigee.Options{
+func RevertResize(client *gophercloud.ServiceClient, id string) error {
+	_, err := perigee.Request("POST", getActionURL(client, id), perigee.Options{
 		ReqBody:     map[string]interface{}{"revertResize": nil},
-		MoreHeaders: h,
+		MoreHeaders: client.Provider.AuthenticatedHeaders(),
 		OkCodes:     []int{202},
 	})
 	return err